arg === null) { return false; } //NOTE: 멸망 직전에 턴을 넣을 수 있으므로, 존재하지 않는 국가여도 argTest에서 바로 탈락시키지 않음 if (!key_exists('destNationID', $this->arg)) { return false; } $destNationID = $this->arg['destNationID']; if (!is_int($destNationID)) { return false; } if ($destNationID < 1) { return false; } $this->arg = [ 'destNationID' => $destNationID ]; return true; } protected function init() { $general = $this->generalObj; $env = $this->env; $this->setCity(); $this->setNation(); $startYear = $this->env['startyear']; $this->minConditionConstraints = [ ConstraintHelper::BeChief(), ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::SuppliedCity(), ConstraintHelper::ReqEnvValue('year', '>=', $startYear + 1, '초반제한 해제 2년전부터 가능합니다.'), ]; } protected function initWithArg() { $startYear = $this->env['startyear']; $this->setDestNation($this->arg['destNationID'], null); $this->fullConditionConstraints = [ ConstraintHelper::BeChief(), ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::SuppliedCity(), ConstraintHelper::ReqEnvValue('year', '>=', $startYear + 1, '초반제한 해제 2년전부터 가능합니다.'), ConstraintHelper::ExistsDestNation(), ConstraintHelper::NearNation(), ConstraintHelper::DisallowDiplomacyBetweenStatus([ 0 => '아국과 이미 교전중입니다.', 1 => '아국과 이미 선포중입니다.', ]), ]; } public function getCost(): array { return [0, 0]; } public function getPreReqTurn(): int { return 0; } public function getPostReqTurn(): int { return 0; } public function getBrief(): string { $commandName = $this->getName(); $destNationName = getNationStaticInfo($this->arg['destNationID'])['name']; return "【{$destNationName}】에 {$commandName}"; } public function run(): bool { if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } $db = DB::db(); $env = $this->env; $general = $this->generalObj; $generalName = $general->getName(); $date = $general->getTurnTime($general::TURNTIME_HM); $nation = $this->nation; $nationID = $nation['nation']; $nationName = $nation['name']; $destNation = $this->destNation; $destNationID = $destNation['nation']; $destNationName = $destNation['name']; $josaYi = JosaUtil::pick($generalName, '이'); $josaYiNation = JosaUtil::pick($nationName, '이'); $logger = $general->getLogger(); $destLogger = new ActionLogger(0, $destNationID, $env['year'], $env['month']); $logger->pushGeneralActionLog("{$destNationName}에 선전 포고 했습니다.<1>$date"); $logger->pushNationalHistoryLog("{$generalName}{$josaYi} {$destNationName}에 선전 포고"); $destLogger->pushNationalHistoryLog("{$nationName}{$generalName}{$josaYi} 아국에 선전 포고"); $logger->pushGlobalActionLog("{$generalName}{$josaYi} {$destNationName}선전 포고 하였습니다."); $logger->pushGlobalHistoryLog("【선포】{$nationName}{$josaYiNation} {$destNationName}에 선전 포고 하였습니다."); $db->update('diplomacy', [ 'state' => 1, 'term' => 24 ], '(me=%i AND you=%i) OR (me=%i AND you=%i)', $nationID, $destNationID, $destNationID, $nationID); //국메로 저장 $text = "【외교】{$env['year']}년 {$env['month']}월:{$nationName}에서 {$destNationName}에 선전포고"; $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'] ); $msg = new Message( Message::MSGTYPE_NATIONAL, $src, $dest, $text, new \DateTime($general->getTurnTime()), new \DateTime('9999-12-31'), [] ); $msg->send(); $this->setResultTurn(new LastTurn(static::getName(), $this->arg)); $general->applyDB($db); $destLogger->flush(); return true; } public function getJSFiles(): array { return [ 'js/defaultSelectNationByMap.js' ]; } public function getForm(): string { $generalObj = $this->generalObj; $nationID = $generalObj->getNationID(); $startYear = $this->env['startyear']; $availableYear = $startYear + 1; $nationList = []; foreach (getAllNationStaticInfo() as $destNation) { if ($destNation['nation'] == $nationID) { continue; } $testCommand = new static($generalObj, $this->env, $this->getLastTurn(), ['destNationID' => $destNation['nation']]); if ($testCommand->hasFullConditionMet()) { $destNation['availableWar'] = true; } else { $destNation['availableWar'] = false; } $nationList[] = $destNation; } ob_start(); ?>
타국에게 선전 포고합니다.
선전 포고할 국가를 목록에서 선택하세요.
고립되지 않은 아국 도시에서 인접한 국가에 선포 가능합니다.
초반제한 해제 2년전부터 선포가 가능합니다. (년 1월부터 가능)
현재 선포가 불가능한 국가는 배경색이 붉은색으로 표시됩니다.