사령턴 수행용 '지난턴' 추가

This commit is contained in:
2018-10-02 03:06:17 +09:00
parent 38bbae13b9
commit 63e5625d62
4 changed files with 78 additions and 15 deletions
+8
View File
@@ -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;
}
};
@@ -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(
'군량이 모자라 병사들이 <R>소집해제</>되었습니다!', ActionLogger::PLAIN
);
$general->activateSkill('pre.소집해제');
}
$general->activateSkill('pre.소집해제');
$general->activateSkill('pre.병력군량소모');
}
return $env;
@@ -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{
+66 -12
View File
@@ -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("현재 멀티, 또는 비매너로 인한<R>블럭</> 대상자입니다. <1>$date</>");
}
else if($blocked == 3){
$general->increaseVarWithLimit('killturn', -1, 0);
$logger->pushGeneralActionLog("현재 악성유저로 분류되어 <R>블럭</> 대상자입니다. <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', [