Refactor(sendunitsComplete): extract buildDefenderUnits() [#155]

The defender's units were gathered by two near-identical inline blocks
(village and oasis targets). Extract them into a single private method
buildDefenderUnits() returning the defender's own troops (normalised to
non-negative ints), the aggregated reinforcement totals (enforDefender) and
the raw reinforcement rows (enforcementarray).

Pure behaviour-preserving extraction:
- Both call sites assign the returned bundle; all downstream usages unchanged.
- The oasis reinforcement aggregation now uses the same isset-guarded loop as
  the village one: identical numeric result, minus a latent PHP 8.3
  "undefined array key" notice.
- The dead `$def_ab[$i] = 0` init that lived in the village normalisation loop
  is dropped: it was unconditionally wiped by the later `$def_ab = []` before
  any use.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Ferywir
2026-06-15 14:39:03 +02:00
committed by Catalin Novgorodschi
parent 6edd4cc4a9
commit 89b0fa50f5
+58 -54
View File
@@ -2199,6 +2199,54 @@ class Automation {
];
}
/**
* Gather the defender's units for the current attack: the village's own
* troops (normalised to non-negative ints) plus the aggregated reinforcement
* totals, and the raw reinforcement rows. Used for both village and oasis
* targets. Pure behaviour-preserving extraction (issue #155).
*
* @param int $wref Defending village/oasis wref.
* @return array { Defender, enforDefender, enforcementarray }
*/
private function buildDefenderUnits($wref) {
global $database;
$enforDefender = [];
$Defender = $database->getUnit($wref, false);
$enforcementarray = $database->getEnforceVillage($wref, 0);
if (count($enforcementarray) > 0) {
foreach ($enforcementarray as $enforce) {
for ($i = 1; $i <= 50; $i++) {
if (!isset($enforDefender['u'.$i])) {
$enforDefender['u'.$i] = 0;
}
$enforDefender['u'.$i] += $enforce['u'.$i];
}
if (!isset($enforDefender['hero'])) {
$enforDefender['hero'] = 0;
}
$enforDefender['hero'] += $enforce['hero'];
}
}
for ($i = 1; $i <= 50; $i++) {
if (!isset($Defender['u'.$i]) || empty($Defender['u'.$i]) || $Defender['u'.$i] < 0) {
$Defender['u'.$i] = 0;
}
}
if (!isset($Defender['hero']) || empty($Defender['hero']) || $Defender['hero'] < 0) {
$Defender['hero'] = 0;
}
return [
'Defender' => $Defender,
'enforDefender' => $enforDefender,
'enforcementarray' => $enforcementarray,
];
}
private function sendunitsComplete() {
// PROCESARE ATACURI COMPLETE - functie critica, pastrata 100% compatibila
// Aceasta functie gestioneaza toate atacurile care ajung la destinatie
@@ -2265,38 +2313,12 @@ class Automation {
$this->handleEvasion($data, $DefenderID, $DefenderUnit, $targettribe, $evasion, $maxevasion, $gold, $cannotsend, $dataarray[$data_num]['attack_type']);
//get defence units
$enforDefender = [];
// defence units gathered — extracted to buildDefenderUnits() [#155]
$rom = $ger = $gal = $nat = $natar = 0;
$Defender = $database->getUnit($data['to'], false);
$enforcementarray = $database->getEnforceVillage($data['to'], 0);
if(count($enforcementarray) > 0) {
foreach($enforcementarray as $enforce) {
for($i = 1; $i <= 50; $i++){
if(!isset($enforDefender['u'.$i])){
$enforDefender['u'.$i] = 0;
}
$enforDefender['u'.$i] += $enforce['u'.$i];
}
if (!isset($enforDefender['hero'])) {
$enforDefender['hero'] = 0;
}
$enforDefender['hero'] += $enforce['hero'];
}
}
for($i = 1; $i <= 50; $i++){
$def_ab[$i] = 0;
if(!isset($Defender['u'.$i]) || empty($Defender['u'.$i]) || $Defender['u'.$i] < 0) {
$Defender['u'.$i] = 0;
}
}
if(!isset($Defender['hero']) || empty($Defender['hero']) || $Defender['hero'] < 0) {
$Defender['hero'] = 0;
}
$defUnits = $this->buildDefenderUnits($data['to']);
$Defender = $defUnits['Defender'];
$enforDefender = $defUnits['enforDefender'];
$enforcementarray = $defUnits['enforcementarray'];
// attacker army built — extracted to buildAttackerUnits() [#155]
$atkUnits = $this->buildAttackerUnits($dataarray[$data_num], $owntribe, $isoasis);
@@ -2366,30 +2388,12 @@ class Automation {
$to = $database->getOMInfo($data['to']);
$toF = $database->getOasisV($data['to']);
$conqureby = $toF['conqured'];
//get defence units
$enforDefender = [];
// defence units gathered — extracted to buildDefenderUnits() [#155]
$rom = $ger = $gal = $nat = $natar = 0;
$Defender = $database->getUnit($data['to'], false);
$enforcementarray = $database->getEnforceVillage($data['to'],0);
if(count($enforcementarray) > 0) {
foreach($enforcementarray as $enforce) {
for($i = 1;$i <= 50; $i++) {
$enforDefender['u'.$i] += $enforce['u'.$i];
}
$enforDefender['hero'] += $enforce['hero'];
}
}
for($i = 1; $i <= 50; $i++){
if(!isset($Defender['u'.$i]) || empty($Defender['u'.$i]) || $Defender['u'.$i] < 0) {
$Defender['u'.$i] = 0;
}
}
if(!isset($Defender['hero']) || empty($Defender['hero']) || $Defender['hero'] < 0) {
$Defender['hero'] = 0;
}
$defUnits = $this->buildDefenderUnits($data['to']);
$Defender = $defUnits['Defender'];
$enforDefender = $defUnits['enforDefender'];
$enforcementarray = $defUnits['enforcementarray'];
// attacker army built — extracted to buildAttackerUnits() [#155]
$atkUnits = $this->buildAttackerUnits($dataarray[$data_num], $owntribe, $isoasis);