diff --git a/hwe/sammo/Command/NationCommand.php b/hwe/sammo/Command/NationCommand.php index 3b46ef6e..d65e1380 100644 --- a/hwe/sammo/Command/NationCommand.php +++ b/hwe/sammo/Command/NationCommand.php @@ -2,5 +2,13 @@ namespace sammo\Command; abstract class NationCommand extends BaseCommand{ + protected $lastTurn; + public function setLast($lastTurn){ + $this->lastTurn = $lastTurn; + } + + public function getLast():array{ + return $this->lastTurn; + } }; \ No newline at end of file diff --git a/hwe/sammo/GeneralTrigger/che_강제소집해제.php b/hwe/sammo/GeneralTrigger/che_병력군량소모.php similarity index 83% rename from hwe/sammo/GeneralTrigger/che_강제소집해제.php rename to hwe/sammo/GeneralTrigger/che_병력군량소모.php index 4586d615..d5a7a79a 100644 --- a/hwe/sammo/GeneralTrigger/che_강제소집해제.php +++ b/hwe/sammo/GeneralTrigger/che_병력군량소모.php @@ -7,7 +7,7 @@ use sammo\DB; use sammo\Util; use sammo\JosaUtil; -class che_강제소집해제 extends BaseGeneralTrigger{ +class che_병력군량소모 extends BaseGeneralTrigger{ static protected $priority = 50000; public function action(?array $env=null, $arg=null):?array{ @@ -26,8 +26,9 @@ class che_강제소집해제 extends BaseGeneralTrigger{ $general->getLogger()->pushGeneralActionLog( '군량이 모자라 병사들이 소집해제되었습니다!', ActionLogger::PLAIN ); + $general->activateSkill('pre.소집해제'); } - $general->activateSkill('pre.소집해제'); + $general->activateSkill('pre.병력군량소모'); } return $env; diff --git a/hwe/sammo/GeneralTrigger/che_부상경감.php b/hwe/sammo/GeneralTrigger/che_부상경감.php index 00b01a5b..9876c7c2 100644 --- a/hwe/sammo/GeneralTrigger/che_부상경감.php +++ b/hwe/sammo/GeneralTrigger/che_부상경감.php @@ -8,7 +8,7 @@ use sammo\Util; use sammo\JosaUtil; class che_부상경감 extends BaseGeneralTrigger{ - static protected $priority = 30000; + static protected $priority = 30010; public function action(?array $env=null, $arg=null):?array{ diff --git a/hwe/sammo/TurnExecutionHelper.php b/hwe/sammo/TurnExecutionHelper.php index d42cef36..075544df 100644 --- a/hwe/sammo/TurnExecutionHelper.php +++ b/hwe/sammo/TurnExecutionHelper.php @@ -10,6 +10,7 @@ class TurnExecutionHelper protected $generalObj; protected $turn = null; protected $nationTurn = null; + protected $lastNationTurn = null; public function __construct(array $rawGeneral, array $turn, ?array $nationTurn, int $year, int $month) { @@ -37,22 +38,59 @@ class TurnExecutionHelper $caller = $general->getPreTurnExecuteTriggerList($general); $caller->merge(new GeneralTriggerCaller([ new GeneralTrigger\che_부상경감($general), - new GeneralTrigger\che_강제소집해제($general), + new GeneralTrigger\che_병력군량소모($general), ])); $caller->fire(); } - public function processNationCommand(){ + public function processBlocked():bool{ + $general = $this->getGeneral(); + + $blocked = $general->getVar('block'); + if($blocked < 2){ + return false; + } + + $date = substr($general->getVar('turntime'),11,5); + $logger = $general->getLogger(); + if($blocked == 2){ + $general->increaseVarWithLimit('killturn', -1, 0); + $logger->pushGeneralActionLog("현재 멀티, 또는 비매너로 인한블럭 대상자입니다. <1>$date"); + } + else if($blocked == 3){ + $general->increaseVarWithLimit('killturn', -1, 0); + $logger->pushGeneralActionLog("현재 악성유저로 분류되어 블럭 대상자입니다. <1>$date"); + } + else{ + //Hmm? + return false; + } + + return true; + } + + public function processNationCommand():array{ if(!$this->nationTurn){ - return; + throw new \InvalidArgumentException('nationTurn이 없음'); } $general = $this->getGeneral(); $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); - [$commandClassName, $commandArg] = $this->nationTurn; + [$commandClassName, $commandArg, $commandLast] = $this->nationTurn; + + if(!$commandLast){ + //doNothing + } + else if($commandLast['command'] != $commandClassName){ + $commandLast = []; + } + else if($commandLast['arg'] != $commandArg){ + $commandLast = []; + } + $commandClass = getNationCommandClass($commandClassName); /** @var \sammo\Command\NationCommand $commandObj */ $commandObj = new $commandClass($general, $gameStor->getAll(true), $commandArg); @@ -63,10 +101,15 @@ class TurnExecutionHelper $commandName = $commandObj->getName(); $text = "{$failReason} {$commandName} 실패. <1>{$date}"; $general->getLogger()->pushGeneralActionLog($text); + + $commandLast = []; } else{ $commandObj->run(); + $commandLast = $commandObj->getLast(); } + + return $commandLast; } public function processCommand(){ @@ -178,19 +221,27 @@ WHERE turntime < %s ORDER BY turntime ASC, `no` ASC', $nationTurn = null; if($generalWork['nation'] != 0 && $generalWork['level'] >= 5){ + $nationStor = KVStorage::getStorage($db, 'nation_env'); + $lastNationTurnKey = "turn_last_{$generalWork['nation']}_{$generalWork['level']}"; + $lastNationTurn = $nationStor->getDBValue($lastNationTurnKey)??[]; //수뇌 몇 없는데 매번 left join 하는건 낭비인것 같다. $rawNationTurn = $db->queryFirstRow( 'SELECT action, arg FROM nation_turn WHERE nation_id = %i AND level = %i AND turn_idx =0', $generalWork['nation'], $generalWork['level'] ); - $nationTurn = [$rawNationTurn['action'], Json::decode($rawNationTurn['arg'])]; + $nationTurn = [$rawNationTurn['action'], Json::decode($rawNationTurn['arg']), $lastNationTurn]; } $turnObj = new static($generalWork, $turn, $nationTurn, $year, $month); - $turnObj->preprocessCommand(); - $turnObj->processNationCommand(); - $turnObj->processCommand(); + if(!$turnObj->processBlocked()){ + $turnObj->preprocessCommand(); + if($nationTurn){ + $lastNationTurn = $turnObj->processNationCommand(); + $nationStor->setValue($lastNationTurnKey, $lastNationTurn); + } + $turnObj->processCommand(); + } pullNationCommand($generalWork['nation'], $generalWork['level']); pullGeneralCommand($generalWork['no']); $turnObj->updateTurntime(); @@ -209,8 +260,6 @@ WHERE turntime < %s ORDER BY turntime ASC, `no` ASC', $gameStor = KVStorage::getStorage($db, 'game_env'); - DB::db(); - if(!tryLock()){ return; } @@ -262,7 +311,7 @@ WHERE turntime < %s ORDER BY turntime ASC, `no` ASC', throw new \RuntimeException('preUpdateMonthly() 처리 에러'); } - [$gameStor->year, $gameStor->month] = turnDate($nextTurn); + turnDate($nextTurn); // 이벤트 핸들러 동작 foreach (DB::db()->query('SELECT * from event') as $rawEvent) { @@ -312,13 +361,18 @@ WHERE turntime < %s ORDER BY turntime ASC, `no` ASC', // 이시각까지는 업데이트 완료했음 $gameStor->turntime = $prevTurn; // 그 시각 년도,월 저장 - [$gameStor->year, $gameStor->month] = turnDate($prevTurn); + turnDate($prevTurn); // 현재시간의 월턴시간 이후 분단위 장수 처리 [$executionOver, $currentTurn] = static::executeGeneralCommandUntil( $nextTurn, $limitActionTime, $gameStor->year, $gameStor->month ); + if($currentTurn !== null){ + $gameStor->turntime = $currentTurn; + } + + // 부상 과도 제한 //TODO: 없애고, 부상 자체가 80 이상 넘지 않도록 처리 $db->update('general', [