diff --git a/hwe/j_diplomacy_destroy_letter.php b/hwe/j_diplomacy_destroy_letter.php index ca417cd7..bc0eb71e 100644 --- a/hwe/j_diplomacy_destroy_letter.php +++ b/hwe/j_diplomacy_destroy_letter.php @@ -123,7 +123,7 @@ $msg = new Message( $msgText, $now, $unlimited, - ['invalid' => true] + ['deletable' => false] ); $msgID = $msg->send(); diff --git a/hwe/j_diplomacy_respond_letter.php b/hwe/j_diplomacy_respond_letter.php index 8f9ee5ed..12e599bd 100644 --- a/hwe/j_diplomacy_respond_letter.php +++ b/hwe/j_diplomacy_respond_letter.php @@ -108,7 +108,7 @@ $msg = new Message( $msgText, $now, $unlimited, - ['invalid' => true] + ['deletable' => false] ); $msgID = $msg->send(); @@ -119,7 +119,7 @@ $msg = new Message( $msgText, $now, $unlimited, - ['invalid' => true] + ['deletable' => false] ); $msgID = $msg->send(); diff --git a/hwe/j_diplomacy_rollback_letter.php b/hwe/j_diplomacy_rollback_letter.php index 6a403e9f..1f24f753 100644 --- a/hwe/j_diplomacy_rollback_letter.php +++ b/hwe/j_diplomacy_rollback_letter.php @@ -79,7 +79,7 @@ $msg = new Message( $msgText, $now, $unlimited, - ['invalid' => true] + ['deletable' => false] ); $msgID = $msg->send(); diff --git a/hwe/j_diplomacy_send_letter.php b/hwe/j_diplomacy_send_letter.php index 056d2578..c04bff5e 100644 --- a/hwe/j_diplomacy_send_letter.php +++ b/hwe/j_diplomacy_send_letter.php @@ -180,7 +180,7 @@ $msg = new Message( $msgText, $now, $unlimited, - ['invalid' => true] + ['deletable' => false] ); $msgID = $msg->send(); diff --git a/hwe/j_msg_decide_opt.php b/hwe/j_msg_decide_opt.php index 097d6916..decd11a5 100644 --- a/hwe/j_msg_decide_opt.php +++ b/hwe/j_msg_decide_opt.php @@ -29,7 +29,7 @@ if ($msgID === null || !is_bool($msgResponse)) { ]); } -$general = DB::db()->queryFirstRow('select `no`, `name`, `nation`, `nations`, `officer_level`, `npc`, `gold`, `rice`, `troop` from `general` where `no` = %i', $generalID); +$general = DB::db()->queryFirstRow('SELECT `no`, `name`, `nation`, `officer_level`, `npc`, `gold`, `rice`, `troop`, `aux` from `general` where `no` = %i', $generalID); if(!$general){ Json::die([ 'result'=>false, diff --git a/hwe/js/msg.js b/hwe/js/msg.js index 9d4ec20b..42b15d2c 100644 --- a/hwe/js/msg.js +++ b/hwe/js/msg.js @@ -208,6 +208,14 @@ function redrawMsg(deferred, addFront){ else{ msg.invalidType = 'msg_valid'; } + + if(msg.option && !msg.option.deletable){ + msg.deletable = false; + } + else{ + msg.deletable = true; + } + var msgHtml = TemplateEngine(messageTemplate, msg); @@ -504,7 +512,7 @@ function activateMessageForm(){ jQuery(function($){ //tmp_template.html은 추후 msg.js에 통합될 수 있음 - var getTemplate = $.get('js/templates/message.html?11',function(obj){ + var getTemplate = $.get('js/templates/message.html?12',function(obj){ messageTemplate = obj; }); diff --git a/hwe/js/templates/message.html b/hwe/js/templates/message.html index 34c4ba6d..efd63516 100644 --- a/hwe/js/templates/message.html +++ b/hwe/js/templates/message.html @@ -12,7 +12,7 @@
- <%if(!this.option.action && src.id == myGeneralID && now <= last5min && invalidType == 'msg_valid'){%> + <%if(!this.option.action && src.id == myGeneralID && now <= last5min && invalidType == 'msg_valid' && !deletable){%> <%}%> <%if(msgType == 'private') {%> diff --git a/hwe/sammo/Command/Nation/che_불가침수락.php b/hwe/sammo/Command/Nation/che_불가침수락.php index a0db4b4f..d57ce0bd 100644 --- a/hwe/sammo/Command/Nation/che_불가침수락.php +++ b/hwe/sammo/Command/Nation/che_불가침수락.php @@ -27,7 +27,7 @@ use \sammo\Constraint\Constraint; use \sammo\Constraint\ConstraintHelper; class che_불가침수락 extends Command\NationCommand{ - static protected $actionName = '불가침'; + static protected $actionName = '불가침 수락'; static public $reqArg = true; protected function argTest():bool{ @@ -95,7 +95,7 @@ class che_불가침수락 extends Command\NationCommand{ $this->setCity(); $this->setNation(); - $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['imgsvr', 'picture'], 1); + $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], [], 1); $this->setDestGeneral($destGeneral); $this->setDestNation($this->arg['destNationID']); @@ -126,6 +126,7 @@ class che_불가침수락 extends Command\NationCommand{ ConstraintHelper::SuppliedCity(), ConstraintHelper::ExistsDestNation(), ConstraintHelper::ExistsDestGeneral(), + ConstraintHelper::ReqDestNationValue('nation', '소속', '==', $this->destGeneralObj->getNationID(), '제의 장수가 국가 소속이 아닙니다'), ConstraintHelper::DisallowDiplomacyBetweenStatus([ 0 => '아국과 이미 교전중입니다.', 1 => '아국과 이미 선포중입니다.', @@ -155,7 +156,7 @@ class che_불가침수락 extends Command\NationCommand{ $destNationName = getNationStaticInfo($this->arg['destNationID'])['name']; $year = $this->arg['year']; $month = $this->arg['month']; - return "{$year}년 {$month}월 전까지 "; + return "{$year}년 {$month}월까지 불가침 합의"; } public function run():bool{ @@ -180,7 +181,7 @@ class che_불가침수락 extends Command\NationCommand{ $month = $this->arg['month']; $logger = $general->getLogger(); - $destLogger = new ActionLogger(0, $destNationID, $env['year'], $env['month']); + $destLogger = $this->destGeneralObj->getLogger(); $currentMonth = $env['year'] * 12 + $env['month'] - 1; $reqMonth = $year *12 + $month - 1; @@ -194,13 +195,13 @@ class che_불가침수락 extends Command\NationCommand{ $nationID, $destNationID); $josaWa = JosaUtil::pick($destNationName, '와'); - $logger->pushGeneralActionLog("{$destNationName}{$josaWa} $year년 불가침에 성공했습니다.", ActionLogger::PLAIN); - $logger->pushGeneralHistoryLog("{$destNationName}{$josaWa} {$year}년 {$month}월 전까지 불가침 성공"); + $logger->pushGeneralActionLog("{$destNationName}{$josaWa} $year년 {$month}월까지 불가침에 성공했습니다.", ActionLogger::PLAIN); + $logger->pushGeneralHistoryLog("{$destNationName}{$josaWa} {$year}년 {$month}월까지 불가침 성공"); $josaWa = JosaUtil::pick($nationName, '와'); - $destLogger->pushGeneralActionLog("{$nationName}{$josaWa} $year년 불가침에 성공했습니다.", ActionLogger::PLAIN); - $destLogger->pushGeneralHistoryLog("{$nationName}{$josaWa} {$year}년 {$month}월 전까지 불가침 성공"); + $destLogger->pushGeneralActionLog("{$nationName}{$josaWa} $year년 {$month}월까지 불가침에 성공했습니다.", ActionLogger::PLAIN); + $destLogger->pushGeneralHistoryLog("{$nationName}{$josaWa} {$year}년 {$month}월까지 불가침 성공"); $general->applyDB($db); $destLogger->flush(); diff --git a/hwe/sammo/Command/Nation/che_불가침제의.php b/hwe/sammo/Command/Nation/che_불가침제의.php index 5d5aaee6..1fa6cc22 100644 --- a/hwe/sammo/Command/Nation/che_불가침제의.php +++ b/hwe/sammo/Command/Nation/che_불가침제의.php @@ -105,8 +105,6 @@ class che_불가침제의 extends Command\NationCommand{ $this->runnableConstraints=[ ConstraintHelper::BeChief(), ConstraintHelper::NotBeNeutral(), - ConstraintHelper::OccupiedCity(), - ConstraintHelper::SuppliedCity(), ConstraintHelper::ExistsDestNation(), ConstraintHelper::DisallowDiplomacyBetweenStatus([ 0 => '아국과 이미 교전중입니다.', @@ -137,7 +135,7 @@ class che_불가침제의 extends Command\NationCommand{ $destNationName = getNationStaticInfo($this->arg['destNationID'])['name']; $year = $this->arg['year']; $month = $this->arg['month']; - return "【{$destNationName}】에게 {$year}년 {$month}월 전까지 {$commandName}"; + return "【{$destNationName}】에게 {$year}년 {$month}월까지 {$commandName}"; } @@ -191,11 +189,13 @@ class che_불가침제의 extends Command\NationCommand{ $validMinutes = max(30, $env['turnterm']*3); $validUntil->add(new \DateInterval("PT{$validMinutes}M")); + $josaWa = JosaUtil::pick($nationName, '와'); + $msg = new DiplomaticMessage( Message::MSGTYPE_DIPLOMACY, $src, $dest, - "{$nationName}와 {$year}년 {$month}월 전까지 불가침 제의 서신", + "{$nationName}{$josaWa} {$year}년 {$month}월까지 불가침 제의 서신", $now, $validUntil, [ @@ -283,7 +283,7 @@ class che_불가침제의 extends Command\NationCommand{ -월 전까지 +월까지 arg === null){ + return false; + } + + if(!key_exists('destNationID', $this->arg)){ + return false; + } + $destNationID = $this->arg['destNationID']; + if(!is_int($destNationID)){ + return false; + } + if($destNationID < 1){ + return false; + } + + if(!key_exists('destGeneralID', $this->arg)){ + return false; + } + $destGeneralID = $this->arg['destGeneralID']; + if(!is_int($destGeneralID)){ + return false; + } + if($destGeneralID <= 0){ + return false; + } + if($destGeneralID == $this->generalObj->getID()){ + return false; + } + + $this->arg = [ + 'destNationID'=>$destNationID, + 'destGeneralID'=>$destGeneralID, + ]; + return true; + } + + protected function init(){ + $general = $this->generalObj; + + $env = $this->env; + $relYear = $env['year'] - $env['startyear']; + + $this->setCity(); + $this->setNation(); + + $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], [], 1); + $this->setDestGeneral($destGeneral); + $this->setDestNation($this->arg['destNationID']); + + $nationID = $this->nation['nation']; + + $this->reservableConstraints = [ + ConstraintHelper::AlwaysFail('예약 불가능 커맨드') + ]; + + $this->runnableConstraints=[ + ConstraintHelper::BeChief(), + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::ExistsDestNation(), + ConstraintHelper::ExistsDestGeneral(), + ConstraintHelper::ReqDestNationValue('nation', '소속', '==', $this->destGeneralObj->getNationID(), '제의 장수가 국가 소속이 아닙니다'), + ConstraintHelper::AllowDiplomacyBetweenStatus( + [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}국과 종전 합의"; + } + + public function run():bool{ + if(!$this->isRunnable()){ + throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); + } + + $db = DB::db(); + $env = $this->env; + + $general = $this->generalObj; + $generalName = $general->getName(); + + $nation = $this->nation; + $nationID = $nation['nation']; + $nationName = $nation['name']; + + $destNation = $this->destNation; + $destNationID = $destNation['nation']; + $destNationName = $destNation['name']; + + $logger = $general->getLogger(); + $destLogger = $this->destGeneralObj->getLogger(); + + $db->update('diplomacy',[ + 'state'=>2, + 'term'=>0 + ], + '(me=%i AND you=%i) OR (you=%i AND me=%i)', + $nationID, $destNationID, + $nationID, $destNationID); + + $josaYiGeneral = JosaUtil::pick($generalName, '이'); + $josaYiNation = JosaUtil::pick($nationName, '이'); + + $josaWa = JosaUtil::pick($destNationName, '와'); + $logger->pushGeneralActionLog("{$destNationName}{$josaWa} 종전에 합의했습니다.", ActionLogger::PLAIN); + $logger->pushGeneralHistoryLog("{$destNationName}{$josaWa} 종전 수락"); + + $logger->pushGlobalActionLog("{$generalName}{$josaYiGeneral} {$destNationName}{$josaWa} 종전 합의 하였습니다."); + $logger->pushGlobalHistoryLog("【종전】{$nationName}{$josaYiNation} {$destNationName}{$josaWa} 종전 합의 하였습니다."); + + + $josaWa = JosaUtil::pick($nationName, '와'); + $destLogger->pushGeneralActionLog("{$nationName}{$josaWa} 종전에 성공했습니다.", ActionLogger::PLAIN); + $destLogger->pushGeneralHistoryLog("{$nationName}{$josaWa} 종전 성공"); + + $general->applyDB($db); + $destLogger->flush(); + + return true; + } +} \ No newline at end of file diff --git a/hwe/sammo/Command/Nation/che_종전제의.php b/hwe/sammo/Command/Nation/che_종전제의.php new file mode 100644 index 00000000..f39fd018 --- /dev/null +++ b/hwe/sammo/Command/Nation/che_종전제의.php @@ -0,0 +1,219 @@ +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(); + + $this->setDestNation($this->arg['destNationID'], null); + + $this->runnableConstraints=[ + ConstraintHelper::BeChief(), + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ConstraintHelper::ExistsDestNation(), + ConstraintHelper::AllowDiplomacyBetweenStatus( + [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->isRunnable()){ + 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']; + + $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, $env['turnterm']*3); + $validUntil->add(new \DateInterval("PT{$validMinutes}M")); + + $msg = new DiplomaticMessage( + Message::MSGTYPE_DIPLOMACY, + $src, + $dest, + "{$nationName}의 종전 제의 서신", + $now, + $validUntil, + [ + 'action'=>DiplomaticMessage::TYPE_STOP_WAR, + 'deletable'=>false, + ] + ); + $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(); + + $db = DB::db(); + $diplomacyStatus = Util::convertArrayToDict( + $db->query('SELECT * FROM diplomacy WHERE me = %i', $nationID), + 'you' + ); + + $nationList = []; + foreach(getAllNationStaticInfo() as $destNation){ + if($destNation['nation'] == $nationID){ + continue; + } + + if(!in_array($diplomacyStatus[$destNation['nation']]['state'], [0, 1])){ + $destNation['cssBgColor'] = 'background-color:red;'; + } + else{ + $destNation['cssBgColor'] = ''; + } + + $nationList[] = $destNation; + } + + ob_start(); +?> +
+전쟁중인 국가에 종전을 제의합니다.
+제의할 국가를 목록에서 선택하세요.
+배경색은 현재 제의가 불가능한 국가는 붉은색으로 표시됩니다.
+
+에게 + +dest->generalID, ['picture', 'imgsvr'], 1); + $destGeneralObj = General::createGeneralObjFromDB($this->dest->generalID, ['picture', 'imgsvr', 'aux'], 1); $commandObj = buildNationCommandClass('che_불가침수락', $destGeneralObj, $gameStor->getAll(true), new LastTurn(), [ 'destNationID'=>$this->src->nationID, @@ -133,38 +133,24 @@ class DiplomaticMessage extends Message{ } protected function stopWar(){ - $helper = new Engine\Diplomacy($this->src->nationID, $this->dest->nationID); - $chk = $helper->stopWar(); - if($chk[0] !== self::ACCEPTED){ - return $chk; + $gameStor = KVStorage::getStorage(DB::db(), 'game_env'); + + $destGeneralObj = General::createGeneralObjFromDB($this->dest->generalID, ['picture', 'imgsvr', 'aux'], 1); + + $commandObj = buildNationCommandClass('che_종전수락', $destGeneralObj, $gameStor->getAll(true), new LastTurn(), [ + 'destNationID'=>$this->src->nationID, + 'destGeneralID'=>$this->src->generalID, + ]); + + $this->diplomacyDetail = $commandObj->getBrief(); + + if(!$commandObj->isRunnable()){ + return [self::DECLINED, $commandObj->getFailString()]; } - $josaYi = JosaUtil::pick($this->dest->generalName, '이'); - $josaWa = JosaUtil::pick($this->src->nationName, '와'); - $alllog[] = "●{$helper->month}월:{$this->dest->generalName}{$josaYi} {$this->src->nationName}{$josaWa} 종전 합의 하였습니다."; + $commandObj->run(); - $josaYi = JosaUtil::pick($this->dest->nationName, '이'); - $josaWa = JosaUtil::pick($this->src->nationName, '와'); - $history[] = "●{$helper->year}년 {$helper->month}월:【종전】{$this->dest->nationName}{$josaYi} {$this->src->nationName}{$josaWa} 종전 합의 하였습니다."; - - $josaWa = JosaUtil::pick($this->dest->nationName, '와'); - $youlog[] = "{$this->dest->nationName}{$josaWa} 종전에 성공했습니다."; - - $josaWa = JosaUtil::pick($this->src->nationName, '와'); - $mylog[] = "{$this->src->nationName}{$josaWa} 종전에 합의했습니다."; - - $josaWa = JosaUtil::pick($this->dest->nationName, '와'); - pushGeneralHistory($this->src->generalID, ["●{$helper->year}년 {$helper->month}월:{$this->dest->nationName}{$josaWa} 종전 성공"]); - - $josaWa = JosaUtil::pick($this->src->nationName, '와'); - pushGeneralHistory($this->dest->generalID, ["●{$helper->year}년 {$helper->month}월:{$this->src->nationName}{$josaWa} 종전 수락"]); - - pushGenLog($this->dest->generalID, $mylog); - pushGenLog($this->src->generalID, $youlog); - pushGeneralPublicRecord($alllog, $helper->year, $helper->month); - pushWorldHistory($history, $helper->year, $helper->month); - - return $chk; + return [self::ACCEPTED, '']; } protected function acceptMerge(){ @@ -307,9 +293,9 @@ class DiplomaticMessage extends Message{ default: throw new \RuntimeException('diplomaticType이 올바르지 않음'); } - + if($result !== self::ACCEPTED){ - pushGenLog($receiverID, ["●{$reason} {$this->diplomacyName} 실패."]); + pushGenLog($receiverID, ["●{$reason}"]); if($result === self::DECLINED){ $this->_declineMessage(); } @@ -329,12 +315,13 @@ class DiplomaticMessage extends Message{ self::MSGTYPE_NATIONAL, $this->dest, $this->src, - "【외교】{$year}년 {$month}월: {$this->src->nationName}{$josaYi} {$this->dest->nationName}에게 제안한 {$this->diplomacyDetail}{$this->diplomacyName} 동의.", + "【외교】{$year}년 {$month}월: {$this->src->nationName}{$josaYi} {$this->dest->nationName}에게 제안한 {$this->diplomacyDetail}", new \DateTime(), new \DateTime('9999-12-31'), [ 'delete'=>$this->id, 'silence'=>true, + 'deletable' => false ] ); $this->invalidate(); @@ -344,12 +331,13 @@ class DiplomaticMessage extends Message{ self::MSGTYPE_DIPLOMACY, $this->dest, $this->src, - "【외교】{$year}년 {$month}월: {$this->src->nationName}{$josaYi} {$this->dest->nationName}에게 제안한 {$this->diplomacyDetail}{$this->diplomacyName} 동의.", + "【외교】{$year}년 {$month}월: {$this->src->nationName}{$josaYi} {$this->dest->nationName}에게 제안한 {$this->diplomacyDetail}", new \DateTime(), new \DateTime('9999-12-31'), [ 'delete'=>$this->id, 'silence'=>true, + 'deletable' => false ] ); $newMsg->send(); diff --git a/hwe/sammo/Engine/Diplomacy.php b/hwe/sammo/Engine/Diplomacy.php index a3bef3a3..133ae2a1 100644 --- a/hwe/sammo/Engine/Diplomacy.php +++ b/hwe/sammo/Engine/Diplomacy.php @@ -294,27 +294,6 @@ class Diplomacy{ return $chk; } - public function stopWar(){ - $chk = $this->checkValidNation(); - $chk = $this->checkInWar($chk); - - [$result, $reason] = $chk; - if($result !== DiplomaticMessage::ACCEPTED){ - return $chk; - } - - $db = DB::db(); - $db->update('diplomacy',[ - 'state'=>2, - 'term'=>0 - ], - '(me=%i AND you=%i) OR (you=%i AND me=%i)', - $this->srcNation['nation'], $this->destNation['nation'], - $this->srcNation['nation'], $this->destNation['nation']); - - return $chk; - } - public function acceptMerge(int $srcGeneral, int $destGeneral){ $chk = $this->checkValidNation(); $chk = $this->checkDiplomacyLimit($chk); diff --git a/hwe/sammo/GameConstBase.php b/hwe/sammo/GameConstBase.php index 76604819..a55f0bad 100644 --- a/hwe/sammo/GameConstBase.php +++ b/hwe/sammo/GameConstBase.php @@ -308,7 +308,7 @@ class GameConstBase 'che_물자원조', 'che_불가침제의', 'che_선전포고', - //'che_종전제의', + 'che_종전제의', //'che_파기제의', ], '특수'=>[ diff --git a/hwe/sammo/General.php b/hwe/sammo/General.php index 8141187f..9623bbb4 100644 --- a/hwe/sammo/General.php +++ b/hwe/sammo/General.php @@ -666,37 +666,47 @@ class General implements iAction{ $this->setVar('last_turn', $this->getResultTurn()->toJson()); } $updateVals = $this->getUpdatedValues(); - - if(!$updateVals){ - return false; - } + $generalID = $this->getID(); - - $db->update('general', $updateVals, 'no=%i', $generalID); - if(key_exists('nation', $updateVals)){ - $db->update('rank_data', [ - 'nation_id'=>$updateVals['nation'] - ], 'general_id = %i', $generalID); + $result = false; + + if($updateVals){ + $db->update('general', $updateVals, 'no=%i', $generalID); + $result |= $db->affectedRows() > 0; + if(key_exists('nation', $updateVals)){ + $db->update('rank_data', [ + 'nation_id'=>$updateVals['nation'] + ], 'general_id = %i', $generalID); + $result = true; + } + $this->flushUpdateValues(); } - foreach($this->rankVarIncrease as $rankKey => $rankVal){ - $db->update('rank_data', [ - 'value'=>$db->sqleval('value + %i', $rankVal) - ], 'general_id = %i AND type = %s', $generalID, $rankKey); + if($this->rankVarIncrease){ + foreach($this->rankVarIncrease as $rankKey => $rankVal){ + $db->update('rank_data', [ + 'value'=>$db->sqleval('value + %i', $rankVal) + ], 'general_id = %i AND type = %s', $generalID, $rankKey); + } + $result = true; } - foreach($this->rankVarSet as $rankKey => $rankVal){ - $db->update('rank_data', [ - 'value'=>$rankVal - ], 'general_id = %i AND type = %s', $generalID, $rankKey); - $this->rankVarRead[$rankKey] = $rankVal; + + if($this->rankVarSet){ + foreach($this->rankVarSet as $rankKey => $rankVal){ + $db->update('rank_data', [ + 'value'=>$rankVal + ], 'general_id = %i AND type = %s', $generalID, $rankKey); + $this->rankVarRead[$rankKey] = $rankVal; + } + $result = true; } + $this->rankVarIncrease = []; $this->rankVarSet = []; $this->getLogger()->flush(); - $this->flushUpdateValues(); - return $db->affectedRows() > 0; + return $result; } function checkStatChange():bool{ diff --git a/hwe/sammo/GeneralAI.php b/hwe/sammo/GeneralAI.php index 45a83d8b..85b4ce11 100644 --- a/hwe/sammo/GeneralAI.php +++ b/hwe/sammo/GeneralAI.php @@ -2923,6 +2923,9 @@ class GeneralAI $cmd = buildGeneralCommandClass(Util::choiceRandom($candidate), $this->general, $this->env); + if(!$cmd->isRunnable()){ + return buildGeneralCommandClass('che_물자조달', $this->general, $this->env); + } return $cmd; }