From a44172f50970f4d49e68f0778165761865ecbccb Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sun, 8 May 2022 23:09:27 +0900 Subject: [PATCH] =?UTF-8?q?refac:=20RankColumn=20enum=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?,=20General=EC=9D=98=20=EB=AA=85=EC=9E=A5=20=EC=9D=BC=EB=9E=8C?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/b_betting.php | 16 +- hwe/func.php | 64 ++++---- hwe/j_simulate_battle.php | 45 +++--- hwe/sammo/API/General/Join.php | 5 +- hwe/sammo/ActionItem/event_전투특기_무쌍.php | 4 +- .../ActionSpecialDomestic/che_event_무쌍.php | 4 +- hwe/sammo/ActionSpecialWar/che_무쌍.php | 4 +- hwe/sammo/Betting.php | 7 +- hwe/sammo/Command/General/che_화계.php | 5 +- hwe/sammo/Enums/RankColumn.php | 49 ++++++ hwe/sammo/General.php | 146 ++++++++++-------- hwe/sammo/GeneralAI.php | 7 +- hwe/sammo/InheritancePointManager.php | 5 +- hwe/sammo/ResetHelper.php | 6 +- hwe/sammo/Scenario/GeneralBuilder.php | 5 +- hwe/sammo/WarUnitGeneral.php | 18 ++- 16 files changed, 236 insertions(+), 154 deletions(-) create mode 100644 hwe/sammo/Enums/RankColumn.php diff --git a/hwe/b_betting.php b/hwe/b_betting.php index b20d4024..7432aa7a 100644 --- a/hwe/b_betting.php +++ b/hwe/b_betting.php @@ -2,6 +2,8 @@ namespace sammo; +use sammo\Enums\RankColumn; + include "lib.php"; include "func.php"; //로그인 검사 @@ -551,14 +553,14 @@ if ($str3) { 勝 queryFirstColumn('SELECT general_id FROM rank_data WHERE `type`= %s ORDER BY value DESC LIMIT 40', $gameColumn), - [$prizeColumn, $gameColumn, $winColumn, $drawColumn, $loseColumn, 'leadership', 'strength', 'intel', 'no', 'npc', 'name'], + $db->queryFirstColumn('SELECT general_id FROM rank_data WHERE `type`= %s ORDER BY value DESC LIMIT 40', $gameColumn->value), + [$prizeColumn->value, $gameColumn->value, $winColumn->value, $drawColumn->value, $loseColumn->value, 'leadership', 'strength', 'intel', 'no', 'npc', 'name'], 0 ); usort($tournamentRankerList, function (General $lhs, General $rhs) use ($gameColumn, $winColumn, $drawColumn, $loseColumn) { diff --git a/hwe/func.php b/hwe/func.php index 06999444..c72fcb7c 100644 --- a/hwe/func.php +++ b/hwe/func.php @@ -4,6 +4,7 @@ namespace sammo; use DateTime; use sammo\Enums\InheritanceKey; +use sammo\Enums\RankColumn; use sammo\Event\Action; require_once 'process_war.php'; @@ -758,8 +759,8 @@ function generalInfo2(General $generalObj) { $general = $generalObj->getRaw(); - $winRate = round($generalObj->getRankVar('killnum') / max($generalObj->getRankVar('warnum'), 1) * 100, 2); - $killRate = round($generalObj->getRankVar('killcrew') / max($generalObj->getRankVar('deathcrew'), 1) * 100, 2); + $winRate = round($generalObj->getRankVar(RankColumn::killnum) / max($generalObj->getRankVar(RankColumn::warnum), 1) * 100, 2); + $killRate = round($generalObj->getRankVar(RankColumn::killcrew) / max($generalObj->getRankVar(RankColumn::deathcrew), 1) * 100, 2); $experienceBonus = $generalObj->onCalcStat($generalObj, 'experience', 10000) - 10000; if ($experienceBonus > 0) { @@ -823,9 +824,9 @@ function generalInfo2(General $generalObj) 전투 - {$generalObj->getRankVar('warnum')} + {$generalObj->getRankVar(RankColumn::warnum)} 계략 - {$generalObj->getRankVar('firenum')} + {$generalObj->getRankVar(RankColumn::firenum)} 사관 {$general['belong']}년 @@ -833,17 +834,17 @@ function generalInfo2(General $generalObj) 승률 {$winRate} % 승리 - {$generalObj->getRankVar('killnum')} + {$generalObj->getRankVar(RankColumn::killnum)} 패배 - {$generalObj->getRankVar('deathnum')} + {$generalObj->getRankVar(RankColumn::deathnum)} 살상률 {$killRate} % 사살 - {$generalObj->getRankVar('killcrew')} + {$generalObj->getRankVar(RankColumn::killcrew)} 피살 - {$generalObj->getRankVar('deathcrew')} + {$generalObj->getRankVar(RankColumn::deathcrew)} @@ -1376,6 +1377,7 @@ function CheckHall($no) $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); + //TODO: Enum타입을 두종류로 넣고, raw string이면 calcVar에서 받아오면? $types = [ ["experience", 'natural'], ["dedication", 'natural'], @@ -1405,33 +1407,33 @@ function CheckHall($no) $generalObj = General::createGeneralObjFromDB($no, null, 2); - $ttw = $generalObj->getRankVar('ttw'); - $ttd = $generalObj->getRankVar('ttd'); - $ttl = $generalObj->getRankVar('ttl'); + $ttw = $generalObj->getRankVar(RankColumn::ttw); + $ttd = $generalObj->getRankVar(RankColumn::ttd); + $ttl = $generalObj->getRankVar(RankColumn::ttl); - $tlw = $generalObj->getRankVar('tlw'); - $tld = $generalObj->getRankVar('tld'); - $tll = $generalObj->getRankVar('tll'); + $tlw = $generalObj->getRankVar(RankColumn::tlw); + $tld = $generalObj->getRankVar(RankColumn::tld); + $tll = $generalObj->getRankVar(RankColumn::tll); - $tsw = $generalObj->getRankVar('tsw'); - $tsd = $generalObj->getRankVar('tsd'); - $tsl = $generalObj->getRankVar('tsl'); + $tsw = $generalObj->getRankVar(RankColumn::tsw); + $tsd = $generalObj->getRankVar(RankColumn::tsd); + $tsl = $generalObj->getRankVar(RankColumn::tsl); - $tiw = $generalObj->getRankVar('tiw'); - $tid = $generalObj->getRankVar('tid'); - $til = $generalObj->getRankVar('til'); + $tiw = $generalObj->getRankVar(RankColumn::tiw); + $tid = $generalObj->getRankVar(RankColumn::tid); + $til = $generalObj->getRankVar(RankColumn::til); - $betWinGold = $generalObj->getRankVar('betwingold'); - $betGold = Util::valueFit($generalObj->getRankVar('betgold'), 1); + $betWinGold = $generalObj->getRankVar(RankColumn::betwingold); + $betGold = Util::valueFit($generalObj->getRankVar(RankColumn::betgold), 1); - $win = $generalObj->getRankVar('killnum'); - $war = Util::valueFit($generalObj->getRankVar('warnum'), 1); + $win = $generalObj->getRankVar(RankColumn::killnum); + $war = Util::valueFit($generalObj->getRankVar(RankColumn::warnum), 1); - $kill = $generalObj->getRankVar('killcrew'); - $death = Util::valueFit($generalObj->getRankVar('deathcrew'), 1); + $kill = $generalObj->getRankVar(RankColumn::killcrew); + $death = Util::valueFit($generalObj->getRankVar(RankColumn::deathcrew), 1); - $killPerson = $generalObj->getRankVar('killcrew_person'); - $deathPerson = Util::valueFit($generalObj->getRankVar('deathcrew_person'), 1); + $killPerson = $generalObj->getRankVar(RankColumn::killcrew_person); + $deathPerson = Util::valueFit($generalObj->getRankVar(RankColumn::deathcrew_person), 1); $tt = Util::valueFit($ttw + $ttd + $ttl, 1); $tl = Util::valueFit($tlw + $tld + $tll, 1); @@ -1469,13 +1471,13 @@ function CheckHall($no) if ($valueType === 'natural') { $value = $generalObj->getVar($typeName); } else if ($valueType === 'rank') { - $value = $generalObj->getRankVar($typeName); + $value = $generalObj->getRankVar(RankColumn::from($typeName)); } else if ($valueType === 'calc') { $value = $calcVar[$typeName]; } //승률,살상률인데 10회 미만 전투시 스킵 - if (($typeName === 'winrate' || $typeName === 'killrate') && $generalObj->getRankVar('warnum') < 10) { + if (($typeName === 'winrate' || $typeName === 'killrate') && $generalObj->getRankVar(RankColumn::warnum) < 10) { continue; } //토너승률인데 50회 미만시 스킵 @@ -1495,7 +1497,7 @@ function CheckHall($no) continue; } //수익률인데 1000미만시 스킵 - if ($typeName === 'betrate' && $generalObj->getRankVar('betgold') < 1000) { + if ($typeName === 'betrate' && $generalObj->getRankVar(RankColumn::betgold) < 1000) { continue; } diff --git a/hwe/j_simulate_battle.php b/hwe/j_simulate_battle.php index 85acd68e..ac89c241 100644 --- a/hwe/j_simulate_battle.php +++ b/hwe/j_simulate_battle.php @@ -1,6 +1,9 @@ [ - 'attackerGeneral', 'attackerCity', 'attackerNation', + 'attackerGeneral', 'attackerCity', 'attackerNation', 'defenderGenerals', 'defenderCity', 'defenderNation' ], ]; @@ -84,14 +87,14 @@ $rawDefenderNation = $query['defenderNation']; $generalCheck = [ 'required'=>[ - 'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train', - 'intel', 'intel_exp', 'book', 'strength', 'strength_exp', 'weapon', 'injury', 'leadership', 'leadership_exp', 'horse', 'item', + 'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train', + 'intel', 'intel_exp', 'book', 'strength', 'strength_exp', 'weapon', 'injury', 'leadership', 'leadership_exp', 'horse', 'item', 'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5', 'recent_war', 'warnum', 'killnum', 'killcrew', ], 'integer'=>[ 'no', 'nation', 'crew', 'crewtype', 'atmos', 'train', - 'intel', 'intel_exp', 'strength', 'strength_exp', 'injury', 'leadership', 'leadership_exp', + 'intel', 'intel_exp', 'strength', 'strength_exp', 'injury', 'leadership', 'leadership_exp', 'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5', 'warnum', 'killnum', 'killcrew', ], @@ -154,18 +157,18 @@ foreach($rawDefenderList as $idx=>$rawDefenderGeneral){ ]); } $rawDefenderGeneral['owner'] = 0; - + $defenderList[] = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), $rawDefenderCity, $rawAttackerNation, $year, $month, true); } $cityCheck = [ 'required'=>[ - 'city', 'nation', 'supply', 'name', - 'pop', 'agri', 'comm', 'secu', 'def', 'wall', + 'city', 'nation', 'supply', 'name', + 'pop', 'agri', 'comm', 'secu', 'def', 'wall', 'trust', 'level', 'pop_max', 'agri_max', 'comm_max', 'secu_max', 'def_max', 'wall_max', - 'dead', 'state', 'conflict', + 'dead', 'state', 'conflict', ], 'numeric'=>[ 'pop', 'agri', 'comm', 'secu', 'def', 'wall', 'trust', 'dead' @@ -258,7 +261,7 @@ if($action == 'reorder'){ foreach($defenderList as $defenderGeneral){ $order[] = $defenderGeneral->getID(); } - + Json::die([ 'result'=>true, 'reason'=>'success', @@ -280,19 +283,21 @@ $gameStor = KVStorage::getStorage($db, 'game_env'); $startYear = $gameStor->startyear; $cityRate = Util::round(($year - $startYear) / 1.5) + 60; -function extractRankVar(array $rawVal):array{ - $rankVars = []; +function extractRankVar(array $rawVal):Map{ + $rankVars = new Map; foreach($rawVal as $rawKey=>$rawVal){ - if(key_exists($rawKey, General::RANK_COLUMN)){ - $rankVars[$rawKey] = $rawVal; + $key = RankColumn::tryFrom($rawKey); + if($key === null){ + continue; } + $rankVars[$key] = $rawVal; } return $rankVars; } function simulateBattle( - $rawAttacker, $rawAttackerCity, $rawAttackerNation, - $rawDefenderList, $rawDefenderCity, $rawDefenderNation, + $rawAttacker, $rawAttackerCity, $rawAttackerNation, + $rawDefenderList, $rawDefenderCity, $rawDefenderNation, $startYear, $year, $month, $cityRate ){ $attacker = new WarUnitGeneral( @@ -310,7 +315,7 @@ function simulateBattle( $attackerRice = $rawAttacker['rice']; $defenderRice = 0; - $getNextDefender = function(?WarUnit $prevDefender, bool $reqNext) + $getNextDefender = function(?WarUnit $prevDefender, bool $reqNext) use ($iterDefender, $rawDefenderCity, $rawDefenderNation, $year, $month, &$battleResult, &$defenderRice) { if($prevDefender !== null){ $prevDefender->getLogger()->rollback(); @@ -393,13 +398,13 @@ $defendersActivatedSkills = []; foreach(Util::range($repeatCnt) as $repeatIdx){ /** @var WarUnit $attacker */ [$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice] = simulateBattle( - $rawAttacker, $rawAttackerCity, $rawAttackerNation, - $rawDefenderList, $rawDefenderCity, $rawDefenderNation, + $rawAttacker, $rawAttackerCity, $rawAttackerNation, + $rawDefenderList, $rawDefenderCity, $rawDefenderNation, $startYear, $year, $month, $cityRate ); $lastWarLog = Util::mapWithKey(function($key, $values){ return ConvertLog(join('
', $values)); - }, $attacker->getLogger()->rollback()); + }, $attacker->getLogger()->rollback()); $avgPhase += $attacker->getPhase() / $repeatCnt; @@ -443,7 +448,7 @@ foreach(Util::range($repeatCnt) as $repeatIdx){ $activatedSkills[$skillName] += $skillCnt / $repeatCnt; } } - + } } diff --git a/hwe/sammo/API/General/Join.php b/hwe/sammo/API/General/Join.php index f676cbdf..2aad0242 100644 --- a/hwe/sammo/API/General/Join.php +++ b/hwe/sammo/API/General/Join.php @@ -5,6 +5,7 @@ namespace sammo\API\General; use sammo\ActionLogger; use sammo\CityConst; use sammo\DB; +use sammo\Enums\RankColumn; use sammo\GameConst; use sammo\GameUnitConst; use sammo\General; @@ -369,11 +370,11 @@ class Join extends \sammo\BaseAPI $db->insert('general_turn', $turnRows); $rank_data = []; - foreach (array_keys(General::RANK_COLUMN) as $rankColumn) { + foreach (RankColumn::cases() as $rankColumn) { $rank_data[] = [ 'general_id' => $generalID, 'nation_id' => 0, - 'type' => $rankColumn, + 'type' => $rankColumn->value, 'value' => 0 ]; } diff --git a/hwe/sammo/ActionItem/event_전투특기_무쌍.php b/hwe/sammo/ActionItem/event_전투특기_무쌍.php index 02524aa3..29ac5a2b 100644 --- a/hwe/sammo/ActionItem/event_전투특기_무쌍.php +++ b/hwe/sammo/ActionItem/event_전투특기_무쌍.php @@ -1,5 +1,7 @@ getGeneral()->getRankVar('killnum'); + $killnum = $unit->getGeneral()->getRankVar(RankColumn::killnum); $attackMultiplier += log(max(1, $killnum / 5), 2) / 20; $defenceMultiplier -= log(max(1, $killnum / 5), 2) / 50; return [$attackMultiplier, $defenceMultiplier]; diff --git a/hwe/sammo/ActionSpecialDomestic/che_event_무쌍.php b/hwe/sammo/ActionSpecialDomestic/che_event_무쌍.php index a2851a38..1d43e300 100644 --- a/hwe/sammo/ActionSpecialDomestic/che_event_무쌍.php +++ b/hwe/sammo/ActionSpecialDomestic/che_event_무쌍.php @@ -1,5 +1,7 @@ getGeneral()->getRankVar('killnum'); + $killnum = $unit->getGeneral()->getRankVar(RankColumn::killnum); $attackMultiplier += log(max(1, $killnum / 5), 2) / 20; $defenceMultiplier -= log(max(1, $killnum / 5), 2) / 50; return [$attackMultiplier, $defenceMultiplier]; diff --git a/hwe/sammo/ActionSpecialWar/che_무쌍.php b/hwe/sammo/ActionSpecialWar/che_무쌍.php index 10500464..8f93d208 100644 --- a/hwe/sammo/ActionSpecialWar/che_무쌍.php +++ b/hwe/sammo/ActionSpecialWar/che_무쌍.php @@ -1,5 +1,7 @@ getGeneral()->getRankVar('killnum'); + $killnum = $unit->getGeneral()->getRankVar(RankColumn::killnum); $attackMultiplier += log(max(1, $killnum / 5), 2) / 20; $defenceMultiplier -= log(max(1, $killnum / 5), 2) / 50; return [$attackMultiplier, $defenceMultiplier]; diff --git a/hwe/sammo/Betting.php b/hwe/sammo/Betting.php index 3060c865..a56c55c3 100644 --- a/hwe/sammo/Betting.php +++ b/hwe/sammo/Betting.php @@ -4,6 +4,7 @@ namespace sammo; use sammo\DTO\BettingInfo; use sammo\DTO\BettingItem; +use sammo\Enums\RankColumn; class Betting { @@ -395,9 +396,9 @@ class Betting $reward = Util::round($rewardItem['amount']); $matchPoint = $rewardItem['matchPoint']; $gambler->increaseVar('gold', $reward); - if (($gambler->getNPCType() == 0) || ($gambler->getNPCType() == 1 && $gambler->getRankVar('betgold', 0) > 0)) { - $gambler->increaseRankVar('betwingold', $reward); - $gambler->increaseRankVar('betwin', 1); + if (($gambler->getNPCType() == 0) || ($gambler->getNPCType() == 1 && $gambler->getRankVar(RankColumn::betgold, 0) > 0)) { + $gambler->increaseRankVar(RankColumn::betwingold, $reward); + $gambler->increaseRankVar(RankColumn::betwin, 1); } if ($matchPoint == $selectCnt) { diff --git a/hwe/sammo/Command/General/che_화계.php b/hwe/sammo/Command/General/che_화계.php index cfc66c7a..ce7bda56 100644 --- a/hwe/sammo/Command/General/che_화계.php +++ b/hwe/sammo/Command/General/che_화계.php @@ -19,8 +19,7 @@ use function sammo\tryRollbackInheritUniqueItem; use \sammo\Constraint\Constraint; use \sammo\Constraint\ConstraintHelper; use sammo\CityConst; - - +use sammo\Enums\RankColumn; class che_화계 extends Command\GeneralCommand { @@ -330,7 +329,7 @@ class che_화계 extends Command\GeneralCommand $general->addExperience($exp); $general->addDedication($ded); $general->increaseVar($statType . '_exp', 1); - $general->increaseRankVar('firenum', 1); + $general->increaseRankVar(RankColumn::firenum, 1); $this->setResultTurn(new LastTurn(static::getName(), $this->arg)); $general->checkStatChange(); tryRollbackInheritUniqueItem($general); diff --git a/hwe/sammo/Enums/RankColumn.php b/hwe/sammo/Enums/RankColumn.php new file mode 100644 index 00000000..03e59eb5 --- /dev/null +++ b/hwe/sammo/Enums/RankColumn.php @@ -0,0 +1,49 @@ + */ + protected Map $rankVarRead; + /** @var Map */ + protected Map $rankVarIncrease; + /** @var Map */ + protected Map $rankVarSet; /** @var \sammo\ActionLogger */ protected $logger; @@ -44,17 +48,6 @@ class General implements iAction protected $lastTurn = null; protected $resultTurn = null; - const RANK_COLUMN = [ - 'firenum' => 1, 'warnum' => 1, 'killnum' => 1, 'deathnum' => 1, 'killcrew' => 1, 'deathcrew' => 1, - 'ttw' => 1, 'ttd' => 1, 'ttl' => 1, 'ttg' => 1, 'ttp' => 1, - 'tlw' => 1, 'tld' => 1, 'tll' => 1, 'tlg' => 1, 'tlp' => 1, - 'tsw' => 1, 'tsd' => 1, 'tsl' => 1, 'tsg' => 1, 'tsp' => 1, - 'tiw' => 1, 'tid' => 1, 'til' => 1, 'tig' => 1, 'tip' => 1, - 'betwin' => 1, 'betgold' => 1, 'betwingold' => 1, - 'killcrew_person' => 1, 'deathcrew_person' => 1, - 'occupied' => 1, - ]; - const TURNTIME_FULL_MS = -1; const TURNTIME_FULL = 0; const TURNTIME_HMS = 1; @@ -82,12 +75,13 @@ class General implements iAction /** * @param array $raw DB row값. + * @param null|Map $rawRank * @param null|array $city DB city 테이블의 row값 * @param int|null $year 게임 연도 * @param int|null $month 게임 월 * @param bool $fullConstruct iAction, 및 ActionLogger 초기화 여부, false인 경우 no, name, city, nation, officer_level 정도로 초기화 가능 */ - public function __construct(array $raw, ?array $rawRank, ?array $city, ?array $nation, ?int $year, ?int $month, bool $fullConstruct = true) + public function __construct(array $raw, ?Map $rawRank, ?array $city, ?array $nation, ?int $year, ?int $month, bool $fullConstruct = true) { //TODO: 밖에서 가져오도록 하면 버그 확률이 높아짐. 필요한 raw 값을 직접 구해야함. @@ -110,7 +104,11 @@ class General implements iAction if ($rawRank) { $this->rankVarRead = $rawRank; + } else { + $this->rankVarRead = new Map(); } + $this->rankVarIncrease = new Map(); + $this->rankVarSet = new Map(); if (!$fullConstruct) { return; @@ -524,7 +522,7 @@ class General implements iAction } $dexType = "dex{$armType}"; - $exp = $this->onCalcStat($this, 'addDex', $exp, ['armType'=>$armType]); + $exp = $this->onCalcStat($this, 'addDex', $exp, ['armType' => $armType]); $this->increaseVar($dexType, $exp); } @@ -630,7 +628,7 @@ class General implements iAction $refundPoint += $amount; } - if($this->getAuxVar('inheritSpecificSpecialWar')){ + if ($this->getAuxVar('inheritSpecificSpecialWar')) { $this->setAuxVar('inheritSpecificSpecialWar', null); $userLogger->push(sprintf("사망으로 전투 특기 지정 %d 포인트 반환", GameConst::$inheritSpecificSpecialPoint), "inheritPoint"); $refundPoint += GameConst::$inheritSpecificSpecialPoint; @@ -723,7 +721,7 @@ class General implements iAction $this->multiplyVar('dex4', 0.5); $this->multiplyVar('dex5', 0.5); - foreach (array_keys(static::RANK_COLUMN) as $rankKey) { + foreach (RankColumn::cases() as $rankKey) { $this->setRankVar($rankKey, 0); } @@ -733,24 +731,20 @@ class General implements iAction $logger->pushGeneralHistoryLog('나이가 들어 은퇴하고, 자손에게 관직을 물려줌'); } - function increaseRankVar(string $key, int $value) + function increaseRankVar(RankColumn $key, int $value) { - if (!key_exists($key, static::RANK_COLUMN)) { - throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key); - } - - if (key_exists($key, $this->rankVarSet)) { + if ($this->rankVarSet->hasKey($key)) { $this->rankVarSet[$key] += $value; return; } - if (key_exists($key, $this->rankVarRead)) { + if ($this->rankVarRead->hasKey($key)) { $this->rankVarSet[$key] = $this->rankVarRead[$key] + $value; - unset($this->rankVarRead[$key]); + $this->rankVarRead->remove($key); return; } - if (key_exists($key, $this->rankVarIncrease)) { + if ($this->rankVarIncrease->hasKey($key)) { $this->rankVarIncrease[$key] += $value; return; } @@ -758,33 +752,25 @@ class General implements iAction $this->rankVarIncrease[$key] = $value; } - function setRankVar(string $key, int $value) + function setRankVar(RankColumn $key, int $value) { - if (!key_exists($key, static::RANK_COLUMN)) { - throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key); - } - - if (key_exists($key, $this->rankVarRead)) { - unset($this->rankVarRead[$key]); - } else if (key_exists($key, $this->rankVarIncrease)) { - unset($this->rankVarIncrease[$key]); + if ($this->rankVarRead->hasKey($key)) { + $this->rankVarRead->remove($key); + } else if ($this->rankVarIncrease->hasKey($key)) { + $this->rankVarIncrease->remove($key); } $this->rankVarSet[$key] = $value; } - function getRankVar(string $key, $defaultValue = null): int + function getRankVar(RankColumn $key, $defaultValue = null): int { - if (!key_exists($key, static::RANK_COLUMN)) { - throw new \InvalidArgumentException('올바르지 않은 인자 :' . $key); - } - - if (key_exists($key, $this->rankVarSet)) { + if ($this->rankVarSet->hasKey($key)) { return $this->rankVarSet[$key]; } - if (!key_exists($key, $this->rankVarRead)) { - if($defaultValue === null){ - throw new \RuntimeException('인자가 없음 : ' . $key); + if (!$this->rankVarRead->hasKey($key)) { + if ($defaultValue === null) { + throw new \RuntimeException('인자가 없음 : ' . $key->value); } return $defaultValue; } @@ -818,27 +804,27 @@ class General implements iAction $this->flushUpdateValues(); } - if ($this->rankVarIncrease) { + if ($this->rankVarIncrease->count()) { foreach ($this->rankVarIncrease as $rankKey => $rankVal) { $db->update('rank_data', [ 'value' => $db->sqleval('value + %i', $rankVal) - ], 'general_id = %i AND type = %s', $generalID, $rankKey); + ], 'general_id = %i AND type = %s', $generalID, $rankKey->value); } $result = true; } - if ($this->rankVarSet) { + if ($this->rankVarSet->count()) { foreach ($this->rankVarSet as $rankKey => $rankVal) { $db->update('rank_data', [ 'value' => $rankVal - ], 'general_id = %i AND type = %s', $generalID, $rankKey); - $this->rankVarRead[$rankKey] = $rankVal; + ], 'general_id = %i AND type = %s', $generalID, $rankKey->value); + $this->rankVarRead[$rankKey->value] = $rankVal; } $result = true; } - $this->rankVarIncrease = []; - $this->rankVarSet = []; + $this->rankVarIncrease = new Map(); + $this->rankVarSet = new Map(); $this->getLogger()->flush(); return $result; @@ -1000,7 +986,8 @@ class General implements iAction return $amount; } - public function onArbitraryAction(General $general, string $actionType, ?string $phase=null, $aux=null): null|array{ + public function onArbitraryAction(General $general, string $actionType, ?string $phase = null, $aux = null): null|array + { foreach (array_merge([ $this->nationType, $this->officerLevelObj, @@ -1114,13 +1101,20 @@ class General implements iAction ]; if ($reqColumns === null) { - return [$fullColumn, array_keys(static::RANK_COLUMN)]; + return [$fullColumn, RankColumn::cases()]; } + /** @var RankColumn[] */ $rankColumn = []; $subColumn = []; foreach ($reqColumns as $column) { - if (key_exists($column, static::RANK_COLUMN)) { + if ($column instanceof RankColumn) { + $rankColumn[] = $column; + continue; + } + + $rankKey = RankColumn::tryFrom($column); + if ($rankKey !== null) { $rankColumn[] = $column; } else { $subColumn[] = $column; @@ -1136,7 +1130,7 @@ class General implements iAction /** * @param ?int[] $generalIDList - * @param null|string[] $column + * @param null|string|RankColumn[] $column * @param int $constructMode * @return \sammo\General[] * @throws MustNotBeReachedException @@ -1156,6 +1150,10 @@ class General implements iAction $month = null; } + /** + * @var string[] $column + * @var RankColumn[] $rankColumn + */ [$column, $rankColumn] = static::mergeQueryColumn($column, $constructMode); if ($generalIDList === null) { @@ -1172,17 +1170,20 @@ class General implements iAction } - $rawRanks = []; + /** @var Map> */ + $rawRanks = new Map(); if ($rankColumn) { $rawValue = $db->queryAllLists( 'SELECT `general_id`, `type`, `value` FROM rank_data WHERE general_id IN %li AND `type` IN %ls', $generalIDList, - $rankColumn + array_map(fn (\BackedEnum $e) => $e->value, $rankColumn) ); - foreach ($rawValue as [$generalID, $rankType, $rankValue]) { - if (!key_exists($generalID, $rawRanks)) { - $rawRanks[$generalID] = []; + foreach ($rawValue as [$generalID, $rawRankType, $rankValue]) { + if (!$rawRanks->hasKey($generalID)) { + $rawRanks[$generalID] = new Map(); } + + $rankType = RankColumn::from($rawRankType); $rawRanks[$generalID][$rankType] = $rankValue; } } @@ -1193,7 +1194,7 @@ class General implements iAction $result[$generalID] = new DummyGeneral($constructMode > 0); continue; } - if (key_exists($generalID, $rawRanks) && count($rawRanks[$generalID] ?? []) !== count($rankColumn)) { + if ($rawRanks->hasKey($generalID) && $rawRanks[$generalID]->count() !== count($rankColumn)) { throw new \RuntimeException('column의 수가 일치하지 않음 : ' . $generalID); } $result[$generalID] = new static($rawGenerals[$generalID], $rawRanks[$generalID] ?? null, null, null, $year, $month, $constructMode > 1); @@ -1213,6 +1214,10 @@ class General implements iAction $month = null; } + /** + * @var string[] $column + * @var RankColumn[] $rankColumn + */ [$column, $rankColumn] = static::mergeQueryColumn($column, $constructMode); $rawGeneral = $db->queryFirstRow('SELECT %l FROM general WHERE no = %i', Util::formatListOfBackticks($column), $generalID); @@ -1220,11 +1225,16 @@ class General implements iAction return new DummyGeneral($constructMode > 0); } - $rawRankValues = []; + $rawRankValues = new Map(); if ($rankColumn) { - $rawValue = $db->queryAllLists('SELECT `type`, `value` FROM rank_data WHERE general_id = %i AND `type` IN %ls', $generalID, $rankColumn); - foreach ($rawValue as [$rankType, $rankValue]) { - $rawRankValues[$rankType] = $rankValue; + $rawValue = $db->queryAllLists( + 'SELECT `type`, `value` FROM rank_data WHERE general_id = %i AND `type` IN %ls', + $generalID, + array_map(fn (\BackedEnum $e) => $e->value, $rankColumn) + ); + foreach ($rawValue as [$rawRankType, $rankValue]) { + $rankType = RankColumn::tryFrom($rawRankType); + $rawRankValues->put($rankType, $rankValue); } } @@ -1336,7 +1346,7 @@ class General implements iAction return InheritancePointManager::getInstance()->increaseInheritancePoint($this, $key, $value, $aux); } - public function mergeTotalInheritancePoint(bool $isEnd=false) + public function mergeTotalInheritancePoint(bool $isEnd = false) { InheritancePointManager::getInstance()->mergeTotalInheritancePoint($this, $isEnd); } diff --git a/hwe/sammo/GeneralAI.php b/hwe/sammo/GeneralAI.php index 4e145f91..8f42d2bf 100644 --- a/hwe/sammo/GeneralAI.php +++ b/hwe/sammo/GeneralAI.php @@ -4,6 +4,7 @@ namespace sammo; use sammo\Command\GeneralCommand; use sammo\Command\NationCommand; +use sammo\Enums\RankColumn; use sammo\Scenario\NPC; class GeneralAI @@ -2340,8 +2341,8 @@ class GeneralAI return null; } - $kill = $general->getRankVar('killcrew') + 50000; - $death = $general->getRankVar('deathcrew') + 50000; + $kill = $general->getRankVar(RankColumn::killcrew) + 50000; + $death = $general->getRankVar(RankColumn::deathcrew) + 50000; $deathRate = $death / $kill; $absGold = $general->getVar('gold'); @@ -2575,7 +2576,7 @@ class GeneralAI $riceCost = $crewType->riceWithTech( $this->nation['tech'], Util::toInt($this->fullLeadership * 100 * - $general->getRankVar('killcrew') / max($general->getRankVar('deathcrew'), 1) * 1.2) + $general->getRankVar(RankColumn::killcrew) / max($general->getRankVar(RankColumn::deathcrew), 1) * 1.2) ); $cmd = buildGeneralCommandClass('che_징병', $general, $env, [ diff --git a/hwe/sammo/InheritancePointManager.php b/hwe/sammo/InheritancePointManager.php index f1718262..b39fb213 100644 --- a/hwe/sammo/InheritancePointManager.php +++ b/hwe/sammo/InheritancePointManager.php @@ -5,6 +5,7 @@ namespace sammo; use sammo\VO\InheritancePointType; use Ds\Map; use sammo\Enums\InheritanceKey; +use sammo\Enums\RankColumn; class InheritancePointManager { @@ -110,8 +111,8 @@ class InheritancePointManager break; case InheritanceKey::betting: $extractFn = function () use ($general, $multiplier) { - $betWin = $general->getRankVar('betwin'); - $betWinRate = $general->getRankVar('betwingold') / max(1, $general->getRankVar('betgold')); + $betWin = $general->getRankVar(RankColumn::betwin); + $betWinRate = $general->getRankVar(RankColumn::betwingold) / max(1, $general->getRankVar(RankColumn::betgold)); return [$betWin * $multiplier * pow($betWinRate, 2), null]; }; diff --git a/hwe/sammo/ResetHelper.php b/hwe/sammo/ResetHelper.php index 994cb95a..f612f521 100644 --- a/hwe/sammo/ResetHelper.php +++ b/hwe/sammo/ResetHelper.php @@ -1,6 +1,8 @@ $generalID, 'nation_id'=>0, - 'type'=>$rankColumn, + 'type'=>$rankColumn->value, 'value'=>0 ]; } diff --git a/hwe/sammo/Scenario/GeneralBuilder.php b/hwe/sammo/Scenario/GeneralBuilder.php index d6c0b5c3..769eb354 100644 --- a/hwe/sammo/Scenario/GeneralBuilder.php +++ b/hwe/sammo/Scenario/GeneralBuilder.php @@ -6,6 +6,7 @@ use \sammo\DB; use \sammo\CityHelper; use \sammo\GameUnitConst; use \sammo\CityConst; +use sammo\Enums\RankColumn; use \sammo\GameConst; use \sammo\SpecialityHelper; use sammo\TimeUtil; @@ -714,11 +715,11 @@ class GeneralBuilder{ $db->insert('general_turn', $turnRows); $rank_data = []; - foreach(array_keys(\sammo\General::RANK_COLUMN) as $rankColumn){ + foreach(RankColumn::cases() as $rankColumn){ $rank_data[] = [ 'general_id'=>$this->generalID, 'nation_id'=>0, - 'type'=>$rankColumn, + 'type'=>$rankColumn->value, 'value'=>0 ]; } diff --git a/hwe/sammo/WarUnitGeneral.php b/hwe/sammo/WarUnitGeneral.php index 11235021..d2417728 100644 --- a/hwe/sammo/WarUnitGeneral.php +++ b/hwe/sammo/WarUnitGeneral.php @@ -2,6 +2,8 @@ namespace sammo; +use sammo\Enums\RankColumn; + class WarUnitGeneral extends WarUnit { protected $raw; @@ -52,7 +54,7 @@ class WarUnitGeneral extends WarUnit { parent::setOppose($oppose); $general = $this->general; - $this->general->increaseRankVar('warnum', 1); + $this->general->increaseRankVar(RankColumn::warnum, 1); if ($this->isAttacker) { $semiTurn = $general->getTurnTime(); @@ -152,11 +154,11 @@ class WarUnitGeneral extends WarUnit function addWin() { $general = $this->general; - $general->increaseRankVar('killnum', 1); + $general->increaseRankVar(RankColumn::killnum, 1); $oppose = $this->getOppose(); if ($oppose instanceof WarUnitCity) { - $general->increaseRankVar('occupied', 1); + $general->increaseRankVar(RankColumn::occupied, 1); } if($this->isAttacker()){ @@ -200,7 +202,7 @@ class WarUnitGeneral extends WarUnit function addLose() { $general = $this->general; - $general->increaseRankVar('deathnum', 1); + $general->increaseRankVar(RankColumn::deathnum, 1); $this->addStatExp(1); } @@ -340,14 +342,14 @@ class WarUnitGeneral extends WarUnit $this->isFinished = true; $general = $this->general; - $general->increaseRankVar('killcrew', $this->killed); - $general->increaseRankVar('deathcrew', $this->dead); + $general->increaseRankVar(RankColumn::killcrew, $this->killed); + $general->increaseRankVar(RankColumn::deathcrew, $this->dead); if($this->killedPerson){ - $general->increaseRankVar('killcrew_person', $this->killedPerson); + $general->increaseRankVar(RankColumn::killcrew_person, $this->killedPerson); } if($this->deadPerson){ - $general->increaseRankVar('deathcrew_person', $this->deadPerson); + $general->increaseRankVar(RankColumn::deathcrew_person, $this->deadPerson); } $general->updateVar('rice', Util::round($general->getVar('rice')));