diff --git a/GameEngine/Automation.php b/GameEngine/Automation.php index 22d6a657..aba5a7da 100644 --- a/GameEngine/Automation.php +++ b/GameEngine/Automation.php @@ -2094,6 +2094,57 @@ class Automation { ]; } + /** + * Apply ram damage to the defender's wall during a normal attack (type 3): + * compute the new wall level, update it in the database (recounting the + * village population if the wall is destroyed), build the report fragment, + * and recalculate the battle when the wall level changed. + * Pure behaviour-preserving extraction (refactor for issue #155). + * + * @param array $data Current attack row (uses t7, to). + * @param int $walllevel Current wall level. + * @param int $wallid Wall building field id (40). + * @param int $ram_pic Ram unit id (for the report fragment). + * @param array $battlepart Battle result (provides the ram damage factors). + * @param array $ctx Battle context for the post-damage recalculation + * (Attacker, Defender, tribes, populations, AB tech, ...). + * @return array { battlepart: array (possibly recalculated), info_ram: string } + */ + private function applyRamDamage($data, $walllevel, $wallid, $ram_pic, $battlepart, array $ctx) { + global $database, $battle; + + $info_ram = "".$ram_pic.",There is no wall to destroy."; + + if($walllevel > 0){ + $ramsDamage = $battle->calculateCatapultsDamage($data['t7'], + $battlepart['rams']['upgrades'], + $battlepart['rams']['durability'], + $battlepart['rams']['attackDefenseRatio'], + $battlepart['rams']['strongerBuildings'], + $battlepart['rams']['moraleBonus']); + $newLevel = $battle->calculateNewBuildingLevel($walllevel, $ramsDamage); + + if ($newLevel == 0){ + $info_ram = "".$ram_pic.",Wall destroyed."; + $database->setVillageLevel($data['to'], ["f".$wallid, "f".$wallid."t"], [0, 0]); + $this->recountPop($data['to']); + }elseif ($newLevel == $walllevel){ + $info_ram = "".$ram_pic.",Wall was not damaged."; + }else{ + $info_ram = "".$ram_pic.",Wall damaged from level ".$walllevel." to level ".$newLevel."."; + $database->setVillageLevel($data['to'],"f".$wallid."",$newLevel); + } + + //If the wall got damaged/destroyed during the attack + //we need to recalculate the whole battle + if($newLevel != $walllevel){ + $battlepart = $battle->calculateBattle($ctx['Attacker'], $ctx['Defender'], $newLevel, $ctx['att_tribe'], $ctx['def_tribe'], $ctx['residence'], $ctx['attpop'], $ctx['defpop'], $ctx['type'], $ctx['def_ab'], $ctx['att_ab1'], $ctx['att_ab2'], $ctx['att_ab3'], $ctx['att_ab4'], $ctx['att_ab5'], $ctx['att_ab6'], $ctx['att_ab7'], $ctx['att_ab8'], $ctx['tblevel'], $ctx['stonemason'], $newLevel, 0, 0, 0, $ctx['AttackerID'], $ctx['DefenderID'], $ctx['AttackerWref'], $ctx['DefenderWref'], $ctx['conqureby'], $ctx['enforcementarray']); + } + } + + return ['battlepart' => $battlepart, 'info_ram' => $info_ram]; + } + private function sendunitsComplete() { // PROCESARE ATACURI COMPLETE - functie critica, pastrata 100% compatibila // Aceasta functie gestioneaza toate atacurile care ajung la destinatie @@ -2409,33 +2460,21 @@ class Automation { if($isoasis == 0){ if ($type == 3){ if (($data['t7'] - $traped7) > 0){ - if($walllevel > 0){ - $ramsDamage = $battle->calculateCatapultsDamage($data['t7'], - $battlepart['rams']['upgrades'], - $battlepart['rams']['durability'], - $battlepart['rams']['attackDefenseRatio'], - $battlepart['rams']['strongerBuildings'], - $battlepart['rams']['moraleBonus']); - $newLevel = $battle->calculateNewBuildingLevel($walllevel, $ramsDamage); - - if ($newLevel == 0){ - $info_ram = "".$ram_pic.",Wall destroyed."; - $database->setVillageLevel($data['to'], ["f".$wallid, "f".$wallid."t"], [0, 0]); - $pop = $this->recountPop($data['to']); - }elseif ($newLevel == $walllevel){ - $info_ram = "".$ram_pic.",Wall was not damaged."; - }else{ - $info_ram = "".$ram_pic.",Wall damaged from level ".$walllevel." to level ".$newLevel."."; - $database->setVillageLevel($data['to'],"f".$wallid."",$newLevel); - } - - //If the wall got damaged/destroyed during the attack - //we need to recalculate the whole battle - if($newLevel != $walllevel){ - $battlepart = $battle->calculateBattle($Attacker, $Defender, $newLevel, $att_tribe, $def_tribe, $residence, $attpop, $defpop, $type, $def_ab, $att_ab1, $att_ab2, $att_ab3, $att_ab4, $att_ab5, $att_ab6, $att_ab7, $att_ab8, $tblevel, $stonemason, $newLevel, 0, 0, 0, $AttackerID, $DefenderID, $AttackerWref, $DefenderWref, $conqureby, $enforcementarray); - } - } - else $info_ram = "".$ram_pic.",There is no wall to destroy."; + // ram damage on the wall (+ battle recalc) — extracted to applyRamDamage() [#155] + $ramResult = $this->applyRamDamage($data, $walllevel, $wallid, $ram_pic, $battlepart, [ + 'Attacker' => $Attacker, 'Defender' => $Defender, + 'att_tribe' => $att_tribe, 'def_tribe' => $def_tribe, + 'residence' => $residence, 'attpop' => $attpop, 'defpop' => $defpop, + 'type' => $type, 'def_ab' => $def_ab, + 'att_ab1' => $att_ab1, 'att_ab2' => $att_ab2, 'att_ab3' => $att_ab3, 'att_ab4' => $att_ab4, + 'att_ab5' => $att_ab5, 'att_ab6' => $att_ab6, 'att_ab7' => $att_ab7, 'att_ab8' => $att_ab8, + 'tblevel' => $tblevel, 'stonemason' => $stonemason, + 'AttackerID' => $AttackerID, 'DefenderID' => $DefenderID, + 'AttackerWref' => $AttackerWref, 'DefenderWref' => $DefenderWref, + 'conqureby' => $conqureby, 'enforcementarray' => $enforcementarray, + ]); + $battlepart = $ramResult['battlepart']; + $info_ram = $ramResult['info_ram']; } if (($data['t8'] - $traped8) > 0)