From d768929d18f7f94674570331a32dd3b89e07c479 Mon Sep 17 00:00:00 2001 From: Martin Ambrus Date: Sat, 18 Nov 2017 20:42:26 +0100 Subject: [PATCH] fix: catapults do not work correctly or sometimes not at all --- GameEngine/Automation.php | 120 +++++++++++++++++++++++++------------- 1 file changed, 81 insertions(+), 39 deletions(-) diff --git a/GameEngine/Automation.php b/GameEngine/Automation.php index 96c2516a..2aeeabe8 100755 --- a/GameEngine/Automation.php +++ b/GameEngine/Automation.php @@ -167,10 +167,10 @@ class Automation { return addslashes($build); } - function recountPop($vid){ + function recountPop($vid, $use_cache = true){ global $database; $vid = (int) $vid; - $fdata = $database->getResourceLevel($vid); + $fdata = $database->getResourceLevel($vid, $use_cache); $popTot = 0; for ($i = 1; $i <= 40; $i++) { @@ -1011,13 +1011,6 @@ class Automation { // building/field destroyed if ($battlepart[4]>$battlepart[3]) { - if ($isSecondRow) { - $info_cat .= "
Information - \"Catapult\" ".$this->procResType($tbgid,$can_destroy,$isoasis)." destroyed."; - } else { - $info_cat = "" . $catp_pic . ", " . $this->procResType( $tbgid, $can_destroy, $isoasis ) . " destroyed."; - } - // prepare data to be updated $fieldsToSet = ["f".$tbid]; $fieldValuesToSet = [0]; @@ -1053,11 +1046,20 @@ class Automation { // oasis cannot be destroyed if ($isoasis == 0) { - $pop=$this->recountPop($data['to']); + $pop=$this->recountPop($data['to'], false); if($pop==0 && $can_destroy==1){ $village_destroyed = 1; + // this will ensure the right $info_cat text + $tbgid = 0; } } + + if ($isSecondRow) { + $info_cat .= "
Information + \"Catapult\" ".$this->procResType($tbgid,$can_destroy,$isoasis)." destroyed."; + } else { + $info_cat = "" . $catp_pic . ", " . $this->procResType( $tbgid, $can_destroy, $isoasis ) . " destroyed."; + } } // building/field not damaged elseif ($battlepart[4]==0) @@ -1083,8 +1085,8 @@ class Automation { } // don't allow this to go below 0 - if ($totallvl <= 0) { - $totallvl = 1; + if ($totallvl < 0) { + $totallvl = 0; } // no damage to the building/field @@ -1095,7 +1097,14 @@ class Automation { // update $bdo, so we don't have to reselect later $bdo[ 'f' . $catapultTarget ] = $totallvl; - $info_cata = " damaged from level " . $tblevel . " to level " . $totallvl . "."; + if ($tblevel == 1 && $totallvl == 0) { + // building was actually destroyed - recalculate population and remove village itself, if needed + $info_cata = " destroyed."; + } else { + // building was damaged to a lower level + $info_cata = " damaged from level " . $tblevel . " to level " . $totallvl . "."; + } + $buildarray = $GLOBALS[ "bid" . $tbgid ]; // (great) warehouse level was changed @@ -1112,10 +1121,26 @@ class Automation { if ( $tbgid == 18 ) { $info_cat .= $database->checkEmbassiesAfterBattle( $data['to'], false ); } + } - // no need to recalculate population of oasis, as there is none - if ( $isoasis == 0 ) { - $pop = $this->recountPop( $data['to'] ); + $fieldsToSet = ["f" . $tbid]; + $fieldValuesToSet = [$totallvl]; + + if ($totallvl == 0) { + $fieldsToSet[] = "f" . $tbid . "t"; + $fieldValuesToSet[] = 0; + $bdo['f'.$catapultTarget."t"] = 0; + } + + $database->setVillageLevel( $data['to'], $fieldsToSet, $fieldValuesToSet ); + + // recalculate population and check if the village shouldn't be destroyed at this point + $pop = $this->recountPop( $data['to'], false ); + if ($isoasis == 0) { + if($pop==0 && $can_destroy==1){ + $village_destroyed = 1; + // this will ensure the right $info_cat text + $tbgid = 0; } } @@ -1125,7 +1150,6 @@ class Automation { } else { $info_cat = "" . $catp_pic . "," . $this->procResType( $tbgid, $can_destroy, $isoasis ) . $info_cata; } - $database->setVillageLevel( $data['to'], "f" . $tbid, $totallvl ); } } @@ -1223,19 +1247,23 @@ class Automation { $playerunit -= $i; $totaltroops += $data['u'.$i]; } - // modify units in DB - $database->modifyUnit($data['to'], $evasionUnitModifications_units, $evasionUnitModifications_amounts, $evasionUnitModifications_modes); $data['u11'] = $DefenderUnit['hero']; $totaltroops += $data['u11']; if($totaltroops > 0){ - $database->modifyUnit($data['to'],array("hero"),array($DefenderUnit['hero']),array(0)); + $evasionUnitModifications_units[] = 'hero'; + $evasionUnitModifications_amounts[] = $DefenderUnit['hero']; + $evasionUnitModifications_modes[] = 0; + $attackid = $database->addAttack($data['to'],$data['u1'],$data['u2'],$data['u3'],$data['u4'],$data['u5'],$data['u6'],$data['u7'],$data['u8'],$data['u9'],$data['u10'],$data['u11'],4,0,0,0,0,0,0,0,0,0,0,0); $database->addMovement(4,0,$data['to'],$attackid,microtime(true),microtime(true)+(180/EVASION_SPEED)); $newgold = $gold-2; $newmaxevasion = $maxevasion-1; $database->updateUserField($DefenderID, ["gold", "maxevasion"], [$newgold, $newmaxevasion], 1); } + + // modify units in DB + $database->modifyUnit($data['to'], $evasionUnitModifications_units, $evasionUnitModifications_amounts, $evasionUnitModifications_modes); } //get defence units $enforDefender = array(); @@ -1689,13 +1717,20 @@ class Automation { $unitModifications_modes[] = 0; } } - // modify units in DB - $database->modifyUnit($data['to'], $unitModifications_units, $unitModifications_amounts, $unitModifications_modes); - $owndead['hero']='0'; + + $owndead['hero'] = 0; + if($unitlist){ $owndead['hero'] = (isset($battlepart['deadherodef']) ? $battlepart['deadherodef'] : ''); - $database->modifyUnit($data['to'],array("hero"),array($owndead['hero']),array(0)); + + $unitModifications_units[] = 'hero'; + $unitModifications_amounts[] = $owndead['hero']; + $unitModifications_modes[] = 0; } + + // modify units in DB + $database->modifyUnit($data['to'], $unitModifications_units, $unitModifications_amounts, $unitModifications_modes); + //kill other defence in village // ... once again, units could have changed, so we need to reselect $enforcementarray3 = $database->getEnforceVillage($data['to'],0, false); @@ -1742,19 +1777,23 @@ class Automation { } } - // modify enforce in DB - foreach ($enforceModificationsById as $enforceId => $enforceArray) { - $database->modifyEnforce( $enforceId, $enforceArray['units'], $enforceArray['amounts'], $enforceArray['modes']); - } + if($enforce['hero'] > 0) { + $enforceModificationsById[$enforce['id']]['units'][] = 'hero'; + $enforceModificationsById[$enforce['id']]['amounts'][] = $battlepart['deadheroref'][$enforce['id']]; + $enforceModificationsById[$enforce['id']]['modes'][] = 0; - if($enforce['hero']>'0'){ - $database->modifyEnforce($enforce['id'],"hero",$battlepart['deadheroref'][$enforce['id']],0); $dead['hero']=$battlepart['deadheroref'][$enforce['id']]; $alldead['hero']+=$dead['hero']; if($dead['hero']!=$enforce['hero']){ $wrong='1'; } } + + // modify enforce in DB + foreach ($enforceModificationsById as $enforceId => $enforceArray) { + $database->modifyEnforce( $enforceId, $enforceArray['units'], $enforceArray['amounts'], $enforceArray['modes']); + } + $notlife= ''.$dead[$start].','.$dead[$start+1].','.$dead[$start+2].','.$dead[$start+3].','.$dead[$start+4].','.$dead[$start+5].','.$dead[$start+6].','.$dead[$start+7].','.$dead[$start+8].','.$dead[$start+9].''; $notlife1 = $dead[$start]+$dead[$start+1]+$dead[$start+2]+$dead[$start+3]+$dead[$start+4]+$dead[$start+5]+$dead[$start+6]+$dead[$start+7]+$dead[$start+8]+$dead[$start+9]; $life= ''.$enforce['u'.$start.''].','.$enforce['u'.($start+1).''].','.$enforce['u'.($start+2).''].','.$enforce['u'.($start+3).''].','.$enforce['u'.($start+4).''].','.$enforce['u'.($start+5).''].','.$enforce['u'.($start+6).''].','.$enforce['u'.($start+7).''].','.$enforce['u'.($start+8).''].','.$enforce['u'.($start+9).''].''; @@ -2158,14 +2197,13 @@ class Automation { { // village stands, let's do the damage $basearray = $data['to']; - - $bdo=mysqli_fetch_array(mysqli_query($database->dblink,"select * from " . TB_PREFIX . "fdata where vref = " . (int) $basearray), MYSQLI_ASSOC); + $bdo = $database->getResourceLevel($basearray, false); $catapultTarget = $data['ctar1']; $catapultTarget2 = (isset($data['ctar2']) ? $data['ctar2'] : 0); $catapults1TargetRandom = ($catapultTarget == 0); - $catapults2TargetRandom = ($catapultTarget2 == 99); $catapults2WillNotShoot = ($catapultTarget2 == 0); + $catapults2TargetRandom = ($catapults2WillNotShoot || $catapultTarget2 == 99); // we're manually targetting 1st and/or 2nd row of catapults if (!$catapults1TargetRandom || !$catapults2TargetRandom) @@ -2209,6 +2247,7 @@ class Automation { } } else { $catapultTarget = 0; + $catapults1TargetRandom = true; } } @@ -2223,6 +2262,7 @@ class Automation { } } else { $catapultTarget2 = 99; + $catapults2TargetRandom = true; } } } @@ -2231,7 +2271,7 @@ class Automation { if ($catapults1TargetRandom) { $list=array(); - $j = 0; + $j = 1; for ($i=1;$i<=41;$i++) { if ($i==41) $i=99; @@ -2241,14 +2281,14 @@ class Automation { $j++; } } - $catapultTarget = $list[ rand(1, $j) ]; + $catapultTarget = $list[ rand(1, $j - 1) ]; } // 2nd row of catapults set to target randomly - if ($catapults2TargetRandom) + if ($catapults2TargetRandom && !$catapults2WillNotShoot) { $list=array(); - $j=0; + $j=1; for ($i=1;$i<=41;$i++) { if ($i==41) $i=99; @@ -2258,7 +2298,7 @@ class Automation { $list[$j]=$i; } } - $catapultTarget2 = $list[ rand(1, $j) ]; + $catapultTarget2 = $list[ rand(1, $j - 1) ]; } /** @@ -2348,6 +2388,7 @@ class Automation { if(count($varray)!='1' AND $to['capital']!='1' AND $villexp < $canconquer){ if($to['owner']!=3 OR $to['name']!='WW Buildingplan'){ // check for standing Palace or Residence + // note: at this point, we can use cache, since we've cleared it above if ($database->getFieldLevelInVillage($data['to'], '25, 26')) { $nochiefing = 1; $info_chief = "".$chief_pic.",The Palace/Residence isn\'t destroyed!"; @@ -2356,6 +2397,7 @@ class Automation { // we can conquer this village if(!isset($nochiefing)){ //$info_chief = "".$chief_pic.",You don't have enought CP to chief a village."; + // note: at this point, we can use cache, since we've cleared it above if($this->getTypeLevel(35,$data['from']) == 0){ for ($i=0; $i<($data['t9']-$dead9); $i++){ if($owntribe == 1){ @@ -2565,7 +2607,7 @@ class Automation { if ($DefenderID==0) { $natar=0; } - if(!empty($scout)){ + if(!empty($scout)) { if ($data['spy'] == 1){ $info_spy = "".$spy_pic.",
\"Lumber\"".round($totwood)." | \"Clay\"".round($totclay)." |