diff --git a/hwe/j_simulate_battle.php b/hwe/j_simulate_battle.php index c66c0e6b..768eb47a 100644 --- a/hwe/j_simulate_battle.php +++ b/hwe/j_simulate_battle.php @@ -293,9 +293,12 @@ if(!$v->validate()){ ]); } +$attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), $rawAttackerCity, $rawAttackerNation, $year, $month); + if($action == 'reorder'){ - usort($defenderList, function(General $lhs, General $rhs){ - return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs)); + + usort($defenderList, function(General $lhs, General $rhs) use ($attackerGeneral){ + return -(extractBattleOrder($lhs, $attackerGeneral) <=> extractBattleOrder($rhs, $attackerGeneral)); }); $order = []; @@ -310,8 +313,8 @@ if($action == 'reorder'){ ]); } -usort($defenderList, function(General $lhs, General $rhs){ - return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs)); +usort($defenderList, function(General $lhs, General $rhs) use ($attackerGeneral){ + return -(extractBattleOrder($lhs, $attackerGeneral) <=> extractBattleOrder($rhs, $attackerGeneral)); }); $rawDefenderList = array_map(function(General $general){ @@ -347,9 +350,10 @@ function simulateBattle( $warRng = new RandUtil(new LiteHashDRBG($warSeed)); + $attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), $rawAttackerCity, $rawAttackerNation, $year, $month); $attacker = new WarUnitGeneral( $warRng, - new General($rawAttacker, extractRankVar($rawAttacker), $rawAttackerCity, $rawAttackerNation, $year, $month), + $attackerGeneral, $rawAttackerNation, true ); @@ -364,7 +368,7 @@ function simulateBattle( $defenderRice = 0; $getNextDefender = function(?WarUnit $prevDefender, bool $reqNext) - use ($warRng, $iterDefender, $rawDefenderCity, $rawDefenderNation, $year, $month, &$battleResult, &$defenderRice) { + use ($warRng, $iterDefender, $rawDefenderCity, $rawDefenderNation, $year, $month, &$battleResult, &$defenderRice, $attackerGeneral) { if($prevDefender !== null){ $prevDefender->getLogger()->rollback(); $battleResult[] = $prevDefender; @@ -382,7 +386,7 @@ function simulateBattle( } $defenderObj = new General($iterDefender->current(), extractRankVar($iterDefender->current()), $rawDefenderCity, $rawDefenderNation, $year, $month); - if(extractBattleOrder($defenderObj) <= 0){ + if(extractBattleOrder($defenderObj, $attackerGeneral) <= 0){ return null; } diff --git a/hwe/process_war.php b/hwe/process_war.php index 51139d44..2203f97b 100644 --- a/hwe/process_war.php +++ b/hwe/process_war.php @@ -39,14 +39,14 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke $defenderIDList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND city=%i AND nation!=0 and crew > 0 and rice>(crew/100) and train>=defence_train and atmos>=defence_train', $city->getVar('nation'), $city->getVar('city')); $defenderList = General::createGeneralObjListFromDB($defenderIDList, null, 2); - usort($defenderList, function (General $lhs, General $rhs) { - return - (extractBattleOrder($lhs) <=> extractBattleOrder($rhs)); + usort($defenderList, function (General $lhs, General $rhs) use ($attackerGeneral) { + return - (extractBattleOrder($lhs, $attackerGeneral) <=> extractBattleOrder($rhs, $attackerGeneral)); }); $iterDefender = new \ArrayIterator($defenderList); $iterDefender->rewind(); - $getNextDefender = function (?WarUnit $prevDefender, bool $reqNext) use ($rng, $iterDefender, $rawDefenderNation, $rawDefenderCity, $db) { + $getNextDefender = function (?WarUnit $prevDefender, bool $reqNext) use ($rng, $iterDefender, $rawDefenderNation, $rawDefenderCity, $db, $attackerGeneral) { if ($prevDefender !== null) { $prevDefender->applyDB($db); } @@ -61,7 +61,7 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke $nextDefender = $iterDefender->current(); $nextDefender->setRawCity($rawDefenderCity); - if (extractBattleOrder($nextDefender) <= 0) { + if (extractBattleOrder($nextDefender, $attackerGeneral) <= 0) { return null; } @@ -180,7 +180,7 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke ], $attacker->getGeneral(), $city->getRaw()); } -function extractBattleOrder(General $general) +function extractBattleOrder(General $general, General $attackerGeneral) { if ($general->getVar('crew') == 0) { return 0;