diff --git a/hwe/sammo/Command/Nation/che_백성동원.php b/hwe/sammo/Command/Nation/che_백성동원.php index dbb37de8..b84f9e7b 100644 --- a/hwe/sammo/Command/Nation/che_백성동원.php +++ b/hwe/sammo/Command/Nation/che_백성동원.php @@ -43,6 +43,8 @@ class che_백성동원 extends Command\NationCommand{ $this->setCity(); $this->setNation(['strategic_cmd_limit']); + $this->setDestCity($this->arg['destCityID'], null); + $this->setDestNation($this->destCity['nation']); $this->runnableConstraints=[ ConstraintHelper::OccupiedCity(), @@ -50,7 +52,7 @@ class che_백성동원 extends Command\NationCommand{ ConstraintHelper::AllowDiplomacyStatus($this->generalObj->getNationID(), [ 0 ], '전쟁중이 아닙니다.'), - ConstraintHelper::SuppliedDestCity(), + ConstraintHelper::OccupiedDestCity(), ConstraintHelper::AvailableStrategicCommand() ]; } diff --git a/hwe/sammo/Command/Nation/che_수몰.php b/hwe/sammo/Command/Nation/che_수몰.php index 6a321d34..3744e05d 100644 --- a/hwe/sammo/Command/Nation/che_수몰.php +++ b/hwe/sammo/Command/Nation/che_수몰.php @@ -31,7 +31,17 @@ class che_수몰 extends Command\NationCommand{ static public $reqArg = true; protected function argTest():bool{ - $this->arg = []; + if(!key_exists('destCityID', $this->arg)){ + return false; + } + if(CityConst::byID($this->arg['destCityID']) === null){ + return false; + } + $destCityID = $this->arg['destCityID']; + + $this->arg = [ + 'destCityID'=>$destCityID, + ]; return true; } @@ -43,6 +53,8 @@ class che_수몰 extends Command\NationCommand{ $this->setCity(); $this->setNation(['strategic_cmd_limit']); + $this->setDestCity($this->arg['destCityID'], null); + $this->setDestNation($this->destCity['nation']); $this->runnableConstraints=[ ConstraintHelper::OccupiedCity(), @@ -51,7 +63,6 @@ class che_수몰 extends Command\NationCommand{ ConstraintHelper::NotOccupiedDestCity(), ConstraintHelper::BattleGroundCity(), ConstraintHelper::AvailableStrategicCommand(), - ConstraintHelper::OccupiedDestCity() ]; } @@ -151,8 +162,9 @@ class che_수몰 extends Command\NationCommand{ $josaYiNation = JosaUtil::pick($nationName, '이'); - $logger->pushGeneralHistoryLog('수몰을 발동'); - $logger->pushNationalHistoryLog("【전략】{$nationName}{$josaYiNation} {$destCityName}수몰을 발동하였습니다."); + $logger->pushGeneralHistoryLog("{$destCityName}수몰을 발동"); + $logger->pushNationalHistoryLog("{$generalName}{$josaYi} {$destCityName}수몰을 발동"); + $logger->pushGlobalHistoryLog("【전략】{$nationName}{$josaYiNation} {$destCityName}수몰을 발동하였습니다."); $db->update('nation', ['strategic_cmd_limit' => $this->getPostReqTurn()], 'nation=%i', $nationID); diff --git a/hwe/sammo/Command/Nation/che_허보.php b/hwe/sammo/Command/Nation/che_허보.php new file mode 100644 index 00000000..9e456b18 --- /dev/null +++ b/hwe/sammo/Command/Nation/che_허보.php @@ -0,0 +1,216 @@ +arg)){ + return false; + } + if(CityConst::byID($this->arg['destCityID']) === null){ + return false; + } + $destCityID = $this->arg['destCityID']; + + $this->arg = [ + 'destCityID'=>$destCityID, + ]; + + return true; + } + + protected function init(){ + $general = $this->generalObj; + + $env = $this->env; + + $this->setCity(); + $this->setNation(['strategic_cmd_limit']); + $this->setDestCity($this->arg['destCityID'], null); + $this->setDestNation($this->destCity['nation']); + + $this->runnableConstraints=[ + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::NotNeutralDestCity(), + ConstraintHelper::NotOccupiedDestCity(), + ConstraintHelper::DisallowDiplomacyBetweenStatus( + [0, 1], + '선포, 전쟁중인 상대국에게만 가능합니다.' + ), + ConstraintHelper::AvailableStrategicCommand(), + ]; + } + + public function getCost():array{ + return [0, 0]; + } + + public function getPreReqTurn():int{ + return 2; + } + + public function getPostReqTurn():int{ + $genCount = Util::valueFit($this->nation['gennum'], GameConst::$initialNationGenLimit); + $nextTerm = Util::round(sqrt($genCount*4)*10); + + $nextTerm = $this->generalObj->onCalcStrategic($this->getName(), 'delay', $nextTerm); + return $nextTerm; + } + + public function getBrief():string{ + $commandName = $this->getName(); + $destCityName = CityConst::byID($this->arg['destCityID'])->name; + $josaUl = JosaUtil::pick($destCityName, '을'); + return "【{$destCityName}】{$josaUl} {$commandName}"; + } + + public function run():bool{ + if(!$this->isRunnable()){ + throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); + } + + $db = DB::db(); + + $general = $this->generalObj; + $generalID = $general->getID(); + $generalName = $general->getName(); + $date = $general->getTurnTime($general::TURNTIME_HM); + + $year = $this->env['year']; + $month = $this->env['month']; + + $destCity = $this->destCity; + $destCityID = $destCity['city']; + $destCityName = $destCity['name']; + + $destNationID = $destCity['nation']; + $destNationName = getNationStaticInfo($destNationID)['name']; + + $nationID = $general->getNationID(); + $nationName = $this->nation['name']; + + $logger = $general->getLogger(); + $logger->pushGeneralActionLog("허보 발동! <1>$date"); + + $general->increaseVar( + 'experience', + $general->onCalcStat($general, + 'experience', 5 * ($this->getPreReqTurn() + 1) + )); + $general->increaseVar( + 'dedication', + $general->onCalcStat($general, + 'dedication', 5 * ($this->getPreReqTurn() + 1) + )); + + $josaYi = JosaUtil::pick($generalName, '이'); + + $broadcastMessage = "{$generalName}{$josaYi} {$destCityName}허보를 발동하였습니다."; + + $targetGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no != %i', $nationID, $generalID); + foreach($targetGeneralList as $targetGeneralID){ + $targetLogger = new ActionLogger($targetGeneralID, $nationID, $year, $month); + $targetLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN); + $targetLogger->flush(); + } + + $destBroadcastMessage = "상대의 허보에 당했다! <1>$date"; + $destNationCityList = $db->queryFirstColumn('SELECT city FROM city WHERE nation = %i AND supply = 1', $destNationID); + + $targetGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND city=%i', $destNationID, $destCityID); + $destNationLogged = false; + foreach(General::createGeneralObjListFromDB($targetGeneralList) as $targetGeneralID => $targetGeneral){ + $targetLogger = $targetGeneral->getLogger(); + $targetLogger->pushGeneralActionLog($destBroadcastMessage, ActionLogger::PLAIN); + if(!$destNationLogged){ + $targetLogger->pushNationalHistoryLog( + "{$nationName}{$generalName}{$josaYi} 아국의 {$destCityName}허보를 발동", ActionLogger::PLAIN + ); + $destNationLogged = true; + } + + $moveCityID = Util::choiceRandom($destNationCityList); + if($moveCityID == $destCityID){ + //현재도시면 다시 랜덤 추첨 + $moveCityID = Util::choiceRandom($destNationCityList); + } + + $targetGeneral->setVar('city', $moveCityID); + + $targetGeneral->applyDB($db); + } + + if(!$targetGeneralList){ + //아무도 없었다! + $destNationLordID = $db->queryFirstField('SELECT no FROM general WHERE nation=%i AND level=12', $destNationID); + $targetLogger = new ActionLogger($destNationLordID, $destNationID, $year, $month); + $targetLogger->pushNationalHistoryLog( + "{$nationName}{$generalName}{$josaYi} 아국의 {$destCityName}허보를 발동", ActionLogger::PLAIN + ); + $targetLogger->flush(); + } + + + $db->update('city', [ + 'def' => $db->sqleval('def * 0.2'), + 'wall' => $db->sqleval('wall * 0.2'), + ], 'city=%i', $destCityID); + + $josaYiNation = JosaUtil::pick($nationName, '이'); + + $logger->pushGeneralHistoryLog("{$destCityName}허보를 발동"); + $logger->pushNationalHistoryLog("{$generalName}{$josaYi} {$destCityName}허보를 발동"); + $logger->pushGlobalHistoryLog("【전략】{$nationName}{$josaYiNation} {$destCityName}허보를 발동하였습니다."); + + $db->update('nation', ['strategic_cmd_limit' => $this->getPostReqTurn()], 'nation=%i', $nationID); + + $general->setResultTurn(new LastTurn($this->getName(), $this->arg, 0)); + $general->applyDB($db); + + return true; + } + + public function getForm(): string + { + ob_start(); +?> +
+선택된 도시에 허보를 발동합니다.
+전쟁중인 상대국 도시만 가능합니다.
+목록을 선택하거나 도시를 클릭하세요.
+
+
+arg) != 2){ + if(!$throwExeception){return false; } + throw new \InvalidArgumentException("require allowDipCodeList, errMsg pair"); + } + + $this->nationID = $this->nation['nation']; + $this->destNationID = $this->destNation['nation']; + [$this->allowDipCodeList, $this->errMsg] = $this->arg; + + foreach($this->allowDipCodeList as $dipCode){ + if(!is_int($dipCode)){ + if(!$throwExeception){return false; } + throw new \InvalidArgumentException("dipCode $dipCode must be int"); + } + } + + return true; + } + + public function test():bool{ + $this->checkInputValues(); + $this->tested = true; + + $db = DB::db(); + + + $state = $db->queryFirstField( + 'SELECT state FROM diplomacy WHERE me = %i AND you = %i AND `state` IN %li LIMIT 1', + $this->nationID, + $this->destNationID, + array_keys($this->allowDipCodeList) + ); + if($state !== null){ + return true; + } + $this->reason = $this->errMsg; + return false; + } +} \ No newline at end of file diff --git a/hwe/sammo/Constraint/ConstraintHelper.php b/hwe/sammo/Constraint/ConstraintHelper.php index f5625fa4..162f0880 100644 --- a/hwe/sammo/Constraint/ConstraintHelper.php +++ b/hwe/sammo/Constraint/ConstraintHelper.php @@ -11,6 +11,10 @@ class ConstraintHelper{ static function AllowDiplomacyStatus(int $nationID, array $disallowList, string $errMsg):array{ return [__FUNCTION__, [$nationID, $disallowList, $errMsg]]; } + + static function AllowDiplomacyBetweenStatus(array $allowDipCodeList, string $errMsg):array{ + return [__FUNCTION__, $allowDipCodeList, $errMsg]; + } static function AllowJoinAction():array{ return [__FUNCTION__];