From 18f9d87a2963b86c05fbcc62d10ff4e615b57340 Mon Sep 17 00:00:00 2001 From: Hide_D Date: Thu, 11 May 2023 01:58:16 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=84=B1=EB=B2=BD=20=EC=84=A0=EC=A0=9C?= =?UTF-8?q?=EA=B0=80=20=ED=98=B8=EC=B6=9C=EC=A1=B0=EC=B0=A8=20=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/func_converter.php | 2 +- hwe/j_simulate_battle.php | 13 +++++++------ hwe/process_war.php | 27 +++++++++++++++++---------- hwe/sammo/ActionCrewType/None.php | 12 ++++++++++++ hwe/sammo/GameUnitConstBase.php | 4 ++-- hwe/sammo/GameUnitDetail.php | 2 +- hwe/sammo/WarUnitCity.php | 13 +++++++++++++ 7 files changed, 53 insertions(+), 20 deletions(-) create mode 100644 hwe/sammo/ActionCrewType/None.php diff --git a/hwe/func_converter.php b/hwe/func_converter.php index a688bc75..8015975f 100644 --- a/hwe/func_converter.php +++ b/hwe/func_converter.php @@ -328,7 +328,7 @@ function buildGeneralSpecialWarClass(?string $type):BaseSpecial{ function getActionCrewTypeClass(?string $type){ if($type === null || $type === ''){ - $type = GameConst::$defaultSpecialWar; + $type = 'None'; } static $basePath = __NAMESPACE__.'\\ActionCrewType\\'; diff --git a/hwe/j_simulate_battle.php b/hwe/j_simulate_battle.php index 38bb2019..d5cf09b9 100644 --- a/hwe/j_simulate_battle.php +++ b/hwe/j_simulate_battle.php @@ -337,10 +337,6 @@ if ($action == 'reorder') { ]); } -usort($defenderList, function (WarUnit $lhs, WarUnit $rhs) use ($attacker) { - return - (extractBattleOrder($lhs, $attacker) <=> extractBattleOrder($rhs, $attacker)); -}); - $rawDefenderList = []; foreach($defenderList as $unit){ if(extractBattleOrder($unit, $attacker) <= 0){ @@ -409,10 +405,13 @@ function simulateBattle( ); } - if(count($defenderList) == 0 && extractBattleOrder($city, $attacker) > 0){ + if(count($defenderList) && extractBattleOrder($city, $attacker) > 0){ $defenderList[] = $city; } + usort($defenderList, function (WarUnit $lhs, WarUnit $rhs) use ($attacker) { + return - (extractBattleOrder($lhs, $attacker) <=> extractBattleOrder($rhs, $attacker)); + }); $iterDefender = new \ArrayIterator($defenderList); $iterDefender->rewind(); @@ -447,7 +446,9 @@ function simulateBattle( return null; } - $defenderRice += $defender->getVar('rice'); + if($defender instanceof WarUnitGeneral){ + $defenderRice += $defender->getVar('rice'); + } $iterDefender->next(); return $defender; diff --git a/hwe/process_war.php b/hwe/process_war.php index c53482e9..35ceb8a1 100644 --- a/hwe/process_war.php +++ b/hwe/process_war.php @@ -51,7 +51,7 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke $defenderList[] = $defenderCandidate; } - if(count($defenderList) == 0 && extractBattleOrder($city, $attacker) > 0){ + if(count($defenderList) && extractBattleOrder($city, $attacker) > 0){ $defenderList[] = $city; } @@ -424,21 +424,28 @@ function processWar_NG( $attacker->logBattleResult(); $defender->logBattleResult(); - $attacker->addWin(); - $defender->addLose(); + if (!($defender instanceof WarUnitCity) || $defender->isSiege()){ + $attacker->addWin(); + $defender->addLose(); - $attacker->tryWound(); - $defender->tryWound(); + $attacker->tryWound(); + $defender->tryWound(); - if ($defender === $city) { - $attacker->addLevelExp(1000); - $conquerCity = true; - break; + if ($defender === $city) { + $attacker->addLevelExp(1000); + $conquerCity = true; + break; + } } + $josaYi = JosaUtil::pick($defender->getCrewTypeName(), '이'); - if ($noRice) { + if ($defender instanceof WarUnitCity && !$defender->isSiege()){ + //실제 공성을 위해 다시 초기화 + $defender->setOppose(null); + } + else if ($noRice) { $logger->pushGlobalActionLog("{$defender->getName()}의 {$defender->getCrewTypeName()}{$josaYi} 패퇴했습니다."); $attacker->getLogger()->pushGeneralActionLog("{$defender->getName()}의 {$defender->getCrewTypeName()}{$josaYi} 패퇴했습니다.", ActionLogger::PLAIN); $defender->getLogger()->pushGeneralActionLog("군량 부족으로 패퇴합니다.", ActionLogger::PLAIN); diff --git a/hwe/sammo/ActionCrewType/None.php b/hwe/sammo/ActionCrewType/None.php new file mode 100644 index 00000000..ae86970e --- /dev/null +++ b/hwe/sammo/ActionCrewType/None.php @@ -0,0 +1,12 @@ +1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112], [self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067], ['상대에게 돌덩이를 날립니다.'], - ['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], null + ['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제'] ], [ 1503, self::T_SIEGE, '목우', @@ -343,7 +343,7 @@ class GameUnitConstBase{ [self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, self::T_CASTLE=>1.8], [self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, 1106=>1], ['상대를 저지하는 특수병기입니다.'], - ['che_성벽부상무효'], ['che_저지시도', 'che_저지발동'], ['che_성벽선제'] + ['che_성벽부상무효'], ['che_저지시도', 'che_저지발동'], null ] ]; diff --git a/hwe/sammo/GameUnitDetail.php b/hwe/sammo/GameUnitDetail.php index 6e524c95..2e63da15 100644 --- a/hwe/sammo/GameUnitDetail.php +++ b/hwe/sammo/GameUnitDetail.php @@ -70,7 +70,7 @@ class GameUnitDetail implements iAction $this->initSkillTrigger = $initSkillTrigger; $this->phaseSkillTrigger = $phaseSkillTrigger; $this->iActionList = []; - foreach($iActionList as $rawAction){ + foreach($iActionList ?? [] as $rawAction){ $action = buildActionCrewTypeClass($rawAction); if(!$action){ continue; diff --git a/hwe/sammo/WarUnitCity.php b/hwe/sammo/WarUnitCity.php index 49369e14..d3f1d513 100644 --- a/hwe/sammo/WarUnitCity.php +++ b/hwe/sammo/WarUnitCity.php @@ -80,6 +80,13 @@ class WarUnitCity extends WarUnit{ function setSiege(){ $this->onSiege = true; + $this->currPhase = 0; + $this->prePhase = 0; + $this->bonusPhase = 0; + } + + function isSiege(): bool{ + return $this->onSiege; } function getDex(GameUnitDetail $crewType){ @@ -99,6 +106,12 @@ class WarUnitCity extends WarUnit{ function continueWar(&$noRice):bool{ //전투가 가능하면 true $noRice = false; + + //본 공성이 아닌 경우에는 한대만 맞아줌 + if(!$this->onSiege){ + return false; + } + if($this->getHP() <= 0){ return false; }