Fixed a spy bug

+Attacking spies will now die if they're detected and the enemy has
spies in reinforcement
This commit is contained in:
iopietro
2018-04-29 12:49:45 +02:00
parent 58e72bf61e
commit c599838dc8
2 changed files with 79 additions and 99 deletions
+7 -29
View File
@@ -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;
}
}
#################################################
+72 -70
View File
@@ -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];