From c599838dc81287963c2e0f51da57040c7f9a32d7 Mon Sep 17 00:00:00 2001 From: iopietro Date: Sun, 29 Apr 2018 12:49:45 +0200 Subject: [PATCH] Fixed a spy bug +Attacking spies will now die if they're detected and the enemy has spies in reinforcement --- GameEngine/Automation.php | 36 ++-------- GameEngine/Battle.php | 142 +++++++++++++++++++------------------- 2 files changed, 79 insertions(+), 99 deletions(-) diff --git a/GameEngine/Automation.php b/GameEngine/Automation.php index 18f8e758..29c0a9d0 100755 --- a/GameEngine/Automation.php +++ b/GameEngine/Automation.php @@ -1453,14 +1453,14 @@ class Automation { $toF = $database->getOasisV($data['to']); $conqureby=$toF['conqured']; //get defence units - $enforDefender = array(); + $enforDefender = []; $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++) { + for($i = 1;$i <= 50; $i++) { $enforDefender['u'.$i] += $enforce['u'.$i]; } $enforDefender['hero'] += $enforce['hero']; @@ -1470,7 +1470,7 @@ class Automation { 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) { @@ -1681,20 +1681,16 @@ class Automation { //fix by ronix //MUST TO BE FIX : You need to filter these values //filter_input_array($battlepart = $battle->calculateBattle($Attacker,$Defender,$def_wall,$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,$walllevel,0,0,0,$AttackerID,$DefenderID,$AttackerWref,$DefenderWref,$conqureby)); - if (!isset($walllevel)) { - $walllevel = 0; - } + if (!isset($walllevel)) $walllevel = 0; $battlepart = $battle->calculateBattle($Attacker,$Defender,$def_wall,$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,$walllevel,0,0,0,$AttackerID,$DefenderID,$AttackerWref,$DefenderWref,$conqureby, $enforcementarray); //units attack string for battleraport $unitssend_att = ''.$data['t1'].','.$data['t2'].','.$data['t3'].','.$data['t4'].','.$data['t5'].','.$data['t6'].','.$data['t7'].','.$data['t8'].','.$data['t9'].','.$data['t10'].''; $herosend_att = $data['t11']; - if ($herosend_att>0){ - $unitssend_att_check=$unitssend_att.','.$data['t11']; - }else{ - $unitssend_att_check=$unitssend_att; - } + + if ($herosend_att > 0) $unitssend_att_check=$unitssend_att.','.$data['t11']; + else $unitssend_att_check=$unitssend_att; //Resetting the enforcement arrays for($i = 1; $i <= 50; $i++) { @@ -1756,24 +1752,6 @@ class Automation { ${'dead'.$i} = (isset($battlepart['casualties_attacker']) && isset($battlepart['casualties_attacker'][$i]) ? $battlepart['casualties_attacker'][$i] : 0); } } - //if the defender does not have spies, the attacker will not die spies. FIXED BY Armando - if(!empty($scout) && $scout){ - $spy_def_Detect=0; - for($i=1;$i<=(50);$i++) { - if($i == 4 || $i == 14 || $i == 23 || $i == 34 || $i == 44){ - if($Defender['u'.$i]>0) { - $spy_def_Detect=$i; - break; - } - } - } - if($spy_def_Detect==0) { - $dead3=0; - $dead4=0; - $battlepart['casualties_attacker'][3]=0; - $battlepart['casualties_attacker'][4]=0; - } - } ################################################# diff --git a/GameEngine/Battle.php b/GameEngine/Battle.php index e826ad24..21a9655d 100755 --- a/GameEngine/Battle.php +++ b/GameEngine/Battle.php @@ -281,17 +281,17 @@ class Battle { $defenderhero = $this->getBattleHero($DefenderID); } //own defender units - if ($type==1) { - $datadefScout=$this->getDataDefScout($Defender,$def_ab,$defender_artefact,$AttackerWref,$AttackerID); - $dp+=$datadefScout['dp']; - $cdp+=$datadefScout['cdp']; - $involve=$datadefScout['involve']; - if ($datadefScout['detect']==1) $detected = 1; + if ($type == 1) { + $datadefScout = $this->getDataDefScout($Defender, $def_ab, $defender_artefact); + $dp += $datadefScout['dp']; + $cdp += $datadefScout['cdp']; + $involve = $datadefScout['involve']; + if ($datadefScout['detect'] == 1) $detected = 1; }else{ - $datadef=$this->getDataDef($Defender,$def_ab); - $dp+=$datadef['dp']; - $cdp+=$datadef['cdp']; - $involve=$datadef['involve']; + $datadef = $this->getDataDef($Defender, $def_ab); + $dp += $datadef['dp']; + $cdp += $datadef['cdp']; + $involve = $datadef['involve']; if(isset($Defender['hero']) && $Defender['hero'] != 0){ $units['Def_unit']['hero'] = $Defender['hero']; $cdp += $defenderhero['dc']; @@ -300,9 +300,9 @@ class Battle { $cdp *= $defenderhero['db']; } } - $DefendersAll = (!is_null($defReinforcements) ? $database->getEnforceVillage($DefenderWref,0) : $defReinforcements); + $DefendersAll = (!is_null($defReinforcements) ? $database->getEnforceVillage($DefenderWref, 0) : $defReinforcements); - if(!empty($DefendersAll) && $DefenderWref>0){ + if(!empty($DefendersAll) && $DefenderWref > 0){ // preload village IDs $vilIDs = []; foreach($DefendersAll as $defenders) { @@ -313,55 +313,54 @@ class Battle { $database->getABTech($vilIDs); foreach($DefendersAll as $defenders) { - for ($i=1;$i<=50;$i++) {$def_ab[$i]=0;} + for ($i = 1; $i <= 50; $i++) $def_ab[$i] = 0; $fromvillage = $defenders['from']; - $userdataCache[$fromvillage] = $database->getUserArray($database->getVillageField($fromvillage,"owner"), 1); + $userdataCache[$fromvillage] = $database->getUserArray($database->getVillageField($fromvillage, "owner"), 1); $enforcetribe = $userdataCache[$fromvillage]["tribe"]; - $ud=($enforcetribe-1)*10; - if($defenders['from']>0) { //don't check nature tribe + $ud=($enforcetribe - 1) * 10; + if($defenders['from'] > 0) { //don't check nature tribe $armory = $database->getABTech($defenders['from']); // Armory level every village enforcement - $def_ab[$ud+1] = $armory['a1']; - $def_ab[$ud+2] = $armory['a2']; - $def_ab[$ud+3] = $armory['a3']; - $def_ab[$ud+4] = $armory['a4']; - $def_ab[$ud+5] = $armory['a5']; - $def_ab[$ud+6] = $armory['a6']; - $def_ab[$ud+7] = $armory['a7']; - $def_ab[$ud+8] = $armory['a8']; + $def_ab[$ud + 1] = $armory['a1']; + $def_ab[$ud + 2] = $armory['a2']; + $def_ab[$ud + 3] = $armory['a3']; + $def_ab[$ud + 4] = $armory['a4']; + $def_ab[$ud + 5] = $armory['a5']; + $def_ab[$ud + 6] = $armory['a6']; + $def_ab[$ud + 7] = $armory['a7']; + $def_ab[$ud + 8] = $armory['a8']; } - if ($type==1) { - $datadefScout=$this->getDataDefScout($defenders,$def_ab,$defender_artefact,$AttackerWref,$AttackerID); - $dp+=$datadefScout['dp']; - $cdp+=$datadefScout['cdp']; - $involve=$datadefScout['involve']; - if ($datadefScout['detect']==1) $detected = 1; + if ($type == 1) { + $datadefScout = $this->getDataDefScout($defenders, $def_ab, $defender_artefact); + $dp += $datadefScout['dp']; + $cdp += $datadefScout['cdp']; + $involve = $datadefScout['involve']; + if ($datadefScout['detect'] == 1) $detected = 1; }else{ - $datadef=$this->getDataDef($defenders,$def_ab); - $dp+=$datadef['dp']; - $cdp+=$datadef['cdp']; - $involve=$datadef['involve']; + $datadef = $this->getDataDef($defenders, $def_ab); + $dp += $datadef['dp']; + $cdp += $datadef['cdp']; + $involve = $datadef['involve']; } - $reinfowner = $database->getVillageField($fromvillage,"owner"); + $reinfowner = $database->getVillageField($fromvillage, "owner"); $defhero = $this->getBattleHero($reinfowner); + //calculate def hero from enforcement if($defenders['hero'] != 0){ - //$cdp += $defhero['dc']; - //$dp += $defhero['di']; + $cdp += $defhero['dc']; + $dp += $defhero['di']; $dp *= $defhero['db']; $cdp *= $defhero['db']; } } } // Calculate the total number of points Attacker - $start = ($att_tribe-1)*10+1; - $end = ($att_tribe*10); - if($att_tribe == 3){ - $abcount = 3; - }else{ - $abcount = 4; - } + $start = ($att_tribe - 1) * 10 + 1; + $end = $att_tribe * 10; + + if($att_tribe == 3) $abcount = 3; + else $abcount = 4; if($type == 1) {//scout for($i = $start;$i <= $end; $i++) { @@ -494,41 +493,45 @@ class Battle { // Formula for calculating the Moral if($attpop > $defpop) { $moralbonus = 1 / round(max(0.667, pow($defpop / $attpop, 0.2 * min(1, $rap / ($rdp > 0 ? $rdp : 1)))), 3); - }else{ - $moralbonus = 1.0; } + else $moralbonus = 1.0; if($involve >= 1000 && $type != 1) { - $Mfactor = 2*round((1.8592-pow($involve,0.015)),4); - }else{ - $Mfactor = 1.5; + $Mfactor = 2 * round((1.8592 - pow($involve, 0.015)), 4); } - if ($Mfactor < 1.2578){$Mfactor=1.2578;}elseif ($Mfactor > 1.5){$Mfactor=1.5;} - // Formula for calculating lost drives - // $type = 1 scout, 2? - // $type = 3 Normal, 4 Raid + else $Mfactor = 1.5; + + if ($Mfactor < 1.2578) $Mfactor = 1.2578; + elseif ($Mfactor > 1.5) $Mfactor = 1.5; + + // Formula for calculating losses + // $type = 1 Scout, 2 Enforcement + // $type = 3 Normal, 4 Raid if($type == 1){ - $holder = pow((($rdp*$moralbonus)/$rap),$Mfactor); - if($holder>1) $holder=1; - if ($rdp>$rap) $holder=1; + $holder = pow((($rdp * $moralbonus) / $rap), $Mfactor); + if($holder > 1) $holder = 1; + if ($rdp > $rap) $holder = 1; // Attacker $result[1] = $holder; - if ($att_tribe==5) $result[1] = 0; //Birds of Prey cannot die when scout + + //Birds of Prey cannot die when scouting + //Spies cannot die if the attacked village has no defending spies + if ($att_tribe == 5 || !$detected) $result[1] = 0; // Defender $result[2] = 0; }else if($type == 2){ }else if($type == 4) { - $holder = ($winner) ? pow((($rdp*$moralbonus)/$rap),$Mfactor) : pow(($rap/($rdp*$moralbonus)),$Mfactor); + $holder = ($winner) ? pow((($rdp * $moralbonus) / $rap), $Mfactor) : pow(($rap / ($rdp * $moralbonus)), $Mfactor); $holder = $holder / (1 + $holder); // Attacker $result[1] = $winner ? $holder : 1 - $holder; // Defender $result[2] = $winner ? 1 - $holder : $holder; - $ram -= round($ram*$result[1]/100); - $catp -= round($catp*$result[1]/100); + $ram -= round($ram * $result[1] / 100); + $catp -= round($catp * $result[1] / 100); }else if($type == 3){ // Attacker @@ -603,16 +606,15 @@ class Battle { $result['rams']['realAttackers'] = $wctp; } - $result[6] = pow($rap/($rdp*$moralbonus > 0 ? $rdp*$moralbonus : 1),$Mfactor); + $result[6] = pow($rap / ($rdp * $moralbonus > 0 ? $rdp * $moralbonus : 1), $Mfactor); $total_att_units = count($units['Att_unit']); - $start = intval(($att_tribe-1)*10+1); - $end = intval(($att_tribe*10)); + $start = intval(($att_tribe - 1) * 10 + 1); + $end = intval($att_tribe * 10); - for($i=$start;$i <= $end;$i++){ - $y = $i-(($att_tribe-1)*10); - $result['casualties_attacker'][$y] = round($result[1]*$units['Att_unit'][$i]); - + for($i = $start; $i <= $end; $i++){ + $y = $i - (($att_tribe - 1) * 10); + $result['casualties_attacker'][$y] = round($result[1] * $units['Att_unit'][$i]); } if (isset($units['Att_unit']['hero']) && $units['Att_unit']['hero'] >0){ @@ -698,10 +700,10 @@ class Battle { return $result; } - public function getDataDefScout($defenders, $def_ab, $defender_artefact, $AttackerWref, $AttackerID) { + public function getDataDefScout($defenders, $def_ab, $defender_artefact) { $abcount = 1; $invol = $dp = $cdp = $detected = 0; - + for($y = 4; $y <= 54; $y++) { if($y == 4 || $y == 14 || $y == 23 || $y == 44){ global ${'u'.$y}; @@ -710,7 +712,7 @@ class Battle { $dp += round(20 + (20 + 300 * ${'u'.$y}['pop'] / 7) * (pow(1.007, $def_ab[$y]) - 1), 4) * $defenders['u'.$y] * $defender_artefact; }else { if($defenders['u'.$y] > 0) { - $dp += $defenders['u'.$y]* 20 * $defender_artefact; + $dp += $defenders['u'.$y] * 20 * $defender_artefact; } $units['Def_unit'][$y] = $defenders['u'.$y];