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);
// 다음달로 넘김