From b7fd5397556d51ee885df234c7f86cd1b93e2bb6 Mon Sep 17 00:00:00 2001 From: hide_d Date: Thu, 22 Nov 2018 02:48:42 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B6=88=EA=B0=80=EC=B9=A8=20=EC=A0=9C?= =?UTF-8?q?=EC=9D=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/func_process_chief.php | 90 --------- hwe/sammo/Command/Nation/che_불가침제의.php | 196 ++++++++++++++++++++ 2 files changed, 196 insertions(+), 90 deletions(-) create mode 100644 hwe/sammo/Command/Nation/che_불가침제의.php diff --git a/hwe/func_process_chief.php b/hwe/func_process_chief.php index 72897a23..a069ab6b 100644 --- a/hwe/func_process_chief.php +++ b/hwe/func_process_chief.php @@ -259,96 +259,6 @@ function process_53(&$general) { pushGenLog($general, ["●{$month}월:{$destNation['name']}{$josaRo} 통합 제의 서신을 보냈습니다.<1>$date"]); } - -function process_61(&$general) { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $date = substr($general['turntime'],11,5); - list($year, $month, $turnterm) = $gameStor->getValuesAsArray(['year','month','turnterm']); - - if($general['level'] < 5 || $general['nation']==0) { - pushGenLog($general, ["●{$month}월:수뇌부가 아닙니다. 제의 실패. <1>$date"]); - return; - } - - $supply = $db->queryFirstField('SELECT supply FROM city WHERE city=%i AND nation=%i', $general['city'], $general['nation']); - $myTurn = $db->queryFirstField('SELECT %b FROM nation WHERE nation=%i', "l{$general['level']}turn0", $general['nation']); - - $command = DecodeCommand($myTurn); - $which = $command[1]; - $when = Util::valueFit($command[2], 1, 20); - - $srcNation = getNationStaticInfo($general['nation']); - $destNation = getNationStaticInfo($which); - - if($destNation['nation'] == 0) { - pushGenLog($general, ["●{$month}월:멸망한 국가입니다. 제의 실패. <1>$date"]); - return; - } - - if($supply === null) { - pushGenLog($general, ["●{$month}월:아국이 아닙니다. 제의 실패. <1>$date"]); - return; - } - - if($supply === 0) { - pushGenLog($general, ["●{$month}월:고립된 도시입니다. 제의 실패. <1>$date"]); - return; - } - - // 상대에게 발송 - $src = new MessageTarget( - $general['no'], - $general['name'], - $srcNation['nation'], - $srcNation['name'], - $srcNation['color'], - GetImageURL($general['imgsvr'], $general['picture']) - ); - - $dest = new MessageTarget( - 0, - '', - $destNation['nation'], - $destNation['name'], - $destNation['color'] - ); - - $now = new \DateTime($date); - $validUntil = new \DateTime($date); - $validMinutes = max(30, $turnterm*3); - $validUntil->add(new \DateInterval("PT{$validMinutes}M")); - - //FIXME: 현재 command가 숫자로만 이루어져 있어서 문자열을 처리할 수 없다. - //XXX: 으악. - //TODO: 커맨드 처리 방식을 json으로 변경 - $option = $db->queryFirstField('SELECT reserved FROM diplomacy WHERE me=%i AND you=%i', $src->nationID, $dest->nationID); - - $msg = new DiplomaticMessage( - Message::MSGTYPE_DIPLOMACY, - $src, - $dest, - "{$srcNation['name']}의 {$when}년 불가침 제의 서신", - $now, - $validUntil, - [ - 'action'=>DiplomaticMessage::TYPE_NO_AGGRESSION, - 'year'=>$when, - 'option'=>$option - ] - ); - $msg->send(); - - //NOTE: 현재 내무부 외교란의 비고는 diplomacy가 기준이니까 유지할 필요는 있다. - //FIXME: 외교란도 message란의 diplomacy를 참조하든가 하도록. - $db->update('diplomacy', [ - 'showing'=>$validUntil->format('Y-m-d H:i:s') - ], 'me=%i AND you=%i', $src->nationID, $dest->nationID); - // 3턴후 - - pushGenLog($general, ["●{$month}월:{$destNation['name']}으로 불가침 제의 서신을 보냈습니다.<1>$date"]); -} - function process_63(&$general) { $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); diff --git a/hwe/sammo/Command/Nation/che_불가침제의.php b/hwe/sammo/Command/Nation/che_불가침제의.php new file mode 100644 index 00000000..412d115e --- /dev/null +++ b/hwe/sammo/Command/Nation/che_불가침제의.php @@ -0,0 +1,196 @@ +arg)){ + return false; + } + $destNationID = $this->arg['destNationID']; + if(!is_int($destNationID)){ + return false; + } + if($destNationID < 1){ + return false; + } + + $optionText = $this->arg['optionText']??''; + if(!is_string($optionText)){ + return false; + } + + if(!key_exists('year', $this->arg) || !key_exists('month', $this->arg) ){ + return false; + } + $year = $this->arg['year']; + $month = $this->arg['month']; + if(!is_int($year) || !is_int($month)){ + return false; + } + + if($month < 1 || 12 < $month){ + return false; + } + + if($year < $this->env['startyear']){ + return false; + } + + $this->arg = [ + 'destNationID'=>$destNationID, + 'optionText'=>$optionText, + 'year'=>$year, + 'month'=>$month, + ]; + return true; + } + + protected function init(){ + $general = $this->generalObj; + + $env = $this->env; + $relYear = $env['year'] - $env['startyear']; + + $this->setCity(); + $this->setNation(); + + $this->setDestNation($this->arg['destNationID'], null); + + //NOTE: 개월에서 기한으로 바뀜 + $year = $this->arg['year']; + $month = $this->arg['month']; + + $currentMonth = $env['year'] * 12 + $env['month'] - 1; + $reqMonth = $year *12 + $month - 1; + + if ($reqMonth < $currentMonth + 12) { + $this->runnableConstraints = [ + ConstraintHelper::AlwaysFail('기한은 1년 이상이어야 합니다.') + ]; + return; + } + + $this->runnableConstraints=[ + ConstraintHelper::BeChief(), + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ConstraintHelper::ExistsDestNation(), + ]; + + } + + public function getCost():array{ + return [0, 0]; + } + + public function getPreReqTurn():int{ + return 0; + } + + public function getPostReqTurn():int{ + return 0; + } + + + public function run():bool{ + if(!$this->isRunnable()){ + throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); + } + + $db = DB::db(); + $env = $this->env; + + $general = $this->generalObj; + $generalName = $general->getName(); + $date = substr($general->getVar('turntime'),11,5); + + $nation = $this->nation; + $nationID = $nation['nation']; + $nationName = $nation['name']; + + $destNation = $this->destNation; + $destNationID = $destNation['nation']; + $destNationName = $destNation['name']; + + $year = $this->arg['year']; + $month = $this->arg['month']; + + $logger = $general->getLogger(); + $destLogger = new ActionLogger(0, $destNationID, $env['year'], $env['month']); + + $logger->pushGeneralActionLog("{$destNationName}으로 불가침 제의 서신을 보냈습니다.<1>$date"); + + // 상대에게 발송 + $src = new MessageTarget( + $general->getID(), + $general->getName(), + $nationID, + $nationName, + $nation['color'], + GetImageURL($general->getVar('imgsvr'), $general->getVar('picture')) + ); + $dest = new MessageTarget( + 0, + '', + $destNationID, + $destNationName, + $destNation['color'] + ); + + $now = new \DateTime($date); + $validUntil = new \DateTime($date); + $validMinutes = max(30, $turnterm*3); + $validUntil->add(new \DateInterval("PT{$validMinutes}M")); + + $msg = new DiplomaticMessage( + Message::MSGTYPE_DIPLOMACY, + $src, + $dest, + "{$srcNation['name']}의 {$year}년 {$month}까지 불가침 제의 서신", + $now, + $validUntil, + [ + 'action'=>DiplomaticMessage::TYPE_NO_AGGRESSION, + 'year'=>$year, + 'month'=>$month, + 'option'=>$this->arg['optionText'], + ] + ); + $msg->send(); + + //FIXME: 현재 내무부, 외교란이 구형 코드임. diplomacy_ticket을 이용하여 재구현 + $db->update('diplomacy', [ + 'showing'=>$validUntil->format('Y-m-d H:i:s'), + 'reserved'=>$this->arg['optionText'], + ], 'me=%i AND you=%i', $nationID, $destNationID); + + $general->setResultTurn(new LastTurn(static::getName(), $this->arg)); + $general->applyDB($db); + $destGeneral->applyDB($db); + + return true; + } +} \ No newline at end of file