From 6ffe3caf4a6c73afc765dbae2ee15a7fd2afca33 Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sun, 12 Mar 2023 02:40:57 +0900 Subject: [PATCH] =?UTF-8?q?feat,=20refac:=20TurnExecutionHelper=EC=97=90?= =?UTF-8?q?=20=ED=95=98=EB=93=9C=EC=BD=94=EB=94=A9=EB=90=9C=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EC=9D=B4=EB=8F=99=20-=20GameConst?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=A0=95=EC=9D=98=EB=90=9C=20defaultEvent?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=20-=20runEventHandler()=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=20=20-=20=EC=9D=B4=EC=99=80=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=ED=95=9C=20=ED=98=B8=EC=B6=9C=EC=9D=84=20=EB=AA=A8=EB=91=90=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9=20-=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=95=B8=EB=93=A4=EB=9F=AC=20=ED=98=B8=EC=B6=9C=20=EC=8B=9C=20?= =?UTF-8?q?gameStor=20=EC=BA=90=EC=8B=9C=20=EC=B4=88=EA=B8=B0=ED=99=94?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/func.php | 71 ------ hwe/func_gamerule.php | 81 +------ hwe/func_time_event.php | 297 ++----------------------- hwe/process_war.php | 38 +--- hwe/sammo/Command/General/che_해산.php | 23 +- hwe/sammo/Enums/EventTarget.php | 2 +- hwe/sammo/GameConstBase.php | 50 +++++ hwe/sammo/TurnExecutionHelper.php | 75 +++---- 8 files changed, 107 insertions(+), 530 deletions(-) diff --git a/hwe/func.php b/hwe/func.php index 20a387ff..05e4e8dc 100644 --- a/hwe/func.php +++ b/hwe/func.php @@ -7,7 +7,6 @@ use Ds\Set; use sammo\Enums\AuctionType; use sammo\Enums\InheritanceKey; use sammo\Enums\RankColumn; -use sammo\Event\Action; require_once 'process_war.php'; require_once 'func_gamerule.php'; @@ -1224,76 +1223,6 @@ function updateOnline() $gameStor->online_nation = join(', ', $onlineNation); } -function addAge(RandUtil $rng) -{ - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - - - //나이와 호봉 증가 - $db->update('general', [ - 'age' => $db->sqleval('age+1'), - ], true); - - $db->update('general', [ - 'belong' => $db->sqleval('belong+1') - ], 'nation != 0'); - - [$startYear, $year, $month] = $gameStor->getValuesAsArray(['startyear', 'year', 'month']); - - if ($year >= $startYear + 3) { - foreach ($db->query('SELECT no,name,nation,leadership,strength,intel,aux from general where specage<=age and special=%s', GameConst::$defaultSpecialDomestic) as $general) { - $generalID = $general['no']; - $special = SpecialityHelper::pickSpecialDomestic( - $rng, - $general, - (Json::decode($general['aux'])['prev_types_special']) ?? [] - ); - $specialClass = buildGeneralSpecialDomesticClass($special); - $specialText = $specialClass->getName(); - $db->update('general', [ - 'special' => $special - ], 'no=%i', $generalID); - - $logger = new ActionLogger($generalID, $general['nation'], $year, $month); - - $josaUl = JosaUtil::pick($specialText, '을'); - $logger->pushGeneralActionLog("특기 【{$specialText}】{$josaUl} 익혔습니다!", ActionLogger::PLAIN); - $logger->pushGeneralHistoryLog("특기 【{$specialText}】{$josaUl} 습득"); - } - - foreach ($db->query('SELECT no,name,nation,leadership,strength,intel,npc,dex1,dex2,dex3,dex4,dex5,aux from general where specage2<=age and special2=%s', GameConst::$defaultSpecialWar) as $general) { - $generalID = $general['no']; - $generalAux = Json::decode($general['aux']); - - $updateVars = []; - if (key_exists('inheritSpecificSpecialWar', $generalAux)) { - $special2 = $generalAux['inheritSpecificSpecialWar']; - unset($generalAux['inheritSpecificSpecialWar']); - $updateVars['aux'] = Json::encode($generalAux); - } else { - $special2 = SpecialityHelper::pickSpecialWar( - $rng, - $general, - ($generalAux['prev_types_special2']) ?? [] - ); - } - - $specialClass = buildGeneralSpecialWarClass($special2); - $specialText = $specialClass->getName(); - - $updateVars['special2'] = $special2; - $db->update('general', $updateVars, 'no=%i', $general['no']); - - $logger = new ActionLogger($generalID, $general['nation'], $year, $month); - - $josaUl = JosaUtil::pick($specialText, '을'); - $logger->pushGeneralActionLog("특기 【{$specialText}】{$josaUl} 익혔습니다!", ActionLogger::PLAIN); - $logger->pushGeneralHistoryLog("특기 【{$specialText}】{$josaUl} 습득"); - } - } -} - function turnDate($curtime) { $db = DB::db(); diff --git a/hwe/func_gamerule.php b/hwe/func_gamerule.php index a065ac1c..728fb9dc 100644 --- a/hwe/func_gamerule.php +++ b/hwe/func_gamerule.php @@ -4,6 +4,7 @@ namespace sammo; use sammo\DTO\AuctionInfo; use sammo\Enums\AuctionType; +use sammo\Enums\EventTarget; use sammo\Enums\InheritanceKey; use sammo\Enums\RankColumn; @@ -184,27 +185,6 @@ function updateGeneralNumber() refreshNationStaticInfo(); } -function updateYearly() -{ - //통계 - checkStatistic(); -} - -//관직 변경 해제 -function updateQuaterly() -{ - $db = DB::db(); - - //천도 제한 해제, 관직 변경 제한 해제 - $db->update('nation', [ - 'chief_set' => 0, - ], true); - //관직 변경 제한 해제 - $db->update('city', [ - 'officer_set' => 0, - ], true); -} - // 벌점 감소와 건국제한-1 전턴제한-1 외교제한-1, 1달마다 실행, 병사 있는 장수의 군량 감소, 수입비율 조정 function preUpdateMonthly() { @@ -220,58 +200,6 @@ function preUpdateMonthly() $admin = $gameStor->getValues(['startyear', 'year', 'month']); - $logger = new ActionLogger(0, 0, $admin['year'], $admin['month']); - - //보급선 체크 - checkSupply(); - //미보급도시 10% 감소 - $db->update('city', [ - 'pop' => $db->sqleval('pop * 0.9'), - 'trust' => $db->sqleval('trust * 0.9'), - 'agri' => $db->sqleval('agri * 0.9'), - 'comm' => $db->sqleval('comm * 0.9'), - 'secu' => $db->sqleval('secu * 0.9'), - 'def' => $db->sqleval('def * 0.9'), - 'wall' => $db->sqleval('wall * 0.9'), - ], 'supply = 0'); - //미보급도시 장수 병 훈 사 5%감소 - //NOTE: update inner join도 가능하지만, meekrodb 기준으로 깔끔하게. - $unsuppliedCities = $db->query('SELECT city, nation, trust, name FROM city WHERE supply = 0'); - foreach (Util::arrayGroupBy($unsuppliedCities, 'nation') as $nationID => $cityList) { - $cityIDList = Util::squeezeFromArray($cityList, 'city'); - $db->update('general', [ - 'crew' => $db->sqleval('crew*0.95'), - 'atmos' => $db->sqleval('atmos*0.95'), - 'train' => $db->sqleval('train*0.95'), - ], 'city IN %li AND nation = %i', $cityIDList, $nationID); - } - - //민심30이하 공백지 처리 - $lostCities = []; - foreach ($unsuppliedCities as $unsuppliedCity) { - if ($unsuppliedCity['trust'] >= 30) { - continue; - } - $lostCities[$unsuppliedCity['city']] = $unsuppliedCity; - } - - if ($lostCities) { - foreach ($lostCities as $lostCity) { - $josaYi = JosaUtil::pick($lostCity['name'], '이'); - $logger->pushGlobalHistoryLog("【고립】{$lostCity['name']}{$josaYi} 보급이 끊겨 미지배 도시가 되었습니다."); - } - $db->update('general', [ - 'officer_level' => 1, - 'officer_city' => 0 - ], 'officer_city IN %li', array_keys($lostCities)); - $db->update('city', [ - 'nation' => 0, - 'officer_set' => 0, - 'conflict' => '{}', - 'term' => 0, - 'front' => 0 - ], 'city IN %li', array_keys($lostCities)); - } //접률감소, 건국제한-1 $db->update('general', [ @@ -289,9 +217,6 @@ function preUpdateMonthly() $develcost = ($admin['year'] - $admin['startyear'] + 10) * 2; $gameStor->develcost = $develcost; - //매달 사망자 수입 결산 - processWarIncome(); - //계략, 전쟁표시 해제 $db->update('city', [ 'state' => $db->sqleval(<<mergeTotalInheritancePoint($genObj); $inheritPointManager->applyInheritanceUser($genObj->getVar('owner')); diff --git a/hwe/func_time_event.php b/hwe/func_time_event.php index f0d6912a..aebe8e8e 100644 --- a/hwe/func_time_event.php +++ b/hwe/func_time_event.php @@ -4,173 +4,32 @@ namespace sammo; use sammo\Enums\InheritanceKey; use sammo\Enums\RankColumn; use Ds\Map; +use sammo\Enums\ResourceType; +use sammo\Event\Action; + /** * 시간 단위로 일어나는 이벤트들에 대한 함수 모음 */ - +/** @deprecated */ function processSumInheritPointRank(){ $db = DB::db(); - - $generals = General::createGeneralObjListFromDB(null, null, 2); - - $points = new Map(); - $points->allocate(count($generals)); - foreach($generals as $general){ - $generalID = $general->getID(); - $points[$generalID] = 0; - } - - foreach(InheritanceKey::cases() as $key){ - if($key === InheritanceKey::previous){ - continue; - } - $subPoints = InheritancePointManager::getInstance()->getInheritancePointFromAll($generals, $key); - foreach($generals as $general){ - $generalID = $general->getID(); - $points[$generalID] += $subPoints[$generalID] ?? 0; - } - } - - $pointsPairs = []; - foreach($points as $generalID => $point){ - $pointsPairs[] = [ - 'nation_id' => $generals[$generalID]->getNationID(), - 'general_id' => $generalID, - 'type' => RankColumn::inherit_point_earned_by_merge->value, - 'value' => $point, - ]; - } - //XXX: multiple batch update가 제공되지 않으므로.. - $db->delete('rank_data', '`type` = %s', RankColumn::inherit_point_earned_by_merge->value); - $db->insert('rank_data', $pointsPairs); - - $db->query( - 'UPDATE `rank_data` D SET `value` = (SELECT SUM(`value`) FROM `rank_data` S WHERE S.general_id = D.general_id AND S.`type` IN %ls) WHERE D.`type` = %s', - [RankColumn::inherit_point_earned_by_action->value, RankColumn::inherit_point_earned_by_merge->value], - RankColumn::inherit_point_earned->value - ); - - $db->query( - 'UPDATE `rank_data` D SET `value` = (SELECT `value` FROM `rank_data` S WHERE S.general_id = D.general_id AND S.`type` = %s) WHERE D.`type` = %s', - RankColumn::inherit_point_spent_dynamic->value, - RankColumn::inherit_point_spent->value - ); -} - -//1월마다 실행 -function processSpring() { - $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); - // 1월엔 무조건 내정 1% 감소 - $db->update('city',[ - 'dead'=>0, - 'agri'=>$db->sqleval('agri * 0.99'), - 'comm'=>$db->sqleval('comm * 0.99'), - 'secu'=>$db->sqleval('secu * 0.99'), - 'def'=>$db->sqleval('def * 0.99'), - 'wall'=>$db->sqleval('wall * 0.99'), - ],true); - - //인구 증가 - popIncrease(); - - // > 10000 유지비 3%, > 1000 유지비 1% - // 유지비 1% - $db->update('general', [ - 'gold'=>$db->sqleval('IF(gold > 10000, gold * 0.97, gold * 0.99)') - ], 'gold > 1000'); - - // > 100000 유지비 5%, > 100000 유지비 3%, > 1000 유지비 1% - $db->update('nation', [ - 'gold'=>$db->sqleval('IF(gold > 100000, gold * 0.95, IF(gold > 10000, gold * 0.97, gold * 0.99))') - ], 'gold > 1000'); - - $admin = $gameStor->getValues(['year', 'month']); - - pushGlobalHistoryLog(["★{$admin['year']}년 {$admin['month']}월: 모두들 즐거운 게임 하고 계신가요? ^^ 매너 있는 플레이 부탁드리고, 지나친 훼접은 삼가주세요~"], $admin['year'], $admin['month']); + $e_env = $gameStor->getValues(['startyear', 'year', 'month']); + $e_env['currentEventID'] = 0; + Action::build(["ProcessIncome", ResourceType::rice->value])->run($e_env); } + +/** @deprecated */ function processGoldIncome() { $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); - [$year, $month] = $gameStor->getValuesAsArray(['year', 'month']); - $adminLog = []; - - - $nationList = $db->query('SELECT name,nation,capital,gold,level,rate_tmp,bill,type from nation'); - $cityListByNation = Util::arrayGroupBy($db->query('SELECT * FROM city'), 'nation'); - $generalRawListByNation = Util::arrayGroupBy($db->query('SELECT no,name,nation,gold,officer_level,dedication,city FROM general WHERE npc != 5'), 'nation'); - - //국가별 처리 - foreach($nationList as $nation) { - $nationID = $nation['nation']; - - $generalRawList = $generalRawListByNation[$nationID]; - $income = getGoldIncome($nationID, $nation['level'], $nation['rate_tmp'], $nation['capital'], $nation['type'], $cityListByNation[$nationID]??[]); - $originoutcome = getOutcome(100, $generalRawList); - $outcome= Util::round($nation['bill'] / 100 * $originoutcome); - - // 실제 지급량 계산 - $nation['gold'] += $income; - // 기본량도 안될경우 - if($nation['gold'] < GameConst::$basegold) { - $realoutcome = 0; - // 실지급률 - $ratio = 0; - //기본량은 넘지만 요구량이 안될경우 - } elseif($nation['gold'] - GameConst::$basegold < $outcome) { - $realoutcome = $nation['gold'] - GameConst::$basegold; - $nation['gold'] = GameConst::$basegold; - // 실지급률 - $ratio = $realoutcome / $originoutcome; - } else { - $realoutcome = $outcome; - $nation['gold'] -= $realoutcome; - // 실지급률 - $ratio = $realoutcome / $originoutcome; - } - $nation['gold'] = Util::valueFit($nation['gold'], GameConst::$basegold); - $adminLog[] = StringUtil::padStringAlignRight((string)$nation['name'],12," ") - ." // 세금 : ".StringUtil::padStringAlignRight((string)$income,6," ") - ." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ") - ." // 실제 : ".tab2((string)$realoutcome,6," ") - ." // 지급률 : ".tab2((string)round($ratio*100,2),5," ") - ." % // 결과금 : ".tab2((string)$nation['gold'],6," "); - - $incomeText = number_format($income); - $incomeLog = "이번 수입은 금 $incomeText입니다."; - $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env'); - $nationStor->prev_income_gold = $income; - - $db->update('nation', [ - 'gold'=>$nation['gold'] - ], 'nation=%i', $nationID); - - // 각 장수들에게 지급 - foreach ($generalRawList as $rawGeneral) { - $generalObj = new General($rawGeneral, null, null, null, $year, $month, false); - $gold = Util::round(getBill($generalObj->getVar('dedication'))*$ratio); - $generalObj->increaseVar('gold', $gold); - - $logger = $generalObj->getLogger(); - if($generalObj->getVar('officer_level') > 4){ - $logger->pushGeneralActionLog($incomeLog, $logger::PLAIN); - } - - $goldText = number_format($gold); - $logger->pushGeneralActionLog("봉급으로 금 $goldText을 받았습니다.", $logger::PLAIN); - $generalObj->applyDB($db); - } - } - - $logger = new ActionLogger(0, 0, $year, $month); - $logger->pushGlobalHistoryLog('【지급】봄이 되어 봉록에 따라 자금이 지급됩니다.'); - $logger->flush(); - - pushAdminLog($adminLog); + $e_env = $gameStor->getValues(['startyear', 'year', 'month']); + $e_env['currentEventID'] = 0; + Action::build(["ProcessIncome", ResourceType::gold->value])->run($e_env); } function popIncrease() { @@ -304,29 +163,6 @@ function getGoldIncome(int $nationID, int $nationLevel, float $taxRate, int $cap return $cityIncome; } -function processWarIncome() { - $db = DB::db(); - - $cityListByNation = Util::arrayGroupBy($db->query('SELECT * FROM city'), 'nation'); - - foreach(getAllNationStaticInfo() as $nation){ - if($nation['level'] <= 0){ - continue; - } - $nationID = $nation['nation']; - $income = getWarGoldIncome($nation['type'], $cityListByNation[$nationID]??[]); - $db->update('nation', [ - 'gold'=>$db->sqleval('gold + %i', $income) - ], 'nation=%i', $nationID); - } - - // 10%수입, 20%부상병 - $db->update('city', [ - 'pop'=>$db->sqleval('pop + dead * %d', 0.2), - 'dead'=>0 - ], true); -} - function getWarGoldIncome(string $nationType, array $cityList){ $nationTypeObj = buildNationTypeClass($nationType); @@ -338,115 +174,14 @@ function getWarGoldIncome(string $nationType, array $cityList){ return $cityIncome; } - - -//7월마다 실행 -function processFall() { - $db = DB::db(); - - // 7월엔 무조건 내정 1% 감소 - $db->update('city',[ - 'dead'=>0, - 'agri'=>$db->sqleval('agri * 0.99'), - 'comm'=>$db->sqleval('comm * 0.99'), - 'secu'=>$db->sqleval('secu * 0.99'), - 'def'=>$db->sqleval('def * 0.99'), - 'wall'=>$db->sqleval('wall * 0.99'), - ],true); - - //인구 증가 - popIncrease(); - - // > 10000 유지비 3%, > 1000 유지비 1% - // 유지비 1% - $db->update('general', [ - 'rice'=>$db->sqleval('IF(rice > 10000, rice * 0.97, rice * 0.99)') - ], 'rice > 1000'); - - // > 100000 유지비 5%, > 100000 유지비 3%, > 1000 유지비 1% - $db->update('nation', [ - 'rice'=>$db->sqleval('IF(rice > 100000, rice * 0.95, IF(rice > 10000, rice * 0.97, rice * 0.99))') - ], 'rice > 1000'); -} - +/** @deprecated */ function processRiceIncome() { $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); - [$year, $month] = $gameStor->getValuesAsArray(['year', 'month']); - $adminLog = []; - - $nationList = $db->query('SELECT name,level,nation,capital,rice,rate_tmp,bill,type from nation'); - $cityListByNation = Util::arrayGroupBy($db->query('SELECT * FROM city'), 'nation'); - $generalRawListByNation = Util::arrayGroupBy($db->query('SELECT no,name,nation,rice,officer_level,dedication,city FROM general WHERE npc != 5'), 'nation'); - - //국가별 처리 - foreach($nationList as $nation) { - $nationID = $nation['nation']; - - $generalRawList = $generalRawListByNation[$nationID]; - $income = getRiceIncome($nation['nation'], $nation['level'], $nation['rate_tmp'], $nation['capital'], $nation['type'], $cityListByNation[$nationID]??[]); - $income += getWallIncome($nation['nation'], $nation['level'], $nation['rate_tmp'], $nation['capital'], $nation['type'], $cityListByNation[$nationID]??[]); - $originoutcome = getOutcome(100, $generalRawList); - $outcome= Util::round($nation['bill'] / 100 * $originoutcome); - - // 실제 지급량 계산 - $nation['rice'] += $income; - // 기본량도 안될경우 - if($nation['rice'] < GameConst::$baserice) { - $realoutcome = 0; - // 실지급률 - $ratio = 0; - //기본량은 넘지만 요구량이 안될경우 - } elseif($nation['rice'] - GameConst::$baserice < $outcome) { - $realoutcome = $nation['rice'] - GameConst::$baserice; - $nation['rice'] = GameConst::$baserice; - // 실지급률 - $ratio = $realoutcome / $originoutcome; - } else { - $realoutcome = $outcome; - $nation['rice'] -= $realoutcome; - // 실지급률 - $ratio = $realoutcome / $originoutcome; - } - $nation['rice'] = Util::valueFit($nation['rice'], GameConst::$baserice); - $adminLog[] = StringUtil::padStringAlignRight($nation['name'],12," ") - ." // 세곡 : ".StringUtil::padStringAlignRight((string)$income,6," ") - ." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ") - ." // 실제 : ".tab2((string)$realoutcome,6," ") - ." // 지급률 : ".tab2((string)round($ratio*100,2),5," ") - ." % // 결과곡 : ".tab2((string)$nation['rice'],6," "); - - $incomeText = number_format($income); - $incomeLog = "이번 수입은 쌀 $incomeText입니다."; - $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env'); - $nationStor->prev_income_rice = $income; - - $db->update('nation', [ - 'rice'=>$nation['rice'] - ], 'nation=%i', $nationID); - - // 각 장수들에게 지급 - foreach ($generalRawList as $rawGeneral) { - $generalObj = new General($rawGeneral, null, null, null, $year, $month, false); - $rice = Util::round(getBill($generalObj->getVar('dedication'))*$ratio); - $generalObj->increaseVar('rice', $rice); - - $logger = $generalObj->getLogger(); - if($generalObj->getVar('officer_level') > 4){ - $logger->pushGeneralActionLog($incomeLog, $logger::PLAIN); - } - $riceText = number_format($rice); - $logger->pushGeneralActionLog("봉급으로 쌀 $riceText을 받았습니다.", $logger::PLAIN); - $generalObj->applyDB($db); - } - } - - $logger = new ActionLogger(0, 0, $year, $month); - $logger->pushGlobalHistoryLog('【지급】가을이 되어 봉록에 따라 군량이 지급됩니다.'); - $logger->flush(); - - pushAdminLog($adminLog); + $e_env = $gameStor->getValues(['startyear', 'year', 'month']); + $e_env['currentEventID'] = 0; + Action::build(["ProcessIncome", ResourceType::rice->value])->run($e_env); } function getRiceIncome(int $nationID, int $nationLevel, float $taxRate, int $capitalID, string $nationType, ?array $cityList) { diff --git a/hwe/process_war.php b/hwe/process_war.php index c7d0ea9f..51139d44 100644 --- a/hwe/process_war.php +++ b/hwe/process_war.php @@ -2,6 +2,7 @@ namespace sammo; +use sammo\Enums\EventTarget; function processWar(string $warSeed, General $attackerGeneral, array $rawAttackerNation, array $rawDefenderCity) { @@ -549,23 +550,10 @@ function ConquerCity(array $admin, General $general, array $city) $gameStor = KVStorage::getStorage($db, 'game_env'); // 이벤트 핸들러 동작 - $e_env = null; - foreach (DB::db()->query('SELECT * FROM event WHERE target = "OCCUPY_CITY" ORDER BY `priority` DESC, `id` ASC') as $rawEvent) { - if ($e_env === null) { - $e_env = $gameStor->getAll(false); - } - $eventID = $rawEvent['id']; - $cond = Json::decode($rawEvent['condition']); - $action = Json::decode($rawEvent['action']); - $event = new Event\EventHandler($cond, $action); - $e_env['currentEventID'] = $eventID; - - $event->tryRunEvent($e_env); + if(TurnExecutionHelper::runEventHandler($db, $gameStor, EventTarget::OccupyCity)){ + $gameStor->cacheAll(); } - if ($e_env !== null) { - $gameStor->resetCache(); - } // 국가 멸망시 if ($defenderNationID && $db->queryFirstField('SELECT count(city) FROM city WHERE nation = %i', $defenderNationID) === 1) { @@ -661,27 +649,11 @@ function ConquerCity(array $admin, General $general, array $city) } // 이벤트 핸들러 동작 - $e_env = null; - foreach (DB::db()->query('SELECT * FROM event WHERE target = "DESTROY_NATION" ORDER BY `priority` DESC, `id` ASC') as $rawEvent) { - if ($e_env === null) { - $e_env = $gameStor->getAll(false); - } - $eventID = $rawEvent['id']; - $cond = Json::decode($rawEvent['condition']); - $action = Json::decode($rawEvent['action']); - $event = new Event\EventHandler($cond, $action); - $e_env['currentEventID'] = $eventID; - - $event->tryRunEvent($e_env); - } - - if ($e_env !== null) { - $gameStor->resetCache(); - } + TurnExecutionHelper::runEventHandler($db, $gameStor, EventTarget::DestroyNation); // 멸망이 아니면 } else { - // 태수,군사,종사은 일반으로... + // 태수,군사,종사는 일반으로... $db->update('general', [ 'officer_level' => 1, 'officer_city' => 0, diff --git a/hwe/sammo/Command/General/che_해산.php b/hwe/sammo/Command/General/che_해산.php index a1f84c2c..e3e53535 100644 --- a/hwe/sammo/Command/General/che_해산.php +++ b/hwe/sammo/Command/General/che_해산.php @@ -9,13 +9,15 @@ use \sammo\{ LastTurn, Command, Json, - KVStorage + KVStorage, + TurnExecutionHelper }; use \sammo\Constraint\Constraint; use \sammo\Constraint\ConstraintHelper; use sammo\CityConst; +use sammo\Enums\EventTarget; use sammo\Event\EventHandler; use function sammo\refreshNationStaticInfo; @@ -110,24 +112,7 @@ class che_해산 extends Command\GeneralCommand{ $general->applyDB($db); // 이벤트 핸들러 동작 - $gameStor = KVStorage::getStorage($db, 'game_env'); - $e_env = null; - foreach (DB::db()->query('SELECT * FROM event WHERE target = "DESTROY_NATION" ORDER BY `priority` DESC, `id` ASC') as $rawEvent) { - if ($e_env === null) { - $e_env = $gameStor->getAll(false); - } - $eventID = $rawEvent['id']; - $cond = Json::decode($rawEvent['condition']); - $action = Json::decode($rawEvent['action']); - $event = new EventHandler($cond, $action); - $e_env['currentEventID'] = $eventID; - - $event->tryRunEvent($e_env); - } - - if ($e_env !== null) { - $gameStor->resetCache(); - } + TurnExecutionHelper::runEventHandler($db, null, EventTarget::OccupyCity); return true; } diff --git a/hwe/sammo/Enums/EventTarget.php b/hwe/sammo/Enums/EventTarget.php index cd8265f0..f97e762f 100644 --- a/hwe/sammo/Enums/EventTarget.php +++ b/hwe/sammo/Enums/EventTarget.php @@ -7,6 +7,6 @@ enum EventTarget: string{ case Month = 'MONTH'; //PostMonth는 없음 case OccupyCity = 'OCCUPY_CITY'; - case DestriyNation = 'DESTROY_NATION'; + case DestroyNation = 'DESTROY_NATION'; case United = 'UNITED'; } \ No newline at end of file diff --git a/hwe/sammo/GameConstBase.php b/hwe/sammo/GameConstBase.php index dfae9317..594157b5 100644 --- a/hwe/sammo/GameConstBase.php +++ b/hwe/sammo/GameConstBase.php @@ -414,6 +414,46 @@ class GameConstBase ] ]; public static $defaultEvents = [ + [ + "pre_month", 9000, + true, + ["UpdateCitySupply"], + ["ProcessWarIncome"] + ], + [ + "month", 9000, + ["Date", "==", null, 1], + ["MergeInheritPointRank"], + ["ProcessSemiAnnual", "gold"], + ["ProcessIncome", "gold"], + ["ResetOfficerLock"], + ["RaiseDisaster"], + ["RandomizeCityTradeRate"], + ["NewYear"], + ["AssignGeneralSpeciality"], + ], + [ + "month", 9000, + ["Date", "==", null, 4], + ["ResetOfficerLock"], + ["RaiseDisaster"], + ], + [ + "month", 9000, + ["Date", "==", null, 7], + ["MergeInheritPointRank"], + ["ProcessSemiAnnual", "rice"], + ["ProcessIncome", "rice"], + ["ResetOfficerLock"], + ["RaiseDisaster"], + ["RandomizeCityTradeRate"], + ], + [ + "month", 9000, + ["Date", "==", null, 10], + ["ResetOfficerLock"], + ["RaiseDisaster"], + ], [ "month", 2000, ["DateRelative", "==", 1, 1], @@ -446,5 +486,15 @@ class GameConstBase ["AddGlobalBetray", 1, 1], ["DeleteEvent"] ], + [ + "month", 1000, + true, + ["ProvideNPCTroopLeader"] + ], + [ + "united", 5000, + true, + ["MergeInheritPointRank"], + ] ]; } diff --git a/hwe/sammo/TurnExecutionHelper.php b/hwe/sammo/TurnExecutionHelper.php index 1c0e700c..c20a1a76 100644 --- a/hwe/sammo/TurnExecutionHelper.php +++ b/hwe/sammo/TurnExecutionHelper.php @@ -2,6 +2,7 @@ namespace sammo; +use sammo\Enums\EventTarget; use sammo\Enums\InheritanceKey; use \Symfony\Component\Lock; @@ -352,6 +353,29 @@ class TurnExecutionHelper return [false, $currentTurn]; } + static public function runEventHandler(\MeekroDB $db, ?KVStorage $gameStor, EventTarget $eventTarget): bool{ + if($gameStor === null){ + $gameStor = KVStorage::getStorage($db, 'game_env'); + } + $e_env = null; + foreach ($db->query('SELECT * FROM event WHERE target = %s ORDER BY `priority` DESC, `id` ASC', $eventTarget->value) as $rawEvent) { + if ($e_env === null) { + $e_env = $gameStor->getAll(false); + } + $eventID = $rawEvent['id']; + $cond = Json::decode($rawEvent['condition']); + $action = Json::decode($rawEvent['action']); + $event = new Event\EventHandler($cond, $action); + $e_env['currentEventID'] = $eventID; + + $event->tryRunEvent($e_env); + } + if ($e_env === null) { + return false; + } + return true; + } + static public function executeAllCommand(&$executed = false, &$locked = false): string { $db = DB::db(); @@ -431,63 +455,18 @@ class TurnExecutionHelper ))); // 1달마다 처리하는 것들, 벌점 감소 및 건국,전턴,합병 -1, 군량 소모 + static::runEventHandler($db, $gameStor, EventTarget::PreMonth); if (!preUpdateMonthly()) { - $gameStor->resetCache(); unlock(); throw new \RuntimeException('preUpdateMonthly() 처리 에러'); } - turnDate($nextTurn); - $logger = new ActionLogger(0, 0, $gameStor->year, $gameStor->month, false); - // 분기계산. 장수들 턴보다 먼저 있다면 먼저처리 if ($gameStor->month == 1) { - processSumInheritPointRank(); - processSpring(); - processGoldIncome(); - updateYearly(); - updateQuaterly(); - disaster($monthlyRng); - tradeRate($monthlyRng); - addAge($monthlyRng); - // 새해 알림 - $logger->pushGlobalActionLog("{$gameStor->year}년이 되었습니다."); - $logger->flush(); //TODO: globalAction류는 전역에서 관리하는것이 좋을 듯. - } elseif ($gameStor->month == 4) { - updateQuaterly(); - disaster($monthlyRng); - } elseif ($gameStor->month == 7) { - processSumInheritPointRank(); - processFall(); - processRiceIncome(); - updateQuaterly(); - disaster($monthlyRng); - tradeRate($monthlyRng); - } elseif ($gameStor->month == 10) { - updateQuaterly(); - disaster($monthlyRng); + checkStatistic(); } - - // 이벤트 핸들러 동작 - $e_env = null; - foreach (DB::db()->query('SELECT * FROM event WHERE target = "MONTH" ORDER BY `priority` DESC, `id` ASC') as $rawEvent) { - if ($e_env === null) { - $e_env = $gameStor->getAll(false); - } - $eventID = $rawEvent['id']; - $cond = Json::decode($rawEvent['condition']); - $action = Json::decode($rawEvent['action']); - $event = new Event\EventHandler($cond, $action); - $e_env['currentEventID'] = $eventID; - - $event->tryRunEvent($e_env); - } - - if ($e_env !== null) { - $gameStor->resetCache(); - } - + static::runEventHandler($db, $gameStor, EventTarget::Month); postUpdateMonthly($monthlyRng); // 다음달로 넘김