diff --git a/GameEngine/Automation.php b/GameEngine/Automation.php index 9dd534d4..1fcf36c6 100755 --- a/GameEngine/Automation.php +++ b/GameEngine/Automation.php @@ -1,4864 +1,4874 @@ -procNewClimbers(); - $this->ClearUser(); - $this->ClearInactive(); - $this->pruneResource(); - $this->pruneOResource(); - $this->checkWWAttacks(); - $this->delTradeRoute(); - $this->TradeRoute(); - - $methodsArrays = ["culturePoints", "updateHero", "clearDeleting", "buildComplete", - "demolitionComplete", "marketComplete", "researchComplete", - "trainingComplete", "starvation", "celebrationComplete", - "sendUnitsComplete", "loyaltyRegeneration", "sendreinfunitsComplete", - "returnunitsComplete", "sendSettlersComplete", "spawnNatars", - "spawnWWVillages", "spawnWWBuildingPlans", "activateArtifacts"]; - - foreach($methodsArrays as $method){ - $file = fopen($autoprefix."GameEngine/Prevention/".$method.".txt", "w"); - if(flock($file, LOCK_EX)) { - call_user_func(array($this, $method)); - flock($file, LOCK_UN); - } - fclose($file); - } - - $this->MasterBuilder(); - $this->updateGeneralAttack(); - $this->checkInvitedPlayes(); - $this->updateStore(); - $this->CheckBan(); - $this->regenerateOasisTroops(); - $this->medals(); - $this->artefactOfTheFool(); - } - - public function procResType($ref, $mode = 0) { - //Capital or only 1 village left = cannot be destroyed - return addslashes(empty($build = Building::procResType($ref)) && !$mode ? "Village can't be" : $build); - } - - function recountPop($vid, $use_cache = true){ - global $database; - - $vid = (int) $vid; - $fdata = $database->getResourceLevel($vid, $use_cache); - $popTot = 0; - - for ($i = 1; $i <= 40; $i++) { - $lvl = $fdata["f".$i]; - $building = $fdata["f".$i."t"]; - if($building) $popTot += $this->buildingPOP($building, $lvl); - } - - $this->recountCP($vid); - $q = "UPDATE ".TB_PREFIX."vdata set pop = $popTot where wref = $vid"; - mysqli_query($database->dblink, $q); - $owner = $database->getVillageField($vid, "owner"); - $this->procClimbers($owner); - - return $popTot; - } - - function recountCP($vid){ - global $database; - - $vid = (int) $vid; - $fdata = $database->getResourceLevel($vid); - $popTot = 0; - - for ($i = 1; $i <= 40; $i++) { - $lvl = $fdata["f".$i]; - $building = $fdata["f".$i."t"]; - if($building){ - $popTot += $this->buildingCP($building,$lvl); - } - } - - $q = "UPDATE ".TB_PREFIX."vdata set cp = $popTot where wref = $vid"; - mysqli_query($database->dblink,$q); - - return $popTot; - } - - function buildingPOP($f, $lvl){ - $name = "bid".$f; - global $$name; - - $popT = 0; - $dataarray = $$name; - - for ($i = 0; $i <= $lvl; $i++) { - $popT += ((isset($dataarray[$i]) && isset($dataarray[$i]['pop'])) ? $dataarray[$i]['pop'] : 0); - } - return $popT; - } - - function buildingCP($f, $lvl){ - $name = "bid".$f; - global $$name; - - $popT = 0; - $dataarray = $$name; - - for ($i = 0; $i <= $lvl; $i++) { - $popT += ((isset($dataarray[$i]) && isset($dataarray[$i]['cp'])) ? $dataarray[$i]['cp'] : 0); - } - return $popT; - } - - private function loyaltyRegeneration() { - global $database; - - $array = []; - $array = $database->getProfileVillages(0, 6); - if(!empty($array)) { - foreach($array as $loyalty) { - if (($t25_level = $this->getTypeLevel(25, $loyalty['wref'])) >= 1) { - $value = $t25_level; - }elseif(($t26_level = $this->getTypeLevel(26, $loyalty['wref'])) >= 1){ - $value = $t26_level; - } - else $value = 0; - - if($value > 0){ - $newloyalty = min(100, $loyalty['loyalty'] + $value * (time() - $loyalty['lastupdate2']) / 3600); - $q = "UPDATE ".TB_PREFIX."vdata SET loyalty = $newloyalty, lastupdate2=".time()." WHERE wref = '".$loyalty['wref']."'"; - $database->query($q); - } - } - } - - $array = []; - $q = "SELECT conqured, loyalty, lastupdated, wref FROM ".TB_PREFIX."odata WHERE loyalty < 100"; - $array = $database->query_return($q); - if(!empty($array)) { - foreach($array as $loyalty) { - $value = $this->getTypeLevel(37, $loyalty['conqured']); - - if($value > 0){ - $newloyalty = min(100, $loyalty['loyalty'] + $value * (time() - $loyalty['lastupdated']) / 3600); - $q = "UPDATE ".TB_PREFIX."odata SET loyalty = $newloyalty, lastupdated=".time()." WHERE wref = '".$loyalty['wref']."'"; - $database->query($q); - } - } - } - } - - public function getTypeLevel($tid, $vid) { - global $database; - - $keyholder = []; - - $resourcearray = $database->getResourceLevel($vid); - foreach(array_keys($resourcearray, $tid) as $key) { - if(strpos($key,'t')) { - $key = preg_replace("/[^0-9]/", '', $key); - array_push($keyholder, $key); - } - } - - $element = count($keyholder); - if($element >= 2) { - if($tid <= 4) { - $temparray = []; - for($i = 0; $i <= $element - 1; $i++) { - array_push($temparray,$resourcearray['f'.$keyholder[$i]]); - } - foreach ($temparray as $key => $val) { - if ($val == max($temparray)) $target = $key; - } - } - else { - $target = 0; - for($i = 1; $i <= $element - 1; $i++) { - if($resourcearray['f'.$keyholder[$i]] > $resourcearray['f'.$keyholder[$target]]) { - $target = $i; - } - } - } - } - else if($element == 1) $target = 0; - else return 0; - - if(!empty($keyholder[$target])) return $resourcearray['f'.$keyholder[$target]]; - else return 0; - } - - private function clearDeleting() { - global $database; - - $needDelete = $database->getNeedDelete(); - if(count($needDelete) > 0) { - - //Remove the time limit, otherwise deleting players with 80 or more villages couldn't be deleted in one run - @set_time_limit(0); - - foreach($needDelete as $need) { - $needVillage = $database->getVillagesID($need['uid']); - - //Delete all villages - foreach($needVillage as $village) $this->DelVillage((int) $village); - - for($i = 0;$i < 20; $i++){ - $q = "SELECT id FROM ".TB_PREFIX."users where friend".$i." = ".(int) $need['uid']." or friend".$i."wait = ".(int) $need['uid'].""; - $array = $database->query_return($q); - foreach($array as $friend){ - $database->deleteFriend($friend['id'],"friend".$i); - $database->deleteFriend($friend['id'],"friend".$i."wait"); - } - } - - $database->updateUserField($need['uid'], 'alliance', 0, 1); - - if($database->isAllianceOwner($need['uid'])){ - $alliance = $database->getUserAllianceID($need['uid']); - $newowner = $database->getAllMember2($alliance); - $newleader = $newowner['id']; - $q = "UPDATE " . TB_PREFIX . "alidata set leader = ".(int) $newleader." where id = ".(int) $alliance.""; - $database->query($q); - $database->updateAlliPermissions($newleader, $alliance, "Leader", 1, 1, 1, 1, 1, 1, 1); - Automation::updateMax($newleader); - } - - if (isset($alliance)) { - $database->deleteAlliance($alliance); - } - $q = "UPDATE ".TB_PREFIX."artefacts where owner = ".(int) $need['uid']." SET del = 1"; - $database->query($q); - - $q = "DELETE FROM ".TB_PREFIX."hero where uid = ".(int) $need['uid']; - $database->query($q); - - $q = "DELETE FROM ".TB_PREFIX."mdata where target = ".(int) $need['uid']." or owner = ".(int) $need['uid']; - $database->query($q); - - $q = "DELETE FROM ".TB_PREFIX."ndata where uid = ".(int) $need['uid']; - $database->query($q); - - $q = "DELETE FROM ".TB_PREFIX."users where id = ".(int) $need['uid']; - $database->query($q); - - $q = "DELETE FROM ".TB_PREFIX."deleting where uid = ".(int) $need['uid']; - $database->query($q); - } - } - } - - private function ClearUser() { - global $database; - - if(AUTO_DEL_INACTIVE) { - $time = time() - UN_ACT_TIME; - - $q = "INSERT INTO ".TB_PREFIX."deleting SELECT id, UNIX_TIMESTAMP() FROM ".TB_PREFIX."users WHERE timestamp < $time AND tribe IN(1, 2, 3)"; - $database->query($q); - } - } - - private function ClearInactive() { - global $database; - - if(TRACK_USR) { - $timeout = time()-USER_TIMEOUT * 60; - $q = "DELETE FROM ".TB_PREFIX."active WHERE timestamp < $timeout"; - $database->query($q); - } - } - - private function pruneOResource() { - global $database; - - if(!ALLOW_BURST) { - $database->query("UPDATE - ".TB_PREFIX."odata - SET - wood = IF(wood < 0, 0, wood), - clay = IF(clay < 0, 0, clay), - iron = IF(iron < 0, 0, iron), - crop = IF(crop < 0, 0, crop), - maxstore = IF(maxstore < ".STORAGE_BASE.", ".STORAGE_BASE.", maxstore), - maxcrop = IF(maxcrop < ".STORAGE_BASE.", ".STORAGE_BASE.", maxcrop) - WHERE - maxstore < ".STORAGE_BASE." OR - maxcrop < ".STORAGE_BASE." OR - wood < 0 OR - clay < 0 OR - iron < 0 OR - crop < 0"); - } - } - private function pruneResource() { - global $database; - - if(!ALLOW_BURST) { - $database->query("UPDATE - ".TB_PREFIX."vdata - SET - wood = IF(wood < 0, 0, wood), - clay = IF(clay < 0, 0, clay), - iron = IF(iron < 0, 0, iron), - crop = IF(crop < 0, 0, crop), - maxstore = IF(maxstore < ".STORAGE_BASE.", ".STORAGE_BASE.", maxstore), - maxcrop = IF(maxcrop < ".STORAGE_BASE.", ".STORAGE_BASE.", maxcrop) - WHERE - maxstore < ".STORAGE_BASE." OR - maxcrop < ".STORAGE_BASE." OR - wood < 0 OR - clay < 0 OR - iron < 0 OR - crop < 0"); - - $database->query("UPDATE - ".TB_PREFIX."vdata - SET - wood = IF(wood > maxstore, maxstore, wood), - clay = IF(clay > maxstore, maxstore, clay), - iron = IF(iron > maxstore, maxstore, iron), - crop = IF(crop > maxcrop, maxcrop, crop) - WHERE - wood > maxstore OR - clay > maxstore OR - iron > maxstore OR - crop > maxcrop"); - } - } - - private function culturePoints() { - global $database; - - $database->updateVSumField('cp'); - } - - private function buildComplete() { - global $database, $bid18, $bid10, $bid11, $bid38, $bid39; - - $time = time(); - // IDs of villages that were affected by this building completion update, - // used to calculate statistical data at the end - $villagesAffected = []; - // holds additional conditions when updating loopcon records in the bdata table - $loopconUpdates = []; - // this will hold IDs of bdata table records to delete - $dbIdsToDelete = []; - - // get all pending builds that should be complete by now - $res = $database->query_return( - "SELECT - id, wid, field, level, type, timestamp - FROM - ".TB_PREFIX."bdata - WHERE - timestamp < $time and master = 0" - ); - - // preload village data - $vilIDs = []; - foreach($res as $indi) { - $vilIDs[$indi['wid']] = true; - } - $vilIDs = array_keys($vilIDs); - $database->getProfileVillages($vilIDs, 5); - $database->getEnforceVillage($vilIDs, 0); - - // complete buildings - foreach($res as $indi) { - // store village ID for later for statistical updates - $villageData = $database->getVillageFields($indi['wid'],'owner, maxcrop, maxstore, starv, pop'); - $villageOwner = $villageData['owner']; - $villagesAffected[] = (int) $indi['wid']; - $fieldsToSet = []; - - $q = "UPDATE ".TB_PREFIX."fdata SET f".$indi['field']." = ".$indi['level'].", f".$indi['field']."t = ".$indi['type']." WHERE vref = ".(int) $indi['wid']; - - if($database->query($q)) { - // this will be the level we brought the building to now - $level = $indi['level']; - - // TODO: magic numbers into constants (for building types below) - - // update capacity if we updated a warehouse or a granary - if (in_array($indi['type'], [10, 11, 38, 39])) { - $fieldDbName = (in_array($indi['type'], [10, 38]) ? 'maxstore' : 'maxcrop'); - $max = $villageData[$fieldDbName]; - - if($level == 1 && $max == STORAGE_BASE) $max = STORAGE_BASE; - - if ($level != 1) $max -= ${'bid'.$indi['type']}[$level - 1]['attri'] * STORAGE_MULTIPLIER; - - $max += ${'bid'.$indi['type']}[$level]['attri'] * STORAGE_MULTIPLIER; - - $fieldsToSet[$fieldDbName] = $max; - } - - // if we updated Embassy, update maximum members that the alliance can take - if($indi['type'] == 18) Automation::updateMax($villageOwner); - - // by SlimShady95 aka Manuel Mannhardt < manuel_mannhardt@web.de > - if ($indi['type'] == 40 && ($indi['level'] % 5 == 0 || $indi['level'] > 95) && $indi['level'] != 100) { - $this->startNatarAttack($indi['level'], $indi['wid'], $indi['timestamp']); - } - - //now can't be more than one winner if ww to level 100 is build by 2 users or more on same time - if ($indi['type'] == 40 && $indi['level'] == 100) { - mysqli_query($database->dblink,"TRUNCATE ".TB_PREFIX."bdata"); - } - - // TODO: find out what exactly these conditions are for - // no special military conditioning for Teutons and Gauls - if ($database->getUserField($villageOwner, "tribe", 0) != 1) $loopconUpdates[$indi['wid']] = ''; - else - { - // special condition for Roman military buildings - if ($indi['field'] > 18) $loopconUpdates[$indi['wid']] = ' AND field > 18'; - else $loopconUpdates[$indi['wid']] = ' AND field < 19'; - } - - // Update ww last finish upgrade - if ($indi['type'] == 40) { - $qW = "UPDATE ".TB_PREFIX."fdata set ww_lastupdate = ".time()." where vref = ".(int) $indi['wid']; - $database->query($qW); - } - - $dbIdsToDelete[] = (int) $indi['id']; - } - - //Update starvation data - $this->addStarvationData($indi['wid']); - - // update the requested fields, all at once - $database->setVillageFields($indi['wid'], array_keys($fieldsToSet), array_values($fieldsToSet)); - } - - // update statistical data for affected villages - foreach ($villagesAffected as $affected_id) $this->recountPop($affected_id, false); - - // update data that can be done in one swoop instead of using multiple update queries - // no special checks for Romans - foreach ($loopconUpdates as $villageId => $updateCondition) { - $database->query( - "UPDATE - ".TB_PREFIX."bdata - SET - loopcon = 0 - WHERE - loopcon = 1 AND - master = 0 AND - wid = ".$villageId.$updateCondition); - } - - // delete all processed entries - if (count($dbIdsToDelete)) { - $database->query( "DELETE FROM " . TB_PREFIX . "bdata WHERE id IN(" . implode( ',', $dbIdsToDelete ) . ")" ); - } - } - - // by SlimShady95 aka Manuel Mannhardt < manuel_mannhardt@web.de > - private function startNatarAttack($level, $vid, $time) { - global $database; - - // bad, but should work :D - // I took the data from my first ww (first .org world) - // TODO: get the algo from the real travian with the 100 biggest offs - - $troops = [5 => [[3412, 2814, 4156, 3553, 9, 0], [35, 0, 77, 33, 17, 10]], - 10 => [[4314, 3688, 5265, 4621, 13, 0], [65, 0, 175, 77, 28, 17]], - 15 => [[4645, 4267, 5659, 5272, 15, 0], [99, 0, 305, 134, 40, 25]], - 20 => [[6207, 5881, 7625, 7225, 22, 0], [144, 0, 456, 201, 56, 36]], - 25 => [[6004, 5977, 7400, 7277, 23, 0], [152, 0, 499, 220, 58, 37]], - 30 => [[7073, 7181, 8730, 8713, 27, 0], [183, 0, 607, 268, 69, 45]], - 35 => [[7090, 7320, 8762, 8856, 28, 0], [186, 0, 620, 278, 70, 45]], - 40 => [[7852, 6967, 9606, 8667, 25, 0], [146, 0, 431, 190, 60, 37]], - 45 => [[8480, 8883, 10490, 10719, 35, 0], [223, 0, 750, 331, 83, 54]], - 50 => [[8522, 9038, 10551, 10883, 35, 0], [224, 0, 757, 335, 83, 54]], - 55 => [[8931, 8690, 10992, 10624, 32, 0], [219, 0, 707, 312, 84, 54]], - 60 => [[12138, 13013, 15040, 15642, 51, 0], [318, 0, 1079, 477, 118, 76]], - 65 => [[13397, 14619, 16622, 17521, 58, 0], [345, 0, 1182, 522, 127, 83]], - 70 => [[16323, 17665, 20240, 21201, 70, 0], [424, 0, 1447, 640, 157, 102]], - 75 => [[20739, 22796, 25746, 27288, 91, 0], [529, 0, 1816, 803, 194, 127]], - 80 => [[21857, 24180, 27147, 28914, 97, 0], [551, 0, 1898, 839, 202, 132]], - 85 => [[22476, 25007, 27928, 29876, 100, 0], [560, 0, 1933, 855, 205, 134]], - 90 => [[31345, 35053, 38963, 41843, 141, 0], [771, 0, 2668, 1180, 281, 184]], - 95 => [[31720, 35635, 39443, 42506, 144, 0], [771, 0, 2671, 1181, 281, 184]], - 96 => [[32885, 37007, 40897, 44130, 150, 0], [795, 0, 2757, 1219, 289, 190]], - 97 => [[32940, 37099, 40968, 44235, 150, 0], [794, 0, 2755, 1219, 289, 190]], - 98 => [[33521, 37691, 41686, 44953, 152, 0], [812, 0, 2816, 1246, 296, 194]], - 99 => [[36251, 40861, 45089, 48714, 165, 0], [872, 0, 3025, 1338, 317, 208]]]; - - // select the troops^^ - if (isset($troops[$level])) $units = $troops[$level]; - else return false; - - // get the capital village from the natars - $query = mysqli_query($database->dblink,'SELECT `wref` FROM `' . TB_PREFIX . 'vdata` WHERE `owner` = 3 and `capital` = 1 LIMIT 1') or die(mysqli_error($database->dblink)); - $row = mysqli_fetch_assoc($query); - - // start the attacks - $endtime = $time + round(86400 / INCREASE_SPEED); - - // -.- - $vid = (int) $vid; - mysqli_query($database->dblink,'INSERT INTO `' . TB_PREFIX . 'ww_attacks` (`vid`, `attack_time`) VALUES (' . $vid . ', ' . $endtime . ')'); - mysqli_query($database->dblink,'INSERT INTO `' . TB_PREFIX . 'ww_attacks` (`vid`, `attack_time`) VALUES (' . $vid . ', ' . ($endtime + 1) . ')'); - - // wave 1 - $ref = $database->addAttack($row['wref'], 0, $units[0][0], $units[0][1], 0, $units[0][2], $units[0][3], $units[0][4], $units[0][5], 0, 0, 0, 3, 0, 0, 0, 0, 20, 20, 0, 20, 20, 20, 20); - $database->addMovement(3, $row['wref'], $vid, $ref, $time, $endtime); - - // wave 2 - $ref2 = $database->addAttack($row['wref'], 0, $units[1][0], $units[1][1], 0, $units[1][2], $units[1][3], $units[1][4], $units[1][5], 0, 0, 0, 3, 40, 0, 0, 0, 20, 20, 0, 20, 20, 20, 20, ['vid' => $vid, 'endtime' => ($endtime + 1)]); - $database->addMovement(3, $row['wref'], $vid, $ref2, $time, $endtime + 1); - } - - private function checkWWAttacks() { - global $database; - - $query = mysqli_query($database->dblink,'SELECT vid, attack_time FROM `' . TB_PREFIX . 'ww_attacks` WHERE `attack_time` <= ' . time()); - while ($row = mysqli_fetch_assoc($query)) - { - // delete the attack - $query3 = mysqli_query($database->dblink,'DELETE FROM `' . TB_PREFIX . 'ww_attacks` WHERE `vid` = ' . (int) $row['vid'] . ' AND `attack_time` = ' . (int) $row['attack_time']); - } - } - - private function getPop($tid, $level) { - $name = "bid".$tid; - global $$name; - - $dataarray = $$name; - $pop = $dataarray[($level + 1)]['pop']; - $cp = $dataarray[($level + 1)]['cp']; - return [$pop, $cp]; - } - - private function delTradeRoute() { - global $database; - - $database->delTradeRoute(); - } - - private function TradeRoute() { - global $database; - $time = time(); - $q = "SELECT `from`, wood, clay, iron, crop, wid, deliveries, id FROM ".TB_PREFIX."route where timestamp < $time"; - $dataarray = $database->query_return($q); - - $vilIDs = []; - foreach($dataarray as $data) { - $vilIDs[$data['to']] = true; - $vilIDs[$data['from']] = true; - } - $vilIDs = array_keys($vilIDs); - $database->getVillageByWorldID($vilIDs); - - foreach($dataarray as $data) { - $targettribe = $database->getUserField($database->getVillageField($data['from'], "owner"), "tribe", 0); - $this->sendResource2($data['wood'], $data['clay'], $data['iron'], $data['crop'], $data['from'], $data['wid'], $targettribe, $data['deliveries']); - $database->editTradeRoute($data['id'], "timestamp", 86400, 1); - } - } - - private function marketComplete() { - global $database, $units; - - $time = microtime(true); - $q = "SELECT s.wood, s.clay, s.iron, s.crop, `to`, `from`, endtime, merchant, send, moveid FROM ".TB_PREFIX."movement m, ".TB_PREFIX."send s WHERE m.ref = s.id AND m.proc = 0 AND sort_type = 0 AND endtime < $time"; - $dataarray = $database->query_return($q); - - foreach($dataarray as $data) { - $userData_from = $database->getUserFields($database->getVillageField($data['from'], "owner"), "alliance, tribe", 0); - $userData_to = $database->getUserFields($database->getVillageField($data['to'], "owner"), "alliance, tribe", 0); - - if($data['wood'] >= $data['clay'] && $data['wood'] >= $data['iron'] && $data['wood'] >= $data['crop']) $sort_type = 10; - elseif($data['clay'] >= $data['wood'] && $data['clay'] >= $data['iron'] && $data['clay'] >= $data['crop']) $sort_type = 11; - elseif($data['iron'] >= $data['wood'] && $data['iron'] >= $data['clay'] && $data['iron'] >= $data['crop']) $sort_type = 12; - elseif($data['crop'] >= $data['wood'] && $data['crop'] >= $data['clay'] && $data['crop'] >= $data['iron']) $sort_type = 13; - - $to = $database->getMInfo($data['to']); - $from = $database->getMInfo($data['from']); - - $ownally = $userData_from['alliance']; - $targetally = $userData_to['alliance']; - - $database->addNotice($to['owner'],$to['wref'],$targetally,$sort_type,''.addslashes($from['name']).' send resources to '.addslashes($to['name']).'',''.$from['owner'].','.$from['wref'].','.$data['wood'].','.$data['clay'].','.$data['iron'].','.$data['crop'].'',$data['endtime']); - if($from['owner'] != $to['owner']) { - $database->addNotice($from['owner'],$to['wref'],$ownally,$sort_type,''.addslashes($from['name']).' send resources to '.addslashes($to['name']).'',''.$from['owner'].','.$from['wref'].','.$data['wood'].','.$data['clay'].','.$data['iron'].','.$data['crop'].'',$data['endtime']); - } - $database->modifyResource($data['to'],$data['wood'],$data['clay'],$data['iron'],$data['crop'],1); - $targettribe = $userData_to["tribe"]; - $endtime = $units->getWalkingTroopsTime($data['from'], $data['to'], 0, 0, [$targettribe], 0) + $data['endtime']; - $database->addMovement(2, $data['to'], $data['from'], $data['merchant'], time(), $endtime, $data['send'], $data['wood'], $data['clay'], $data['iron'], $data['crop']); - $database->setMovementProc($data['moveid']); - } - - $q1 = "SELECT send, moveid, `to`, wood, clay, iron, crop, `from` FROM ".TB_PREFIX."movement WHERE proc = 0 and sort_type = 2 and endtime < $time"; - $dataarray1 = $database->query_return($q1); - - $vilIDs = []; - foreach($dataarray1 as $data1) { - $vilIDs[$data1['to']] = true; - $vilIDs[$data1['from']] = true; - } - $vilIDs = array_keys($vilIDs); - $database->getVillageByWorldID($vilIDs); - - foreach($dataarray1 as $data1) { - $database->setMovementProc($data1['moveid']); - if($data1['send'] > 1){ - $targettribe1 = $database->getUserFields($database->getVillageField($data1['to'],"owner"),"alliance, tribe",0)['tribe']; - $send = $data1['send']-1; - $this->sendResource2($data1['wood'],$data1['clay'],$data1['iron'],$data1['crop'],$data1['to'],$data1['from'],$targettribe1,$send); - } - } - } - - private function sendResource2($wtrans, $ctrans, $itrans, $crtrans, $from, $to, $tribe, $send) { - global $bid17, $bid28, $database, $units; - - $availableWood = $database->getWoodAvailable($from); - $availableClay = $database->getClayAvailable($from); - $availableIron = $database->getIronAvailable($from); - $availableCrop = $database->getCropAvailable($from); - - if($availableWood + $availableClay + $availableIron + $availableCrop > 0) - { - if($availableWood < $wtrans) $wtrans = $availableWood; - if($availableClay < $ctrans) $ctrans = $availableClay; - if($availableIron < $itrans) $itrans = $availableIron; - if($availableCrop < $crtrans) $crtrans = $availableCrop; - - $merchant2 = ($this->getTypeLevel(17, $from) > 0)? $this->getTypeLevel(17, $from) : 0; - $used2 = $database->totalMerchantUsed($from, false); - $merchantAvail2 = $merchant2 - $used2; - $maxcarry2 = ($tribe == 1)? 500 : (($tribe == 2)? 1000 : 750); - $maxcarry2 *= TRADER_CAPACITY; - - if($this->getTypeLevel(28, $from) != 0) { - $maxcarry2 *= $bid28[$this->getTypeLevel(28, $from)]['attri'] / 100; - } - - $resource = [$wtrans, $ctrans, $itrans, $crtrans]; - $reqMerc = ceil((array_sum($resource) - 0.1) / $maxcarry2); - - if($merchantAvail2 > 0 && $reqMerc <= $merchantAvail2) { - if($database->getVillageState($to)) { - $timetaken = $units->getWalkingTroopsTime($from, $to, 0, 0, [$tribe], 0); - $res = $resource[0] + $resource[1] + $resource[2] + $resource[3]; - if($res > 0){ - $reference = $database->sendResource($resource[0], $resource[1], $resource[2], $resource[3], $reqMerc, 0); - $database->modifyResource($from, $resource[0], $resource[1], $resource[2], $resource[3], 0); - $database->addMovement(0, $from, $to, $reference, microtime(true), microtime(true) + $timetaken, $send); - } - } - } - } - } - - private function resolveCatapultsDestruction(&$bdo, &$battlepart, &$info_cat, &$data, $catapultTarget, $twoRowsCatapultSetup, $isSecondRow, $catp_pic, $can_destroy, $isoasis, &$village_destroyed, $tribe) { - global $battle, $database, $bid34; - - if(isset($catapultTarget)) - { - // currently targeted building/field level - $tblevel = (int) $bdo['f'.$catapultTarget]; - // currently targetet building/field GID (ID of the building/field type - woodcutter, cropland, embassy...) - $tbgid = (int) $bdo['f'.$catapultTarget.'t']; - // currently targeted building/field ID in the database (fdata, the fID field, e.g. f1, f2, f3...) - $tbid = (int) $catapultTarget; - - $newLevel = $battle->CalculateNewBuildingLevel($battlepart['catapults']['moral'], - $battlepart['catapults']['upgrades'], - $battlepart['catapults']['downgrades'], - $tblevel, - $battlepart['catapults']['realAttackers'] / ($twoRowsCatapultSetup ? 2 : 1), - $data['t8'] / ($twoRowsCatapultSetup ? 2 : 1), - ($catapultTarget == 40 ? 1 : $battlepart['catapults']['strongerBuildings'])); - - //If that building was present in the building queue, we have to modify his level or remove it - $database->modifyBData($data['to'], $tbid, [$newLevel, $tblevel], $tribe); - - // building/field destroyed - if ($newLevel == 0) - { - // prepare data to be updated - $fieldsToSet = ["f".$tbid]; - $fieldValuesToSet = [0]; - - // update $bdo, so we don't have to reselect later - $bdo['f'.$catapultTarget] = 0; - - if ($tbid >= 19 && $tbid != 99) { - $fieldsToSet[] = "f".$tbid."t"; - $fieldValuesToSet[] = 0; - $bdo['f'.$catapultTarget."t"] = 0; - } - - // update all that needs updating - $database->setVillageLevel($data['to'], $fieldsToSet, $fieldValuesToSet); - - $buildarray = $GLOBALS["bid".$tbgid]; - - // (great) warehouse level was changed - if ($tbgid == 10 || $tbgid == 38) { - $database->setMaxStoreForVillage($data['to'], $buildarray[$newLevel]['attri']); - } - - // (great) granary level was changed - if ($tbgid == 11 || $tbgid == 39) { - $database->setMaxCropForVillage($data['to'], $buildarray[$newLevel]['attri']); - } - - // oasis cannot be destroyed - $pop = $this->recountPop($data['to'], false); - if ($isoasis == 0 && $pop == 0 && $can_destroy == 1) $village_destroyed = 1; - - if ($isSecondRow) { - if ($tbid > 0) { - $info_cat .= "Information - \"Catapult\" ".$this->procResType($tbgid, $can_destroy)." destroyed."; - } - - // embassy level was changed - if ($tbgid == 18){ - $info_cat .= $database->checkEmbassiesAfterBattle($data['to'], $bdo['f'.$catapultTarget], false); - } - - $info_cat .= ""; - } else { - $info_cat = "".$catp_pic.", ".$this->procResType($tbgid, $can_destroy)." destroyed."; - - // embassy level was changed - if ($tbgid == 18){ - $info_cat .= $database->checkEmbassiesAfterBattle($data['to'], $bdo['f'.$catapultTarget], false); - } - } - } - // building/field not damaged - elseif($newLevel == $tblevel){ - if($isSecondRow) { - if ($tbid > 0) { - $info_cat .= "Information - \"Catapult\" ".$this->procResType($tbgid, $can_destroy)." was not damaged."; - } - } else { - $info_cat = "".$catp_pic.",".$this->procResType($tbgid, $can_destroy)." was not damaged."; - } - } - // building/field was damaged, let's calculate the actual damage - else - { - // update $bdo, so we don't have to reselect later - $bdo['f'.$catapultTarget] = $newLevel; - - // building was damaged to a lower level - $info_cata = " damaged from level ".$tblevel." to level ".$newLevel."."; - - $buildarray = $GLOBALS["bid".$tbgid]; - - // (great) warehouse level was changed - if ($tbgid == 10 || $tbgid == 38) { - $database->setMaxStoreForVillage($data['to'], $buildarray[$newLevel]['attri']); - } - - // (great) granary level was changed - if ($tbgid == 11 || $tbgid == 39) { - $database->setMaxCropForVillage($data['to'], $buildarray[$newLevel]['attri']); - } - - $fieldsToSet = ["f".$tbid]; - $fieldValuesToSet = [$newLevel]; - - $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; - } - - if ($isSecondRow) { - $info_cat .= "Information - \"Catapult\" ".$this->procResType($tbgid, $can_destroy).$info_cata; - - // embassy level was changed - if ($tbgid == 18) { - $info_cat .= $database->checkEmbassiesAfterBattle($data['to'], $bdo['f'.$catapultTarget], false); - } - - $info_cat .= ""; - } else { - $info_cat = "" . $catp_pic . "," . $this->procResType($tbgid, $can_destroy).$info_cata; - - // embassy level was changed - if ($tbgid == 18) { - $info_cat .= $database->checkEmbassiesAfterBattle($data['to'], $bdo['f'.$catapultTarget], false); - } - } - } - }else{ - if(!isset($info_cat) || empty($info_cat) || $info_cat == ","){ - $info_cat = "".$catp_pic.", There are no buildings left to destroy"; - }else if(strpos($info_cat, "There are no buildings left") === false){ - $info_cat .= "Information - \"Catapult\" There are no buildings left to destroy."; - } - } - } - - private function sendunitsComplete() { - global $bid19, $bid23, $bid34, $u99, $database, $battle, $technology, $units; - - $time = time(); - $q = " - SELECT - `from`, `to`, endtime, ref, ctar1, ctar2, spy, moveid, attack_type, - t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, (SELECT oasistype FROM ".TB_PREFIX."wdata WHERE id = `to`) as oasistype - FROM - ".TB_PREFIX."movement, - ".TB_PREFIX."attacks - WHERE - ".TB_PREFIX."movement.ref = ".TB_PREFIX."attacks.id - AND - ".TB_PREFIX."movement.proc = 0 - AND - ".TB_PREFIX."movement.sort_type = 3 - AND - ".TB_PREFIX."attacks.attack_type != 2 - AND - endtime < $time - ORDER BY endtime ASC"; - $dataarray = $database->query_return($q); - $totalattackdead = $data_num = 0; - - if ($dataarray && count($dataarray)) { - // preload village data - $vilIDs = []; - foreach($dataarray as $data) { - $vilIDs[$data['from']] = true; - $vilIDs[$data['to']] = true; - } - $vilIDs = array_keys($vilIDs); - $database->getProfileVillages($vilIDs, 5); - $database->getUnit($vilIDs); - $database->getEnforceVillage($vilIDs, 0); - $database->getMovement(34, $vilIDs, 1); - $database->getABTech($vilIDs); - - // calculate battles - foreach($dataarray as $data) { - //set base things - $isoasis = $data['oasistype']; - $AttackArrivalTime = $data['endtime']; - $AttackerWref = $data['from']; - $DefenderWref = $data['to']; - $NatarCapital = false; - - $Attacker['id'] = $database->getUserArray($database->getVillageField($data['from'],"owner"), 1)["id"]; - $AttackerID = $Attacker['id']; - $owntribe = $database->getUserArray($database->getVillageField($data['from'],"owner"), 1)["tribe"]; - $ownally = $database->getUserArray($database->getVillageField($data['from'],"owner"), 1)["alliance"]; - $from = $database->getMInfo($data['from']); - $fromF = $database->getVillage($data['from']); - - //It's a village - if ($isoasis == 0){ - $DefenderUserData = $database->getUserArray($database->getVillageField($data['to'],"owner"), 1); - $Defender['id'] = $DefenderUserData["id"]; - $DefenderID = $Defender['id']; - $targettribe = $DefenderUserData["tribe"]; - $targetally = $DefenderUserData["alliance"]; - $to = $database->getMInfo($data['to']); - $toF = $database->getVillage($data['to']); - $conqureby = 0; - $NatarCapital = ($toF['owner'] == 3 && $toF['capital'] == 1); - if(!isset($to['name']) || empty($to['name'])) $to['name'] = "[?]"; - - $DefenderUnit = []; - $DefenderUnit = $database->getUnit($data['to']); - $evasion = $toF["evasion"]; - $maxevasion = $DefenderUserData["maxevasion"]; - $gold = $DefenderUserData["gold"]; - $playerunit = (($targettribe - 1) * 10); - $cannotsend = false; - - $movements = $database->getMovement(34, $data['to'], 1); - for($y = 0; $y < count($movements); $y++){ - if(property_exists($units, $y)){ - $returntime = $units->$y['endtime'] - time(); - if($units->$y['sort_type'] == 4 && $units->$y['from'] != 0 && $returntime <= 10){ - $cannotsend = true; - } - } - } - - if($evasion == 1 && $maxevasion > 0 && $gold > 1 && !$cannotsend && $dataarray[$data_num]['attack_type'] > 2){ - $evaded = true; - $totaltroops = 0; - $evasionUnitModifications_units = []; - $evasionUnitModifications_amounts = []; - $evasionUnitModifications_modes = []; - for($i = 1; $i <= 10; $i++){ - $playerunit += $i; - $data['u' . $i] = $DefenderUnit['u' . $playerunit]; - $evasionUnitModifications_units[] = $playerunit; - $evasionUnitModifications_amounts[] = $DefenderUnit['u' . $playerunit]; - $evasionUnitModifications_modes[] = 0; - $playerunit -= $i; - $totaltroops += $data['u' . $i]; - } - - $data['u11'] = $DefenderUnit['hero']; - $totaltroops += $data['u11']; - if($totaltroops > 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 = []; - $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; - } - - //get attack units - $Attacker = []; - $start = ($owntribe - 1) * 10 + 1; - $end = $owntribe * 10; - $u = ($owntribe - 1) * 10; - $catapult = [8, 18, 28, 48]; - $ram = [7, 17, 27, 47]; - $chief = [9, 19, 29, 49]; - $spys = [4, 14, 23, 44]; - for($i = $start; $i <= $end; $i++) { - $y = $i - $u; - $Attacker['u'.$i] = $dataarray[$data_num]['t'.$y]; - //there are catas - if(in_array($i, $catapult)) $catp_pic = $i; - if(in_array($i, $ram)) $ram_pic = $i; - if(in_array($i, $chief)) $chief_pic = $i; - if(in_array($i, $spys)) $spy_pic = $i; - } - $Attacker['uhero'] = $dataarray[$data_num]['t11']; - $hero_pic = "hero"; - - //need to set these variables. - $def_wall = $database->getFieldLevel($data['to'], 40, false); - $att_tribe = $owntribe; - $def_tribe = $targettribe; - $attpop = $defpop = $residence = 0; - $def_ab = []; - - //get level of palace or residence - $residence = $database->getFieldLevelInVillage($data['to'], '25, 26', false); - - //type of attack - $type = $dataarray[$data_num]['attack_type']; - if($type == 1) $scout = 1; - - $ud = ($def_tribe - 1) * 10; - $att_ab = $database->getABTech($data['from']); // Blacksmith level - $att_ab1 = $att_ab['b1']; - $att_ab2 = $att_ab['b2']; - $att_ab3 = $att_ab['b3']; - $att_ab4 = $att_ab['b4']; - $att_ab5 = $att_ab['b5']; - $att_ab6 = $att_ab['b6']; - $att_ab7 = $att_ab['b7']; - $att_ab8 = $att_ab['b8']; - $armory = $database->getABTech($data['to']); // Armory level - $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']; - - //rams attack - if (($data['t7']) > 0 && $type == 3) { - $basearraywall = $to; - if (($walllevel = $database->getFieldLevel($basearraywall['wref'], 40, false)) > 0){ - $wallgid = $database->getFieldLevel($basearraywall['wref'],"40t"); - $wallid = 40; - $w = 4; - } - } - - $tblevel = 1; - $stonemason = $database->getFieldLevelInVillage($data['to'], 34); - - }else{ //It's an oasis - - $DefenderUserData = $database->getUserArray($database->getOasisField($data['to'], "owner"), 1); - $Defender['id'] = $DefenderUserData["id"]; - $DefenderID = $Defender['id']; - $targettribe = $DefenderUserData["tribe"]; - $targetally = $DefenderUserData["alliance"]; - $to = $database->getOMInfo($data['to']); - $toF = $database->getOasisV($data['to']); - $conqureby = $toF['conqured']; - //get defence units - $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++) { - $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; - } - - //get attack units - $Attacker = []; - $start = ($owntribe - 1) * 10 + 1; - $end = $owntribe * 10; - $u = ($owntribe - 1) * 10; - $catapult = [8, 18, 28, 38, 48]; - $ram = [7, 17, 27, 37, 47]; - $chief = [9, 19, 29, 39, 49]; - $spys = [4, 14, 23, 44]; - for($i = $start; $i <= $end; $i++) { - $y = $i - $u; - $Attacker['u'.$i] = $dataarray[$data_num]['t'.$y]; - //there are catas - if(in_array($i, $catapult)) $catp_pic = $i; - if(in_array($i, $ram)) $ram_pic = $i; - if(in_array($i, $chief)) $chief_pic = $i; - if(in_array($i, $spys)) $spy_pic = $i; - } - $Attacker['uhero'] = $dataarray[$data_num]['t11']; - $hero_pic = "hero"; - - //need to set these variables. - $def_wall = $residence = $attpop = 0; - $att_tribe = $owntribe; - $def_tribe = $targettribe; - $defpop = 500; - - //type of attack - $type = $dataarray[$data_num]['attack_type']; - if($type == 1) $scout = 1; - - $att_ab1 = $att_ab2 = $att_ab3 = $att_ab4 = $att_ab5 = $att_ab6 = $att_ab7 = $att_ab8 = 0; - $def_ab[31] = $def_ab[32] = $def_ab[33] = $def_ab[34] = $def_ab[35] = $def_ab[36] = $def_ab[37] = $def_ab[38] = 0; - - $walllevel = $tblevel = $stonemason = 0; - } - - $varray = $database->getProfileVillages($to['owner'], 0, false); - - if ($to['owner'] == $from['owner']) $varray1 = $varray; - else $varray1 = $database->getProfileVillages($from['owner'], 0, false); - - // total population of the defender - if($isoasis == 0){ - foreach($varray as $defenderVillage) $defpop += $defenderVillage['pop']; - } - - // total population of the attacker - foreach($varray1 as $attackerVillage) $attpop += $attackerVillage['pop']; - - //fix by ronix - for ($i = 1; $i <= 50; $i++) { - if (!isset($enforDefender['u'.$i])) { - $enforDefender['u'.$i] = 0; - } - $enforDefender['u'.$i] += (isset($Defender['u'.$i]) ? $Defender['u'.$i] : 0); - } - - $defspy = $enforDefender['u4'] > 0 || $enforDefender['u14'] > 0 || $enforDefender['u23'] > 0 || $enforDefender['u44'] > 0; - - if(PEACE == 0 || $targettribe == 4 || $targettribe == 5 || $scout){ - if($targettribe == 1) $def_spy = $enforDefender['u4']; - elseif($targettribe == 2) $def_spy = $enforDefender['u14']; - elseif($targettribe == 3) $def_spy = $enforDefender['u23']; - elseif($targettribe == 5) $def_spy = $enforDefender['u44']; - - //impossible to attack or scout NATAR Capital Village - if ($NatarCapital){ - for($i = 1; $i <= 11; $i++) ${'traped'.$i} = $data['t'.$i]; - } - elseif(empty($scout)) - { - $traps = max($Defender['u99'] - $Defender['u99o'], 0); - - $totalTroops = 0; - for($i = 1; $i <= 11; $i++) $totalTroops += $data['t'.$i]; - - if($traps >= $totalTroops){ - for($i = 1; $i <= 11; $i++) ${'traped'.$i} = $data['t'.$i]; - } - else - { - $multiplier = $traps / $totalTroops; - - //The hero is excluded, because it can be only trapped if traps > totalTroops - for($i = 1; $i <= 10; $i++){ - $trappedUnits = intval($data['t'.$i] * $multiplier); - ${'traped'.$i} = $trappedUnits; - $traps -= $trappedUnits; - } - - while($traps > 0){ - //There are some traps left, let's distribute them - for($i = 1; $i <= 10 && $traps > 0; $i++){ - if($data['t'.$i] != 0){ - ${'traped'.$i}++; - $traps--; - } - } - } - } - } - - if(empty($scout) || $NatarCapital){ - for ($i = 1; $i <= 11; $i++){ - if (!isset(${'traped'.$i})) ${'traped'.$i} = 0; - $totaltraped_att += ${'traped'.$i}; - } - - $database->modifyUnit($data['to'], ["99o"], [$totaltraped_att], [1]); - - for($i = $start; $i <= $end; $i++){ - $j = $i-$start+1; - $Attacker['u'.$i] -= ${'traped'.$j}; - } - $Attacker['uhero'] -= $traped11; - - if($totaltraped_att > 0){ - $prisoners2 = $database->getPrisoners2($data['to'], $data['from'], false); - if(empty($prisoners2)){ - $database->addPrisoners($data['to'],$data['from'],$traped1,$traped2,$traped3,$traped4,$traped5,$traped6,$traped7,$traped8,$traped9,$traped10,$traped11); - }else{ - $database->updatePrisoners($data['to'],$data['from'],$traped1,$traped2,$traped3,$traped4,$traped5,$traped6,$traped7,$traped8,$traped9,$traped10,$traped11); - } - } - } - - // we need to save the attacker heroid before the battle - if(isset($Attacker['uhero']) && $Attacker['uhero'] > 0){ - $AttackerHeroID = $database->getHeroField($from['owner'], "heroid"); - } - - // and the defender(s) heroid - $DefendersHeroID = []; - $herosend_def = 0; - - // check if our hero is defending the village, if so, add it to the list - if (isset($Defender['hero']) && $Defender['hero'] > 0) { - $DefendersHeroID[] = $database->getHeroField($DefenderID, "heroid"); - - // collecting information for the battle report - $herosend_def += $Defender['hero']; - } - - // check if there are other heroes defending the village - if(count($enforcementarray) > 0){ - foreach($enforcementarray as $enforcement){ - if($enforcement['hero'] > 0){ - $heroOwner = $database->getVillageField($enforcement['from'], "owner"); - $DefendersHeroID[] = $database->getHeroField($heroOwner, "heroid"); - } - } - } - - //to battle.php - //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; - - $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); - - //Data for when troops return. - //catapults look :D - $info_cat = $info_chief = $info_ram = $info_hero = ","; - - //check to see if can destroy village - if (count($varray) > 1 && !$database->villageHasArtefact($DefenderWref)) { - $can_destroy = 1; - } - else $can_destroy = 0; - - //Catapults and rams management - if($isoasis == 0){ - if ($type == 3){ - if (($data['t7'] - $traped7) > 0){ - if($walllevel > 0){ - $newLevel = $battle->CalculateNewBuildingLevel($battlepart['rams']['moral'], - $battlepart['rams']['upgrades'], - $battlepart['rams']['downgrades'], - $walllevel, - $battlepart['rams']['realAttackers'], - $data['t7'], - $battlepart['rams']['strongerBuildings']); - - 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."; - } - - if (($data['t8'] - $traped8) > 0) - { - $pop = $this->recountPop($data['to']); - - // village has been destroyed - if ($pop <= 0) { - if ($can_destroy == 1) $info_cat = "".$catp_pic.", Village already destroyed."; - else $info_cat = "".$catp_pic.", Village can\'t be destroyed."; - } - else - { - // village stands, let's do the damage - /** - * FIRST CATAPULTS ROW - */ - - $basearray = $data['to']; - $bdo = $database->getResourceLevel($basearray, false); - $catapultTarget = $data['ctar1']; - $catapultTarget2 = (isset($data['ctar2']) ? $data['ctar2'] : 0); - - $catapults1TargetRandom = ($catapultTarget == 0); - $catapults2WillNotShoot = ($catapultTarget2 == 0); - $catapults2TargetRandom = ($catapults2WillNotShoot || $catapultTarget2 == 99); - - // we're manually targetting 1st and/or 2nd row of catapults - if (!$catapults1TargetRandom) - { - $_catapultsTarget1Levels = []; - $__catapultsTarget1AltTargets = []; - - // calculate targets for 1st rows of catapults - $j = 0; - for ($i = 1; $i <= 41; $i++) - { - if ($i == 41) $i = 99; - - // 1st row of catapults pre-selected target calculations, if needed - if (!$catapults1TargetRandom && $bdo['f'.$i.'t'] == $catapultTarget && $bdo['f'.$i] > 0 && $i != 40) - { - $j++; - $_catapultsTarget1Levels[$j]=$bdo['f'.$i]; - $__catapultsTarget1AltTargets[$j]=$i; - } - } - - // if we couldn't find a suitable target for 1st row of catapults, - // select a random target instead - if (!$catapults1TargetRandom) { - if ( count( $_catapultsTarget1Levels ) > 0 ) { - if ( max( $_catapultsTarget1Levels ) <= 0 ) { - $catapultTarget = 0; - } else { - $catapultTarget = $__catapultsTarget1AltTargets[rand( 1, $j )]; - } - } else { - $catapultTarget = 0; - $catapults1TargetRandom = true; - } - } - } - - // 1st row of catapults set to target randomly - if ($catapults1TargetRandom) - { - $list = []; - for ($i = 1; $i <= 41; $i++) - { - if ($i == 41) $i = 99; - if ($bdo['f'.$i] > 0 && $i != 40) $list[] = $i; - } - $catapultTarget = $list[rand(0, count($list) - 1)]; - } - - /** - * resolve 1st row of catapults - */ - $village_destroyed = 0; - $this->resolveCatapultsDestruction($bdo, $battlepart, $info_cat, $data, $catapultTarget, !$catapults2WillNotShoot, false, $catp_pic, $can_destroy, $isoasis, $village_destroyed, $targettribe); - - /** - * SECOND CATAPULTS ROW - */ - - // we're manually targetting 2nd row of catapults - if (!$catapults2TargetRandom) - { - $_catapultsTarget2Levels = []; - $__catapultsTarget2AltTargets = []; - - // calculate targets for 2nd rows of catapults - $j = 0; - for ($i = 1; $i <= 41; $i++) - { - if ($i == 41) $i = 99; - - // 2nd row of catapults pre-selected target calculations, if needed - if (!$catapults2TargetRandom && !$catapults2WillNotShoot && $bdo['f'.$i.'t'] == $catapultTarget2 && $bdo['f'.$i] > 0 && $i != 40) - { - $j++; - $_catapultsTarget2Levels[$j] = $bdo['f'.$i]; - $__catapultsTarget2AltTargets[$j] = $i; - } - } - - // if we couldn't find a suitable target for 2nd row of catapults, - // select a random target instead - if (!$catapults2TargetRandom) { - if (count($_catapultsTarget2Levels) > 0 ) { - if (max($_catapultsTarget2Levels) <= 0 ) { - $catapultTarget2 = 99; - } - else $catapultTarget2 = $__catapultsTarget2AltTargets[rand( 1, $j )]; - } else { - $catapultTarget2 = 99; - $catapults2TargetRandom = true; - } - } - } - - // 2nd row of catapults set to target randomly - if ($catapults2TargetRandom && !$catapults2WillNotShoot) - { - $list = []; - for ($i = 1; $i <= 41; $i++) - { - if ($i == 41) $i = 99; - if ($bdo['f'.$i] > 0 && $i != 40) $list[] = $i; - } - $catapultTarget2 = $list[ rand(0, count($list) - 1) ]; - } - - /** - * resolve 2nd row of catapults - */ - if (!$catapults2WillNotShoot) { - $this->resolveCatapultsDestruction($bdo, $battlepart, $info_cat, $data, $catapultTarget2, true, true, $catp_pic, $can_destroy, $isoasis, $village_destroyed, $targettribe); - } - - // clear resource levels cache, since we might have destroyed buildings/fields by now - call_user_func(get_class($database).'::clearResourseLevelsCache'); - } - } - } elseif (($data['t7'] - $traped7) > 0) { - $info_ram = "".$ram_pic.",Hint: The ram does not work during a raid."; - } - } - else $can_destroy = 0; - - //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; - - //Resetting the enforcement arrays - for($i = 1; $i <= 50; $i++) { - $DefenderEnf['u'.$i] = 0; - if($i <= 5){ - $DefenderHeroesTotArray[$i] = 0; - $DefenderHeroesDeadArray[$i] = 0; - } - } - - // our reinforcements count could have changed at this point, thus the re-select - $enforcementarray2 = $database->getEnforceVillage($data['to'], 0); - if(count($enforcementarray2) > 0) { - foreach($enforcementarray2 as $enforce2) { - for($i = 1; $i <= 50; $i++) { - $DefenderEnf['u'.$i] += $enforce2['u'.$i]; - } - - //Divide heroes by tribe - if($enforce2['hero'] > 0) { - $reinfTribe = ($enforce2['from'] == 0) ? 4 : $database->getUserField($database->getVillageField($enforce2['from'], "owner"), "tribe", 0); - $DefenderHeroesTotArray[$reinfTribe] += $enforce2['hero']; - $Defender['hero'] += $enforce2['hero']; - } - } - } - - $totalsend_alldef = 0; - $unitssend_def = []; - - //Own troops - $ownTroops = array_slice($Defender, ($targettribe - 1) * 10 + 1, 10); - $totalsend_alldef = array_sum($ownTroops); - - //Collecting informations for the report - $unitssend_def[0] = implode(",", $ownTroops); - $unitssend_deff[0] = '?,?,?,?,?,?,?,?,?,?,'; - - for($i = 1; $i <= 5; $i++){ - //Reinforcements - $reinfTroops = array_slice($DefenderEnf, ($i - 1) * 10, 10); - $totalsend_alldef += array_sum($reinfTroops); - - //Collecting informations for the report - $unitssend_def[$i] = implode(",", $reinfTroops); - $unitssend_deff[$i] = $unitssend_deff[0]; - } - $totalsend_alldef += $Defender['hero']; - - ################################################# - ################FIXED BY SONGER################ - ################################################# - - for($i = 1; $i <= 11; $i++){ - //MUST TO BE FIX : This is only for defender and still not properly coded - if (isset($battlepart['casualties_attacker']) && isset($battlepart['casualties_attacker'][$i]) && $battlepart['casualties_attacker'][$i] <= 0) { - ${'dead'.$i} = 0; - } else if (isset($data['t'.$i]) && isset($battlepart['casualties_attacker']) && isset($battlepart['casualties_attacker'][$i]) && $battlepart['casualties_attacker'][$i] > $data['t'.$i]) { - ${'dead'.$i} = $data['t'.$i]; - } else { - ${'dead'.$i} = (isset($battlepart['casualties_attacker']) && isset($battlepart['casualties_attacker'][$i]) ? $battlepart['casualties_attacker'][$i] : 0); - } - } - - ################################################# - - $dead = []; - $owndead = []; - $alldead = []; - - for($i = 1; $i <= 50; $i++) $alldead[$i] = 0; - $heroAttackDead = $dead11; - - //kill own defence - $unitlist = $database->getUnit($data['to'], false); - $start = ($targettribe-1)*10+1; - $end = ($targettribe*10); - - if ($targettribe == 1) $u = ""; - else $u = $targettribe - 1; - - $unitModifications_units = []; - $unitModifications_amounts = []; - $unitModifications_modes = []; - for ($i = $start; $i <= $end; $i++) { - if($i == $end) { - $u = $targettribe; - } - - if($unitlist){ - $owndead[$i] = round($battlepart[2] * $unitlist['u'.$i]); - $unitModifications_units[] = $i; - $unitModifications_amounts[] = $owndead[$i]; - $unitModifications_modes[] = 0; - } - } - - $owndead['hero'] = 0; - - if($unitlist){ - $owndead['hero'] = (isset($battlepart['deadherodef']) ? $battlepart['deadherodef'] : ''); - - $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); - foreach ($enforcementarray3 as $enforce) { - $life=''; $notlife=''; $wrong = false; - if($enforce['from'] != 0){ - $tribe = $database->getUserArray($database->getVillageField($enforce['from'],"owner"), 1)["tribe"]; - } - else $tribe = 4; - - $start = ($tribe - 1) * 10 + 1; - $end = ($tribe * 10); - unset($dead); - - switch($tribe) - { - case 1: $rom = 1; break; - case 2: $ger = 1; break; - case 3: $gal = 1; break; - case 4: $nat = 1; break; - case 5: - default: $natar = 1; break; - } - - $enforceModificationsById = []; - for ($i = $start; $i <= $end; $i++){ - if($enforce['u'.$i]>'0'){ - if (!isset($enforceModificationsById[$enforce['id']])) { - $enforceModificationsById[$enforce['id']] = [ - 'units' => [], - 'amounts' => [], - 'modes' => [] - ]; - } - $enforceModificationsById[$enforce['id']]['units'][] = $i; - $enforceModificationsById[$enforce['id']]['amounts'][] = (isset($battlepart[2]) ? round($battlepart[2]*$enforce['u'.$i]) : 0); - $enforceModificationsById[$enforce['id']]['modes'][] = 0; - $dead[$i] = (isset($battlepart[2]) ? round($battlepart[2]*$enforce['u'.$i]) : 0); - $checkpoint = (isset($battlepart[2]) ? round($battlepart[2]*$enforce['u'.$i]) : 0); - - if (!isset($enforce['u'.$i])) $enforce['u'.$i] = 0; - - $alldead[$i] += $dead[$i]; - - $wrong = $checkpoint != $enforce['u'.$i]; - } - else $dead[$i] = 0; - } - - if($enforce['hero'] > 0) { - $enforceModificationsById[$enforce['id']]['units'][] = 'hero'; - $enforceModificationsById[$enforce['id']]['amounts'][] = $battlepart['deadheroref'][$enforce['id']]; - $enforceModificationsById[$enforce['id']]['modes'][] = 0; - - $dead['hero'] = $battlepart['deadheroref'][$enforce['id']]; - $alldead['hero'] += $dead['hero']; - $wrong = $dead['hero'] != $enforce['hero']; - - //Collecting information for the report - $reinfTribe = ($enforce['from'] == 0) ? 4 : $database->getUserField($database->getVillageField($enforce['from'], "owner"), "tribe", 0); - $DefenderHeroesDeadArray[$reinfTribe] += $dead['hero']; - } - - // 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).''].''; - $life1 = $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).'']; - $lifehero = (isset($enforce['hero']) ? $enforce['hero'] : 0); - $notlifehero = (isset($dead['hero']) ? $dead['hero'] : 0); - $totallife = (isset($enforce['hero']) ? $enforce['hero'] : 0)+$life1; - $totalnotlife = (isset($dead['hero']) ? $dead['hero'] : 0)+$notlife1; - $totalsend_att = $data['t1']+$data['t2']+$data['t3']+$data['t4']+$data['t5']+$data['t6']+$data['t7']+$data['t8']+$data['t9']+$data['t10']+$data['t11']; - $totaldead_att = $dead1+$dead2+$dead3+$dead4+$dead5+$dead6+$dead7+$dead8+$dead9+$dead10+$dead11; - //NEED TO SEND A RAPPORTAGE!!! - $data2 = ''.$database->getVillageField( $enforce['from'], "owner" ).','.$to['wref'].','.addslashes($to['name']).','.$tribe.','.$life.','.$notlife.','.$lifehero.','.$notlifehero.','.$enforce['from'].''; - if(empty($scout)) { - if($totalnotlife == 0){ - $database->addNotice($database->getVillageField( $enforce['from'], "owner" ),$from['wref'],$ownally,15,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime); - }else if($totallife > $totalnotlife){ - $database->addNotice($database->getVillageField( $enforce['from'], "owner" ),$from['wref'],$ownally,16,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime); - }else{ - $database->addNotice($database->getVillageField( $enforce['from'], "owner" ),$from['wref'],$ownally,17,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime); - } - //delete reinf sting when its killed all. - if(!$wrong) $database->deleteReinf($enforce['id']); - } - } - $totalsend_att = $data['t1']+$data['t2']+$data['t3']+$data['t4']+$data['t5']+$data['t6']+$data['t7']+$data['t8']+$data['t9']+$data['t10']+$data['t11']; - - $DefenderHeroesTot = implode(",", $DefenderHeroesTotArray); - $DefenderHeroesDead = implode(",", $DefenderHeroesDeadArray); - - if (empty($alldead['hero'])) $alldead['hero'] = 0; - if (empty($owndead['hero'])) $owndead['hero'] = 0; - $deadhero = $owndead['hero']; - - //Counting own total dead troops - $ownDeadTroops = array_slice($owndead, 0, 10); - $totaldead_alldef = array_sum($ownDeadTroops); - - //Collecting informations for the report - $unitsdead_def[0] = implode(",", $ownDeadTroops); - $unitsdead_deff[0] = '?,?,?,?,?,?,?,?,?,?,'; - for($i = 1; $i <= 5; $i++){ - //Counting reinforcements total dead troops - $deadTroops = array_slice($alldead, ($i - 1) * 10, 10); - $totaldead_alldef += array_sum($deadTroops); - //Collecting informations for the report - $unitsdead_def[$i] = implode(",", $deadTroops); - $unitsdead_deff[$i] = $unitsdead_deff[0]; - } - $totaldead_alldef += ($deadhero + $alldead['hero']); - - if (!isset($totalattackdead)) $totalattackdead = 0; - $totalattackdead += $totaldead_alldef; - - // Set units returning from attack - - $p_units = []; - for ($i = 1; $i <= 11; $i++) { - if (!isset(${'dead'.$i})) ${'dead'.$i} = 0; - if (!isset(${'traped'.$i})) ${'traped'.$i} = 0; - $p_units[] = "t".$i." = t".$i." - ".(${'dead'.$i} + ${'traped'.$i}); - } - - $database->modifyAttack3($data['ref'],implode(', ', $p_units)); - - $unitsdead_att = $dead1.','.$dead2.','.$dead3.','.$dead4.','.$dead5.','.$dead6.','.$dead7.','.$dead8.','.$dead9.','.$dead10; - $unitstraped_att = $traped1.','.$traped2.','.$traped3.','.$traped4.','.$traped5.','.$traped6.','.$traped7.','.$traped8.','.$traped9.','.$traped10.','.$traped11; - - if($herosend_att > 0) $unitsdead_att_check = $unitsdead_att.','.$dead11; - else $unitsdead_att_check = $unitsdead_att; - - - //top 10 attack and defence update - $totaldead_att = $dead1 + $dead2 + $dead3 + $dead4 + $dead5 + $dead6 + $dead7 + $dead8 + $dead9 + $dead10 + $dead11; - $totalattackdead += $totaldead_att; - $troopsdead1 = $dead1; - $troopsdead2 = $dead2; - $troopsdead3 = $dead3; - $troopsdead4 = $dead4; - $troopsdead5 = $dead5; - $troopsdead6 = $dead6; - $troopsdead7 = $dead7; - $troopsdead8 = $dead8; - $troopsdead9 = $dead9 + 1; - $troopsdead10 = $dead10; - $troopsdead11 = $dead11; - - $totaldead_def = 0; - $totalpoint_att = 0; - - for($i = 1 ;$i <= 50; $i++) { - $unitarray = $GLOBALS["u".$i]; - - //Reinforcements dead troops - $totaldead_def += $alldead[$i]; - $totalpoint_att += ($alldead[$i] * $unitarray['pop']); - - //Own dead troops - if($i >= ($targettribe - 1) * 10 + 1 && $i <= $targettribe * 10){ - $totaldead_def += $owndead[$i]; - $totalpoint_att += ($owndead[$i] * $unitarray['pop']); - } - } - $totalpoint_att += ((isset($alldead['hero']) ? $alldead['hero'] : 0) * 6); - $totalpoint_att += ((isset($owndead['hero']) ? $owndead['hero'] : 0) * 6); - - if ($Attacker['uhero'] > 0){ - $heroxp = $totalpoint_att; - $database->modifyHeroXp("experience", $heroxp, $AttackerHeroID); - } - - for($i = 1; $i <= 10; $i++){ - $unitarray = $GLOBALS["u".(($att_tribe - 1) * 10 + $i)]; - $totalpoint_def += (${'dead'.$i}*$unitarray['pop']); - } - - $totalpoint_def += $dead11 * 6; - - if($Defender['hero'] > 0){ - //counting heroxp - $defheroxp = intval($totalpoint_def / count($DefendersHeroID)); - foreach($DefendersHeroID as $HeroID){ - $database->modifyHeroXp("experience",$defheroxp,$HeroID); - } - } - - // we don't need these two variables anymore - unset($AttackerHeroID, $DefendersHeroID); - - $database->modifyPoints( - $toF['owner'], - ['dpall', 'dp'], - [$totalpoint_def, $totalpoint_def] - ); - - $database->modifyPoints( - $from['owner'], - ['apall', 'ap'], - [$totalpoint_att, $totalpoint_att] - ); - - $database->modifyPointsAlly( - $targetally, - ['Adp', 'dp'], - [$totalpoint_def, $totalpoint_def] - ); - - $database->modifyPointsAlly( - $ownally, - ['Aap', 'ap'], - [$totalpoint_att, $totalpoint_att] - ); - - if ($isoasis == 0){ - // get total cranny value: - $buildarray = $database->getResourceLevel($data['to']); - $cranny = 0; - for($i = 19; $i < 39;$i++){ - if($buildarray['f'.$i.'t'] == 23){ - $cranny += $bid23[$buildarray['f'.$i]]['attri'] * CRANNY_CAPACITY; - } - } - - //cranny efficiency - $atk_bonus = ($owntribe == 2) ? (4 / 5) : 1; - $def_bonus = ($targettribe == 3) ? 2 : 1; - $to_owner = $database->getVillageField($data['to'], "owner"); - - $crannySpy = $database->getArtifactsValueInfluence($to_owner, $data['to'], 7, $cranny * $def_bonus); - $cranny_eff = $crannySpy * $atk_bonus; - - // work out available resources. - $this->updateRes($data['to']); - $this->pruneResource(); - - $villageData = $database->getVillageFields($data['to'], 'clay, iron, wood, crop', false); - $totclay = $villageData['clay']; - $totiron = $villageData['iron']; - $totwood = $villageData['wood']; - $totcrop = $villageData['crop']; - }else{ - $cranny_eff = 0; - - if ($conqureby > 0) { //10% from owner proc village owner - fix by ronix - exploit fixed by iopietro - $this->updateRes($conqureby); - $this->pruneResource(); - - $villageData = $database->getVillageFields($conqureby, 'clay, iron, wood, crop', false); - $totclay = intval($villageData['clay'] / 10); - $totiron = intval($villageData['iron'] / 10); - $totwood = intval($villageData['wood'] / 10); - $totcrop = intval($villageData['crop'] / 10); - }else{ - // work out available resources. - $this->updateORes($data['to']); - $this->pruneOResource(); - - $oasisData = $database->getOasisFields($data['to'], false); - $totclay = $oasisData['clay']; - $totiron = $oasisData['iron']; - $totwood = $oasisData['wood']; - $totcrop = $oasisData['crop']; - } - } - - $avclay = floor($totclay - $cranny_eff); - $aviron = floor($totiron - $cranny_eff); - $avwood = floor($totwood - $cranny_eff); - $avcrop = floor($totcrop - $cranny_eff); - - $avclay = ($avclay < 0) ? 0 : $avclay; - $aviron = ($aviron < 0) ? 0 : $aviron; - $avwood = ($avwood < 0) ? 0 : $avwood; - $avcrop = ($avcrop < 0) ? 0 : $avcrop; - - $avtotal = [$avwood, $avclay, $aviron, $avcrop]; - $av = $avtotal; - - // resources (wood,clay,iron,crop) - $steal = [0, 0, 0, 0]; - - //bounty variables - $btotal = $battlepart['bounty']; - $bmod = 0; - - for($i = 0; $i < 5; $i++) - { - for($j = 0; $j < 4; $j++) - { - if(isset($avtotal[$j])) - { - if($avtotal[$j] < 1) unset($avtotal[$j]); - } - } - - //No resources left to take - if(empty($avtotal) || ($btotal < 1 && $bmod < 1)) break; - - if($btotal < 1) - { - while($bmod) - { - //random select - $rs = array_rand($avtotal); - if(isset($avtotal[$rs])) - { - $avtotal[$rs] -= 1; - $steal[$rs] += 1; - $bmod -= 1; - } - } - } - - // handle unbalanced amounts. - $btotal += $bmod; - $bmod = $btotal % count($avtotal); - $btotal -= $bmod; - $bsplit = $btotal / count($avtotal); - - $max_steal = (min($avtotal) < $bsplit) ? min($avtotal) : $bsplit; - - for($j = 0; $j < 4; $j++) - { - if(isset($avtotal[$j])) - { - $avtotal[$j] -= $max_steal; - $steal[$j] += $max_steal; - $btotal -= $max_steal; - } - } - } - - //chiefing village - //there are senators - if(($data['t9'] - $dead9 - $traped9) > 0 && $isoasis == 0){ - if ($type == 3) { - $palacelevel = $database->getResourceLevel($from['wref']); - - for($i = 1; $i <= 40; $i++) { - if($palacelevel['f'.$i.'t'] == 26) $plevel = $i; - elseif($palacelevel['f'.$i.'t'] == 25) $plevel = $i; - } - - if($palacelevel['f'.$plevel.'t'] == 26){ - if($palacelevel['f'.$plevel] < 10) $canconquer = 0; - elseif($palacelevel['f'.$plevel] < 15) $canconquer = 1; - elseif($palacelevel['f'.$plevel] < 20) $canconquer = 2; - else $canconquer = 3; - }else if($palacelevel['f'.$plevel.'t'] == 25){ - if($palacelevel['f'.$plevel] < 10) $canconquer = 0; - elseif($palacelevel['f'.$plevel] < 20) $canconquer = 1; - else $canconquer = 2; - } - - $expArray = $database->getVillageFields($from['wref'], 'exp1, exp2, exp3'); - $exp1 = $expArray['exp1']; - $exp2 = $expArray['exp2']; - $exp3 = $expArray['exp3']; - - if($exp1 == 0) $villexp = 0; - elseif($exp2 == 0) $villexp = 1; - elseif($exp3 == 0) $villexp = 2; - else $villexp = 3; - - $mode = CP; - $cp_mode = $GLOBALS['cp'.$mode]; - $need_cps = $cp_mode[count($varray1) + 1]; - $user_cps = $database->getUserArray($from['owner'], 1)['cp']; - - //check for last village or capital - if($user_cps >= $need_cps){ - if(count($varray) > 1 && $to['capital'] != 1 && $villexp < $canconquer){ - if($to['owner'] != 3 || $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!"; - } - - // 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 - $time = time(); - $reducedLoyaltyTotal = $reducedLoyalty = 0; - for ($i = 0; $i < ($data['t9'] - $dead9 - $traped9); $i++){ - - //Random factor, which depends on the attacking tribe - if($owntribe == 1) $reducedLoyalty = rand(20, 30); - else $reducedLoyalty = rand(20, 25); - - //If a Big Party is active in the attacking village - if($from['celebration'] > $time && $from['type'] == 2) $reducedLoyalty += 5; - - //If a Big Party is active in the target village - if($to['celebration'] > $time && $to['type'] == 2) $reducedLoyalty -= 5; - - //Moral bonus - $reducedLoyalty /= $battlepart['moralBonus']; - - //If the brewery is built (Teutons only) - if($owntribe == 2 && $this->getTypeLevel(35, $data['from']) > 0) $reducedLoyalty /= 2; - - $reducedLoyaltyTotal += $reducedLoyalty; - } - - // loyalty is more than 0 - if (($toF['loyalty'] - $reducedLoyaltyTotal) > 0) { - $info_chief = "".$chief_pic.",The loyalty was lowered from ".floor($toF['loyalty'])." to ".floor($toF['loyalty'] - $reducedLoyaltyTotal)."."; - $database->setVillageField($data['to'], 'loyalty', ($toF['loyalty'] - $reducedLoyaltyTotal)); - } else if (!$village_destroyed) { - // you took over the village - $villname = addslashes($database->getVillageField($data['to'],"name")); - $artifact = reset($database->getOwnArtefactInfo($data['to'])); - - $info_chief = "".$chief_pic.",Inhabitants of ".$villname." village decided to join your empire."; - - if ($artifact['vref'] == $data['to']){ - $database->claimArtefact($data['to'], $data['to'], $database->getVillageField($data['from'], "owner")); - } - - $database->setVillageFields( - $data['to'], - ['loyalty', 'owner'], - [0, $database->getVillageField($data['from'],"owner")] - ); - - //delete upgrades in armory and blacksmith - $q = "DELETE FROM ".TB_PREFIX."abdata WHERE vref = ".(int) $data['to']; - $database->query($q); - $database->addABTech($data['to']); - - //delete researches in academy - $q = "DELETE FROM ".TB_PREFIX."tdata WHERE vref = ".(int) $data['to']; - $database->query($q); - $database->addTech($data['to']); - - //delete reinforcement - $q = "DELETE FROM ".TB_PREFIX."enforcement WHERE `from` = ".(int) $data['to']; - $database->query($q); - - //delete trade routes - $q = "DELETE FROM ".TB_PREFIX."route where wid = ".(int) $data['to']." OR `from` =".(int) $data['to']; - $database->query($q); - - //no units can stay in the village itself - $units2reset = []; - for ($u = 1; $u <= 50; $u++) $units2reset[] = 'u'.$u.' = 0'; - - $units2reset[] = 'u99 = 0'; - $units2reset[] = 'u99o = 0'; - $units2reset[] = 'hero = 0'; - $q = "UPDATE ".TB_PREFIX."units SET ".implode(',', $units2reset)." WHERE vref = ".(int) $data['to']; - $database->query($q); - - // check buildings - $newLevels_fieldNames = []; - $newLevels_fieldValues = []; - - $poparray = $database->getVSumField([$AttackerID, $DefenderID] ,"pop"); - $pop1 = $poparray[0]['Total']; - $pop2 = $poparray[1]['Total']; - if($pop1 > $pop2 && $targettribe != 5){ - $buildlevel = $database->getResourceLevel($data['to']); - for ($i = 1; $i <= 39; $i++){ - if($buildlevel['f'.$i]!=0){ - if($buildlevel['f'.$i."t"] != 35 && $buildlevel['f'.$i."t"] != 36 && $buildlevel['f'.$i."t"] != 41){ - $leveldown = $buildlevel['f'.$i]-1; - $newLevels_fieldNames[] = "f".$i; - $newLevels_fieldValues[] = $leveldown; - - // building at level 0, remove it completely - if (!$leveldown > 0) { - $newLevels_fieldNames[] = "f".$i."t"; - $newLevels_fieldValues[] = 0; - } - }else{ - $newLevels_fieldNames[] = "f".$i; - $newLevels_fieldValues[] = 0; - - $newLevels_fieldNames[] = "f".$i."t"; - $newLevels_fieldValues[] = 0; - } - } - } - - if ($buildlevel['f99'] != 0) { - $leveldown = $buildlevel['f99'] - 1; - $newLevels_fieldNames[] = "f99"; - $newLevels_fieldValues[] = $leveldown; - } - } - - //destroy wall - $newLevels_fieldNames[] = "f40"; - $newLevels_fieldValues[] = 0; - - $newLevels_fieldNames[] = "f40t"; - $newLevels_fieldValues[] = 0; - - //clear expansion slot in the village which founded the conquered one - $database->clearExpansionSlot($data['to'], 1); - - $expArray = $database->getVillageFields($data['from'], 'exp1, exp2, exp3'); - $exp1 = $expArray['exp1']; - $exp2 = $expArray['exp2']; - $exp3 = $expArray['exp3']; - - if($exp1 == 0){ - $exp = 'exp1'; - $value = $data['to']; - }elseif($exp2 == 0){ - $exp = 'exp2'; - $value = $data['to']; - }else{ - $exp = 'exp3'; - $value = $data['to']; - } - - $database->setVillageField($data['from'], $exp, $value); - - //Remove oasis related to village - $units->returnTroops($data['to'], 1); - $chiefing_village = 1; - - //Remove trade routes related to village - $database->deleteTradeRoutesByVillage($data['to']); - - //Update data in the database - $database->setVillageLevel($data['to'], $newLevels_fieldNames, $newLevels_fieldValues); - - //Recount the population - $pop = $this->recountPop($data['to'], false); - - //Kill and reassign the hero to the capital village, if registered in the conquered one - $database->reassignHero($data['to']); - } - } - } - else $info_chief = "".$chief_pic.",You cant take over this village."; - } - else $info_chief = "".$chief_pic.",You cant take over this village."; - } - else $info_chief = "".$chief_pic.",Not enough culture points."; - unset($plevel); - } - else - $info_chief = "".$chief_pic.",Could not reduce cultural points during raid"; - } - - if(($data['t11'] - $dead11 - $traped11) > 0){ //hero - if ($heroxp == 0) { - $xp = ""; - $info_hero = $hero_pic.",Your hero had nothing to kill therefore gains no XP at all."; - } else { - $xp = " and gained ".$heroxp." XP from the battle."; - $info_hero = $hero_pic.",Your hero gained ".$heroxp." XP."; - } - - if ($isoasis != 0) { //oasis fix by ronix - if ($to['owner'] != $from['owner']) { - $troopcount = $database->countOasisTroops($data['to'], false); - $canqured = $database->canConquerOasis($data['from'], $data['to'], false); - if ($canqured == 1 && $troopcount == 0) { - $database->conquerOasis($data['from'], $data['to']); - $info_hero = $hero_pic.",Your hero has conquered this oasis".$xp; - }else{ - if ($canqured == 3 && $troopcount == 0) { - if ($type == 3) { - $Oloyaltybefore = intval($to['loyalty']); - //$database->modifyOasisLoyalty($data['to']); - //$OasisInfo = $database->getOasisInfo($data['to']); - $Oloyaltynow = intval($database->modifyOasisLoyalty($data['to']));//intval($OasisInfo['loyalty']); - $info_hero = $hero_pic.",Your hero has reduced oasis loyalty to ".$Oloyaltynow." from ".$Oloyaltybefore.$xp; - } - else $info_hero = $hero_pic.",Could not reduce loyalty during raid".$xp; - } - } - } - } else { - if ($heroxp == 0) $xp=" no XP from the battle."; - else $xp=" gained ".$heroxp." XP from the battle."; - - $artifact = reset($database->getOwnArtefactInfo($data['to'])); - if (!empty($artifact)) { - if ($type == 3) { - if (empty($artifactError = $database->canClaimArtifact($data['from'], $artifact['vref'], $artifact['size'], $artifact['type']))) { - $database->claimArtefact($data['from'], $data['to'], $database->getVillageField($data['from'], "owner")); - $info_hero = $hero_pic.",Your hero is carrying home the artifact ".$artifact['name']." and".$xp; - - // if the defender pop is 0 with no artefact, then destroy the village - if($database->getVillageField($data['to'], "pop") == 0 || $targettribe == 5){ - $can_destroy = $village_destroyed = 1; - $info_hero .= " The village has been destroyed."; - } - } - else $info_hero = $hero_pic.",".$artifactError.$xp; - } - else $info_hero = $hero_pic.",Your hero could not claim an artifact during raid".$xp; - } - } - }elseif($data['t11'] > 0) { - if ($heroxp == 0) $xp = ""; - else $xp = " but gained ".$heroxp." XP from the battle."; - - if ($traped11 > 0) $info_hero = $hero_pic.",Your hero was trapped".$xp; - else $info_hero = $hero_pic.",Your hero died".$xp; - } - - if ($DefenderID == 0) $natar = 0; - - if(!empty($scout)) { - if ($data['spy'] == 1){ - $info_spy = "".$spy_pic.",
\"Lumber\"".round($totwood)." | - \"Clay\"".round($totclay)." | - \"Iron\"".round($totiron)." | - \"Crop\"".round($totcrop)."
-
\"carry\"Total Resources: ".round($totwood+$totclay+$totiron+$totcrop)."
- "; - }else if($data['spy'] == 2){ - if ($isoasis == 0){ - $walllevel = $database->getFieldLevelInVillage($data['to'], '31, 32, 33'); - $residencelevel = $database->getFieldLevelInVillage($data['to'], 25); - $palacelevel = $database->getFieldLevelInVillage($data['to'], 26); - $residenceimg = "\"Residence\""; - $palaceimg = "\"Palace\""; - $crannyimg = "\"Cranny\""; - $wallimg = "\"Wall\""; - $info_spy = "".$spy_pic.","; - if($residencelevel > 0) $info_spy .= $residenceimg." Residence level:".$residencelevel."
"; - elseif($palacelevel > 0) $info_spy .= $palaceimg." Palace level: ".$palacelevel."
"; - - if($walllevel > 0) $info_spy .= $wallimg." Wall level: ".$walllevel."
"; - $info_spy .= $crannyimg." Total crannies capacity: ".$crannySpy.""; - } - else $info_spy = "".$spy_pic.", There are no informations to show"; - } - - $data2 = ''.$from['owner'].','.$from['wref'].','.$owntribe.','.$unitssend_att.','.$unitsdead_att.',0,0,0,0,0,'.$to['owner'].','.$to['wref'].','.addslashes($to['name']).',,,,'.$targettribe.','.$unitssend_def[0].','.$unitsdead_def[0].','.$rom.','.$unitssend_def[1].','.$unitsdead_def[1].','.$ger.','.$unitssend_def[2].','.$unitsdead_def[2].','.$gal.','.$unitssend_def[3].','.$unitsdead_def[3].','.$nat.','.$unitssend_def[4].','.$unitsdead_def[4].','.$natar.','.$unitssend_def[5].','.$unitsdead_def[5].','.$DefenderHeroesTot.','.$DefenderHeroesDead.','.$info_ram.','.$info_cat.','.$info_chief.','.$info_spy.','.$data['t11'].','.$dead11.','.$herosend_def.','.$deadhero.',,'.$unitstraped_att; - }else{ - if(isset($village_destroyed) && $village_destroyed == 1 && $can_destroy==1){ - //check if village pop=0 and no info destroy - if (strpos($info_cat,"The village has") === false) { - $info_cat .= "Information - \"Catapult\" The village has been destroyed."; - } - } - $data2 = ''.$from['owner'].','.$from['wref'].','.$owntribe.','.$unitssend_att.','.$unitsdead_att.','.$steal[0].','.$steal[1].','.$steal[2].','.$steal[3].','.$battlepart['bounty'].','.$to['owner'].','.$to['wref'].','.addslashes($to['name']).',,,,'.$targettribe.','.$unitssend_def[0].','.$unitsdead_def[0].','.$rom.','.$unitssend_def[1].','.$unitsdead_def[1].','.$ger.','.$unitssend_def[2].','.$unitsdead_def[2].','.$gal.','.$unitssend_def[3].','.$unitsdead_def[3].','.$nat.','.$unitssend_def[4].','.$unitsdead_def[4].','.$natar.','.$unitssend_def[5].','.$unitsdead_def[5].','.$DefenderHeroesTot.','.$DefenderHeroesDead.','.$info_ram.','.$info_cat.','.$info_chief.','.(isset($info_spy) ? $info_spy : '').',,'.$data['t11'].','.$dead11.','.$herosend_def.','.$deadhero.','.$unitstraped_att; - } - - if($totalsend_att - ($totaldead_att + (isset($totaltraped_att) ? $totaltraped_att : 0)) <= 0){ - $info_troop = "None of your soldiers returned."; - } - else $info_troop = ""; - - //When all of the attacker's troops die, send no informations - $data_fail = ''.$from['owner'].','.$from['wref'].','.$owntribe.','.$unitssend_att.','.$unitsdead_att.','.$steal[0].','.$steal[1].','.$steal[2].','.$steal[3].','.$battlepart['bounty'].','.$to['owner'].','.$to['wref'].','.addslashes($to['name']).',,,,'.$targettribe.','.$unitssend_deff[0].','.$unitsdead_deff[0].','.$rom.','.$unitssend_deff[1].','.$unitsdead_deff[1].','.$ger.','.$unitssend_deff[2].','.$unitsdead_deff[2].','.$gal.','.$unitssend_deff[3].','.$unitsdead_deff[3].','.$nat.','.$unitssend_deff[4].','.$unitsdead_deff[4].','.$natar.','.$unitssend_deff[5].','.$unitsdead_deff[5].','.$DefenderHeroesTot.','.$DefenderHeroesDead.',,,'.$data['t11'].','.$dead11.','.$unitstraped_att.',,'.$info_ram.','.$info_cat.','.$info_chief.','.$info_troop.','.$info_hero; - - //Undetected and detected in here. - if(!empty($scout)){ - for($i = 1; $i <= 10; $i++){ - if($battlepart['casualties_attacker'][$i]){ - if($from['owner'] == 3){ - $database->addNotice($to['owner'],$to['wref'],$targetally,20,''.addslashes($from['name']).' scouts '.addslashes($to['name']).'',$data2,$AttackArrivalTime); - break; - }else if($unitsdead_att == $unitssend_att && $defspy){ //fix by ronix - $database->addNotice($to['owner'],$to['wref'],$targetally,20,''.addslashes($from['name']).' scouts '.addslashes($to['name']).'',$data2.',,'.$info_troop,$AttackArrivalTime); - break; - }else if($defspy){ //fix by ronix - $database->addNotice($to['owner'],$to['wref'],$targetally,21,''.addslashes($from['name']).' scouts '.addslashes($to['name']).'',$data2,$AttackArrivalTime); - break; - } - } - } - }else{ - if($type == 3 && $totalsend_att - ($totaldead_att + $totaltraped_att) > 0){ - $prisoners = $database->getPrisoners([$to['wref']], 0, false)[$to['wref'].'0']; - if(count($prisoners) > 0){ - $anothertroops = $mytroops = $ownDeads = $anotherDeads = 0; - $prisoners2delete = []; - $movementType = []; - $movementFrom = []; - $movementTo = []; - $movementRef = []; - $movementTime = []; - $movementEndtime = []; - $utime = microtime(true); - - foreach($prisoners as $prisoner) { - $p_owner = $database->getVillageField($prisoner['from'], "owner"); - - //If troops are coming from the same village, add it to the returing troops - if ($prisoner['from'] == $from['wref']) { - for($i = 1; $i <= 11; $i++){ - $deadPrisoners = round($prisoner['t'.$i] / 4); - $mytroops += $prisoner['t'.$i]; - $ownDeads += $deadPrisoners; - $prisoner['t'.$i] -= $deadPrisoners; - } - - $database->modifyAttack2( - $data['ref'], - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], - [$prisoner['t1'], $prisoner['t2'], $prisoner['t3'], $prisoner['t4'], $prisoner['t5'], $prisoner['t6'], $prisoner['t7'], $prisoner['t8'], $prisoner['t9'], $prisoner['t10'], $prisoner['t11']] - ); - $prisoners2delete[] = $prisoner['id']; - } else { - $p_alliance = $database->getUserField($p_owner, "alliance",0); - $friendarray = $database->getAllianceAlly($p_alliance, 1); - $neutralarray = $database->getAllianceAlly($p_alliance, 2); - $friend = ($friendarray[0]['alli1'] > 0 && $friendarray[0]['alli2'] > 0 && $p_alliance > 0) && ($friendarray[0]['alli1'] == $ownally || $friendarray[0]['alli2'] == $ownally) && ($ownally != $p_alliance && $ownally && $p_alliance); - $neutral = ($neutralarray[0]['alli1'] > 0 && $neutralarray[0]['alli2'] > 0 && $p_alliance > 0) && ($neutralarray[0]['alli1'] == $ownally || $neutralarray[0]['alli2'] == $ownally) && ($ownally != $p_alliance && $ownally && $p_alliance); - - if($p_alliance == $ownally || $friend || $neutral){ - $p_tribe = $database->getUserField($p_owner, "tribe", 0); - - for($i = 1; $i <= 11; $i++){ - $deadPrisoners = round($prisoner['t'.$i] / 4); - if($p_owner == $from['owner']){ - $mytroops += $prisoner['t'.$i]; - $ownDeads += $deadPrisoners; - }else{ - $anothertroops += $prisoner['t'.$i]; - $anotherDeads += $deadPrisoners; - } - $prisoner['t'.$i] -= $deadPrisoners; - } - - $troopsTime = $units->getWalkingTroopsTime($prisoner['from'], $prisoner['wref'], $p_owner, $p_tribe, $prisoner, 1, 't'); - $p_time = $database->getArtifactsValueInfluence($p_owner, $prisoner['from'], 2, $troopsTime); - - $p_reference = $database->addAttack($prisoner['from'], $prisoner['t1'], $prisoner['t2'], $prisoner['t3'], $prisoner['t4'], $prisoner['t5'], $prisoner['t6'], $prisoner['t7'], $prisoner['t8'], $prisoner['t9'], $prisoner['t10'], $prisoner['t11'], 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - $movementType[] = 4; - $movementFrom[] = $prisoner['wref']; - $movementTo[] = $prisoner['from']; - $movementRef[] = $p_reference; - $movementTime[] = $utime; - $movementEndtime[] = $p_time + $utime; - $prisoners2delete[] = $prisoner['id']; - } - } - } - - if (count($movementType)) { - $database->addMovement($movementType, $movementFrom, $movementTo, $movementRef, $movementTime, $movementEndtime); - } - - $database->deletePrisoners($prisoners2delete); - - $ownDeadsText = ($ownAlive = $mytroops - $ownDeads) > 0 ? " of which ".$ownAlive." have been saved" : ""; - $anotherDeadsText = ($anotherAlive = $anothertroops - $anotherDeads) > 0 ? " of which ".$anotherAlive." have been saved" : ""; - - //Add dead troops to the "General attacks" tab - $database->addGeneralAttack($ownDeads + $anotherDeads); - - //Calculate new traps which have to be repaired - $newtraps = round(($mytroops + $anothertroops) / 3); - - //Reset traps - $database->modifyUnit($data['to'], ['99', '99o'], [$mytroops + $anothertroops, $mytroops + $anothertroops], [0, 0]); - - //Repair needed traps - if($newtraps > 0){ - $repairDuration = $database->getArtifactsValueInfluence($to['owner'], $to['wref'], 5, round(($bid19[max($this->getTypeLevel(36, $to['wref']), 1)]['attri'] / 100) * $u99['time'] / SPEED)); - $database->trainUnit($to['wref'], 99, $newtraps, $u99['pop'], $repairDuration, 0); - } - - $trapper_pic = "\"Trap\""; - $p_username = $database->getUserField($from['owner'], "username", 0); - - if($mytroops > 0 && $anothertroops > 0){ - $info_trap = "".$trapper_pic." ".$p_username." freed ".$mytroops." from his troops".$ownDeadsText." and ".$anothertroops." friendly troops".$anotherDeadsText."."; - }elseif($mytroops > 0){ - $info_trap = "".$trapper_pic." ".$p_username." freed ".$mytroops." from his troops".$ownDeadsText."."; - }elseif($anothertroops > 0){ - $info_trap = "".$trapper_pic." ".$p_username." freed ".$anothertroops." friendly troops".$anotherDeadsText."."; - } - } - } - - $data2 = $data2.','.(isset($info_trap) ? addslashes($info_trap) : '').',,'.$info_troop.','.$info_hero; - - if($totalsend_alldef == 0 && $totalsend_att - ($totaldead_att + (isset($totaltraped_att) ? $totaltraped_att : 0)) > 0){ - $database->addNotice($to['owner'],$to['wref'],$targetally,7,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'',$data2,$AttackArrivalTime); - }else if($totaldead_alldef == 0){ - $database->addNotice($to['owner'],$to['wref'],$targetally,4,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'',$data2,$AttackArrivalTime); - }else if($totalsend_alldef > $totaldead_alldef){ - $database->addNotice($to['owner'],$to['wref'],$targetally,5,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'',$data2,$AttackArrivalTime); - }else if($totalsend_alldef == $totaldead_alldef){ - $database->addNotice($to['owner'],$to['wref'],$targetally,6,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'',$data2,$AttackArrivalTime); - } - } - //to here - // If the dead units not equal the ammount sent they will return and report - if($totalsend_att - ($totaldead_att + (isset($totaltraped_att) ? $totaltraped_att : 0)) > 0) - { - $returningTroops = []; - for($i = 1; $i <= 11; $i++) $returningTroops['t'.$i] = $data['t'.$i] - ${'traped'.$i} - ${'dead'.$i}; - $troopsTime = $units->getWalkingTroopsTime($from['wref'], $to['wref'], $from['owner'], $owntribe, $returningTroops, 1, 't'); - $endtime = $database->getArtifactsValueInfluence($from['owner'], $from['wref'], 2, $troopsTime); - $endtime += $AttackArrivalTime; - if($type == 1){ - if($from['owner'] == 3){ // fix natar report by ronix - $database->addNotice($to['owner'], $to['wref'], $targetally, 20, '' . addslashes($from['name']) . ' scouts ' . addslashes($to['name']) . '', $data2, $AttackArrivalTime); - }elseif($totaldead_att == 0 && $totaltraped_att == 0){ - $database->addNotice($from['owner'], $to['wref'], $ownally, 18, '' . addslashes($from['name']) . ' scouts ' . addslashes($to['name']) . '', $data2, $AttackArrivalTime); - }else{ - $database->addNotice($from['owner'], $to['wref'], $ownally, 21, '' . addslashes($from['name']) . ' scouts ' . addslashes($to['name']) . '', $data2, $AttackArrivalTime); - } - }else{ - if((empty($totaldead_att) || $totaldead_att == 0) && (empty($totaltraped_att) || $totaltraped_att == 0)){ - $database->addNotice($from['owner'], $to['wref'], $ownally, 1, '' . addslashes($from['name']) . ' attacks ' . addslashes($to['name']) . '', $data2, $AttackArrivalTime); - }else{ - $database->addNotice($from['owner'], $to['wref'], $ownally, 2, '' . addslashes($from['name']) . ' attacks ' . addslashes($to['name']) . '', $data2, $AttackArrivalTime); - } - } - - $database->setMovementProc($data['moveid']); - - if (!isset($chiefing_village)) $chiefing_village = 0; - - if($chiefing_village != 1){ - $database->addMovement(4, $DefenderWref, $AttackerWref, $data['ref'], $AttackArrivalTime, $endtime, 1, $steal[0], $steal[1], $steal[2], $steal[3]); - if($type !== 1){ - if ($isoasis == 0) $database->modifyResource($DefenderWref, $steal[0], $steal[1], $steal[2], $steal[3], 0); - else - { - //if it's an oasis but it's conquered by someone, resources must be modified in the owner's village - if($conqureby > 0) $database->modifyResource($conqureby, $steal[0], $steal[1], $steal[2], $steal[3], 0); - else $database->modifyOasisResource($DefenderWref, $steal[0], $steal[1], $steal[2], $steal[3], 0); - } - $totalstolengain = $steal[0] + $steal[1] + $steal[2] + $steal[3]; - $totalstolentaken = ((isset($totalstolentaken) ? $totalstolentaken : 0) - ($steal[0] + $steal[1] + $steal[2] + $steal[3])); - $database->modifyPoints($from['owner'], 'RR', $totalstolengain); - $database->modifyPoints($to['owner'], 'RR', $totalstolentaken); - $database->modifyPointsAlly($targetally, 'RR', $totalstolentaken); - $database->modifyPointsAlly($ownally, 'RR', $totalstolengain); - } - }else{ //fix by ronix if only 1 chief left to conqured - don't add with zero enforces - if($totalsend_att - ($totaldead_att + (isset($totaltraped_att) ? $totaltraped_att : 0)) > 1){ - $database->addEnforce2($data, $owntribe, $troopsdead1, $troopsdead2, $troopsdead3, $troopsdead4, $troopsdead5, $troopsdead6, $troopsdead7, $troopsdead8, $troopsdead9, $troopsdead10, $troopsdead11); - } - } - } - else //else they die and don't return or report. - { - $database->setMovementProc($data['moveid']); - if($type == 1){ - $database->addNotice($from['owner'], $to['wref'], $ownally, 19, addslashes($from['name']) . ' scouts ' . addslashes($to['name']) . '', $data_fail, $AttackArrivalTime); - }else{ - $database->addNotice($from['owner'], $to['wref'], $ownally, 3, '' . addslashes($from['name']) . ' attacks ' . addslashes($to['name']) . '', $data_fail, $AttackArrivalTime); - } - } - if($type == 3 || $type == 4) $database->addGeneralAttack($totalattackdead); - - if (!isset($village_destroyed)) $village_destroyed = 0; - - if ($village_destroyed == 1 && $can_destroy == 1) - { - if($to['capital'] == 1){ - $mostPopulatedVillage = []; - //Search for the most populated village - foreach($varray as $village){ - if($village['wref'] != $data['to'] && (empty($mostPopulatedVillage) || $mostPopulatedVillage['pop'] < $village['pop'])){ - $mostPopulatedVillage = $village; - } - } - //Set the new capital - $database->changeCapital($mostPopulatedVillage['wref']); - } - - //Delete the village - $this->DelVillage($data['to']); - - //Reassign the hero, if dead and assigned to the deleted village - $database->reassignHero($data['to']); - } - }else{ - //units attack string for battleraport - $unitssend_att1 = ''.$data['t1'].','.$data['t2'].','.$data['t3'].','.$data['t4'].','.$data['t5'].','.$data['t6'].','.$data['t7'].','.$data['t8'].','.$data['t9'].','.$data['t10'].''; - $herosend_att = $data['t11']; - $unitssend_att= $unitssend_att1.','.$herosend_att; - - $troopsTime = $units->getWalkingTroopsTime($from['wref'], $to['wref'], $from['owner'], $owntribe, $data, 1, 't'); - $endtime = $database->getArtifactsValueInfluence($from['owner'], $from['wref'], 2, $troopsTime); - $endtime += $AttackArrivalTime; - - $database->setMovementProc($data['moveid']); - $database->addMovement(4, $to['wref'], $from['wref'], $data['ref'], $AttackArrivalTime, $endtime); - $peace = PEACE; - $data2 = $from['owner'].','.$from['wref'].','.$to['owner'].','.$owntribe.','.$unitssend_att.','.$peace; - $time = time(); - $database->addNotice($from['owner'], $to['wref'], $ownally, 22,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'', $data2, $time); - $database->addNotice($to['owner'], $to['wref'], $targetally, 23,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'', $data2, $time); - } - - //Update starvation data - $this->addStarvationData($to['wref']); - - //Returning units back to village is not necessary because it will be taken care when processing movement - // Fix by AL-Kateb - // if evasion was active, return units back to base - /* - if (isset($evaded)) { - foreach ($evasionUnitModifications_modes as $index => $mode) { - $evasionUnitModifications_modes[$index] = 1; - } - - $database->modifyUnit($data['to'], $evasionUnitModifications_units, $evasionUnitModifications_amounts, $evasionUnitModifications_modes); - } - */ - - ################################################# - ################FIXED BY SONGER################ - ################################################# - - ################################################################################ - ##############ISUE: Lag, fixed3#################################################### - #### PHP.NET manual: unset() destroy more than one variable unset($foo1, $foo2, $foo3);###### - ################################################################################ - $data_num++; - - unset( - $Attacker - ,$Defender - ,$DefenderEnf - ,$DefenderHeroesTotArray - ,$DefenderHeroesDeadArray - ,$DefenderHeroesTot - ,$DefenderHeroesDead - ,$enforce - ,$unitssend_att - ,$unitssend_def - ,$battlepart - ,$unitlist - ,$unitsdead_def - ,$dead - ,$steal - ,$from - ,$data - ,$data2 - ,$to - ,$artifact - ,$artifactBig - ,$canclaim - ,$data_fail - ,$owntribe - ,$unitsdead_att - ,$herosend_def - ,$deadhero - ,$heroxp - ,$AttackerID - ,$DefenderID - ,$totalsend_att - ,$totalsend_alldef - ,$totaldead_att - ,$totaltraped_att - ,$totaldead_def - ,$unitsdead_att_check - ,$totalattackdead - ,$enforce1 - ,$defheroowner - ,$enforceowner - ,$defheroxp - ,$reinfheroxp - ,$AttackerWref - ,$DefenderWref - ,$troopsdead1 - ,$troopsdead2 - ,$troopsdead3 - ,$troopsdead4 - ,$troopsdead5 - ,$troopsdead6 - ,$troopsdead7 - ,$troopsdead8 - ,$troopsdead9 - ,$troopsdead10 - ,$troopsdead11 - ,$DefenderUnit - ,$info_trap); - - ################################################# - - } - } - } - - function DelVillage($wref){ - global $database, $units; - - $database->clearExpansionSlot($wref); - $wref = (int) $wref; - $q = "DELETE FROM ".TB_PREFIX."abdata where vref = $wref"; - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."bdata where wid = $wref"; - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."market where vref = $wref"; - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."research where vref = $wref"; - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."tdata where vref = $wref"; - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."fdata where vref = $wref"; - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."training where vref = $wref"; - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."units where vref = $wref"; - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."farmlist where wref = $wref"; - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."raidlist where towref = $wref"; - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."route where wid = $wref OR `from` = $wref"; - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."movement where proc = 0 AND ((`to` = $wref AND sort_type=4) OR (`from` = $wref AND sort_type=3))"; - $database->query($q); - $database->removeOases($wref, 1); - - $getmovement = $database->getMovement(3, $wref, 1); - - $moveIDs = []; - $time = microtime(true); - $types = []; - $froms = []; - $tos = []; - $refs = []; - $times = []; - $endtimes = []; - - foreach($getmovement as $movedata) { - $time2 = $time - $movedata['starttime']; - $moveIDs[] = $movedata['moveid']; - $types[] = 4; - $froms[] = $movedata['to']; - $tos[] = $movedata['from']; - $refs[] = $movedata['ref']; - $times[] = $time; - $endtimes[] = $time+$time2; - } - - $database->setMovementProc(implode(', ', $moveIDs)); - $database->addMovement($types, $froms, $tos, $refs, $times, $endtimes); - - $q = "DELETE FROM ".TB_PREFIX."enforcement WHERE `from` = $wref"; - $database->query($q); - - //check return enforcement from del village - $units->returnTroops($wref); - - $q = "DELETE FROM ".TB_PREFIX."vdata WHERE `wref` = $wref"; - $database->query($q); - - if (mysqli_affected_rows($database->dblink) > 0) { - $q = "UPDATE ".TB_PREFIX."wdata set occupied = 0 where id = $wref"; - $database->query($q); - - // clear expansion slots, if this village is an expansion of any other village - $database->clearExpansionSlot($wref, 1); - - $getprisoners = $database->getPrisoners($wref); - foreach($getprisoners as $pris) { - $troops = 0; - for($i = 1; $i < 12; $i++) $troops += $pris['t'.$i]; - $database->modifyUnit($pris['wref'], ["99o"], [$troops], [0]); - $database->deletePrisoners($pris['id']); - } - - $getprisoners = $database->getPrisoners3($wref); - foreach($getprisoners as $pris) { - $troops = 0; - for($i = 1;$i < 12; $i++) $troops += $pris['t'.$i]; - $database->modifyUnit($pris['wref'], ["99o"], [$troops], [0]); - $database->deletePrisoners($pris['id']); - } - } - } - - private function sendreinfunitsComplete() { - global $bid23, $database, $battle; - - $time = time(); - $q = " - SELECT - `to`, `from`, moveid, - t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 - FROM - ".TB_PREFIX."movement, - ".TB_PREFIX."attacks - WHERE - ".TB_PREFIX."movement.ref = ".TB_PREFIX."attacks.id - AND - ".TB_PREFIX."movement.proc = 0 - AND - ".TB_PREFIX."movement.sort_type = 3 - AND - ".TB_PREFIX."attacks.attack_type = 2 - AND - endtime < $time"; - $dataarray = $database->query_return($q); - - if ($dataarray && count($dataarray)) { - // preload village data - $vilIDs = []; - $tos = []; - $froms = []; - foreach($dataarray as $data) { - $vilIDs[$data['from']] = true; - $vilIDs[$data['to']] = true; - $tos[$data['to']] = true; - $froms[$data['from']] = true; - } - $vilIDs = array_keys($vilIDs); - $database->getProfileVillages($vilIDs, 5); - $database->getUnit($vilIDs); - $database->getEnforce(array_keys($tos), array_keys($froms)); - $database->getVillageByWorldID($vilIDs); - - // calculate reinforcements data - $movementProcIDs = []; - foreach($dataarray as $data) { - $isoasis = $database->isVillageOases($data['to']); - if($isoasis == 0){ - $to = $database->getMInfo($data['to']); - $toF = $database->getVillage($data['to']); - $DefenderID = $to['owner']; - $targettribe = $database->getUserField($DefenderID, "tribe", 0); - $conqureby = 0; - }else{ - $to = $database->getOMInfo($data['to']); - $toF = $database->getOasisV($data['to']); - $DefenderID = $to['owner']; - $targettribe = $database->getUserField($DefenderID, "tribe", 0); - $conqureby = $toF['conqured']; - } - - if($data['from'] == 0){ - $DefenderID = $database->getVillageField($data['to'], "owner"); - $database->addEnforce($data); - $reinf = $database->getEnforce($data['to'], $data['from']); - $database->modifyEnforce($reinf['id'], 31, 1, 1); - $data_fail = '0,0,4,1,0,0,0,0,0,0,0,0,0,0'; - $database->addNotice($to['owner'], $to['wref'], (isset($targetally) ? $targetally : 0), 8, 'village of the elders reinforcement ' . addslashes($to['name']), $data_fail, $AttackArrivalTime); - $movementProcIDs[] = $data['moveid']; - }else{ - //set base things - $from = $database->getMInfo($data['from']); - $fromF = $database->getVillage($data['from']); - $AttackerID = $from['owner']; - $owntribe = $database->getUserField($AttackerID,"tribe",0); - - $HeroTransfer = $troopsPresent = 0; - for($i = 1;$i <= 10; $i++) { - if($data['t'.$i] > 0) { - $troopsPresent = 1; - break; - } - } - - //check if the hero is present and we're not sending him to an occupied oasis - //only add hero if we're sending him alone - if($data['t11'] > 0 && !$isoasis && !$troopsPresent) { - //check if we're sending a hero between own villages - if($AttackerID == $DefenderID) { - //check if there's a Mansion at target village - if($this->getTypeLevel(37, $data['to']) > 0){ - //don't reinforce, addunit instead - $database->modifyUnit($data['to'], ["hero"], [1], [1]); - $heroid = $database->getHeroField($DefenderID, 'heroid'); - $database->modifyHero("wref", $data['to'], $heroid); - $HeroTransfer = 1; - } - } - } - - if($data['t11'] > 0 || $troopsPresent) { - $temphero = $data['t11']; - if ($HeroTransfer) $data['t11'] = 0; - //check if there is defence from town in to town - $check = $database->getEnforce($data['to'], $data['from']); - if (!isset($check['id'])) $database->addEnforce($data); - else - { - //yes - $start = ($owntribe - 1) * 10 + 1; - $end = ($owntribe * 10); - - //add unit. - $t_units = ''; - for($i = $start, $j = 1; $i <= $end; $i++, $j++) - { - $t_units .= "u".$i." = u".$i." + ".$data['t'.$j].(($j > 9) ? '' : ', '); - } - - $q = "UPDATE ".TB_PREFIX."enforcement set $t_units where id =".(int) $check['id']; - $database->query($q); - $database->modifyEnforce($check['id'], 'hero', $data['t11'], 1); - } - $data['t11'] = $temphero; - } - //send rapport - $unitssend_att = ''.$data['t1'].','.$data['t2'].','.$data['t3'].','.$data['t4'].','.$data['t5'].','.$data['t6'].','.$data['t7'].','.$data['t8'].','.$data['t9'].','.$data['t10'].','.$data['t11'].''; - $data_fail = ''.$from['wref'].','.$from['owner'].','.$owntribe.','.$unitssend_att.''; - - - if($isoasis == 0) $to_name = $to['name']; - else $to_name = "Oasis ".$database->getVillageField($to['conqured'],"name"); - - $database->addNotice($from['owner'],$from['wref'],(isset($ownally) ? $ownally : 0),8,''.addslashes($from['name']).' reinforcement '.addslashes($to_name).'',$data_fail,(isset($AttackArrivalTime) ? $AttackArrivalTime : time())); - if($from['owner'] != $to['owner']) { - $database->addNotice($to['owner'],$to['wref'],(isset($targetally) ? $targetally : 0),8,''.addslashes($from['name']).' reinforcement '.addslashes($to_name).'',$data_fail,(isset($AttackArrivalTime) ? $AttackArrivalTime : time())); - } - //update status - $movementProcIDs[] = $data['moveid']; - } - - //Update starvation data - $this->addStarvationData($data['to']); - - //check empty reinforcement in rally point - $e_units = ''; - for ($i = 1; $i <= 50; $i++) $e_units.= 'u'.$i.'= 0 AND '; - - $e_units.= 'hero = 0'; - $q = "DELETE FROM ".TB_PREFIX."enforcement WHERE ".$e_units." AND (vref=".(int) $data['to']." OR `from`=".(int) $data['to'].")"; - $database->query($q); - } - - $database->setMovementProc(implode(', ', $movementProcIDs)); - } - } - - private function returnunitsComplete() { - global $database; - - $time = time(); - $q = " - SELECT - `to`, `from`, moveid, starttime, endtime, wood, clay, iron, crop, - t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 - FROM - ".TB_PREFIX."movement, - ".TB_PREFIX."attacks - WHERE - ".TB_PREFIX."movement.ref = ".TB_PREFIX."attacks.id - AND - ".TB_PREFIX."movement.proc = 0 - AND - ".TB_PREFIX."movement.sort_type = 4 - AND - endtime < $time"; - $dataarray = $database->query_return($q); - - if ($dataarray && count($dataarray)) { - // preload village data - $vilIDs = []; - foreach($dataarray as $data) { - $vilIDs[$data['from']] = true; - $vilIDs[$data['to']] = true; - } - $database->getProfileVillages(array_keys($vilIDs), 5); - $database->getOasisEnforce($vilIDs, 0); - $database->getOasisEnforce($vilIDs, 1); - - $movementProcIDs = []; - foreach($dataarray as $data) { - $tribe = $database->getUserField($database->getVillageField($data['to'], "owner"), "tribe", 0); - $u = $tribe == 1 ? "" : $tribe - 1; - $database->modifyUnit( - $data['to'], - [$u."1", $u."2", $u."3", $u."4", $u."5", $u."6", $u."7", $u."8", $u."9", $tribe."0", "hero"], - [$data['t1'], $data['t2'], $data['t3'], $data['t4'], $data['t5'], $data['t6'], $data['t7'], $data['t8'], $data['t9'], $data['t10'], $data['t11']], - [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] - ); - - //If there's at least 1 resource, add it to the village - if($data['wood'] + $data['clay'] + $data['iron'] + $data['crop'] > 0){ - $database->modifyResource($data['to'], $data['wood'], $data['clay'], $data['iron'], $data['crop'], 1); - } - - $movementProcIDs[] = $data['moveid']; - - //Update starvation data - $this->addStarvationData($data['to']); - } - - $database->setMovementProc(implode(', ', $movementProcIDs)); - $this->pruneResource(); - } - - // Settlers - $q = "SELECT `to`, moveid FROM ".TB_PREFIX."movement where ref = 0 and proc = '0' and sort_type = '4' and endtime < $time"; - $dataarray = $database->query_return($q); - $movementProcIDs = []; - - if ($dataarray && count($dataarray)) { - foreach($dataarray as $data) { - $tribe = $database->getUserField($database->getVillageField($data['to'], "owner"), "tribe", 0); - $database->modifyUnit($data['to'], [$tribe."0"], [3], [1]); - - //If a settling is canceled, add 750 for each resource type - $database->modifyResource($data['to'], 750, 750, 750, 750, 1); - $movementProcIDs[] = $data['moveid']; - } - $database->setMovementProc(implode(', ', $movementProcIDs)); - } - } - - private function sendSettlersComplete() { - global $database; - - $time = microtime(true); - $q = "SELECT `to`, `from`, moveid, starttime, ref FROM ".TB_PREFIX."movement where proc = 0 and sort_type = 5 and endtime < $time"; - - $dataarray = $database->query_return($q); - $movementProcIDs = []; - $fieldIDs = []; - $addUnitsWrefs = []; - $addTechWrefs = []; - $addABTechWrefs = []; - $time = microtime(true); - $types = []; - $froms = []; - $tos = []; - $refs = []; - $times = []; - $endtimes = []; - - // preload village data - $vilIDs = []; - foreach($dataarray as $data) { - $vilIDs[$data['from']] = true; - $vilIDs[$data['to']] = true; - } - $vilIDs = array_keys($vilIDs); - $database->getProfileVillages($vilIDs, 5); - $database->getVillageByWorldID($vilIDs); - - foreach($dataarray as $data) { - $ownerID = $database->getUserField($database->getVillageField($data['from'], "owner"), "id", 0); - $to = $database->getMInfo($data['from']); - $user = addslashes($database->getUserField($to['owner'], 'username', 0)); - $taken = $database->getVillageState($data['to']); - if($taken != 1){ - $fieldIDs[] = $data['to']; - $database->addVillage($data['to'], $to['owner'], $user, '0'); - $database->addResourceFields($data['to'], $database->getVillageType($data['to'])); - $addUnitsWrefs[] = $data['to']; - $addTechWrefs[] = $data['to']; - $addABTechWrefs[] = $data['to']; - $movementProcIDs[] = $data['moveid']; - - $exp1 = $database->getVillageField($data['from'], 'exp1'); - $exp2 = $database->getVillageField($data['from'], 'exp2'); - $exp3 = $database->getVillageField($data['from'], 'exp3'); - - if($exp1 == 0){ - $exp = 'exp1'; - $value = $data['to']; - }elseif($exp2 == 0){ - $exp = 'exp2'; - $value = $data['to']; - }else{ - $exp = 'exp3'; - $value = $data['to']; - } - - $database->setVillageField($data['from'], $exp, $value); - }else{ - // here must come movement from returning settlers - $types[] = 4; - $froms[] = $data['to']; - $tos[] = $data['from']; - $refs[] = $data['ref']; - $times[] = $time; - $endtimes[] = $time + ($time - $data['starttime']); - $movementProcIDs[] = $data['moveid']; - } - } - - $database->addMovement($types, $froms, $tos, $refs, $times, $endtimes); - $database->setMovementProc(implode(', ', $movementProcIDs)); - $database->setFieldTaken($fieldIDs); - $database->addUnits($addUnitsWrefs); - $database->addTech($addTechWrefs); - $database->addABTech($addABTechWrefs); - - } - - /** - * Create the Natars account and spawn artifacts - * - */ - - private function spawnNatars(){ - global $database; - - //Check if Natars account is already created and if the time - //is come and we have to create Natars and spawn their artifacts - if($database->areArtifactsSpawned() || strtotime(START_DATE) + (NATARS_SPAWN_TIME * 86400) > time()) return; - - //Create the Natars account and his capital - $database->createNatars(); - - //Artifacts constants - $artifactArrays = [ARCHITECTS_DESC => [["type" => 1, "size" => 1, "name" => ARCHITECTS_SMALL, "vname" => ARCHITECTS_SMALLVILLAGE, "effect" => "(4x)", "quantity" => 6, "img" => 2], - ["type" => 1, "size" => 2, "name" => ARCHITECTS_LARGE, "vname" => ARCHITECTS_LARGEVILLAGE, "effect" => "(3x)", "quantity" => 4, "img" => 2], - ["type" => 1, "size" => 3, "name" => ARCHITECTS_UNIQUE,"vname" => ARCHITECTS_UNIQUEVILLAGE, "effect" => "(5x)", "quantity" => 1, "img" => 2]], - - HASTE_DESC => [["type" => 2, "size" => 1, "name" => HASTE_SMALL, "vname" => HASTE_SMALLVILLAGE, "effect" => "(2x)", "quantity" => 6, "img" => 4], - ["type" => 2, "size" => 2, "name" => HASTE_LARGE, "vname" => HASTE_LARGEVILLAGE, "effect" => "(1.5x)", "quantity" => 4, "img" => 4], - ["type" => 2, "size" => 3, "name" => HASTE_UNIQUE, "vname" => HASTE_UNIQUEVILLAGE, "effect" => "(3x)", "quantity" => 1, "img" => 4]], - - EYESIGHT_DESC => [["type" => 3, "size" => 1, "name" => EYESIGHT_SMALL, "vname" => EYESIGHT_SMALLVILLAGE, "effect" => "(5x)", "quantity" => 6, "img" => 5], - ["type" => 3, "size" => 2, "name" => EYESIGHT_LARGE, "vname" => EYESIGHT_LARGEVILLAGE, "effect" => "(3x)", "quantity" => 4, "img" => 5], - ["type" => 3, "size" => 3, "name" => EYESIGHT_UNIQUE, "vname" => EYESIGHT_UNIQUEVILLAGE, "effect" => "(10x)", "quantity" => 1, "img" => 5]], - - DIET_DESC => [["type" => 4, "size" => 1, "name" => DIET_SMALL, "vname" => DIET_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 6], - ["type" => 4, "size" => 2, "name" => DIET_LARGE, "vname" => DIET_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 6], - ["type" => 4, "size" => 3, "name" => DIET_UNIQUE, "vname" => DIET_UNIQUEVILLAGE, "effect" => "(50%)", "quantity" => 1, "img" => 6]], - - ACADEMIC_DESC => [["type" => 5, "size" => 1, "name" => ACADEMIC_SMALL, "vname" => ACADEMIC_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 8], - ["type" => 5, "size" => 2, "name" => ACADEMIC_LARGE, "vname" => ACADEMIC_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 8], - ["type" => 5, "size" => 3, "name" => ACADEMIC_UNIQUE, "vname" => ACADEMIC_UNIQUEVILLAGE, "effect" => "(50%)", "quantity" => 1, "img" => 8]], - - STORAGE_DESC => [["type" => 6, "size" => 1, "name" => STORAGE_SMALL, "vname" => STORAGE_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 9], - ["type" => 6, "size" => 2, "name" => STORAGE_LARGE, "vname" => STORAGE_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 9]], - - CONFUSION_DESC => [["type" => 7, "size" => 1, "name" => CONFUSION_SMALL, "vname" => CONFUSION_SMALLVILLAGE, "effect" => "(200)", "quantity" => 6, "img" => 10], - ["type" => 7, "size" => 2, "name" => CONFUSION_LARGE, "vname" => CONFUSION_LARGEVILLAGE, "effect" => "(100)", "quantity" => 4, "img" => 10], - ["type" => 7, "size" => 3, "name" => CONFUSION_UNIQUE, "vname" => CONFUSION_UNIQUEVILLAGE, "effect" => "(500)", "quantity" => 1, "img" => 10]], - - FOOL_DESC => [["type" => 8, "size" => 1, "name" => FOOL_SMALL, "vname" => FOOL_SMALLVILLAGE, "effect" => "", "quantity" => 10, "img" => "fool"], - ["type" => 8, "size" => 3, "name" => FOOL_UNIQUE, "vname" => FOOL_UNIQUEVILLAGE, "effect" => "", "quantity" => 1, "img" => "fool"]]]; - - //Add artifacts and their villages - $database->addArtifactVillages($artifactArrays); - - //Write the system message - $database->displaySystemMessage(ARTEFACT); - } - - /** - * Spawn WW Villages - * - */ - - private function spawnWWVillages(){ - global $database; - - //Check if Natars account has already been created, if WW villages have already been spawned - //and if it's the time to spawn them or not - if(!$database->areArtifactsSpawned() || $database->areWWVillagesSpawned() || strtotime(START_DATE) + (NATARS_WW_SPAWN_TIME * 86400) > time()) return; - - //WW village Natars' troops - $unitArrays = [41 => rand(500, 12000) * NATARS_UNITS, - 42 => rand(1000 , 14000) * NATARS_UNITS, - 43 => rand(2000, 16000) * NATARS_UNITS, - 44 => rand(100, 500) * NATARS_UNITS, - 45 => rand(480, 17000) * NATARS_UNITS, - 46 => rand(600, 18000) * NATARS_UNITS, - 47 => rand(2000, 16000) * NATARS_UNITS, - 48 => rand(400, 2000) * NATARS_UNITS, - 49 => rand(40, 200) * NATARS_UNITS, - 50 => rand(50, 250) * NATARS_UNITS]; - - //WW village buildings - $buildingArrays = ["f99t" => 40, "f99" => 0, "f39t" => 16, "f39" => 1, "f19t" => 17, "f19" => 20, "f20t" => 11, - "f20" => 20, "f21t" => 15, "f21" => 20, "f22t" => 10, "f22" => 20, "f23t" => 22, "f23" => 10, - "f24t" => 25, "f24" => 10, "f26t" => 0, "f26" => 0, "f27t" => 19, "f27" => 10, "f31t" => 23, "f31" => 10]; - - $villageArrays = $wids = []; - for($i = 1; $i <= 13; $i++) $villageArrays[] = ['wid' => 0, 'kid' => ($i == 13 ? rand(1, 4) : ($i % 4) + 1), 'capital' => 0]; - - $wids = $database->generateVillages($villageArrays, 3, "Natars"); - - foreach($wids as $wid){ - $database->modifyUnit($wid, array_keys($unitArrays), array_values($unitArrays), [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]); - $database->setVillageLevel($wid, array_keys($buildingArrays), array_values($buildingArrays)); - $database->setVillageFields($wid, ['natar', 'name'], [1, WWVILLAGE]); - $this->recountPop($wid); - } - - //Write the system message - $database->displaySystemMessage(WWVILLAGEMSG); - } - - /** - * Spawn WW Building plans - * - */ - - private function spawnWWBuildingPlans(){ - global $database; - - //Check if Natars account is already spawned, if WW building plans have already been spawned - //and if it's the time to spawn them or not - if(!$database->areArtifactsSpawned() || $database->areArtifactsSpawned(true) || strtotime(START_DATE) + (NATARS_WW_BUILDING_PLAN_SPAWN_TIME * 86400) > time()) return; - - $artifactArrays = [PLAN_DESC => [["type" => 11, "size" => 1, "name" => PLAN,"vname" => PLANVILLAGE, "effect" => "", "quantity" => 13, "img" => 1]]]; - - //Add the artifacts and villages - $database->addArtifactVillages($artifactArrays); - - //Set the system message to contain the infos of the WW building plans - $database->displaySystemMessage(PLAN_INFO); - } - - /** - * Automatically activate all artifacts that need to be activated - * - */ - - private function activateArtifacts() { - global $database; - - //Check if there's at least one artifact, if not, return - if(!$database->areArtifactsSpawned()) return; - - //Get all inactive artifacts that have to be activated --> (24 hours / Speed of the server) - $time = time(); - $artifacts = $database->getInactiveArtifacts(round($time - (86400 / (SPEED == 2 ? 1.5 : (SPEED == 3 ? 2 : SPEED))))); - - if(!empty($artifacts)){ - - //Cache inactive artifacts by owner - $inactiveArtifactsCache = []; - foreach($artifacts as $artifact) $inactiveArtifactsCache[$artifact['owner']][] = $artifact; - - foreach($inactiveArtifactsCache as $owner => $inactiveArtifacts){ - - //Initialize the array - $activeArtifacts = []; - - //Get cached active artifacts - $ownArtifacts = $database->getOwnArtifactsSum($owner, true); - - //Activate activable artifacts - foreach($inactiveArtifacts as $artifact){ - if($ownArtifacts['totals'] < 3){ - if($artifact['size'] == 1){ //Village effect - $database->activateArtifact($artifact['id']); - $ownArtifacts['totals']++; - $ownArtifacts['small']++; - }elseif($artifact['size'] == 2 && !$ownArtifacts['unique'] && !$ownArtifacts['great']){ //Account effect - $database->activateArtifact($artifact['id']); - $ownArtifacts['totals']++; - $ownArtifacts['great']++; - }elseif($artifact['size'] == 3 && !$ownArtifacts['unique'] && !$ownArtifacts['great']){ //Unique effect - $database->activateArtifact($artifact['id']); - $ownArtifacts['totals']++; - $ownArtifacts['unique']++; - } - }elseif($ownArtifacts['small'] == 3 && $artifact['size'] > 1){ - //If we've 3 village effect artifacts activated and at least one account/unique effect not activated - //then we need to deactivate the most recent village effect artifact and activate the oldest account - //or unique effect artifact - - //Deactivate the most recent village effect artifact - $database->activateArtifact($database->getNewestArtifactBySize($owner, 1)['id'], 0); - - //Activate the great/unique artifact - $database->activateArtifact($artifact['id']); - - $ownArtifacts['small']--; - $ownArtifacts['totals']++; - if($artifact['size'] == 2) $ownArtifacts['great']++; - else $ownArtifacts['unique']++; - } - } - } - } - } - - private function researchComplete() { - global $database; - - $time = time(); - $deleteIDs = []; - $tdata = []; - $abdata = []; - - $q = "SELECT tech, vref, id FROM ".TB_PREFIX."research where timestamp < $time"; - $dataarray = $database->query_return($q); - - foreach($dataarray as $data) { - $sort_type = substr($data['tech'],0,1); - switch($sort_type) { - case "t": - if (!isset($tdata[$data['vref']])) $tdata[$data['vref']] = []; - $tdata[$data['vref']][] = $data['tech'].' = 1'; - break; - case "a": - case "b": - if (!isset($abdata[$data['vref']])) $abdata[$data['vref']] = []; - $abdata[$data['vref']][] = $data['tech']." = ".$data['tech']." + 1"; - break; - } - $deleteIDs[] = (int) $data['id']; - } - - // execute queries with consolidated research data - if (count($tdata)) { - foreach ( $tdata as $vid => $preparedData ) { - $q = "UPDATE ".TB_PREFIX."tdata SET ".implode(', ', $preparedData)." WHERE vref = ".$vid; - $database->query($q); - } - } - - if (count($abdata)) { - foreach ( $abdata as $vid => $preparedData ) { - $q = "UPDATE ".TB_PREFIX."abdata SET ".implode(', ', $preparedData)." WHERE vref = ".$vid; - $database->query($q); - } - } - - if (count($deleteIDs)) { - $q = "DELETE FROM " . TB_PREFIX . "research where id IN(" . implode( ', ', $deleteIDs ) . ")"; - $database->query( $q ); - } - } - - private function updateORes($bountywid) { - global $database; - - $oasisInfoArray = $database->getOasisV($bountywid); - $timepast = time() - $oasisInfoArray['lastupdated']; - $nwood = (OASIS_WOOD_PRODUCTION / 3600) * $timepast; - $nclay = (OASIS_CLAY_PRODUCTION / 3600) * $timepast; - $niron = (OASIS_IRON_PRODUCTION / 3600) * $timepast; - $ncrop = (OASIS_CROP_PRODUCTION / 3600) * $timepast; - $database->modifyOasisResource($bountywid, $nwood, $nclay, $niron, $ncrop, 1); - $database->updateOasis($bountywid); - } - - private function updateRes($bountywid) { - global $database, $technology; - - //Get village infos - $villageInfoArray = $database->getVillage($bountywid); - - //Get building and resource fields array - $resArray = $database->getResourceLevel($bountywid, false); - - //Get oasis array - $oasisArray = $database->getOasis($bountywid); - - //Get an array with the numbers of the oasis - $numberOfOasis = $this->bountysortOasis($oasisArray); - - //Set the village population (if WW Villages, it's halved) - $villagePopulation = !$villageInfoArray['natar'] ? $villageInfoArray['pop'] : round($villageInfoArray['pop'] / 2); - - //Get the upkeep of the village - $upkeep = $technology->getUpkeep($this->getAllUnits($bountywid), 0, $bountywid); - - //Calculate the produced resources - $timepast = time() - $villageInfoArray['lastupdate']; - $nwood = ($this->bountyGetWoodProd($resArray, $numberOfOasis) / 3600) * $timepast; - $nclay = ($this->bountyGetClayProd($resArray, $numberOfOasis) / 3600) * $timepast; - $niron = ($this->bountyGetIronProd($resArray, $numberOfOasis) / 3600) * $timepast; - $ncrop = (($this->bountyGetCropProd($resArray, $numberOfOasis) - $villagePopulation - $upkeep) / 3600) * $timepast; - $database->modifyResource($bountywid, $nwood, $nclay, $niron, $ncrop, 1); - $database->updateVillage($bountywid); - } - - private function bountysortOasis($oasisArray) { - $crop = $clay = $wood = $iron = 0; - foreach ($oasisArray as $oasis) { - switch($oasis['type']) { - case 1: - case 2: - $wood++; - break; - case 3: - $wood++; - $crop++; - break; - case 4: - case 5: - $clay++; - break; - case 6: - $clay++; - $crop++; - break; - case 7: - case 8: - $iron++; - break; - case 9: - $iron++; - $crop++; - break; - case 10: - case 11: - $crop++; - break; - case 12: - $crop += 2; - break; - } - } - return [$wood, $clay, $iron, $crop]; - } - - function getAllUnits($base, $use_cache = true) { - global $database; - - $ownunit = $database->getUnit($base, $use_cache); - $enforcementarray = $database->getEnforceVillage($base, 0); - - if(count($enforcementarray) > 0){ - foreach($enforcementarray as $enforce){ - for($i = 1; $i <= 50; $i++){ - $ownunit['u'.$i] += $enforce['u'.$i]; - } - } - } - - $enforceoasis = $database->getOasisEnforce($base, 0, $use_cache); - if(count($enforceoasis) > 0){ - foreach($enforceoasis as $enforce){ - for($i = 1; $i <= 50; $i++){ - $ownunit['u'.$i] += $enforce['u'.$i]; - } - } - } - - $enforceoasis1 = $database->getOasisEnforce($base, 1, $use_cache); - if(count($enforceoasis1) > 0){ - foreach($enforceoasis1 as $enforce){ - for($i = 1; $i <= 50; $i++){ - $ownunit['u'.$i] += $enforce['u'.$i]; - } - } - } - - $movement = $database->getVillageMovement($base); - if(!empty($movement)){ - for($i = 1; $i <= 50; $i++){ - if(!isset($ownunit['u' . $i])){ - $ownunit['u'.$i] = 0; - } - - $ownunit['u'.$i] += (isset($movement['u'.$i]) ? $movement['u'.$i] : 0); - } - } - - $prisoners = $database->getPrisoners($base, 1); - if(!empty($prisoners)){ - foreach($prisoners as $prisoner){ - $owner = $database->getVillageField($base, "owner"); - $ownertribe = $database->getUserField($owner, "tribe", 0); - $start = ($ownertribe - 1) * 10 + 1; - $end = ($ownertribe * 10); - for($i = $start; $i <= $end; $i++){ - $j = $i - $start + 1; - $ownunit['u'.$i] += $prisoner['t'.$j]; - } - $ownunit['hero'] += $prisoner['t11']; - } - } - return $ownunit; - } - - private function bountyGetWoodProd($resArray, $oasisNumber) { - global $bid1, $bid5; - - $wood = $sawmill = 0; - $woodholder = []; - for($i = 1; $i <= 38; $i++) { - if($resArray['f'.$i.'t'] == 1) array_push($woodholder,'f'.$i); - if($resArray['f'.$i.'t'] == 5) $sawmill = $resArray['f'.$i]; - } - - for($i = 0; $i <= count($woodholder) - 1; $i++) $wood += $bid1[$resArray[$woodholder[$i]]]['prod']; - - if($sawmill >= 1) $wood += $wood / 100 * $bid5[$sawmill]['attri']; - if($oasisNumber[0] > 0) $wood += $wood * 0.25 * $oasisNumber[0]; - - return round($wood * SPEED); - } - - private function bountyGetClayProd($resArray, $oasisNumber) { - global $bid2, $bid6; - - $clay = $brick = 0; - $clayholder = []; - for($i = 1; $i <= 38; $i++) { - if($resArray['f'.$i.'t'] == 2) array_push($clayholder, 'f'.$i); - if($resArray['f'.$i.'t'] == 6) $brick = $resArray['f'.$i]; - } - - for($i = 0; $i <= count($clayholder) - 1; $i++) $clay += $bid2[$resArray[$clayholder[$i]]]['prod']; - - if($brick >= 1) $clay += $clay / 100 * $bid6[$brick]['attri']; - if($oasisNumber[1] > 0) $clay += $clay * 0.25 * $oasisNumber[1]; - - return round($clay * SPEED); - } - - private function bountyGetIronProd($resArray, $oasisNumber) { - global $bid3, $bid7; - - $iron = $foundry = 0; - $ironholder = []; - for($i = 1; $i <= 38; $i++) { - if($resArray['f'.$i.'t'] == 3) array_push($ironholder, 'f'.$i); - if($resArray['f'.$i.'t'] == 7) $foundry = $resArray['f'.$i]; - } - - for($i = 0; $i <= count($ironholder) - 1; $i++) $iron += $bid3[$resArray[$ironholder[$i]]]['prod']; - - if($foundry >= 1) $iron += $iron / 100 * $bid7[$foundry]['attri']; - if($oasisNumber[2] > 0) $iron += $iron * 0.25 * $oasisNumber[2]; - - return round($iron * SPEED); - } - - private function bountyGetCropProd($resArray, $oasisNumber) { - global $bid4, $bid8, $bid9, $database; - - $crop = $grainmill = $bakery = 0; - $cropholder = []; - for($i = 1; $i <= 38;$i++) { - if($resArray['f'.$i.'t'] == 4) array_push($cropholder, 'f'.$i); - if($resArray['f'.$i.'t'] == 8) $grainmill = $resArray['f'.$i]; - if($resArray['f'.$i.'t'] == 9) $bakery = $resArray['f'.$i]; - } - for($i = 0; $i <= count($cropholder) - 1; $i++) $crop += $bid4[$resArray[$cropholder[$i]]]['prod']; - - if($grainmill >= 1) $crop += $crop / 100 * (isset($bid8[$grainmill]['attri']) ? $bid8[$grainmill]['attri'] : 0); - if($bakery >= 1) $crop += $crop / 100 * (isset($bid9[$bakery]['attri']) ? $bid9[$bakery]['attri'] : 0); - if($oasisNumber[3] > 0) $crop += $crop * 0.25 * $oasisNumber[3]; - - if(!empty($resArray['vref']) && is_numeric($resArray['vref'])){ - $who = $database->getVillageField($resArray['vref'], "owner"); - $croptrue = $database->getUserField($who, "b4", 0); - if($croptrue > time()) $crop *= 1.25; - } - - return round($crop * SPEED); - } - - private function trainingComplete() { - global $database; - - $time = time(); - $trainlist = $database->getTrainingList(); - if(count($trainlist) > 0){ - // preload village data - $vilIDs = []; - foreach($trainlist as $train){ - $vilIDs[$train['vref']] = true; - } - $vilIDs = array_keys($vilIDs); - $database->getProfileVillages($vilIDs, 5); - $database->cacheResourceLevels($vilIDs); - $database->getUnit($vilIDs); - $database->getEnforceVillage($vilIDs, 0 ); - $database->getMovement(3, $vilIDs, 0); - $database->getMovement(4, $vilIDs, 1); - $database->getMovement(5, $vilIDs, 0); - $database->getOasisEnforce($vilIDs, 0); - $database->getOasisEnforce($vilIDs, 1); - $database->getPrisoners($vilIDs, 1); - - // calculate training updates - foreach($trainlist as $train){ - $timepast = $train['timestamp2'] - $time; - $pop = $train['pop']; - $valuesUpdated = false; - if($timepast <= 0 && $train['amt'] > 0) { - $valuesUpdated = true; - if($train['eachtime'] > 0){ - $timepast2 = $time - $train['timestamp2']; - $trained = 1; - while($timepast2 >= $train['eachtime']){ - $timepast2 -= $train['eachtime']; - $trained += 1; - } - - if($trained > $train['amt']) $trained = $train['amt']; - } - else $trained = $train['amt']; - - if($train['unit'] > 60 && $train['unit'] != 99){ - $database->modifyUnit($train['vref'], [$train['unit'] - 60], [$trained], [1]); - } - else $database->modifyUnit($train['vref'], [$train['unit']], [$trained], [1]); - - $database->updateTraining($train['id'], $trained, $trained * $train['eachtime']); - - if($train['amt'] - $trained <= 0) $database->trainUnit($train['id'], 0, 0, 0, 0, 1); - } - - if ($valuesUpdated) call_user_func(get_class($database).'::clearUnitsCache'); - - //Update starvation data - $this->addStarvationData($train['vref']); - } - } - } - - private function getsort_typeLevel($tid, $resarray) { - $keyholder = []; - - foreach(array_keys($resarray, $tid) as $key) { - if(strpos($key, 't')) { - $key = preg_replace("/[^0-9]/", '', $key); - array_push($keyholder, $key); - } - } - - $element = count($keyholder); - if($element >= 2) { - if($tid <= 4) { - $temparray = []; - - for($i = 0; $i <= $element - 1; $i++) { - array_push($temparray, $resarray['f'.$keyholder[$i]]); - } - - foreach ($temparray as $key => $val) { - if ($val == max($temparray)) $target = $key; - } - } - } - else if($element == 1) $target = 0; - else return 0; - - if(!empty($keyholder[$target])) return $resarray['f'.$keyholder[$target]]; - else return 0; - } - - private function celebrationComplete() { - global $database; - - $varray = $database->getCel(); - foreach($varray as $vil){ - $id = $vil['wref']; - $type = $vil['type']; - $user = $vil['owner']; - $cp = ($type == 1) ? 500 : 2000; - $database->clearCel($id); - $database->setCelCp($user, $cp); - } - } - - private function demolitionComplete() { - global $database; - - $varray = $database->getDemolition(); - foreach($varray as $vil) { - if ($vil['timetofinish'] <= time()) { - $type = $database->getFieldType($vil['vref'],$vil['buildnumber']); - $level = $database->getFieldLevel($vil['vref'],$vil['buildnumber']); - - if ($level < 0) $level = 0; - - $buildarray = $GLOBALS["bid".$type]; - - if ($type == 10 || $type == 38) { - $database->query(" - UPDATE ".TB_PREFIX."vdata - SET - `maxstore` = IF(`maxstore` - ".$buildarray[$level]['attri']." <= ".STORAGE_BASE.", ".STORAGE_BASE.", `maxstore` - ".$buildarray[$level]['attri']."), - WHERE - wref=".(int) $vil['vref']); - } - - if ($type == 11 || $type == 39) { - $database->query(" - UPDATE ".TB_PREFIX."vdata - SET - `maxcrop` = IF(`maxcrop` - ".$buildarray[$level]['attri']." <= ".STORAGE_BASE.", ".STORAGE_BASE.", `maxcrop` - ".$buildarray[$level]['attri']."), - WHERE - wref=".(int) $vil['vref']); - } - - if ($level == 1) $clear = ",f".$vil['buildnumber']."t=0"; - else $clear = ""; - - if ($database->getVillageField($vil['vref'], 'natar') == 1 && $type == 40) $clear = ""; //fix by ronix - fixed by iopietro - - $q = "UPDATE ".TB_PREFIX."fdata SET f".$vil['buildnumber']."=".(($level - 1 >= 0) ? $level - 1 : 0).$clear." WHERE vref=".(int) $vil['vref']; - $database->query($q); - - $pop = $this->getPop($type, $level - 1); - $database->modifyPop($vil['vref'], $pop[0], 1); - $this->procClimbers($database->getVillageField($vil['vref'], 'owner')); - $database->delDemolition($vil['vref'], true); - - if ($type == 18) Automation::updateMax($database->getVillageField($vil['vref'], 'owner')); - } - } - - } - - private function updateHero() { - global $database, $hero_levels; - - $harray = $database->getHero(); - if(!empty($harray)){ - // first of all, prepare all unit data at once for these heroes - $heroVillageIDs = []; - foreach($harray as $hdata) { - $heroVillageIDs[] = $hdata['wref']; - } - - // load data for those prepared IDs - $unitData = $database->getUnit($heroVillageIDs); - - // now do the math - $lastUpdateIDs = []; - $timeNow = time(); - foreach($harray as $hdata){ - $columns = []; - $columnValues = []; - $modes = []; - $lastUpdateTime = $timeNow; - $newHealth = -1; - - if((time()-$hdata['lastupdate']) >= 1){ - if($hdata['health'] < 100 and $hdata['health'] > 0){ - if(SPEED <= 10) $speed = SPEED; - else if(SPEED <= 100) $speed = ceil(SPEED / 10); - else $speed = ceil(SPEED / 100); - - $reg = $hdata['health'] + $hdata['regeneration'] * 5 * $speed / 86400 * (time() - $hdata['lastupdate']); - - if($reg <= 100) $newHealth = $reg; - else $newHealth = 100; - } - } - - $herolevel = $hdata['level']; - $newLevel = - 1; - $scorePoints = false; - for ($i = $herolevel + 1; $i < 100; $i++){ - if($hdata['experience'] >= $hero_levels[$i]){ - $newLevel = $i; - if ($i < 99) $scorePoints = true; - } - } - - // upgrade hero to a new level, if needed - if ($newLevel > -1) { - $columns[] = 'level'; - $columnValues[] = $newLevel; - $modes[] = null; - } - - // add as many points as needed, if we're below level 100 - if ($scorePoints) { - $columns[] = 'points'; - $columnValues[] = (5 * ($newLevel - $herolevel)); - $modes[] = 1; - } - - $villunits = $unitData[$hdata['wref']]; - if($hdata['trainingtime'] < time() && $hdata['inrevive'] == 1){ - mysqli_query($database->dblink,"UPDATE " . TB_PREFIX . "units SET hero = 1 WHERE vref = ".(int) $hdata['wref'].""); - - $columns[] = 'dead'; - $columnValues[] = 0; - $modes[] = null; - - $columns[] = 'inrevive'; - $columnValues[] = 0; - $modes[] = null; - - $columns[] = 'inrevive'; - $columnValues[] = 0; - $modes[] = null; - - $newHealth = 100; - $lastUpdateTime = (int) $hdata['trainingtime']; - } - - if($hdata['trainingtime'] < time() && $hdata['intraining'] == 1){ - mysqli_query($database->dblink,"UPDATE " . TB_PREFIX . "units SET hero = 1 WHERE vref = ".(int) $hdata['wref']); - - $columns[] = 'dead'; - $columnValues[] = 0; - $modes[] = null; - - $columns[] = 'intraining'; - $columnValues[] = 0; - $modes[] = null; - - $lastUpdateTime = (int) $hdata['trainingtime']; - } - - // update health, if needed - if ($newHealth > -1) { - $columns[] = 'health'; - $columnValues[] = $newHealth; - $modes[] = null; - } - - if ($lastUpdateTime != $timeNow) { - // last update timestamp - $columns[] = 'lastupdate'; - $columnValues[] = $lastUpdateTime; - $modes[] = null; - } else { - // leave same last update values for multiple heroes to the end - $lastUpdateIDs[] = $hdata['heroid']; - } - - if (count($columns)) $database->modifyHero($columns, $columnValues, $hdata['heroid'], $modes); - } - - if (count($lastUpdateIDs)) { - mysqli_query($database->dblink,"UPDATE " . TB_PREFIX . "hero SET lastupdate = $timeNow WHERE heroid IN(".implode(', ', $lastUpdateIDs).")"); - } - } - } - - // by SlimShady95, aka Manuel Mannhardt < manuel_mannhardt@web.de > UPDATED FROM songeriux < haroldas.snei@gmail.com > - private function updateStore() { - global $database, $bid10, $bid38, $bid11, $bid39; - - $result = mysqli_query($database->dblink, 'SELECT * FROM `' . TB_PREFIX . 'fdata`'); - - mysqli_begin_transaction($database->dblink); - while ($row = mysqli_fetch_assoc($result)) - { - $ress = $crop = 0; - for ($i = 19; $i < 40; ++$i) - { - //Warehouse - if ($row['f' . $i . 't'] == 10) - { - $ress += ((isset($bid10[$row['f' . $i]]) && isset($bid10[$row['f' . $i]]['attri'])) ? $bid10[$row['f' . $i]]['attri'] * STORAGE_MULTIPLIER : 0); - } - - //Great warehouse - if ($row['f' . $i . 't'] == 38) - { - $ress += ((isset($bid38[$row['f' . $i]]) && isset($bid38[$row['f' . $i]]['attri'])) ? $bid38[$row['f' . $i]]['attri'] * STORAGE_MULTIPLIER : 0); - } - - //Granary - if ($row['f' . $i . 't'] == 11) - { - $crop += ((isset($bid11[$row['f' . $i]]) && isset($bid11[$row['f' . $i]]['attri'])) ? $bid11[$row['f' . $i]]['attri'] * STORAGE_MULTIPLIER : 0); - } - - //Great granary - if ($row['f' . $i . 't'] == 39) - { - $crop += ((isset($bid39[$row['f' . $i]]) && isset($bid39[$row['f' . $i]]['attri'])) ? $bid39[$row['f' . $i]]['attri'] * STORAGE_MULTIPLIER : 0); - } - } - - // no need for update, since we didn't find any warehouses or granaries - // and maximums would have been set to correct values inside prune* functions already - if ($ress == 0 && $crop == 0) continue; - - // maxstore nor maxcrop can go below the minimum threshold - if ($ress < STORAGE_BASE) $ress = STORAGE_BASE; - if ($crop < STORAGE_BASE) $crop = STORAGE_BASE; - - mysqli_query($database->dblink,'UPDATE `' . TB_PREFIX . 'vdata` SET `maxstore` = ' . (int) $ress . ', `maxcrop` = ' . (int) $crop . ' WHERE `wref` = ' . (int) $row['vref']); - } - mysqli_commit($database->dblink); - } - - /*private function oasisResourcesProduce() { - global $database; - - $speedMultiplier = (8 * (SPEED/3600)); - $database->query(" - UPDATE " . TB_PREFIX . "odata - SET - lastupdated = UNIX_TIMESTAMP(), - wood = IF(wood + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxstore, maxstore, wood + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))), - clay = IF(clay + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxstore, maxstore, clay + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))), - iron = IF(iron + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxstore, maxstore, iron + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))), - crop = IF(crop + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxcrop, maxcrop, crop + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))) - WHERE - wood < 800 OR - clay < 800 OR - iron < 800 OR - crop < 800"); - }*/ - - private function checkInvitedPlayes() { - global $database; - - $q = "SELECT id, invited FROM ".TB_PREFIX."users WHERE invited > 0"; - $array = $database->query_return($q); - - // preload villages data - $userIDs = []; - foreach($array as $user) { - $userIDs[] = $user['id']; - } - $database->getProfileVillages($userIDs); - - // continue... - foreach($array as $user) { - $numusers = mysqli_fetch_array(mysqli_query($database->dblink,"SELECT Count(*) as Total FROM ".TB_PREFIX."users WHERE id = ".(int) $user['invited']), MYSQLI_ASSOC); - if($numusers['Total'] > 0){ - $varray = count($database->getProfileVillages($user['id'])); - if($varray > 1){ - $usergold = $database->getUserField($user['invited'],"gold",0); - $gold = $usergold+50; - $database->updateUserField($user['invited'],"gold",$gold,1); - $database->updateUserField($user['id'],"invited",0,1); - } - } - } - } - - private function updateGeneralAttack() { - global $database; - - mysqli_query($database->dblink, " - UPDATE ".TB_PREFIX."general - SET - shown = 0 - WHERE - shown = 1 AND - `time` < (UNIX_TIMESTAMP() - (86400 * 8))"); - } - - private function MasterBuilder() { - global $database; - - $q = "SELECT id, wid, type, level, field, timestamp FROM ".TB_PREFIX."bdata WHERE master = 1"; - $array = $database->query_return($q); - - foreach($array as $master) { - $owner = $database->getVillageField($master['wid'], 'owner'); - $tribe = $database->getUserField($owner, 'tribe', 0); - $villwood = $database->getVillageField($master['wid'], 'wood'); - $villclay = $database->getVillageField($master['wid'], 'clay'); - $villiron = $database->getVillageField($master['wid'], 'iron'); - $villcrop = $database->getVillageField($master['wid'], 'crop'); - $type = $master['type']; - $level = $master['level']; - $buildarray = $GLOBALS["bid".$type]; - $buildwood = $buildarray[$level]['wood']; - $buildclay = $buildarray[$level]['clay']; - $buildiron = $buildarray[$level]['iron']; - $buildcrop = $buildarray[$level]['crop']; - $ww = count($database->getBuildingByType($master['wid'], 40)); - - if($tribe == 1){ - if($master['field'] < 19){ - $bdata = $database->getDorf1Building($master['wid']); - $bdataTotal = count($bdata); - $bbdata = count($database->getDorf2Building($master['wid'])); - }else{ - $bdata = $database->getDorf2Building($master['wid']); - $bdataTotal = count($bdata); - $bbdata = count($database->getDorf1Building($master['wid'])); - } - }else{ - $bdata = array_merge($database->getDorf1Building($master['wid']), $database->getDorf2Building($master['wid'])); - $bdataTotal = $bbdata = count($bdata); - } - - if($database->getUserField($owner, 'plus', 0) > time() || $ww > 0){ - if($bbdata < 2) $inbuild = 2; - else $inbuild = 1; - } - else $inbuild = 1; - - $usergold = $database->getUserField($owner, 'gold', 0); - - if($bdataTotal < $inbuild && $buildwood <= $villwood && $buildclay <= $villclay && $buildiron <= $villiron && $buildcrop <= $villcrop && $usergold > 0){ - $time = $master['timestamp'] + time(); - - if(!empty($bdata)){ - foreach($bdata as $masterLoop) $time += ($masterLoop['timestamp'] - time()); - } - - if($bdataTotal == 0) $database->updateBuildingWithMaster($master['id'], $time, 0); - else $database->updateBuildingWithMaster($master['id'], $time, 1); - - $database->updateUserField($owner, 'gold', --$usergold, 1); - $database->modifyResource($master['wid'], $buildwood, $buildclay, $buildiron, $buildcrop, 0); - } - } - } - - /** - * Adds the starvation data in villages with a negative value of crop - * - * @param int $wref The village ID where the crop is negative - */ - - private function addStarvationData($wref){ - global $database, $technology; - - $getVillage = $database->getVillage($wref); - - //Exlude Support, Nature, Natars, TaskMaster and Multihunter - if ($getVillage['owner'] > 5){ - $crop = $database->getCropProdstarv($wref, false); - $unitArrays = $this->getAllUnits($wref, false); - $villageUpkeep = $getVillage['pop'] + $technology->getUpkeep($unitArrays, 0, $wref); - $starv = $getVillage['starv']; - if ($crop < $villageUpkeep){ - //Add starvation data - $database->setVillageFields($wref, ['starv'], [$villageUpkeep]); - } - } - } - - /** - * Function for starvation - by brainiacX and Shadow - * Rework by ronix - * Refactored by iopietro - */ - - //TODO: This function needs to be splitted in many subfunctions (for TravianZ refactor) - private function starvation() { - global $database, $technology; - - //starvation is disabled during Easter/Holidays/Christmas - if(PEACE) return; - - $time = time(); - - //update starvation in every village - $starvarray = $database->getProfileVillages(0, 7); - foreach($starvarray as $starv) $this->addStarvationData($starv['wref']); - - // load villages with minus prod - $starvarray = []; - $starvarray = $database->getStarvation(); - - $vilIDs = []; - foreach ($starvarray as $starv) $vilIDs[] = $starv['wref']; - - // cache - $database->getEnforceVillage($vilIDs, 0); - $database->getOasisEnforce($vilIDs, 2); - $database->getOasisEnforce($vilIDs, 3); - $database->getPrisoners($vilIDs, 1); - $database->getMovement(3, $vilIDs, 0); - $database->getMovement(4, $vilIDs, 1); - - foreach ($starvarray as $starv) - { - $unitarrays = $this->getAllUnits($starv['wref']); - - $upkeep = $starv['pop'] + $technology->getUpkeep($unitarrays, 0, $starv['wref']); - - $enforceArrays = $prisonerArrays = $unitArrays = $attackArrays = $allTroopsArray = $starvingTroops = $killedUnits = []; - - $enforceArrays = [$database->getOasisEnforce($starv['wref'], 2), - $database->getOasisEnforce($starv['wref'], 3), - $database->getEnforceVillage($starv['wref'], 2), - $database->getEnforceVillage($starv['wref'], 3)]; - - $prisonerArrays = [$database->getPrisoners($starv['wref'], 1)]; - - $unitArrays = ($database->getUnitsNumber($starv['wref'], 0) > 0) ? [[$database->getUnit($starv['wref'])]] : []; - - $attackArrays = [$database->getMovement(3, $starv['wref'], 0), - $database->getMovement(4, $starv['wref'], 1)]; - - $allTroopsArray = [$enforceArrays, $prisonerArrays, $unitArrays, $attackArrays]; - - // find the first not-empty array - foreach($allTroopsArray as $type => $allTroops) - { - if(!empty($allTroops)){ - foreach($allTroops as $subtype => $troops){ - if(!empty($troops)){ - $starvingTroops = reset($troops); - break 2; - } - } - } - } - - // if the player has no troops, then skip the next instructions - if(empty($starvingTroops)) continue; - - // counting - $timedif = $time - $starv['starvupdate']; - $cropProd = $database->getCropProdstarv($starv['wref']) - $starv['starv']; - if($cropProd < 0){ - $starvsec = (abs($cropProd) / 3600); - $difcrop = ($timedif * $starvsec); //crop eat up over time - $newcrop = 0; - $oldcrop = $database->getVillageField($starv['wref'], 'crop'); - - //if the grain is then tries to send all - if ($oldcrop > 100){ - $difcrop = $difcrop - $oldcrop; - if($difcrop < 0){ - $difcrop = 0; - $newcrop = $oldcrop - $difcrop; - $database->setVillageField($starv['wref'], 'crop', $newcrop); - } - } - - if($difcrop > 0 && $oldcrop <= 0){ - $tribe = $database->getUserField(($type == 2) ? $starv['owner'] : $database->getVillageField($starvingTroops['from'], "owner"), "tribe", 0); - $start = ($special = in_array($type, [1, 3])) ? 1 : ($tribe - 1) * 10 + 1; - $end = ($special) ? 10 : $tribe * 10 ; - $utype = ($special) ? 't' : 'u'; - $heroType = ($special) ? 't11' : 'hero'; - - $totalUnits = 0; - $counting = true; - while($difcrop > 0) - { - // search the highest troop - $maxcount = $maxtype = 0; - for($i = $start ; $i <= $end ; $i++) - { - $units = (isset($starvingTroops[$utype.$i]) ? $starvingTroops[$utype.$i] : 0); - if($counting) $totalUnits += $units; - if($units > $maxcount){ - $maxcount = $units; - $maxtype = $i; - } - } - if($counting) $counting = false; - - if($maxtype > 0){ - $starvingTroops[$utype.$maxtype]--; - $killedUnits[$maxtype]++; - $difcrop -= $GLOBALS['u'.(($special) ? $maxtype + ($tribe - 1) * 10 : $maxtype)]['crop']; - } - else break; - } - - $totalKilledUnits = array_sum($killedUnits); - if($starvingTroops[$heroType] > 0 && ($totalUnits == 0 || $totalUnits == $totalKilledUnits)){ - $totalKilledUnits += $starvingTroops[$heroType]; - $totalUnits += $starvingTroops[$heroType]; - $starvingTroops['heroinfo'] = $database->getHero(($type == 2) ? $starv['owner'] : $database->getVillageField(($type == 3 && $subtype == 1) ? $starvingTroops['to'] : $starvingTroops['from'], "owner"))[0]; - $database->modifyHero("dead", 1, $starvingTroops['heroinfo']['heroid']); - $database->modifyHero("health", 0, $starvingTroops['heroinfo']['heroid']); - $newCrop = $GLOBALS['h'.$starvingTroops['heroinfo']['unit'].'_full'][min($starvingTroops['heroinfo']['level'], 60)]['crop'] + $difcrop; - } - else if($maxtype == 0) $newCrop = 0; - else $newCrop = $GLOBALS['u'.$maxtype]['crop']; - - if($totalKilledUnits > 0) - { - switch($type) - { - case 0: - if($totalKilledUnits < $totalUnits){ - $database->modifyEnforce($starvingTroops['id'], array_keys($killedUnits), array_values($killedUnits), 0); - } - else $database->deleteReinf($starvingTroops['id']); - break; - - case 1: - if($totalKilledUnits < $totalUnits){ - $database->modifyPrisoners($starvingTroops['id'], array_keys($killedUnits), array_values($killedUnits), 0); - $database->modifyUnit($starvingTroops['wref'], ["99o"], [$totalKilledUnits], [0]); - }else{ - $database->deletePrisoners($starvingTroops['id']); - $database->modifyUnit($starvingTroops['wref'], ["99o"], [$totalUnits], [0]); - } - break; - - case 2: - $database->modifyUnit($starv['wref'], array_keys($killedUnits), array_values($killedUnits), [0]); - break; - - case 3: - if($totalKilledUnits < $totalUnits){ - $database->modifyAttack2($starvingTroops['id'], array_keys($killedUnits), array_values($killedUnits), 0); - } - else $database->setMovementProc($starvingTroops['moveid']); - break; - } - - $database->modifyResource($starv['wref'], 0, 0, 0, max($newCrop, 0), 1); - $database->setVillageField($starv['wref'], ['starv', 'starvupdate'], [$upkeep, $time]); - } - } - } - - $crop = $database->getCropProdstarv($starv['wref'], false); - if ($crop > $upkeep) $database->setVillageFields($starv['wref'], ['starv', 'starvupdate'], [0, 0]); - - unset ($unitarrays, $type, $subtype); - } - } - - private function procNewClimbers() { - global $database, $ranking; - - $ranking->procRankArray(); - $climbers = $ranking->getRank(); - if(count($climbers) > 0){ - $q = "SELECT week FROM ".TB_PREFIX."medal order by week DESC LIMIT 0, 1"; - $result = mysqli_query($database->dblink,$q); - if(mysqli_num_rows($result)) { - $row = mysqli_fetch_assoc($result); - $week = $row['week'] + 1; - } - else $week = 1; - - $q = "SELECT id FROM ".TB_PREFIX."users where oldrank = 0 and id > 5"; - $array = $database->query_return($q); - foreach($array as $user){ - $newrank = $ranking->getUserRank($user['id']); - if($week > 1){ - for($i = $newrank + 1; $i < count($climbers); $i++) { - if(isset($climbers[$i]['userid'])){ - $oldrank = $ranking->getUserRank($climbers[$i]['userid']); - $totalpoints = $oldrank - $climbers[$i]['oldrank']; - $database->removeclimberrankpop($climbers[$i]['userid'], $totalpoints); - $database->updateoldrank($climbers[$i]['userid'], $oldrank); - } - } - $database->updateoldrank($user['id'], $newrank); - }else{ - $totalpoints = count($climbers) - $newrank; - $database->setclimberrankpop($user['id'], $totalpoints); - $database->updateoldrank($user['id'], $newrank); - for($i = 1; $i < $newrank; $i++){ - if(isset($climbers[$i]['userid'])){ - $oldrank = $ranking->getUserRank($climbers[$i]['userid']); - $totalpoints = count($climbers) - $oldrank; - $database->setclimberrankpop($climbers[$i]['userid'], $totalpoints); - $database->updateoldrank($climbers[$i]['userid'], $oldrank); - } - } - for($i = $newrank + 1; $i < count($climbers); $i++){ - if(isset($climbers[$i]['userid'])){ - $oldrank = $ranking->getUserRank($climbers[$i]['userid']); - $totalpoints = count($climbers) - $oldrank; - $database->setclimberrankpop($climbers[$i]['userid'], $totalpoints); - $database->updateoldrank($climbers[$i]['userid'], $oldrank); - } - } - } - } - } - } - - private function procClimbers($uid) { - global $database, $ranking; - - $ranking->procRankArray(); - $climbers = $ranking->getRank(); - if(count($ranking->getRank()) > 0){ - $q = "SELECT week FROM ".TB_PREFIX."medal order by week DESC LIMIT 0, 1"; - $result = mysqli_query($database->dblink,$q); - if(mysqli_num_rows($result)) { - $row = mysqli_fetch_assoc($result); - $week = $row['week'] + 1; - } - else $week = 1; - - $myrank = $ranking->getUserRank($uid); - if(isset($climbers[$myrank]['oldrank']) && $climbers[$myrank]['oldrank'] > $myrank){ - for($i = $myrank + 1; $i <= $climbers[$myrank]['oldrank']; $i++) { - if(isset($climbers[$i]['oldrank'])){ - $oldrank = $ranking->getUserRank($climbers[$i]['userid']); - if($week > 1){ - $totalpoints = $oldrank - $climbers[$i]['oldrank']; - $database->removeclimberrankpop($climbers[$i]['userid'], $totalpoints); - $database->updateoldrank($climbers[$i]['userid'], $oldrank); - }else{ - $totalpoints = count($ranking->getRank()) - $oldrank; - $database->setclimberrankpop($climbers[$i]['userid'], $totalpoints); - $database->updateoldrank($climbers[$i]['userid'], $oldrank); - } - } - } - if(isset($climbers[$myrank]['oldrank'])){ - if($week > 1){ - $totalpoints = $climbers[$myrank]['oldrank'] - $myrank; - $database->addclimberrankpop($climbers[$myrank]['userid'], $totalpoints); - $database->updateoldrank($climbers[$myrank]['userid'], $myrank); - }else{ - $totalpoints = count($ranking->getRank()) - $myrank; - $database->setclimberrankpop($climbers[$myrank]['userid'], $totalpoints); - $database->updateoldrank($climbers[$myrank]['userid'], $myrank); - } - } - }else if(isset($climbers[$myrank]['oldrank']) && $climbers[$myrank]['oldrank'] < $myrank){ - for($i = $climbers[$myrank]['oldrank']; $i < $myrank; $i++) { - if(isset($climbers[$i]['oldrank'])){ - $oldrank = $ranking->getUserRank($climbers[$i]['userid']); - if($week > 1){ - $totalpoints = $climbers[$i]['oldrank'] - $oldrank; - $database->addclimberrankpop($climbers[$i]['userid'], $totalpoints); - $database->updateoldrank($climbers[$i]['userid'], $oldrank); - }else{ - $totalpoints = count($ranking->getRank()) - $oldrank; - $database->setclimberrankpop($climbers[$i]['userid'], $totalpoints); - $database->updateoldrank($climbers[$i]['userid'], $oldrank); - } - } - } - if(isset($climbers[$myrank-1]['oldrank'])){ - if($week > 1){ - $totalpoints = $myrank - $climbers[$myrank-1]['oldrank']; - $database->removeclimberrankpop($climbers[$myrank-1]['userid'], $totalpoints); - $database->updateoldrank($climbers[$myrank-1]['userid'], $myrank); - }else{ - $totalpoints = count($ranking->getRank()) - $myrank; - $database->setclimberrankpop($climbers[$myrank-1]['userid'], $totalpoints); - $database->updateoldrank($climbers[$myrank-1]['userid'], $myrank); - } - } - } - } - $ranking->procARankArray(); - $aid = $database->getUserField($uid,"alliance",0); - if(count($ranking->getRank()) > 0 && $aid != 0){ - $ally = $database->getAlliance($aid); - $memberlist = $database->getAllMember($ally['id']); - $oldrank = 0; - - $memberIDs = []; - foreach($memberlist as $member) { - $memberIDs[] = $member['id']; - } - $data = $database->getVSumField($memberIDs,"pop"); - - if (count($data)) { - foreach ($data as $row) { - $oldrank += $row['Total']; - } - } - - if($ally['oldrank'] != $oldrank){ - if($ally['oldrank'] < $oldrank) { - $totalpoints = $oldrank - $ally['oldrank']; - $database->addclimberrankpopAlly($ally['id'], $totalpoints); - $database->updateoldrankAlly($ally['id'], $oldrank); - } else - if($ally['oldrank'] > $oldrank) { - $totalpoints = $ally['oldrank'] - $oldrank; - $database->removeclimberrankpopAlly($ally['id'], $totalpoints); - $database->updateoldrankAlly($ally['id'], $oldrank); - } - } - } - } - - private function checkBan() { - global $database; - - mysqli_query($database->dblink, " - UPDATE ".TB_PREFIX."banlist as b - JOIN ".TB_PREFIX."users as u ON b.uid = u.id - SET - b.active = 0, - u.access = 2 - WHERE - b.active = 1 AND - b.`end` < UNIX_TIMESTAMP() AND - b.`end` > 0"); - } - - private function regenerateOasisTroops() { - global $database; - - $timeFinal = time() - NATURE_REGTIME; - $q = "SELECT wref FROM " . TB_PREFIX . "odata where conqured = 0 and lastupdated2 < $timeFinal"; - $array = $database->query_return($q); - if (count($array)) { - $ids = []; - foreach($array as $oasis) $ids[] = $oasis['wref']; - $database->regenerateOasisUnits($ids, true); - } - } - - public static function updateMax($leader) { - global $bid18, $database; - - $q = mysqli_fetch_array(mysqli_query($database->dblink,"SELECT Count(*) as Total FROM " . TB_PREFIX . "alidata where leader = ". (int) $leader), MYSQLI_ASSOC); - if ($q['Total'] > 0) { - $villages = $database->getVillagesID2($leader); - $max = 0; - - // cache resource levels - $vilIDs = []; - foreach($villages as $village){ - $vilIDs[$village['wref']] = true; - } - $database->cacheResourceLevels(array_keys($vilIDs)); - - foreach($villages as $village){ - $field = $database->getResourceLevel($village['wref'], false); - for($i = 19; $i <= 40; $i++){ - if($field['f'.$i.'t'] == 18){ - $level = $field['f'.$i]; - $attri = $bid18[$level]['attri']; - } - } - if($attri > $max){ - $max = $attri; - } - } - $q = "UPDATE ".TB_PREFIX."alidata set max = ".(int) $max." where leader = ".(int) $leader; - $database->query($q); - } - } - - /** - * Function for automate medals - by yi12345 and Shadow - * - */ - - function medals(){ - global $ranking, $database; - - //we may give away ribbons - $giveMedal = false; - $q = "SELECT lastgavemedal FROM ".TB_PREFIX."config"; - $result = mysqli_query($database->dblink,$q); - if($result) { - $row = mysqli_fetch_assoc($result); - $stime = strtotime(START_DATE) - strtotime(date('d.m.Y')) + strtotime(START_TIME); - if($row['lastgavemedal'] == 0 && $stime < time()){ - $newtime = strtotime('next monday'); - $q = "UPDATE ".TB_PREFIX."config SET lastgavemedal = ".(int) $newtime; - $database->query($q); - }elseif($row['lastgavemedal'] != 0){ - $time = $row['lastgavemedal'] + MEDALINTERVAL; - $giveMedal = $row['lastgavemedal'] < time(); - } - } - - if($giveMedal && MEDALINTERVAL > 0){ - - //determine which week we are - - $q = "SELECT week FROM ".TB_PREFIX."medal order by week DESC LIMIT 0, 1"; - $result = mysqli_query($database->dblink,$q); - if(mysqli_num_rows($result)) { - $row=mysqli_fetch_assoc($result); - $week=($row['week']+1); - } else { - $week='1'; - } - - //Do same for ally week - - $q = "SELECT week FROM ".TB_PREFIX."allimedal order by week DESC LIMIT 0, 1"; - $result = mysqli_query($database->dblink,$q); - if(mysqli_num_rows($result)) { - $row=mysqli_fetch_assoc($result); - $allyweek=($row['week']+1); - } else { - $allyweek='1'; - } - - - //Attackers of the week - $result = mysqli_query($database->dblink,"SELECT id, ap FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY ap DESC, id DESC Limit 10"); - $i=0; - while($row = mysqli_fetch_array($result)){ - $i++; - $img="t2_".($i).""; - $quer="insert into ".TB_PREFIX."medal (userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", 1, ".($i).", ".(int) $week.", '".$row['ap']."', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - //Defender of the week - $result = mysqli_query($database->dblink,"SELECT id, dp FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY dp DESC, id DESC Limit 10"); - $i=0; - while($row = mysqli_fetch_array($result)){ - $i++; - $img="t3_".($i).""; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '2', ".($i).", '".(int) $week."', '".$row['dp']."', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - //Climbers of the week - $result = mysqli_query($database->dblink,"SELECT id, Rc FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY Rc DESC, id DESC Limit 10"); - $i=0; - while($row = mysqli_fetch_array($result)){ - $i++; - $img="t1_".($i).""; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '3', ".($i).", '".(int) $week."', '".$row['Rc']."', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - //Rank climbers of the week - $result = mysqli_query($database->dblink,"SELECT id, clp FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY clp DESC Limit 10"); - $i=0; - while($row = mysqli_fetch_array($result)){ - $i++; - $img="t6_".($i).""; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '10', ".($i).", '".(int) $week."', '".$row['clp']."', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - //Robbers of the week - $result = mysqli_query($database->dblink,"SELECT id, RR FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY RR DESC, id DESC Limit 10"); - $i=0; - while($row = mysqli_fetch_array($result)){ - $i++; - $img="t4_".($i).""; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '4', ".($i).", '".(int) $week."', '".$row['RR']."', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - //Part of the bonus for top 10 attack + defense out - //Top10 attackers - $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY ap DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - //Top 10 defenders - $result2 = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY dp DESC, id DESC Limit 10"); - while($row2 = mysqli_fetch_array($result2)){ - if($row['id']==$row2['id']){ - - $query3="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 5"; - $result3=mysqli_query($database->dblink,$query3); - $row3=mysqli_fetch_row($result3); - - //Look what color the ribbon must have - if($row3[0]<='2'){ - $img="t22".$row3[0]."_1"; - switch ($row3[0]) { - case "0": - $tekst=""; - break; - case "1": - $tekst="twice "; - break; - case "2": - $tekst="three times "; - break; - } - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '5', '0', '".(int) $week."', '".$tekst."', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - } - } - } - - //you stand for 3rd / 5th / 10th time in the top 3 strikers - //top10 attackers - $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY ap DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 1 AND plaats<=3"; - $result1=mysqli_query($database->dblink,$query1); - $row1=mysqli_fetch_row($result1); - - - //2x at present as it is so ribbon 3rd (bronze) - if($row1[0]=='3'){ - $img="t120_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '6', '0', '".(int) $week."', 'Three', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //4x at present as it is so 5th medal (silver) - if($row1[0]=='5'){ - $img="t121_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '6', '0', '".(int) $week."', 'Five', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //9x at present as it is so 10th medal (gold) - if($row1[0]=='10'){ - $img="t122_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '6', '0', '".(int) $week."', 'Ten', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - } - //you stand for 3rd / 5th / 10th time in the top 10 attackers - //top10 attackers - $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY ap DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 1 AND plaats<=10"; - $result1=mysqli_query($database->dblink,$query1); - $row1=mysqli_fetch_row($result1); - - - //2x in gestaan, dit is 3e dus lintje (brons) - if($row1[0]=='3'){ - $img="t130_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '12', '0', '".(int) $week."', 'Three', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //4x in gestaan, dit is 5e dus lintje (zilver) - if($row1[0]=='5'){ - $img="t131_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '12', '0', '".(int) $week."', 'Five', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //9x at present as it is so 10th medal (gold) - if($row1[0]=='10'){ - $img="t132_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '12', '0', '".(int) $week."', 'Ten', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - } - //je staat voor 3e / 5e / 10e keer in de top 3 verdedigers - //Pak de top10 verdedigers - $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY dp DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 2 AND plaats<=3"; - $result1=mysqli_query($database->dblink,$query1); - $row1=mysqli_fetch_row($result1); - - - //2x in gestaan, dit is 3e dus lintje (brons) - if($row1[0]=='3'){ - $img="t140_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '7', '0', '".(int) $week."', 'Three', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //4x in gestaan, dit is 5e dus lintje (zilver) - if($row1[0]=='5'){ - $img="t141_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '7', '0', '".(int) $week."', 'Five', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //9x at present as it is so 10th medal (gold) - if($row1[0]=='10'){ - $img="t142_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '7', '0', '".(int) $week."', 'Ten', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - } - //je staat voor 3e / 5e / 10e keer in de top 3 verdedigers - //Pak de top10 verdedigers - $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY dp DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 2 AND plaats<=10"; - $result1=mysqli_query($database->dblink,$query1); - $row1=mysqli_fetch_row($result1); - - - //2x in gestaan, dit is 3e dus lintje (brons) - if($row1[0]=='3'){ - $img="t150_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '13', '0', '".(int) $week."', 'Three', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //4x in gestaan, dit is 5e dus lintje (zilver) - if($row1[0]=='5'){ - $img="t151_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '13', '0', '".(int) $week."', 'Five', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //9x at present as it is so 10th medal (gold) - if($row1[0]=='10'){ - $img="t152_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '13', '0', '".(int) $week."', 'Ten', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - } - - //je staat voor 3e / 5e / 10e keer in de top 3 klimmers - //Pak de top10 klimmers - $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY Rc DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 3 AND plaats<=3"; - $result1=mysqli_query($database->dblink,$query1); - $row1=mysqli_fetch_row($result1); - - - //2x in gestaan, dit is 3e dus lintje (brons) - if($row1[0]=='3'){ - $img="t100_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '8', '0', '".(int) $week."', 'Three', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //4x in gestaan, dit is 5e dus lintje (zilver) - if($row1[0]=='5'){ - $img="t101_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '8', '0', '".(int) $week."', 'Five', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //9x at present as it is so 10th medal (gold) - if($row1[0]=='10'){ - $img="t102_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '8', '0', '".(int) $week."', 'Ten', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - } - //je staat voor 3e / 5e / 10e keer in de top 3 klimmers - //Pak de top10 klimmers - $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY Rc DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 3 AND plaats<=10"; - $result1=mysqli_query($database->dblink,$query1); - $row1=mysqli_fetch_row($result1); - - - //2x in gestaan, dit is 3e dus lintje (brons) - if($row1[0]=='3'){ - $img="t110_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '14', '0', '".(int) $week."', 'Three', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //4x in gestaan, dit is 5e dus lintje (zilver) - if($row1[0]=='5'){ - $img="t111_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '14', '0', '".(int) $week."', 'Five', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //9x at present as it is so 10th medal (gold) - if($row1[0]=='10'){ - $img="t112_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '14', '0', '".(int) $week."', 'Ten', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - } - - //je staat voor 3e / 5e / 10e keer in de top 3 klimmers - //Pak de top3 rank climbers - $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY clp DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 10 AND plaats<=3"; - $result1=mysqli_query($database->dblink,$query1); - $row1=mysqli_fetch_row($result1); - - - //2x in gestaan, dit is 3e dus lintje (brons) - if($row1[0]=='3'){ - $img="t200_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '11', '0', '".(int) $week."', 'Three', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //4x in gestaan, dit is 5e dus lintje (zilver) - if($row1[0]=='5'){ - $img="t201_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '11', '0', '".(int) $week."', 'Five', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //9x at present as it is so 10th medal (gold) - if($row1[0]=='10'){ - $img="t202_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '11', '0', '".(int) $week."', 'Ten', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - } - //je staat voor 3e / 5e / 10e keer in de top 10klimmers - //Pak de top3 rank climbers - $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY clp DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 10 AND plaats<=10"; - $result1=mysqli_query($database->dblink,$query1); - $row1=mysqli_fetch_row($result1); - - - //2x in gestaan, dit is 3e dus lintje (brons) - if($row1[0]=='3'){ - $img="t210_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '16', '0', '".(int) $week."', 'Three', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //4x in gestaan, dit is 5e dus lintje (zilver) - if($row1[0]=='5'){ - $img="t211_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '16', '0', '".(int) $week."', 'Five', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //9x at present as it is so 10th medal (gold) - if($row1[0]=='10'){ - $img="t212_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '16', '0', '".(int) $week."', 'Ten', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - } - - //je staat voor 3e / 5e / 10e keer in de top 10 overvallers - //Pak de top10 overvallers - $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY RR DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 4 AND plaats<=3"; - $result1=mysqli_query($database->dblink,$query1); - $row1=mysqli_fetch_row($result1); - - - //2x in gestaan, dit is 3e dus lintje (brons) - if($row1[0]=='3'){ - $img="t160_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '9', '0', '".(int) $week."', 'Three', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //4x in gestaan, dit is 5e dus lintje (zilver) - if($row1[0]=='5'){ - $img="t161_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '9', '0', '".(int) $week."', 'Five', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //9x at present as it is so 10th medal (gold) - if($row1[0]=='10'){ - $img="t162_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '9', '0', '".(int) $week."', 'Ten', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - } - //je staat voor 3e / 5e / 10e keer in de top 10 overvallers - //Pak de top10 overvallers - $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY RR DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 4 AND plaats<=10"; - $result1=mysqli_query($database->dblink,$query1); - $row1=mysqli_fetch_row($result1); - - - //2x in gestaan, dit is 3e dus lintje (brons) - if($row1[0]=='3'){ - $img="t170_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '15', '0', '".(int) $week."', 'Three', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //4x in gestaan, dit is 5e dus lintje (zilver) - if($row1[0]=='5'){ - $img="t171_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '15', '0', '".(int) $week."', 'Five', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - //9x at present as it is so 10th medal (gold) - if($row1[0]=='10'){ - $img="t172_1"; - $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '15', '0', '".(int) $week."', 'Ten', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - } - - //Put all true dens to 0 - $query="SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY id+0 DESC"; - $result=mysqli_query($database->dblink,$query); - $userIDs = []; - for ($i=0; $row=mysqli_fetch_row($result); $i++){ - $userIDs[] = (int) $row[0]; - } - - if (count($userIDs)) { - mysqli_query($database->dblink,"UPDATE ".TB_PREFIX."users SET ap=0, dp=0,Rc=0,clp=0, RR=0 WHERE id IN(".implode(', ', $userIDs).")"); - } - - //Start alliance Medals wooot - - //Aanvallers v/d Week - $result = mysqli_query($database->dblink,"SELECT id, ap FROM ".TB_PREFIX."alidata ORDER BY ap DESC, id DESC Limit 10"); - $i=0; while($row = mysqli_fetch_array($result)){ - $i++; $img="a2_".($i).""; - $quer="insert into ".TB_PREFIX."allimedal(allyid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '1', ".($i).", '".$allyweek."', '".$row['ap']."', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - //Verdediger v/d Week - $result = mysqli_query($database->dblink,"SELECT id, dp FROM ".TB_PREFIX."alidata ORDER BY dp DESC Limit 10"); - $i=0; while($row = mysqli_fetch_array($result)){ - $i++; $img="a3_".($i).""; - $quer="insert into ".TB_PREFIX."allimedal(allyid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '2', ".($i).", '".$allyweek."', '".$row['dp']."', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - //Overvallers v/d Week - $result = mysqli_query($database->dblink,"SELECT id, RR FROM ".TB_PREFIX."alidata ORDER BY RR DESC, id DESC Limit 10"); - $i=0; while($row = mysqli_fetch_array($result)){ - $i++; $img="a4_".($i).""; - $quer="insert into ".TB_PREFIX."allimedal(allyid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '4', ".($i).", '".$allyweek."', '".$row['RR']."', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - //Rank climbers of the week - $result = mysqli_query($database->dblink,"SELECT id, clp FROM ".TB_PREFIX."alidata ORDER BY clp DESC Limit 10"); - $i=0; while($row = mysqli_fetch_array($result)){ - $i++; $img="a1_".($i).""; - $quer="insert into ".TB_PREFIX."allimedal(allyid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '3', ".($i).", '".$allyweek."', '".$row['clp']."', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - - $result = mysqli_query($database->dblink,"SELECT * FROM ".TB_PREFIX."alidata ORDER BY ap DESC, id DESC Limit 10"); - while($row = mysqli_fetch_array($result)){ - - //Pak de top10 verdedigers - $result2 = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."alidata ORDER BY dp DESC, id DESC Limit 10"); - while($row2 = mysqli_fetch_array($result2)){ - if($row['id']==$row2['id']){ - - $query3="SELECT Count(*) FROM ".TB_PREFIX."allimedal WHERE allyid=".(int) $row['id']." AND categorie = 5"; - $result3=mysqli_query($database->dblink,$query3); - $row3=mysqli_fetch_row($result3); - - //Look what color the ribbon must have - if($row3[0]<='2'){ - $img="t22".$row3[0]."_1"; - switch ($row3[0]) { - case "0": - $tekst=""; - break; - case "1": - $tekst="twice "; - break; - case "2": - $tekst="three times "; - break; - } - $quer="insert into ".TB_PREFIX."allimedal(allyid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '5', '0', '".$allyweek."', '".$tekst."', '".$img."')"; - $resul=mysqli_query($database->dblink,$quer); - } - } - } - } - - $query="SELECT id FROM ".TB_PREFIX."alidata ORDER BY id+0 DESC"; - $result=mysqli_query($database->dblink,$query); - - $aliIDs = []; - for ($i=0; $row=mysqli_fetch_row($result); $i++){ - $aliIDs[] = (int) $row[0]; - } - - if (count($aliIDs)) { - mysqli_query($database->dblink,"UPDATE ".TB_PREFIX."alidata SET ap=0, dp=0,RR=0,clp=0 WHERE id IN(".implode(', ', $aliIDs).")"); - } - - $q = "UPDATE ".TB_PREFIX."config SET lastgavemedal=".$time; - $database->query($q); - } - } - - private function artefactOfTheFool() { - global $database; - - $time = time(); - $q = "SELECT id, size FROM " . TB_PREFIX . "artefacts where type = 8 AND active = 1 AND lastupdate <= ".($time - (86400 / (SPEED == 2 ? 1.5 : (SPEED == 3 ? 2 : SPEED)))); - $array = $database->query_return($q); - if ($array) { - foreach($array as $artefact) { - $kind = rand(1, 7); - - while($kind == 6) $kind = rand(1, 7); - - if($artefact['size'] != 3) $bad_effect = rand(0, 1); - else $bad_effect = 0; - - switch($kind) { - case 1: - $effect = rand(1, 5); - break; - case 2: - $effect = rand(1, 3); - break; - case 3: - $effect = rand(3, 10); - break; - case 4: - case 5: - $effect = rand(2, 4); - break; - case 7: - $effect = rand(1, 6); - break; - } - mysqli_query($database->dblink,"UPDATE ".TB_PREFIX."artefacts SET kind = ". (int) $kind. ", bad_effect = $bad_effect, effect2 = $effect, lastupdate = $time WHERE id = ".(int) $artefact['id']); - } - } - } -} -$automation = new Automation; -?> +procNewClimbers(); + $this->ClearUser(); + $this->ClearInactive(); + $this->pruneResource(); + $this->pruneOResource(); + $this->checkWWAttacks(); + $this->delTradeRoute(); + $this->TradeRoute(); + + $methodsArrays = ["culturePoints", "updateHero", "clearDeleting", "buildComplete", + "demolitionComplete", "marketComplete", "researchComplete", + "trainingComplete", "starvation", "celebrationComplete", + "sendUnitsComplete", "loyaltyRegeneration", "sendreinfunitsComplete", + "returnunitsComplete", "sendSettlersComplete", "spawnNatars", + "spawnWWVillages", "spawnWWBuildingPlans", "activateArtifacts"]; + + foreach($methodsArrays as $method){ + $file = fopen($autoprefix."GameEngine/Prevention/".$method.".txt", "w"); + if(flock($file, LOCK_EX)) { + call_user_func(array($this, $method)); + flock($file, LOCK_UN); + } + fclose($file); + } + + $this->MasterBuilder(); + $this->updateGeneralAttack(); + $this->checkInvitedPlayes(); + $this->updateStore(); + $this->CheckBan(); + $this->regenerateOasisTroops(); + $this->medals(); + $this->artefactOfTheFool(); + } + + public function procResType($ref, $mode = 0) { + //Capital or only 1 village left = cannot be destroyed + return addslashes(empty($build = Building::procResType($ref)) && !$mode ? "Village can't be" : $build); + } + + function recountPop($vid, $use_cache = true){ + global $database; + + $vid = (int) $vid; + $fdata = $database->getResourceLevel($vid, $use_cache); + $popTot = 0; + + for ($i = 1; $i <= 40; $i++) { + $lvl = $fdata["f".$i]; + $building = $fdata["f".$i."t"]; + if($building) $popTot += $this->buildingPOP($building, $lvl); + } + + $this->recountCP($vid); + $q = "UPDATE ".TB_PREFIX."vdata set pop = $popTot where wref = $vid"; + mysqli_query($database->dblink, $q); + $owner = $database->getVillageField($vid, "owner"); + $this->procClimbers($owner); + + return $popTot; + } + + function recountCP($vid){ + global $database; + + $vid = (int) $vid; + $fdata = $database->getResourceLevel($vid); + $popTot = 0; + + for ($i = 1; $i <= 40; $i++) { + $lvl = $fdata["f".$i]; + $building = $fdata["f".$i."t"]; + if($building){ + $popTot += $this->buildingCP($building,$lvl); + } + } + + $q = "UPDATE ".TB_PREFIX."vdata set cp = $popTot where wref = $vid"; + mysqli_query($database->dblink,$q); + + return $popTot; + } + + function buildingPOP($f, $lvl){ + $name = "bid".$f; + global $$name; + + $popT = 0; + $dataarray = $$name; + + for ($i = 0; $i <= $lvl; $i++) { + $popT += ((isset($dataarray[$i]) && isset($dataarray[$i]['pop'])) ? $dataarray[$i]['pop'] : 0); + } + return $popT; + } + + function buildingCP($f, $lvl){ + $name = "bid".$f; + global $$name; + + $popT = 0; + $dataarray = $$name; + + for ($i = 0; $i <= $lvl; $i++) { + $popT += ((isset($dataarray[$i]) && isset($dataarray[$i]['cp'])) ? $dataarray[$i]['cp'] : 0); + } + return $popT; + } + + private function loyaltyRegeneration() { + global $database; + + $array = []; + $array = $database->getProfileVillages(0, 6); + if(!empty($array)) { + foreach($array as $loyalty) { + if (($t25_level = $this->getTypeLevel(25, $loyalty['wref'])) >= 1) { + $value = $t25_level; + }elseif(($t26_level = $this->getTypeLevel(26, $loyalty['wref'])) >= 1){ + $value = $t26_level; + } + else $value = 0; + + if($value > 0){ + $newloyalty = min(100, $loyalty['loyalty'] + $value * (time() - $loyalty['lastupdate2']) / 3600); + $q = "UPDATE ".TB_PREFIX."vdata SET loyalty = $newloyalty, lastupdate2=".time()." WHERE wref = '".$loyalty['wref']."'"; + $database->query($q); + } + } + } + + $array = []; + $q = "SELECT conqured, loyalty, lastupdated, wref FROM ".TB_PREFIX."odata WHERE loyalty < 100"; + $array = $database->query_return($q); + if(!empty($array)) { + foreach($array as $loyalty) { + $value = $this->getTypeLevel(37, $loyalty['conqured']); + + if($value > 0){ + $newloyalty = min(100, $loyalty['loyalty'] + $value * (time() - $loyalty['lastupdated']) / 3600); + $q = "UPDATE ".TB_PREFIX."odata SET loyalty = $newloyalty, lastupdated=".time()." WHERE wref = '".$loyalty['wref']."'"; + $database->query($q); + } + } + } + } + + public function getTypeLevel($tid, $vid) { + global $database; + + $keyholder = []; + + $resourcearray = $database->getResourceLevel($vid); + foreach(array_keys($resourcearray, $tid) as $key) { + if(strpos($key,'t')) { + $key = preg_replace("/[^0-9]/", '', $key); + array_push($keyholder, $key); + } + } + + $element = count($keyholder); + if($element >= 2) { + if($tid <= 4) { + $temparray = []; + for($i = 0; $i <= $element - 1; $i++) { + array_push($temparray,$resourcearray['f'.$keyholder[$i]]); + } + foreach ($temparray as $key => $val) { + if ($val == max($temparray)) $target = $key; + } + } + else { + $target = 0; + for($i = 1; $i <= $element - 1; $i++) { + if($resourcearray['f'.$keyholder[$i]] > $resourcearray['f'.$keyholder[$target]]) { + $target = $i; + } + } + } + } + else if($element == 1) $target = 0; + else return 0; + + if(!empty($keyholder[$target])) return $resourcearray['f'.$keyholder[$target]]; + else return 0; + } + + private function clearDeleting() { + global $database; + + $needDelete = $database->getNeedDelete(); + if(count($needDelete) > 0) { + + //Remove the time limit, otherwise deleting players with 80 or more villages couldn't be deleted in one run + @set_time_limit(0); + + foreach($needDelete as $need) { + $needVillage = $database->getVillagesID($need['uid']); + + //Delete all villages + foreach($needVillage as $village) $this->DelVillage((int) $village); + + for($i = 0;$i < 20; $i++){ + $q = "SELECT id FROM ".TB_PREFIX."users where friend".$i." = ".(int) $need['uid']." or friend".$i."wait = ".(int) $need['uid'].""; + $array = $database->query_return($q); + foreach($array as $friend){ + $database->deleteFriend($friend['id'],"friend".$i); + $database->deleteFriend($friend['id'],"friend".$i."wait"); + } + } + + $database->updateUserField($need['uid'], 'alliance', 0, 1); + + if($database->isAllianceOwner($need['uid'])){ + $alliance = $database->getUserAllianceID($need['uid']); + $newowner = $database->getAllMember2($alliance); + $newleader = $newowner['id']; + $q = "UPDATE " . TB_PREFIX . "alidata set leader = ".(int) $newleader." where id = ".(int) $alliance.""; + $database->query($q); + $database->updateAlliPermissions($newleader, $alliance, "Leader", 1, 1, 1, 1, 1, 1, 1); + Automation::updateMax($newleader); + } + + if (isset($alliance)) { + $database->deleteAlliance($alliance); + } + $q = "UPDATE ".TB_PREFIX."artefacts where owner = ".(int) $need['uid']." SET del = 1"; + $database->query($q); + + $q = "DELETE FROM ".TB_PREFIX."hero where uid = ".(int) $need['uid']; + $database->query($q); + + $q = "DELETE FROM ".TB_PREFIX."mdata where target = ".(int) $need['uid']." or owner = ".(int) $need['uid']; + $database->query($q); + + $q = "DELETE FROM ".TB_PREFIX."ndata where uid = ".(int) $need['uid']; + $database->query($q); + + $q = "DELETE FROM ".TB_PREFIX."users where id = ".(int) $need['uid']; + $database->query($q); + + $q = "DELETE FROM ".TB_PREFIX."deleting where uid = ".(int) $need['uid']; + $database->query($q); + } + } + } + + private function ClearUser() { + global $database; + + if(AUTO_DEL_INACTIVE) { + $time = time() - UN_ACT_TIME; + + $q = "INSERT INTO ".TB_PREFIX."deleting SELECT id, UNIX_TIMESTAMP() FROM ".TB_PREFIX."users WHERE timestamp < $time AND tribe IN(1, 2, 3)"; + $database->query($q); + } + } + + private function ClearInactive() { + global $database; + + if(TRACK_USR) { + $timeout = time()-USER_TIMEOUT * 60; + $q = "DELETE FROM ".TB_PREFIX."active WHERE timestamp < $timeout"; + $database->query($q); + } + } + + private function pruneOResource() { + global $database; + + if(!ALLOW_BURST) { + $database->query("UPDATE + ".TB_PREFIX."odata + SET + wood = IF(wood < 0, 0, wood), + clay = IF(clay < 0, 0, clay), + iron = IF(iron < 0, 0, iron), + crop = IF(crop < 0, 0, crop), + maxstore = IF(maxstore < ".STORAGE_BASE.", ".STORAGE_BASE.", maxstore), + maxcrop = IF(maxcrop < ".STORAGE_BASE.", ".STORAGE_BASE.", maxcrop) + WHERE + maxstore < ".STORAGE_BASE." OR + maxcrop < ".STORAGE_BASE." OR + wood < 0 OR + clay < 0 OR + iron < 0 OR + crop < 0"); + } + } + private function pruneResource() { + global $database; + + if(!ALLOW_BURST) { + $database->query("UPDATE + ".TB_PREFIX."vdata + SET + wood = IF(wood < 0, 0, wood), + clay = IF(clay < 0, 0, clay), + iron = IF(iron < 0, 0, iron), + crop = IF(crop < 0, 0, crop), + maxstore = IF(maxstore < ".STORAGE_BASE.", ".STORAGE_BASE.", maxstore), + maxcrop = IF(maxcrop < ".STORAGE_BASE.", ".STORAGE_BASE.", maxcrop) + WHERE + maxstore < ".STORAGE_BASE." OR + maxcrop < ".STORAGE_BASE." OR + wood < 0 OR + clay < 0 OR + iron < 0 OR + crop < 0"); + + $database->query("UPDATE + ".TB_PREFIX."vdata + SET + wood = IF(wood > maxstore, maxstore, wood), + clay = IF(clay > maxstore, maxstore, clay), + iron = IF(iron > maxstore, maxstore, iron), + crop = IF(crop > maxcrop, maxcrop, crop) + WHERE + wood > maxstore OR + clay > maxstore OR + iron > maxstore OR + crop > maxcrop"); + } + } + + private function culturePoints() { + global $database; + + $database->updateVSumField('cp'); + } + + private function buildComplete() { + global $database, $bid18, $bid10, $bid11, $bid38, $bid39; + + $time = time(); + // IDs of villages that were affected by this building completion update, + // used to calculate statistical data at the end + $villagesAffected = []; + // holds additional conditions when updating loopcon records in the bdata table + $loopconUpdates = []; + // this will hold IDs of bdata table records to delete + $dbIdsToDelete = []; + + // get all pending builds that should be complete by now + $res = $database->query_return( + "SELECT + id, wid, field, level, type, timestamp + FROM + ".TB_PREFIX."bdata + WHERE + timestamp < $time and master = 0" + ); + + // preload village data + $vilIDs = []; + foreach($res as $indi) { + $vilIDs[$indi['wid']] = true; + } + $vilIDs = array_keys($vilIDs); + $database->getProfileVillages($vilIDs, 5); + $database->getEnforceVillage($vilIDs, 0); + + // complete buildings + foreach($res as $indi) { + // store village ID for later for statistical updates + $villageData = $database->getVillageFields($indi['wid'],'owner, maxcrop, maxstore, starv, pop'); + $villageOwner = $villageData['owner']; + $villagesAffected[] = (int) $indi['wid']; + $fieldsToSet = []; + + $q = "UPDATE ".TB_PREFIX."fdata SET f".$indi['field']." = ".$indi['level'].", f".$indi['field']."t = ".$indi['type']." WHERE vref = ".(int) $indi['wid']; + + if($database->query($q)) { + // this will be the level we brought the building to now + $level = $indi['level']; + + // TODO: magic numbers into constants (for building types below) + + // update capacity if we updated a warehouse or a granary + if (in_array($indi['type'], [10, 11, 38, 39])) { + $fieldDbName = (in_array($indi['type'], [10, 38]) ? 'maxstore' : 'maxcrop'); + $max = $villageData[$fieldDbName]; + + if($level == 1 && $max == STORAGE_BASE) $max = STORAGE_BASE; + + if ($level != 1) $max -= ${'bid'.$indi['type']}[$level - 1]['attri'] * STORAGE_MULTIPLIER; + + $max += ${'bid'.$indi['type']}[$level]['attri'] * STORAGE_MULTIPLIER; + + $fieldsToSet[$fieldDbName] = $max; + } + + // if we updated Embassy, update maximum members that the alliance can take + if($indi['type'] == 18) Automation::updateMax($villageOwner); + + // by SlimShady95 aka Manuel Mannhardt < manuel_mannhardt@web.de > + if ($indi['type'] == 40 && ($indi['level'] % 5 == 0 || $indi['level'] > 95) && $indi['level'] != 100) { + $this->startNatarAttack($indi['level'], $indi['wid'], $indi['timestamp']); + } + + //now can't be more than one winner if ww to level 100 is build by 2 users or more on same time + if ($indi['type'] == 40 && $indi['level'] == 100) { + mysqli_query($database->dblink,"TRUNCATE ".TB_PREFIX."bdata"); + } + + // TODO: find out what exactly these conditions are for + // no special military conditioning for Teutons and Gauls + if ($database->getUserField($villageOwner, "tribe", 0) != 1) $loopconUpdates[$indi['wid']] = ''; + else + { + // special condition for Roman military buildings + if ($indi['field'] > 18) $loopconUpdates[$indi['wid']] = ' AND field > 18'; + else $loopconUpdates[$indi['wid']] = ' AND field < 19'; + } + + // Update ww last finish upgrade + if ($indi['type'] == 40) { + $qW = "UPDATE ".TB_PREFIX."fdata set ww_lastupdate = ".time()." where vref = ".(int) $indi['wid']; + $database->query($qW); + } + + $dbIdsToDelete[] = (int) $indi['id']; + } + + //Update starvation data + $this->addStarvationData($indi['wid']); + + // update the requested fields, all at once + $database->setVillageFields($indi['wid'], array_keys($fieldsToSet), array_values($fieldsToSet)); + } + + // update statistical data for affected villages + foreach ($villagesAffected as $affected_id) $this->recountPop($affected_id, false); + + // update data that can be done in one swoop instead of using multiple update queries + // no special checks for Romans + foreach ($loopconUpdates as $villageId => $updateCondition) { + $database->query( + "UPDATE + ".TB_PREFIX."bdata + SET + loopcon = 0 + WHERE + loopcon = 1 AND + master = 0 AND + wid = ".$villageId.$updateCondition); + } + + // delete all processed entries + if (count($dbIdsToDelete)) { + $database->query( "DELETE FROM " . TB_PREFIX . "bdata WHERE id IN(" . implode( ',', $dbIdsToDelete ) . ")" ); + } + } + + // by SlimShady95 aka Manuel Mannhardt < manuel_mannhardt@web.de > + private function startNatarAttack($level, $vid, $time) { + global $database; + + // bad, but should work :D + // I took the data from my first ww (first .org world) + // TODO: get the algo from the real travian with the 100 biggest offs + + $troops = [5 => [[3412, 2814, 4156, 3553, 9, 0], [35, 0, 77, 33, 17, 10]], + 10 => [[4314, 3688, 5265, 4621, 13, 0], [65, 0, 175, 77, 28, 17]], + 15 => [[4645, 4267, 5659, 5272, 15, 0], [99, 0, 305, 134, 40, 25]], + 20 => [[6207, 5881, 7625, 7225, 22, 0], [144, 0, 456, 201, 56, 36]], + 25 => [[6004, 5977, 7400, 7277, 23, 0], [152, 0, 499, 220, 58, 37]], + 30 => [[7073, 7181, 8730, 8713, 27, 0], [183, 0, 607, 268, 69, 45]], + 35 => [[7090, 7320, 8762, 8856, 28, 0], [186, 0, 620, 278, 70, 45]], + 40 => [[7852, 6967, 9606, 8667, 25, 0], [146, 0, 431, 190, 60, 37]], + 45 => [[8480, 8883, 10490, 10719, 35, 0], [223, 0, 750, 331, 83, 54]], + 50 => [[8522, 9038, 10551, 10883, 35, 0], [224, 0, 757, 335, 83, 54]], + 55 => [[8931, 8690, 10992, 10624, 32, 0], [219, 0, 707, 312, 84, 54]], + 60 => [[12138, 13013, 15040, 15642, 51, 0], [318, 0, 1079, 477, 118, 76]], + 65 => [[13397, 14619, 16622, 17521, 58, 0], [345, 0, 1182, 522, 127, 83]], + 70 => [[16323, 17665, 20240, 21201, 70, 0], [424, 0, 1447, 640, 157, 102]], + 75 => [[20739, 22796, 25746, 27288, 91, 0], [529, 0, 1816, 803, 194, 127]], + 80 => [[21857, 24180, 27147, 28914, 97, 0], [551, 0, 1898, 839, 202, 132]], + 85 => [[22476, 25007, 27928, 29876, 100, 0], [560, 0, 1933, 855, 205, 134]], + 90 => [[31345, 35053, 38963, 41843, 141, 0], [771, 0, 2668, 1180, 281, 184]], + 95 => [[31720, 35635, 39443, 42506, 144, 0], [771, 0, 2671, 1181, 281, 184]], + 96 => [[32885, 37007, 40897, 44130, 150, 0], [795, 0, 2757, 1219, 289, 190]], + 97 => [[32940, 37099, 40968, 44235, 150, 0], [794, 0, 2755, 1219, 289, 190]], + 98 => [[33521, 37691, 41686, 44953, 152, 0], [812, 0, 2816, 1246, 296, 194]], + 99 => [[36251, 40861, 45089, 48714, 165, 0], [872, 0, 3025, 1338, 317, 208]]]; + + // select the troops^^ + if (isset($troops[$level])) $units = $troops[$level]; + else return false; + + // get the capital village from the natars + $query = mysqli_query($database->dblink,'SELECT `wref` FROM `' . TB_PREFIX . 'vdata` WHERE `owner` = 3 and `capital` = 1 LIMIT 1') or die(mysqli_error($database->dblink)); + $row = mysqli_fetch_assoc($query); + + // start the attacks + $endtime = $time + round(86400 / INCREASE_SPEED); + + // -.- + $vid = (int) $vid; + mysqli_query($database->dblink,'INSERT INTO `' . TB_PREFIX . 'ww_attacks` (`vid`, `attack_time`) VALUES (' . $vid . ', ' . $endtime . ')'); + mysqli_query($database->dblink,'INSERT INTO `' . TB_PREFIX . 'ww_attacks` (`vid`, `attack_time`) VALUES (' . $vid . ', ' . ($endtime + 1) . ')'); + + // wave 1 + $ref = $database->addAttack($row['wref'], 0, $units[0][0], $units[0][1], 0, $units[0][2], $units[0][3], $units[0][4], $units[0][5], 0, 0, 0, 3, 0, 0, 0, 0, 20, 20, 0, 20, 20, 20, 20); + $database->addMovement(3, $row['wref'], $vid, $ref, $time, $endtime); + + // wave 2 + $ref2 = $database->addAttack($row['wref'], 0, $units[1][0], $units[1][1], 0, $units[1][2], $units[1][3], $units[1][4], $units[1][5], 0, 0, 0, 3, 40, 0, 0, 0, 20, 20, 0, 20, 20, 20, 20, ['vid' => $vid, 'endtime' => ($endtime + 1)]); + $database->addMovement(3, $row['wref'], $vid, $ref2, $time, $endtime + 1); + } + + private function checkWWAttacks() { + global $database; + + $query = mysqli_query($database->dblink,'SELECT vid, attack_time FROM `' . TB_PREFIX . 'ww_attacks` WHERE `attack_time` <= ' . time()); + while ($row = mysqli_fetch_assoc($query)) + { + // delete the attack + $query3 = mysqli_query($database->dblink,'DELETE FROM `' . TB_PREFIX . 'ww_attacks` WHERE `vid` = ' . (int) $row['vid'] . ' AND `attack_time` = ' . (int) $row['attack_time']); + } + } + + private function getPop($tid, $level) { + $name = "bid".$tid; + global $$name; + + $dataarray = $$name; + $pop = $dataarray[($level + 1)]['pop']; + $cp = $dataarray[($level + 1)]['cp']; + return [$pop, $cp]; + } + + private function delTradeRoute() { + global $database; + + $database->delTradeRoute(); + } + + private function TradeRoute() { + global $database; + $time = time(); + $q = "SELECT `from`, wood, clay, iron, crop, wid, deliveries, id FROM ".TB_PREFIX."route where timestamp < $time"; + $dataarray = $database->query_return($q); + + $vilIDs = []; + foreach($dataarray as $data) { + $vilIDs[$data['to']] = true; + $vilIDs[$data['from']] = true; + } + $vilIDs = array_keys($vilIDs); + $database->getVillageByWorldID($vilIDs); + + foreach($dataarray as $data) { + $targettribe = $database->getUserField($database->getVillageField($data['from'], "owner"), "tribe", 0); + $this->sendResource2($data['wood'], $data['clay'], $data['iron'], $data['crop'], $data['from'], $data['wid'], $targettribe, $data['deliveries']); + $database->editTradeRoute($data['id'], "timestamp", 86400, 1); + } + } + + private function marketComplete() { + global $database, $units; + + $time = microtime(true); + $q = "SELECT s.wood, s.clay, s.iron, s.crop, `to`, `from`, endtime, merchant, send, moveid FROM ".TB_PREFIX."movement m, ".TB_PREFIX."send s WHERE m.ref = s.id AND m.proc = 0 AND sort_type = 0 AND endtime < $time"; + $dataarray = $database->query_return($q); + + foreach($dataarray as $data) { + $userData_from = $database->getUserFields($database->getVillageField($data['from'], "owner"), "alliance, tribe", 0); + $userData_to = $database->getUserFields($database->getVillageField($data['to'], "owner"), "alliance, tribe", 0); + + if($data['wood'] >= $data['clay'] && $data['wood'] >= $data['iron'] && $data['wood'] >= $data['crop']) $sort_type = 10; + elseif($data['clay'] >= $data['wood'] && $data['clay'] >= $data['iron'] && $data['clay'] >= $data['crop']) $sort_type = 11; + elseif($data['iron'] >= $data['wood'] && $data['iron'] >= $data['clay'] && $data['iron'] >= $data['crop']) $sort_type = 12; + elseif($data['crop'] >= $data['wood'] && $data['crop'] >= $data['clay'] && $data['crop'] >= $data['iron']) $sort_type = 13; + + $to = $database->getMInfo($data['to']); + $from = $database->getMInfo($data['from']); + + $ownally = $userData_from['alliance']; + $targetally = $userData_to['alliance']; + + $database->addNotice($to['owner'],$to['wref'],$targetally,$sort_type,''.addslashes($from['name']).' send resources to '.addslashes($to['name']).'',''.$from['owner'].','.$from['wref'].','.$data['wood'].','.$data['clay'].','.$data['iron'].','.$data['crop'].'',$data['endtime']); + if($from['owner'] != $to['owner']) { + $database->addNotice($from['owner'],$to['wref'],$ownally,$sort_type,''.addslashes($from['name']).' send resources to '.addslashes($to['name']).'',''.$from['owner'].','.$from['wref'].','.$data['wood'].','.$data['clay'].','.$data['iron'].','.$data['crop'].'',$data['endtime']); + } + $database->modifyResource($data['to'],$data['wood'],$data['clay'],$data['iron'],$data['crop'],1); + $targettribe = $userData_to["tribe"]; + $endtime = $units->getWalkingTroopsTime($data['from'], $data['to'], 0, 0, [$targettribe], 0) + $data['endtime']; + $database->addMovement(2, $data['to'], $data['from'], $data['merchant'], time(), $endtime, $data['send'], $data['wood'], $data['clay'], $data['iron'], $data['crop']); + $database->setMovementProc($data['moveid']); + } + + $q1 = "SELECT send, moveid, `to`, wood, clay, iron, crop, `from` FROM ".TB_PREFIX."movement WHERE proc = 0 and sort_type = 2 and endtime < $time"; + $dataarray1 = $database->query_return($q1); + + $vilIDs = []; + foreach($dataarray1 as $data1) { + $vilIDs[$data1['to']] = true; + $vilIDs[$data1['from']] = true; + } + $vilIDs = array_keys($vilIDs); + $database->getVillageByWorldID($vilIDs); + + foreach($dataarray1 as $data1) { + $database->setMovementProc($data1['moveid']); + if($data1['send'] > 1){ + $targettribe1 = $database->getUserFields($database->getVillageField($data1['to'],"owner"),"alliance, tribe",0)['tribe']; + $send = $data1['send']-1; + $this->sendResource2($data1['wood'],$data1['clay'],$data1['iron'],$data1['crop'],$data1['to'],$data1['from'],$targettribe1,$send); + } + } + } + + private function sendResource2($wtrans, $ctrans, $itrans, $crtrans, $from, $to, $tribe, $send) { + global $bid17, $bid28, $database, $units; + + $availableWood = $database->getWoodAvailable($from); + $availableClay = $database->getClayAvailable($from); + $availableIron = $database->getIronAvailable($from); + $availableCrop = $database->getCropAvailable($from); + + if($availableWood + $availableClay + $availableIron + $availableCrop > 0) + { + if($availableWood < $wtrans) $wtrans = $availableWood; + if($availableClay < $ctrans) $ctrans = $availableClay; + if($availableIron < $itrans) $itrans = $availableIron; + if($availableCrop < $crtrans) $crtrans = $availableCrop; + + $merchant2 = ($this->getTypeLevel(17, $from) > 0)? $this->getTypeLevel(17, $from) : 0; + $used2 = $database->totalMerchantUsed($from, false); + $merchantAvail2 = $merchant2 - $used2; + $maxcarry2 = ($tribe == 1)? 500 : (($tribe == 2)? 1000 : 750); + $maxcarry2 *= TRADER_CAPACITY; + + if($this->getTypeLevel(28, $from) != 0) { + $maxcarry2 *= $bid28[$this->getTypeLevel(28, $from)]['attri'] / 100; + } + + $resource = [$wtrans, $ctrans, $itrans, $crtrans]; + $reqMerc = ceil((array_sum($resource) - 0.1) / $maxcarry2); + + if($merchantAvail2 > 0 && $reqMerc <= $merchantAvail2) { + if($database->getVillageState($to)) { + $timetaken = $units->getWalkingTroopsTime($from, $to, 0, 0, [$tribe], 0); + $res = $resource[0] + $resource[1] + $resource[2] + $resource[3]; + if($res > 0){ + $reference = $database->sendResource($resource[0], $resource[1], $resource[2], $resource[3], $reqMerc, 0); + $database->modifyResource($from, $resource[0], $resource[1], $resource[2], $resource[3], 0); + $database->addMovement(0, $from, $to, $reference, microtime(true), microtime(true) + $timetaken, $send); + } + } + } + } + } + + private function resolveCatapultsDestruction(&$bdo, &$battlepart, &$info_cat, &$data, $catapultTarget, $twoRowsCatapultSetup, $isSecondRow, $catp_pic, $can_destroy, $isoasis, &$village_destroyed, $tribe) { + global $battle, $database, $bid34; + + if(isset($catapultTarget)) + { + // currently targeted building/field level + $tblevel = (int) $bdo['f'.$catapultTarget]; + // currently targetet building/field GID (ID of the building/field type - woodcutter, cropland, embassy...) + $tbgid = (int) $bdo['f'.$catapultTarget.'t']; + // currently targeted building/field ID in the database (fdata, the fID field, e.g. f1, f2, f3...) + $tbid = (int) $catapultTarget; + + $newLevel = $battle->CalculateNewBuildingLevel($battlepart['catapults']['moral'], + $battlepart['catapults']['upgrades'], + $battlepart['catapults']['downgrades'], + $tblevel, + $battlepart['catapults']['realAttackers'] / ($twoRowsCatapultSetup ? 2 : 1), + $data['t8'] / ($twoRowsCatapultSetup ? 2 : 1), + ($catapultTarget == 40 ? 1 : $battlepart['catapults']['strongerBuildings'])); + + //If that building was present in the building queue, we have to modify his level or remove it + $database->modifyBData($data['to'], $tbid, [$newLevel, $tblevel], $tribe); + + // building/field destroyed + if ($newLevel == 0) + { + // prepare data to be updated + $fieldsToSet = ["f".$tbid]; + $fieldValuesToSet = [0]; + + // update $bdo, so we don't have to reselect later + $bdo['f'.$catapultTarget] = 0; + + if ($tbid >= 19 && $tbid != 99) { + $fieldsToSet[] = "f".$tbid."t"; + $fieldValuesToSet[] = 0; + $bdo['f'.$catapultTarget."t"] = 0; + } + + // update all that needs updating + $database->setVillageLevel($data['to'], $fieldsToSet, $fieldValuesToSet); + + $buildarray = $GLOBALS["bid".$tbgid]; + + // (great) warehouse level was changed + if ($tbgid == 10 || $tbgid == 38) { + $database->setMaxStoreForVillage($data['to'], $buildarray[$newLevel]['attri']); + } + + // (great) granary level was changed + if ($tbgid == 11 || $tbgid == 39) { + $database->setMaxCropForVillage($data['to'], $buildarray[$newLevel]['attri']); + } + + // oasis cannot be destroyed + $pop = $this->recountPop($data['to'], false); + if ($isoasis == 0 && $pop == 0 && $can_destroy == 1) $village_destroyed = 1; + + if ($isSecondRow) { + if ($tbid > 0) { + $info_cat .= "Information + \"Catapult\" ".$this->procResType($tbgid, $can_destroy)." destroyed."; + } + + // embassy level was changed + if ($tbgid == 18){ + $info_cat .= $database->checkEmbassiesAfterBattle($data['to'], $bdo['f'.$catapultTarget], false); + } + + $info_cat .= ""; + } else { + $info_cat = "".$catp_pic.", ".$this->procResType($tbgid, $can_destroy)." destroyed."; + + // embassy level was changed + if ($tbgid == 18){ + $info_cat .= $database->checkEmbassiesAfterBattle($data['to'], $bdo['f'.$catapultTarget], false); + } + } + } + // building/field not damaged + elseif($newLevel == $tblevel){ + if($isSecondRow) { + if ($tbid > 0) { + $info_cat .= "Information + \"Catapult\" ".$this->procResType($tbgid, $can_destroy)." was not damaged."; + } + } else { + $info_cat = "".$catp_pic.",".$this->procResType($tbgid, $can_destroy)." was not damaged."; + } + } + // building/field was damaged, let's calculate the actual damage + else + { + // update $bdo, so we don't have to reselect later + $bdo['f'.$catapultTarget] = $newLevel; + + // building was damaged to a lower level + $info_cata = " damaged from level ".$tblevel." to level ".$newLevel."."; + + $buildarray = $GLOBALS["bid".$tbgid]; + + // (great) warehouse level was changed + if ($tbgid == 10 || $tbgid == 38) { + $database->setMaxStoreForVillage($data['to'], $buildarray[$newLevel]['attri']); + } + + // (great) granary level was changed + if ($tbgid == 11 || $tbgid == 39) { + $database->setMaxCropForVillage($data['to'], $buildarray[$newLevel]['attri']); + } + + $fieldsToSet = ["f".$tbid]; + $fieldValuesToSet = [$newLevel]; + + $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; + } + + if ($isSecondRow) { + $info_cat .= "Information + \"Catapult\" ".$this->procResType($tbgid, $can_destroy).$info_cata; + + // embassy level was changed + if ($tbgid == 18) { + $info_cat .= $database->checkEmbassiesAfterBattle($data['to'], $bdo['f'.$catapultTarget], false); + } + + $info_cat .= ""; + } else { + $info_cat = "" . $catp_pic . "," . $this->procResType($tbgid, $can_destroy).$info_cata; + + // embassy level was changed + if ($tbgid == 18) { + $info_cat .= $database->checkEmbassiesAfterBattle($data['to'], $bdo['f'.$catapultTarget], false); + } + } + } + }else{ + if(!isset($info_cat) || empty($info_cat) || $info_cat == ","){ + $info_cat = "".$catp_pic.", There are no buildings left to destroy"; + }else if(strpos($info_cat, "There are no buildings left") === false){ + $info_cat .= "Information + \"Catapult\" There are no buildings left to destroy."; + } + } + } + + private function sendunitsComplete() { + global $bid19, $bid23, $bid34, $u99, $database, $battle, $technology, $units; + + $time = time(); + $q = " + SELECT + `from`, `to`, endtime, ref, ctar1, ctar2, spy, moveid, attack_type, + t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, (SELECT oasistype FROM ".TB_PREFIX."wdata WHERE id = `to`) as oasistype + FROM + ".TB_PREFIX."movement, + ".TB_PREFIX."attacks + WHERE + ".TB_PREFIX."movement.ref = ".TB_PREFIX."attacks.id + AND + ".TB_PREFIX."movement.proc = 0 + AND + ".TB_PREFIX."movement.sort_type = 3 + AND + ".TB_PREFIX."attacks.attack_type != 2 + AND + endtime < $time + ORDER BY endtime ASC"; + $dataarray = $database->query_return($q); + $totalattackdead = $data_num = 0; + + if ($dataarray && count($dataarray)) { + // preload village data + $vilIDs = []; + foreach($dataarray as $data) { + $vilIDs[$data['from']] = true; + $vilIDs[$data['to']] = true; + } + $vilIDs = array_keys($vilIDs); + $database->getProfileVillages($vilIDs, 5); + $database->getUnit($vilIDs); + $database->getEnforceVillage($vilIDs, 0); + $database->getMovement(34, $vilIDs, 1); + $database->getABTech($vilIDs); + + // calculate battles + foreach($dataarray as $data) { + //set base things + $isoasis = $data['oasistype']; + $AttackArrivalTime = $data['endtime']; + $AttackerWref = $data['from']; + $DefenderWref = $data['to']; + $NatarCapital = false; + + $Attacker['id'] = $database->getUserArray($database->getVillageField($data['from'],"owner"), 1)["id"]; + $AttackerID = $Attacker['id']; + $owntribe = $database->getUserArray($database->getVillageField($data['from'],"owner"), 1)["tribe"]; + $ownally = $database->getUserArray($database->getVillageField($data['from'],"owner"), 1)["alliance"]; + $from = $database->getMInfo($data['from']); + $fromF = $database->getVillage($data['from']); + + //It's a village + if ($isoasis == 0){ + $DefenderUserData = $database->getUserArray($database->getVillageField($data['to'],"owner"), 1); + $Defender['id'] = $DefenderUserData["id"]; + $DefenderID = $Defender['id']; + $targettribe = $DefenderUserData["tribe"]; + $targetally = $DefenderUserData["alliance"]; + $to = $database->getMInfo($data['to']); + $toF = $database->getVillage($data['to']); + $conqureby = 0; + $NatarCapital = ($toF['owner'] == 3 && $toF['capital'] == 1); + if(!isset($to['name']) || empty($to['name'])) $to['name'] = "[?]"; + + $DefenderUnit = []; + $DefenderUnit = $database->getUnit($data['to']); + $evasion = $toF["evasion"]; + $maxevasion = $DefenderUserData["maxevasion"]; + $gold = $DefenderUserData["gold"]; + $playerunit = (($targettribe - 1) * 10); + $cannotsend = false; + + $movements = $database->getMovement(34, $data['to'], 1); + for($y = 0; $y < count($movements); $y++){ + if(property_exists($units, $y)){ + $returntime = $units->$y['endtime'] - time(); + if($units->$y['sort_type'] == 4 && $units->$y['from'] != 0 && $returntime <= 10){ + $cannotsend = true; + } + } + } + + if($evasion == 1 && $maxevasion > 0 && $gold > 1 && !$cannotsend && $dataarray[$data_num]['attack_type'] > 2){ + $evaded = true; + $totaltroops = 0; + $evasionUnitModifications_units = []; + $evasionUnitModifications_amounts = []; + $evasionUnitModifications_modes = []; + for($i = 1; $i <= 10; $i++){ + $playerunit += $i; + $data['u' . $i] = $DefenderUnit['u' . $playerunit]; + $evasionUnitModifications_units[] = $playerunit; + $evasionUnitModifications_amounts[] = $DefenderUnit['u' . $playerunit]; + $evasionUnitModifications_modes[] = 0; + $playerunit -= $i; + $totaltroops += $data['u' . $i]; + } + + $data['u11'] = $DefenderUnit['hero']; + $totaltroops += $data['u11']; + if($totaltroops > 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 = []; + $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; + } + + //get attack units + $Attacker = []; + $start = ($owntribe - 1) * 10 + 1; + $end = $owntribe * 10; + $u = ($owntribe - 1) * 10; + $catapult = [8, 18, 28, 48]; + $ram = [7, 17, 27, 47]; + $chief = [9, 19, 29, 49]; + $spys = [4, 14, 23, 44]; + for($i = $start; $i <= $end; $i++) { + $y = $i - $u; + $Attacker['u'.$i] = $dataarray[$data_num]['t'.$y]; + //there are catas + if(in_array($i, $catapult)) $catp_pic = $i; + if(in_array($i, $ram)) $ram_pic = $i; + if(in_array($i, $chief)) $chief_pic = $i; + if(in_array($i, $spys)) $spy_pic = $i; + } + $Attacker['uhero'] = $dataarray[$data_num]['t11']; + $hero_pic = "hero"; + + //need to set these variables. + $def_wall = $database->getFieldLevel($data['to'], 40, false); + $att_tribe = $owntribe; + $def_tribe = $targettribe; + $attpop = $defpop = $residence = 0; + $def_ab = []; + + //get level of palace or residence + $residence = $database->getFieldLevelInVillage($data['to'], '25, 26', false); + + //type of attack + $type = $dataarray[$data_num]['attack_type']; + if($type == 1) $scout = 1; + + $ud = ($def_tribe - 1) * 10; + $att_ab = $database->getABTech($data['from']); // Blacksmith level + $att_ab1 = $att_ab['b1']; + $att_ab2 = $att_ab['b2']; + $att_ab3 = $att_ab['b3']; + $att_ab4 = $att_ab['b4']; + $att_ab5 = $att_ab['b5']; + $att_ab6 = $att_ab['b6']; + $att_ab7 = $att_ab['b7']; + $att_ab8 = $att_ab['b8']; + $armory = $database->getABTech($data['to']); // Armory level + $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']; + + //rams attack + if (($data['t7']) > 0 && $type == 3) { + $basearraywall = $to; + if (($walllevel = $database->getFieldLevel($basearraywall['wref'], 40, false)) > 0){ + $wallgid = $database->getFieldLevel($basearraywall['wref'],"40t"); + $wallid = 40; + $w = 4; + } + } + + $tblevel = 1; + $stonemason = $database->getFieldLevelInVillage($data['to'], 34); + + }else{ //It's an oasis + + $DefenderUserData = $database->getUserArray($database->getOasisField($data['to'], "owner"), 1); + $Defender['id'] = $DefenderUserData["id"]; + $DefenderID = $Defender['id']; + $targettribe = $DefenderUserData["tribe"]; + $targetally = $DefenderUserData["alliance"]; + $to = $database->getOMInfo($data['to']); + $toF = $database->getOasisV($data['to']); + $conqureby = $toF['conqured']; + //get defence units + $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++) { + $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; + } + + //get attack units + $Attacker = []; + $start = ($owntribe - 1) * 10 + 1; + $end = $owntribe * 10; + $u = ($owntribe - 1) * 10; + $catapult = [8, 18, 28, 38, 48]; + $ram = [7, 17, 27, 37, 47]; + $chief = [9, 19, 29, 39, 49]; + $spys = [4, 14, 23, 44]; + for($i = $start; $i <= $end; $i++) { + $y = $i - $u; + $Attacker['u'.$i] = $dataarray[$data_num]['t'.$y]; + //there are catas + if(in_array($i, $catapult)) $catp_pic = $i; + if(in_array($i, $ram)) $ram_pic = $i; + if(in_array($i, $chief)) $chief_pic = $i; + if(in_array($i, $spys)) $spy_pic = $i; + } + $Attacker['uhero'] = $dataarray[$data_num]['t11']; + $hero_pic = "hero"; + + //need to set these variables. + $def_wall = $residence = $attpop = 0; + $att_tribe = $owntribe; + $def_tribe = $targettribe; + $defpop = 500; + + //type of attack + $type = $dataarray[$data_num]['attack_type']; + if($type == 1) $scout = 1; + + $att_ab1 = $att_ab2 = $att_ab3 = $att_ab4 = $att_ab5 = $att_ab6 = $att_ab7 = $att_ab8 = 0; + $def_ab[31] = $def_ab[32] = $def_ab[33] = $def_ab[34] = $def_ab[35] = $def_ab[36] = $def_ab[37] = $def_ab[38] = 0; + + $walllevel = $tblevel = $stonemason = 0; + } + + $varray = $database->getProfileVillages($to['owner'], 0, false); + + if ($to['owner'] == $from['owner']) $varray1 = $varray; + else $varray1 = $database->getProfileVillages($from['owner'], 0, false); + + // total population of the defender + if($isoasis == 0){ + foreach($varray as $defenderVillage) $defpop += $defenderVillage['pop']; + } + + // total population of the attacker + foreach($varray1 as $attackerVillage) $attpop += $attackerVillage['pop']; + + //fix by ronix + for ($i = 1; $i <= 50; $i++) { + if (!isset($enforDefender['u'.$i])) { + $enforDefender['u'.$i] = 0; + } + $enforDefender['u'.$i] += (isset($Defender['u'.$i]) ? $Defender['u'.$i] : 0); + } + + $defspy = $enforDefender['u4'] > 0 || $enforDefender['u14'] > 0 || $enforDefender['u23'] > 0 || $enforDefender['u44'] > 0; + + if(PEACE == 0 || $targettribe == 4 || $targettribe == 5 || $scout){ + if($targettribe == 1) $def_spy = $enforDefender['u4']; + elseif($targettribe == 2) $def_spy = $enforDefender['u14']; + elseif($targettribe == 3) $def_spy = $enforDefender['u23']; + elseif($targettribe == 5) $def_spy = $enforDefender['u44']; + + //impossible to attack or scout NATAR Capital Village + if ($NatarCapital){ + for($i = 1; $i <= 11; $i++) ${'traped'.$i} = $data['t'.$i]; + } + elseif(empty($scout)) + { + $traps = max($Defender['u99'] - $Defender['u99o'], 0); + + $totalTroops = 0; + for($i = 1; $i <= 11; $i++) $totalTroops += $data['t'.$i]; + + if($traps >= $totalTroops){ + for($i = 1; $i <= 11; $i++) ${'traped'.$i} = $data['t'.$i]; + } + else + { + $multiplier = $traps / $totalTroops; + + //The hero is excluded, because it can be only trapped if traps > totalTroops + for($i = 1; $i <= 10; $i++){ + $trappedUnits = intval($data['t'.$i] * $multiplier); + ${'traped'.$i} = $trappedUnits; + $traps -= $trappedUnits; + } + + while($traps > 0){ + //There are some traps left, let's distribute them + for($i = 1; $i <= 10 && $traps > 0; $i++){ + if($data['t'.$i] != 0){ + ${'traped'.$i}++; + $traps--; + } + } + } + } + } + + if(empty($scout) || $NatarCapital){ + for ($i = 1; $i <= 11; $i++){ + if (!isset(${'traped'.$i})) ${'traped'.$i} = 0; + $totaltraped_att += ${'traped'.$i}; + } + + $database->modifyUnit($data['to'], ["99o"], [$totaltraped_att], [1]); + + for($i = $start; $i <= $end; $i++){ + $j = $i-$start+1; + $Attacker['u'.$i] -= ${'traped'.$j}; + } + $Attacker['uhero'] -= $traped11; + + if($totaltraped_att > 0){ + $prisoners2 = $database->getPrisoners2($data['to'], $data['from'], false); + if(empty($prisoners2)){ + $database->addPrisoners($data['to'],$data['from'],$traped1,$traped2,$traped3,$traped4,$traped5,$traped6,$traped7,$traped8,$traped9,$traped10,$traped11); + }else{ + $database->updatePrisoners($data['to'],$data['from'],$traped1,$traped2,$traped3,$traped4,$traped5,$traped6,$traped7,$traped8,$traped9,$traped10,$traped11); + } + } + } + + // we need to save the attacker heroid before the battle + if(isset($Attacker['uhero']) && $Attacker['uhero'] > 0){ + $AttackerHeroID = $database->getHeroField($from['owner'], "heroid"); + } + + // and the defender(s) heroid + $DefendersHeroID = []; + $herosend_def = 0; + + // check if our hero is defending the village, if so, add it to the list + if (isset($Defender['hero']) && $Defender['hero'] > 0) { + $DefendersHeroID[] = $database->getHeroField($DefenderID, "heroid"); + + // collecting information for the battle report + $herosend_def += $Defender['hero']; + } + + // check if there are other heroes defending the village + if(count($enforcementarray) > 0){ + foreach($enforcementarray as $enforcement){ + if($enforcement['hero'] > 0){ + $heroOwner = $database->getVillageField($enforcement['from'], "owner"); + $DefendersHeroID[] = $database->getHeroField($heroOwner, "heroid"); + } + } + } + + //to battle.php + //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; + + $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); + + //Data for when troops return. + //catapults look :D + $info_cat = $info_chief = $info_ram = $info_hero = ","; + + //check to see if can destroy village + if (count($varray) > 1 && !$database->villageHasArtefact($DefenderWref)) { + $can_destroy = 1; + } + else $can_destroy = 0; + + //Catapults and rams management + if($isoasis == 0){ + if ($type == 3){ + if (($data['t7'] - $traped7) > 0){ + if($walllevel > 0){ + $newLevel = $battle->CalculateNewBuildingLevel($battlepart['rams']['moral'], + $battlepart['rams']['upgrades'], + $battlepart['rams']['downgrades'], + $walllevel, + $battlepart['rams']['realAttackers'], + $data['t7'], + $battlepart['rams']['strongerBuildings']); + + 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."; + } + + if (($data['t8'] - $traped8) > 0) + { + $pop = $this->recountPop($data['to']); + + // village has been destroyed + if ($pop <= 0) { + if ($can_destroy == 1) $info_cat = "".$catp_pic.", Village already destroyed."; + else $info_cat = "".$catp_pic.", Village can\'t be destroyed."; + } + else + { + // village stands, let's do the damage + /** + * FIRST CATAPULTS ROW + */ + + $basearray = $data['to']; + $bdo = $database->getResourceLevel($basearray, false); + $catapultTarget = $data['ctar1']; + $catapultTarget2 = (isset($data['ctar2']) ? $data['ctar2'] : 0); + + $catapults1TargetRandom = ($catapultTarget == 0); + $catapults2WillNotShoot = ($catapultTarget2 == 0); + $catapults2TargetRandom = ($catapults2WillNotShoot || $catapultTarget2 == 99); + + // we're manually targetting 1st and/or 2nd row of catapults + if (!$catapults1TargetRandom) + { + $_catapultsTarget1Levels = []; + $__catapultsTarget1AltTargets = []; + + // calculate targets for 1st rows of catapults + $j = 0; + for ($i = 1; $i <= 41; $i++) + { + if ($i == 41) $i = 99; + + // 1st row of catapults pre-selected target calculations, if needed + if (!$catapults1TargetRandom && $bdo['f'.$i.'t'] == $catapultTarget && $bdo['f'.$i] > 0 && $i != 40) + { + $j++; + $_catapultsTarget1Levels[$j]=$bdo['f'.$i]; + $__catapultsTarget1AltTargets[$j]=$i; + } + } + + // if we couldn't find a suitable target for 1st row of catapults, + // select a random target instead + if (!$catapults1TargetRandom) { + if ( count( $_catapultsTarget1Levels ) > 0 ) { + if ( max( $_catapultsTarget1Levels ) <= 0 ) { + $catapultTarget = 0; + } else { + $catapultTarget = $__catapultsTarget1AltTargets[rand( 1, $j )]; + } + } else { + $catapultTarget = 0; + $catapults1TargetRandom = true; + } + } + } + + // 1st row of catapults set to target randomly + if ($catapults1TargetRandom) + { + $list = []; + for ($i = 1; $i <= 41; $i++) + { + if ($i == 41) $i = 99; + if ($bdo['f'.$i] > 0 && $i != 40) $list[] = $i; + } + $catapultTarget = $list[rand(0, count($list) - 1)]; + } + + /** + * resolve 1st row of catapults + */ + $village_destroyed = 0; + $this->resolveCatapultsDestruction($bdo, $battlepart, $info_cat, $data, $catapultTarget, !$catapults2WillNotShoot, false, $catp_pic, $can_destroy, $isoasis, $village_destroyed, $targettribe); + + /** + * SECOND CATAPULTS ROW + */ + + // we're manually targetting 2nd row of catapults + if (!$catapults2TargetRandom) + { + $_catapultsTarget2Levels = []; + $__catapultsTarget2AltTargets = []; + + // calculate targets for 2nd rows of catapults + $j = 0; + for ($i = 1; $i <= 41; $i++) + { + if ($i == 41) $i = 99; + + // 2nd row of catapults pre-selected target calculations, if needed + if (!$catapults2TargetRandom && !$catapults2WillNotShoot && $bdo['f'.$i.'t'] == $catapultTarget2 && $bdo['f'.$i] > 0 && $i != 40) + { + $j++; + $_catapultsTarget2Levels[$j] = $bdo['f'.$i]; + $__catapultsTarget2AltTargets[$j] = $i; + } + } + + // if we couldn't find a suitable target for 2nd row of catapults, + // select a random target instead + if (!$catapults2TargetRandom) { + if (count($_catapultsTarget2Levels) > 0 ) { + if (max($_catapultsTarget2Levels) <= 0 ) { + $catapultTarget2 = 99; + } + else $catapultTarget2 = $__catapultsTarget2AltTargets[rand( 1, $j )]; + } else { + $catapultTarget2 = 99; + $catapults2TargetRandom = true; + } + } + } + + // 2nd row of catapults set to target randomly + if ($catapults2TargetRandom && !$catapults2WillNotShoot) + { + $list = []; + for ($i = 1; $i <= 41; $i++) + { + if ($i == 41) $i = 99; + if ($bdo['f'.$i] > 0 && $i != 40) $list[] = $i; + } + $catapultTarget2 = $list[ rand(0, count($list) - 1) ]; + } + + /** + * resolve 2nd row of catapults + */ + if (!$catapults2WillNotShoot) { + $this->resolveCatapultsDestruction($bdo, $battlepart, $info_cat, $data, $catapultTarget2, true, true, $catp_pic, $can_destroy, $isoasis, $village_destroyed, $targettribe); + } + + // clear resource levels cache, since we might have destroyed buildings/fields by now + call_user_func(get_class($database).'::clearResourseLevelsCache'); + } + } + } elseif (($data['t7'] - $traped7) > 0) { + $info_ram = "".$ram_pic.",Hint: The ram does not work during a raid."; + } + } + else $can_destroy = 0; + + //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; + + //Resetting the enforcement arrays + for($i = 1; $i <= 50; $i++) { + $DefenderEnf['u'.$i] = 0; + if($i <= 5){ + $DefenderHeroesTotArray[$i] = 0; + $DefenderHeroesDeadArray[$i] = 0; + } + } + + // our reinforcements count could have changed at this point, thus the re-select + $enforcementarray2 = $database->getEnforceVillage($data['to'], 0); + if(count($enforcementarray2) > 0) { + foreach($enforcementarray2 as $enforce2) { + for($i = 1; $i <= 50; $i++) { + $DefenderEnf['u'.$i] += $enforce2['u'.$i]; + } + + //Divide heroes by tribe + if($enforce2['hero'] > 0) { + $reinfTribe = ($enforce2['from'] == 0) ? 4 : $database->getUserField($database->getVillageField($enforce2['from'], "owner"), "tribe", 0); + $DefenderHeroesTotArray[$reinfTribe] += $enforce2['hero']; + $Defender['hero'] += $enforce2['hero']; + } + } + } + + $totalsend_alldef = 0; + $unitssend_def = []; + + //Own troops + $ownTroops = array_slice($Defender, ($targettribe - 1) * 10 + 1, 10); + $totalsend_alldef = array_sum($ownTroops); + + //Collecting informations for the report + $unitssend_def[0] = implode(",", $ownTroops); + $unitssend_deff[0] = '?,?,?,?,?,?,?,?,?,?,'; + + for($i = 1; $i <= 5; $i++){ + //Reinforcements + $reinfTroops = array_slice($DefenderEnf, ($i - 1) * 10, 10); + $totalsend_alldef += array_sum($reinfTroops); + + //Collecting informations for the report + $unitssend_def[$i] = implode(",", $reinfTroops); + $unitssend_deff[$i] = $unitssend_deff[0]; + } + $totalsend_alldef += $Defender['hero']; + + ################################################# + ################FIXED BY SONGER################ + ################################################# + + for($i = 1; $i <= 11; $i++){ + //MUST TO BE FIX : This is only for defender and still not properly coded + if (isset($battlepart['casualties_attacker']) && isset($battlepart['casualties_attacker'][$i]) && $battlepart['casualties_attacker'][$i] <= 0) { + ${'dead'.$i} = 0; + } else if (isset($data['t'.$i]) && isset($battlepart['casualties_attacker']) && isset($battlepart['casualties_attacker'][$i]) && $battlepart['casualties_attacker'][$i] > $data['t'.$i]) { + ${'dead'.$i} = $data['t'.$i]; + } else { + ${'dead'.$i} = (isset($battlepart['casualties_attacker']) && isset($battlepart['casualties_attacker'][$i]) ? $battlepart['casualties_attacker'][$i] : 0); + } + } + + ################################################# + + $dead = []; + $owndead = []; + $alldead = []; + + for($i = 1; $i <= 50; $i++) $alldead[$i] = 0; + $heroAttackDead = $dead11; + + //kill own defence + $unitlist = $database->getUnit($data['to'], false); + $start = ($targettribe-1)*10+1; + $end = ($targettribe*10); + + if ($targettribe == 1) $u = ""; + else $u = $targettribe - 1; + + $unitModifications_units = []; + $unitModifications_amounts = []; + $unitModifications_modes = []; + for ($i = $start; $i <= $end; $i++) { + if($i == $end) { + $u = $targettribe; + } + + if($unitlist){ + $owndead[$i] = round($battlepart[2] * $unitlist['u'.$i]); + $unitModifications_units[] = $i; + $unitModifications_amounts[] = $owndead[$i]; + $unitModifications_modes[] = 0; + } + } + + $owndead['hero'] = 0; + + if($unitlist){ + $owndead['hero'] = (isset($battlepart['deadherodef']) ? $battlepart['deadherodef'] : ''); + + $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); + foreach ($enforcementarray3 as $enforce) { + $life=''; $notlife=''; $wrong = false; + if($enforce['from'] != 0){ + $tribe = $database->getUserArray($database->getVillageField($enforce['from'],"owner"), 1)["tribe"]; + } + else $tribe = 4; + + $start = ($tribe - 1) * 10 + 1; + $end = ($tribe * 10); + unset($dead); + + switch($tribe) + { + case 1: $rom = 1; break; + case 2: $ger = 1; break; + case 3: $gal = 1; break; + case 4: $nat = 1; break; + case 5: + default: $natar = 1; break; + } + + $enforceModificationsById = []; + for ($i = $start; $i <= $end; $i++){ + if($enforce['u'.$i]>'0'){ + if (!isset($enforceModificationsById[$enforce['id']])) { + $enforceModificationsById[$enforce['id']] = [ + 'units' => [], + 'amounts' => [], + 'modes' => [] + ]; + } + $enforceModificationsById[$enforce['id']]['units'][] = $i; + $enforceModificationsById[$enforce['id']]['amounts'][] = (isset($battlepart[2]) ? round($battlepart[2]*$enforce['u'.$i]) : 0); + $enforceModificationsById[$enforce['id']]['modes'][] = 0; + $dead[$i] = (isset($battlepart[2]) ? round($battlepart[2]*$enforce['u'.$i]) : 0); + $checkpoint = (isset($battlepart[2]) ? round($battlepart[2]*$enforce['u'.$i]) : 0); + + if (!isset($enforce['u'.$i])) $enforce['u'.$i] = 0; + + $alldead[$i] += $dead[$i]; + + $wrong = $checkpoint != $enforce['u'.$i]; + } + else $dead[$i] = 0; + } + + if($enforce['hero'] > 0) { + $enforceModificationsById[$enforce['id']]['units'][] = 'hero'; + $enforceModificationsById[$enforce['id']]['amounts'][] = $battlepart['deadheroref'][$enforce['id']]; + $enforceModificationsById[$enforce['id']]['modes'][] = 0; + + $dead['hero'] = $battlepart['deadheroref'][$enforce['id']]; + $alldead['hero'] += $dead['hero']; + $wrong = $dead['hero'] != $enforce['hero']; + + //Collecting information for the report + $reinfTribe = ($enforce['from'] == 0) ? 4 : $database->getUserField($database->getVillageField($enforce['from'], "owner"), "tribe", 0); + $DefenderHeroesDeadArray[$reinfTribe] += $dead['hero']; + } + + // 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).''].''; + $life1 = $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).'']; + $lifehero = (isset($enforce['hero']) ? $enforce['hero'] : 0); + $notlifehero = (isset($dead['hero']) ? $dead['hero'] : 0); + $totallife = (isset($enforce['hero']) ? $enforce['hero'] : 0)+$life1; + $totalnotlife = (isset($dead['hero']) ? $dead['hero'] : 0)+$notlife1; + $totalsend_att = $data['t1']+$data['t2']+$data['t3']+$data['t4']+$data['t5']+$data['t6']+$data['t7']+$data['t8']+$data['t9']+$data['t10']+$data['t11']; + $totaldead_att = $dead1+$dead2+$dead3+$dead4+$dead5+$dead6+$dead7+$dead8+$dead9+$dead10+$dead11; + //NEED TO SEND A RAPPORTAGE!!! + $data2 = ''.$database->getVillageField( $enforce['from'], "owner" ).','.$to['wref'].','.addslashes($to['name']).','.$tribe.','.$life.','.$notlife.','.$lifehero.','.$notlifehero.','.$enforce['from'].''; + if(empty($scout)) { + if($totalnotlife == 0){ + $database->addNotice($database->getVillageField( $enforce['from'], "owner" ),$from['wref'],$ownally,15,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime); + }else if($totallife > $totalnotlife){ + $database->addNotice($database->getVillageField( $enforce['from'], "owner" ),$from['wref'],$ownally,16,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime); + }else{ + $database->addNotice($database->getVillageField( $enforce['from'], "owner" ),$from['wref'],$ownally,17,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime); + } + //delete reinf sting when its killed all. + if(!$wrong) $database->deleteReinf($enforce['id']); + } + } + $totalsend_att = $data['t1']+$data['t2']+$data['t3']+$data['t4']+$data['t5']+$data['t6']+$data['t7']+$data['t8']+$data['t9']+$data['t10']+$data['t11']; + + $DefenderHeroesTot = implode(",", $DefenderHeroesTotArray); + $DefenderHeroesDead = implode(",", $DefenderHeroesDeadArray); + + if (empty($alldead['hero'])) $alldead['hero'] = 0; + if (empty($owndead['hero'])) $owndead['hero'] = 0; + $deadhero = $owndead['hero']; + + //Counting own total dead troops + $ownDeadTroops = array_slice($owndead, 0, 10); + $totaldead_alldef = array_sum($ownDeadTroops); + + //Collecting informations for the report + $unitsdead_def[0] = implode(",", $ownDeadTroops); + $unitsdead_deff[0] = '?,?,?,?,?,?,?,?,?,?,'; + for($i = 1; $i <= 5; $i++){ + //Counting reinforcements total dead troops + $deadTroops = array_slice($alldead, ($i - 1) * 10, 10); + $totaldead_alldef += array_sum($deadTroops); + //Collecting informations for the report + $unitsdead_def[$i] = implode(",", $deadTroops); + $unitsdead_deff[$i] = $unitsdead_deff[0]; + } + $totaldead_alldef += ($deadhero + $alldead['hero']); + + if (!isset($totalattackdead)) $totalattackdead = 0; + $totalattackdead += $totaldead_alldef; + + // Set units returning from attack + + $p_units = []; + for ($i = 1; $i <= 11; $i++) { + if (!isset(${'dead'.$i})) ${'dead'.$i} = 0; + if (!isset(${'traped'.$i})) ${'traped'.$i} = 0; + $p_units[] = "t".$i." = t".$i." - ".(${'dead'.$i} + ${'traped'.$i}); + } + + $database->modifyAttack3($data['ref'],implode(', ', $p_units)); + + $unitsdead_att = $dead1.','.$dead2.','.$dead3.','.$dead4.','.$dead5.','.$dead6.','.$dead7.','.$dead8.','.$dead9.','.$dead10; + $unitstraped_att = $traped1.','.$traped2.','.$traped3.','.$traped4.','.$traped5.','.$traped6.','.$traped7.','.$traped8.','.$traped9.','.$traped10.','.$traped11; + + if($herosend_att > 0) $unitsdead_att_check = $unitsdead_att.','.$dead11; + else $unitsdead_att_check = $unitsdead_att; + + + //top 10 attack and defence update + $totaldead_att = $dead1 + $dead2 + $dead3 + $dead4 + $dead5 + $dead6 + $dead7 + $dead8 + $dead9 + $dead10 + $dead11; + $totalattackdead += $totaldead_att; + $troopsdead1 = $dead1; + $troopsdead2 = $dead2; + $troopsdead3 = $dead3; + $troopsdead4 = $dead4; + $troopsdead5 = $dead5; + $troopsdead6 = $dead6; + $troopsdead7 = $dead7; + $troopsdead8 = $dead8; + $troopsdead9 = $dead9 + 1; + $troopsdead10 = $dead10; + $troopsdead11 = $dead11; + + $totaldead_def = 0; + $totalpoint_att = 0; + + for($i = 1 ;$i <= 50; $i++) { + $unitarray = $GLOBALS["u".$i]; + + //Reinforcements dead troops + $totaldead_def += $alldead[$i]; + $totalpoint_att += ($alldead[$i] * $unitarray['pop']); + + //Own dead troops + if($i >= ($targettribe - 1) * 10 + 1 && $i <= $targettribe * 10){ + $totaldead_def += $owndead[$i]; + $totalpoint_att += ($owndead[$i] * $unitarray['pop']); + } + } + $totalpoint_att += ((isset($alldead['hero']) ? $alldead['hero'] : 0) * 6); + $totalpoint_att += ((isset($owndead['hero']) ? $owndead['hero'] : 0) * 6); + + if ($Attacker['uhero'] > 0){ + $heroxp = $totalpoint_att; + $database->modifyHeroXp("experience", $heroxp, $AttackerHeroID); + } + + for($i = 1; $i <= 10; $i++){ + $unitarray = $GLOBALS["u".(($att_tribe - 1) * 10 + $i)]; + $totalpoint_def += (${'dead'.$i}*$unitarray['pop']); + } + + $totalpoint_def += $dead11 * 6; + + if($Defender['hero'] > 0){ + //counting heroxp + $defheroxp = intval($totalpoint_def / count($DefendersHeroID)); + foreach($DefendersHeroID as $HeroID){ + $database->modifyHeroXp("experience",$defheroxp,$HeroID); + } + } + + // we don't need these two variables anymore + unset($AttackerHeroID, $DefendersHeroID); + + $database->modifyPoints( + $toF['owner'], + ['dpall', 'dp'], + [$totalpoint_def, $totalpoint_def] + ); + + $database->modifyPoints( + $from['owner'], + ['apall', 'ap'], + [$totalpoint_att, $totalpoint_att] + ); + + $database->modifyPointsAlly( + $targetally, + ['Adp', 'dp'], + [$totalpoint_def, $totalpoint_def] + ); + + $database->modifyPointsAlly( + $ownally, + ['Aap', 'ap'], + [$totalpoint_att, $totalpoint_att] + ); + + if ($isoasis == 0){ + // get total cranny value: + $buildarray = $database->getResourceLevel($data['to']); + $cranny = 0; + for($i = 19; $i < 39;$i++){ + if($buildarray['f'.$i.'t'] == 23){ + $cranny += $bid23[$buildarray['f'.$i]]['attri'] * CRANNY_CAPACITY; + } + } + + //cranny efficiency + $atk_bonus = ($owntribe == 2) ? (4 / 5) : 1; + $def_bonus = ($targettribe == 3) ? 2 : 1; + $to_owner = $database->getVillageField($data['to'], "owner"); + + $crannySpy = $database->getArtifactsValueInfluence($to_owner, $data['to'], 7, $cranny * $def_bonus); + $cranny_eff = $crannySpy * $atk_bonus; + + // work out available resources. + $this->updateRes($data['to']); + $this->pruneResource(); + + $villageData = $database->getVillageFields($data['to'], 'clay, iron, wood, crop', false); + $totclay = $villageData['clay']; + $totiron = $villageData['iron']; + $totwood = $villageData['wood']; + $totcrop = $villageData['crop']; + }else{ + $cranny_eff = 0; + + if ($conqureby > 0) { //10% from owner proc village owner - fix by ronix - exploit fixed by iopietro + $this->updateRes($conqureby); + $this->pruneResource(); + + $villageData = $database->getVillageFields($conqureby, 'clay, iron, wood, crop', false); + $totclay = intval($villageData['clay'] / 10); + $totiron = intval($villageData['iron'] / 10); + $totwood = intval($villageData['wood'] / 10); + $totcrop = intval($villageData['crop'] / 10); + }else{ + // work out available resources. + $this->updateORes($data['to']); + $this->pruneOResource(); + + $oasisData = $database->getOasisFields($data['to'], false); + $totclay = $oasisData['clay']; + $totiron = $oasisData['iron']; + $totwood = $oasisData['wood']; + $totcrop = $oasisData['crop']; + } + } + + $avclay = floor($totclay - $cranny_eff); + $aviron = floor($totiron - $cranny_eff); + $avwood = floor($totwood - $cranny_eff); + $avcrop = floor($totcrop - $cranny_eff); + + $avclay = ($avclay < 0) ? 0 : $avclay; + $aviron = ($aviron < 0) ? 0 : $aviron; + $avwood = ($avwood < 0) ? 0 : $avwood; + $avcrop = ($avcrop < 0) ? 0 : $avcrop; + + $avtotal = [$avwood, $avclay, $aviron, $avcrop]; + $av = $avtotal; + + // resources (wood,clay,iron,crop) + $steal = [0, 0, 0, 0]; + + //bounty variables + $btotal = $battlepart['bounty']; + $bmod = 0; + + for($i = 0; $i < 5; $i++) + { + for($j = 0; $j < 4; $j++) + { + if(isset($avtotal[$j])) + { + if($avtotal[$j] < 1) unset($avtotal[$j]); + } + } + + //No resources left to take + if(empty($avtotal) || ($btotal < 1 && $bmod < 1)) break; + + if($btotal < 1) + { + while($bmod) + { + //random select + $rs = array_rand($avtotal); + if(isset($avtotal[$rs])) + { + $avtotal[$rs] -= 1; + $steal[$rs] += 1; + $bmod -= 1; + } + } + } + + // handle unbalanced amounts. + $btotal += $bmod; + $bmod = $btotal % count($avtotal); + $btotal -= $bmod; + $bsplit = $btotal / count($avtotal); + + $max_steal = (min($avtotal) < $bsplit) ? min($avtotal) : $bsplit; + + for($j = 0; $j < 4; $j++) + { + if(isset($avtotal[$j])) + { + $avtotal[$j] -= $max_steal; + $steal[$j] += $max_steal; + $btotal -= $max_steal; + } + } + } + + //chiefing village + //there are senators + if(($data['t9'] - $dead9 - $traped9) > 0 && $isoasis == 0){ + if ($type == 3) { + $palacelevel = $database->getResourceLevel($from['wref']); + + for($i = 1; $i <= 40; $i++) { + if($palacelevel['f'.$i.'t'] == 26) $plevel = $i; + elseif($palacelevel['f'.$i.'t'] == 25) $plevel = $i; + } + + if($palacelevel['f'.$plevel.'t'] == 26){ + if($palacelevel['f'.$plevel] < 10) $canconquer = 0; + elseif($palacelevel['f'.$plevel] < 15) $canconquer = 1; + elseif($palacelevel['f'.$plevel] < 20) $canconquer = 2; + else $canconquer = 3; + }else if($palacelevel['f'.$plevel.'t'] == 25){ + if($palacelevel['f'.$plevel] < 10) $canconquer = 0; + elseif($palacelevel['f'.$plevel] < 20) $canconquer = 1; + else $canconquer = 2; + } + + $expArray = $database->getVillageFields($from['wref'], 'exp1, exp2, exp3'); + $exp1 = $expArray['exp1']; + $exp2 = $expArray['exp2']; + $exp3 = $expArray['exp3']; + + if($exp1 == 0) $villexp = 0; + elseif($exp2 == 0) $villexp = 1; + elseif($exp3 == 0) $villexp = 2; + else $villexp = 3; + + $mode = CP; + $cp_mode = $GLOBALS['cp'.$mode]; + $need_cps = $cp_mode[count($varray1) + 1]; + $user_cps = $database->getUserArray($from['owner'], 1)['cp']; + + //check for last village or capital + if($user_cps >= $need_cps){ + if(count($varray) > 1 && $to['capital'] != 1 && $villexp < $canconquer){ + if($to['owner'] != 3 || $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!"; + } + + // 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 + $time = time(); + $reducedLoyaltyTotal = $reducedLoyalty = 0; + for ($i = 0; $i < ($data['t9'] - $dead9 - $traped9); $i++){ + + //Random factor, which depends on the attacking tribe + if($owntribe == 1) $reducedLoyalty = rand(20, 30); + else $reducedLoyalty = rand(20, 25); + + //If a Big Party is active in the attacking village + if($from['celebration'] > $time && $from['type'] == 2) $reducedLoyalty += 5; + + //If a Big Party is active in the target village + if($to['celebration'] > $time && $to['type'] == 2) $reducedLoyalty -= 5; + + //Moral bonus + $reducedLoyalty /= $battlepart['moralBonus']; + + //If the brewery is built (Teutons only) + if($owntribe == 2 && $this->getTypeLevel(35, $data['from']) > 0) $reducedLoyalty /= 2; + + $reducedLoyaltyTotal += $reducedLoyalty; + } + + // loyalty is more than 0 + if (($toF['loyalty'] - $reducedLoyaltyTotal) > 0) { + $info_chief = "".$chief_pic.",The loyalty was lowered from ".floor($toF['loyalty'])." to ".floor($toF['loyalty'] - $reducedLoyaltyTotal)."."; + $database->setVillageField($data['to'], 'loyalty', ($toF['loyalty'] - $reducedLoyaltyTotal)); + } else if (!$village_destroyed) { + // you took over the village + $villname = addslashes($database->getVillageField($data['to'],"name")); + $artifact = reset($database->getOwnArtefactInfo($data['to'])); + + $info_chief = "".$chief_pic.",Inhabitants of ".$villname." village decided to join your empire."; + + if ($artifact['vref'] == $data['to']){ + $database->claimArtefact($data['to'], $data['to'], $database->getVillageField($data['from'], "owner")); + } + + $database->setVillageFields( + $data['to'], + ['loyalty', 'owner'], + [0, $database->getVillageField($data['from'],"owner")] + ); + + //delete upgrades in armory and blacksmith + $q = "DELETE FROM ".TB_PREFIX."abdata WHERE vref = ".(int) $data['to']; + $database->query($q); + $database->addABTech($data['to']); + + //delete researches in academy + $q = "DELETE FROM ".TB_PREFIX."tdata WHERE vref = ".(int) $data['to']; + $database->query($q); + $database->addTech($data['to']); + + //delete reinforcement + $q = "DELETE FROM ".TB_PREFIX."enforcement WHERE `from` = ".(int) $data['to']; + $database->query($q); + + //delete trade routes + $q = "DELETE FROM ".TB_PREFIX."route where wid = ".(int) $data['to']." OR `from` =".(int) $data['to']; + $database->query($q); + + //no units can stay in the village itself + $units2reset = []; + for ($u = 1; $u <= 50; $u++) $units2reset[] = 'u'.$u.' = 0'; + + $units2reset[] = 'u99 = 0'; + $units2reset[] = 'u99o = 0'; + $units2reset[] = 'hero = 0'; + $q = "UPDATE ".TB_PREFIX."units SET ".implode(',', $units2reset)." WHERE vref = ".(int) $data['to']; + $database->query($q); + + // check buildings + $newLevels_fieldNames = []; + $newLevels_fieldValues = []; + + $poparray = $database->getVSumField([$AttackerID, $DefenderID] ,"pop"); + $pop1 = $poparray[0]['Total']; + $pop2 = $poparray[1]['Total']; + if($pop1 > $pop2 && $targettribe != 5){ + $buildlevel = $database->getResourceLevel($data['to']); + for ($i = 1; $i <= 39; $i++){ + if($buildlevel['f'.$i]!=0){ + if($buildlevel['f'.$i."t"] != 35 && $buildlevel['f'.$i."t"] != 36 && $buildlevel['f'.$i."t"] != 41){ + $leveldown = $buildlevel['f'.$i]-1; + $newLevels_fieldNames[] = "f".$i; + $newLevels_fieldValues[] = $leveldown; + + // building at level 0, remove it completely + if (!$leveldown > 0) { + $newLevels_fieldNames[] = "f".$i."t"; + $newLevels_fieldValues[] = 0; + } + }else{ + $newLevels_fieldNames[] = "f".$i; + $newLevels_fieldValues[] = 0; + + $newLevels_fieldNames[] = "f".$i."t"; + $newLevels_fieldValues[] = 0; + } + } + } + + if ($buildlevel['f99'] != 0) { + $leveldown = $buildlevel['f99'] - 1; + $newLevels_fieldNames[] = "f99"; + $newLevels_fieldValues[] = $leveldown; + } + } + + //destroy wall + $newLevels_fieldNames[] = "f40"; + $newLevels_fieldValues[] = 0; + + $newLevels_fieldNames[] = "f40t"; + $newLevels_fieldValues[] = 0; + + //clear expansion slot in the village which founded the conquered one + $database->clearExpansionSlot($data['to'], 1); + + $expArray = $database->getVillageFields($data['from'], 'exp1, exp2, exp3'); + $exp1 = $expArray['exp1']; + $exp2 = $expArray['exp2']; + $exp3 = $expArray['exp3']; + + if($exp1 == 0){ + $exp = 'exp1'; + $value = $data['to']; + }elseif($exp2 == 0){ + $exp = 'exp2'; + $value = $data['to']; + }else{ + $exp = 'exp3'; + $value = $data['to']; + } + + $database->setVillageField($data['from'], $exp, $value); + + //Remove oasis related to village + $units->returnTroops($data['to'], 1); + $chiefing_village = 1; + + //Remove trade routes related to village + $database->deleteTradeRoutesByVillage($data['to']); + + //Update data in the database + $database->setVillageLevel($data['to'], $newLevels_fieldNames, $newLevels_fieldValues); + + //Recount the population + $pop = $this->recountPop($data['to'], false); + + //Kill and reassign the hero to the capital village, if registered in the conquered one + $database->reassignHero($data['to']); + } + } + } + else $info_chief = "".$chief_pic.",You cant take over this village."; + } + else $info_chief = "".$chief_pic.",You cant take over this village."; + } + else $info_chief = "".$chief_pic.",Not enough culture points."; + unset($plevel); + } + else + $info_chief = "".$chief_pic.",Could not reduce cultural points during raid"; + } + + if(($data['t11'] - $dead11 - $traped11) > 0){ //hero + if ($heroxp == 0) { + $xp = ""; + $info_hero = $hero_pic.",Your hero had nothing to kill therefore gains no XP at all."; + } else { + $xp = " and gained ".$heroxp." XP from the battle."; + $info_hero = $hero_pic.",Your hero gained ".$heroxp." XP."; + } + + if ($isoasis != 0) { //oasis fix by ronix + if ($to['owner'] != $from['owner']) { + $troopcount = $database->countOasisTroops($data['to'], false); + $canqured = $database->canConquerOasis($data['from'], $data['to'], false); + if ($canqured == 1 && $troopcount == 0) { + $database->conquerOasis($data['from'], $data['to']); + $info_hero = $hero_pic.",Your hero has conquered this oasis".$xp; + }else{ + if ($canqured == 3 && $troopcount == 0) { + if ($type == 3) { + $Oloyaltybefore = intval($to['loyalty']); + //$database->modifyOasisLoyalty($data['to']); + //$OasisInfo = $database->getOasisInfo($data['to']); + $Oloyaltynow = intval($database->modifyOasisLoyalty($data['to']));//intval($OasisInfo['loyalty']); + $info_hero = $hero_pic.",Your hero has reduced oasis loyalty to ".$Oloyaltynow." from ".$Oloyaltybefore.$xp; + } + else $info_hero = $hero_pic.",Could not reduce loyalty during raid".$xp; + } + } + } + } else { + if ($heroxp == 0) $xp=" no XP from the battle."; + else $xp=" gained ".$heroxp." XP from the battle."; + + $artifact = reset($database->getOwnArtefactInfo($data['to'])); + if (!empty($artifact)) { + if ($type == 3) { + if (empty($artifactError = $database->canClaimArtifact($data['from'], $artifact['vref'], $artifact['size'], $artifact['type']))) { + $database->claimArtefact($data['from'], $data['to'], $database->getVillageField($data['from'], "owner")); + $info_hero = $hero_pic.",Your hero is carrying home the artifact ".$artifact['name']." and".$xp; + + // if the defender pop is 0 with no artefact, then destroy the village + if($database->getVillageField($data['to'], "pop") == 0 || $targettribe == 5){ + $can_destroy = $village_destroyed = 1; + $info_hero .= " The village has been destroyed."; + } + } + else $info_hero = $hero_pic.",".$artifactError.$xp; + } + else $info_hero = $hero_pic.",Your hero could not claim an artifact during raid".$xp; + } + } + }elseif($data['t11'] > 0) { + if ($heroxp == 0) $xp = ""; + else $xp = " but gained ".$heroxp." XP from the battle."; + + if ($traped11 > 0) $info_hero = $hero_pic.",Your hero was trapped".$xp; + else $info_hero = $hero_pic.",Your hero died".$xp; + } + + if ($DefenderID == 0) $natar = 0; + + if(!empty($scout)) { + if ($data['spy'] == 1){ + $info_spy = "".$spy_pic.",
\"Lumber\"".round($totwood)." | + \"Clay\"".round($totclay)." | + \"Iron\"".round($totiron)." | + \"Crop\"".round($totcrop)."
+
\"carry\"Total Resources: ".round($totwood+$totclay+$totiron+$totcrop)."
+ "; + }else if($data['spy'] == 2){ + if ($isoasis == 0){ + $walllevel = $database->getFieldLevelInVillage($data['to'], '31, 32, 33'); + $residencelevel = $database->getFieldLevelInVillage($data['to'], 25); + $palacelevel = $database->getFieldLevelInVillage($data['to'], 26); + $residenceimg = "\"Residence\""; + $palaceimg = "\"Palace\""; + $crannyimg = "\"Cranny\""; + $wallimg = "\"Wall\""; + $info_spy = "".$spy_pic.","; + if($residencelevel > 0) $info_spy .= $residenceimg." Residence level:".$residencelevel."
"; + elseif($palacelevel > 0) $info_spy .= $palaceimg." Palace level: ".$palacelevel."
"; + + if($walllevel > 0) $info_spy .= $wallimg." Wall level: ".$walllevel."
"; + $info_spy .= $crannyimg." Total crannies capacity: ".$crannySpy.""; + } + else $info_spy = "".$spy_pic.", There are no informations to show"; + } + + $data2 = ''.$from['owner'].','.$from['wref'].','.$owntribe.','.$unitssend_att.','.$unitsdead_att.',0,0,0,0,0,'.$to['owner'].','.$to['wref'].','.addslashes($to['name']).',,,,'.$targettribe.','.$unitssend_def[0].','.$unitsdead_def[0].','.$rom.','.$unitssend_def[1].','.$unitsdead_def[1].','.$ger.','.$unitssend_def[2].','.$unitsdead_def[2].','.$gal.','.$unitssend_def[3].','.$unitsdead_def[3].','.$nat.','.$unitssend_def[4].','.$unitsdead_def[4].','.$natar.','.$unitssend_def[5].','.$unitsdead_def[5].','.$DefenderHeroesTot.','.$DefenderHeroesDead.','.$info_ram.','.$info_cat.','.$info_chief.','.$info_spy.','.$data['t11'].','.$dead11.','.$herosend_def.','.$deadhero.',,'.$unitstraped_att; + }else{ + if(isset($village_destroyed) && $village_destroyed == 1 && $can_destroy==1){ + //check if village pop=0 and no info destroy + if (strpos($info_cat,"The village has") === false) { + $info_cat .= "Information + \"Catapult\" The village has been destroyed."; + } + } + $data2 = ''.$from['owner'].','.$from['wref'].','.$owntribe.','.$unitssend_att.','.$unitsdead_att.','.$steal[0].','.$steal[1].','.$steal[2].','.$steal[3].','.$battlepart['bounty'].','.$to['owner'].','.$to['wref'].','.addslashes($to['name']).',,,,'.$targettribe.','.$unitssend_def[0].','.$unitsdead_def[0].','.$rom.','.$unitssend_def[1].','.$unitsdead_def[1].','.$ger.','.$unitssend_def[2].','.$unitsdead_def[2].','.$gal.','.$unitssend_def[3].','.$unitsdead_def[3].','.$nat.','.$unitssend_def[4].','.$unitsdead_def[4].','.$natar.','.$unitssend_def[5].','.$unitsdead_def[5].','.$DefenderHeroesTot.','.$DefenderHeroesDead.','.$info_ram.','.$info_cat.','.$info_chief.','.(isset($info_spy) ? $info_spy : '').',,'.$data['t11'].','.$dead11.','.$herosend_def.','.$deadhero.','.$unitstraped_att; + } + + if($totalsend_att - ($totaldead_att + (isset($totaltraped_att) ? $totaltraped_att : 0)) <= 0){ + $info_troop = "None of your soldiers returned."; + } + else $info_troop = ""; + + //When all of the attacker's troops die, send no informations + $data_fail = ''.$from['owner'].','.$from['wref'].','.$owntribe.','.$unitssend_att.','.$unitsdead_att.','.$steal[0].','.$steal[1].','.$steal[2].','.$steal[3].','.$battlepart['bounty'].','.$to['owner'].','.$to['wref'].','.addslashes($to['name']).',,,,'.$targettribe.','.$unitssend_deff[0].','.$unitsdead_deff[0].','.$rom.','.$unitssend_deff[1].','.$unitsdead_deff[1].','.$ger.','.$unitssend_deff[2].','.$unitsdead_deff[2].','.$gal.','.$unitssend_deff[3].','.$unitsdead_deff[3].','.$nat.','.$unitssend_deff[4].','.$unitsdead_deff[4].','.$natar.','.$unitssend_deff[5].','.$unitsdead_deff[5].','.$DefenderHeroesTot.','.$DefenderHeroesDead.',,,'.$data['t11'].','.$dead11.','.$unitstraped_att.',,'.$info_ram.','.$info_cat.','.$info_chief.','.$info_troop.','.$info_hero; + + //Undetected and detected in here. + if(!empty($scout)){ + for($i = 1; $i <= 10; $i++){ + if($battlepart['casualties_attacker'][$i]){ + if($from['owner'] == 3){ + $database->addNotice($to['owner'],$to['wref'],$targetally,20,''.addslashes($from['name']).' scouts '.addslashes($to['name']).'',$data2,$AttackArrivalTime); + break; + }else if($unitsdead_att == $unitssend_att && $defspy){ //fix by ronix + $database->addNotice($to['owner'],$to['wref'],$targetally,20,''.addslashes($from['name']).' scouts '.addslashes($to['name']).'',$data2.',,'.$info_troop,$AttackArrivalTime); + break; + }else if($defspy){ //fix by ronix + $database->addNotice($to['owner'],$to['wref'],$targetally,21,''.addslashes($from['name']).' scouts '.addslashes($to['name']).'',$data2,$AttackArrivalTime); + break; + } + } + } + }else{ + if($type == 3 && $totalsend_att - ($totaldead_att + $totaltraped_att) > 0){ + $prisoners = $database->getPrisoners([$to['wref']], 0, false)[$to['wref'].'0']; + if(count($prisoners) > 0){ + $anothertroops = $mytroops = $ownDeads = $anotherDeads = 0; + $prisoners2delete = []; + $movementType = []; + $movementFrom = []; + $movementTo = []; + $movementRef = []; + $movementTime = []; + $movementEndtime = []; + $utime = microtime(true); + + foreach($prisoners as $prisoner) { + $p_owner = $database->getVillageField($prisoner['from'], "owner"); + + //If troops are coming from the same village, add it to the returing troops + if ($prisoner['from'] == $from['wref']) { + for($i = 1; $i <= 11; $i++){ + $deadPrisoners = round($prisoner['t'.$i] / 4); + $mytroops += $prisoner['t'.$i]; + $ownDeads += $deadPrisoners; + $prisoner['t'.$i] -= $deadPrisoners; + } + + $database->modifyAttack2( + $data['ref'], + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + [$prisoner['t1'], $prisoner['t2'], $prisoner['t3'], $prisoner['t4'], $prisoner['t5'], $prisoner['t6'], $prisoner['t7'], $prisoner['t8'], $prisoner['t9'], $prisoner['t10'], $prisoner['t11']] + ); + $prisoners2delete[] = $prisoner['id']; + } else { + $p_alliance = $database->getUserField($p_owner, "alliance",0); + $friendarray = $database->getAllianceAlly($p_alliance, 1); + $neutralarray = $database->getAllianceAlly($p_alliance, 2); + $friend = ($friendarray[0]['alli1'] > 0 && $friendarray[0]['alli2'] > 0 && $p_alliance > 0) && ($friendarray[0]['alli1'] == $ownally || $friendarray[0]['alli2'] == $ownally) && ($ownally != $p_alliance && $ownally && $p_alliance); + $neutral = ($neutralarray[0]['alli1'] > 0 && $neutralarray[0]['alli2'] > 0 && $p_alliance > 0) && ($neutralarray[0]['alli1'] == $ownally || $neutralarray[0]['alli2'] == $ownally) && ($ownally != $p_alliance && $ownally && $p_alliance); + + if($p_alliance == $ownally || $friend || $neutral){ + $p_tribe = $database->getUserField($p_owner, "tribe", 0); + + for($i = 1; $i <= 11; $i++){ + $deadPrisoners = round($prisoner['t'.$i] / 4); + if($p_owner == $from['owner']){ + $mytroops += $prisoner['t'.$i]; + $ownDeads += $deadPrisoners; + }else{ + $anothertroops += $prisoner['t'.$i]; + $anotherDeads += $deadPrisoners; + } + $prisoner['t'.$i] -= $deadPrisoners; + } + + $troopsTime = $units->getWalkingTroopsTime($prisoner['from'], $prisoner['wref'], $p_owner, $p_tribe, $prisoner, 1, 't'); + $p_time = $database->getArtifactsValueInfluence($p_owner, $prisoner['from'], 2, $troopsTime); + + $p_reference = $database->addAttack($prisoner['from'], $prisoner['t1'], $prisoner['t2'], $prisoner['t3'], $prisoner['t4'], $prisoner['t5'], $prisoner['t6'], $prisoner['t7'], $prisoner['t8'], $prisoner['t9'], $prisoner['t10'], $prisoner['t11'], 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + $movementType[] = 4; + $movementFrom[] = $prisoner['wref']; + $movementTo[] = $prisoner['from']; + $movementRef[] = $p_reference; + $movementTime[] = $utime; + $movementEndtime[] = $p_time + $utime; + $prisoners2delete[] = $prisoner['id']; + } + } + } + + if (count($movementType)) { + $database->addMovement($movementType, $movementFrom, $movementTo, $movementRef, $movementTime, $movementEndtime); + } + + $database->deletePrisoners($prisoners2delete); + + $ownDeadsText = ($ownAlive = $mytroops - $ownDeads) > 0 ? " of which ".$ownAlive." have been saved" : ""; + $anotherDeadsText = ($anotherAlive = $anothertroops - $anotherDeads) > 0 ? " of which ".$anotherAlive." have been saved" : ""; + + //Add dead troops to the "General attacks" tab + $database->addGeneralAttack($ownDeads + $anotherDeads); + + //Calculate new traps which have to be repaired + $newtraps = round(($mytroops + $anothertroops) / 3); + + //Reset traps + $database->modifyUnit($data['to'], ['99', '99o'], [$mytroops + $anothertroops, $mytroops + $anothertroops], [0, 0]); + + //Repair needed traps + if($newtraps > 0){ + $repairDuration = $database->getArtifactsValueInfluence($to['owner'], $to['wref'], 5, round(($bid19[max($this->getTypeLevel(36, $to['wref']), 1)]['attri'] / 100) * $u99['time'] / SPEED)); + $database->trainUnit($to['wref'], 99, $newtraps, $u99['pop'], $repairDuration, 0); + } + + $trapper_pic = "\"Trap\""; + $p_username = $database->getUserField($from['owner'], "username", 0); + + if($mytroops > 0 && $anothertroops > 0){ + $info_trap = "".$trapper_pic." ".$p_username." freed ".$mytroops." from his troops".$ownDeadsText." and ".$anothertroops." friendly troops".$anotherDeadsText."."; + }elseif($mytroops > 0){ + $info_trap = "".$trapper_pic." ".$p_username." freed ".$mytroops." from his troops".$ownDeadsText."."; + }elseif($anothertroops > 0){ + $info_trap = "".$trapper_pic." ".$p_username." freed ".$anothertroops." friendly troops".$anotherDeadsText."."; + } + } + } + + $data2 = $data2.','.(isset($info_trap) ? addslashes($info_trap) : '').',,'.$info_troop.','.$info_hero; + + if($totalsend_alldef == 0 && $totalsend_att - ($totaldead_att + (isset($totaltraped_att) ? $totaltraped_att : 0)) > 0){ + $database->addNotice($to['owner'],$to['wref'],$targetally,7,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'',$data2,$AttackArrivalTime); + }else if($totaldead_alldef == 0){ + $database->addNotice($to['owner'],$to['wref'],$targetally,4,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'',$data2,$AttackArrivalTime); + }else if($totalsend_alldef > $totaldead_alldef){ + $database->addNotice($to['owner'],$to['wref'],$targetally,5,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'',$data2,$AttackArrivalTime); + }else if($totalsend_alldef == $totaldead_alldef){ + $database->addNotice($to['owner'],$to['wref'],$targetally,6,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'',$data2,$AttackArrivalTime); + } + } + //to here + // If the dead units not equal the ammount sent they will return and report + if($totalsend_att - ($totaldead_att + (isset($totaltraped_att) ? $totaltraped_att : 0)) > 0) + { + $returningTroops = []; + for($i = 1; $i <= 11; $i++) $returningTroops['t'.$i] = $data['t'.$i] - ${'traped'.$i} - ${'dead'.$i}; + $troopsTime = $units->getWalkingTroopsTime($from['wref'], $to['wref'], $from['owner'], $owntribe, $returningTroops, 1, 't'); + $endtime = $database->getArtifactsValueInfluence($from['owner'], $from['wref'], 2, $troopsTime); + $endtime += $AttackArrivalTime; + if($type == 1){ + if($from['owner'] == 3){ // fix natar report by ronix + $database->addNotice($to['owner'], $to['wref'], $targetally, 20, '' . addslashes($from['name']) . ' scouts ' . addslashes($to['name']) . '', $data2, $AttackArrivalTime); + }elseif($totaldead_att == 0 && $totaltraped_att == 0){ + $database->addNotice($from['owner'], $to['wref'], $ownally, 18, '' . addslashes($from['name']) . ' scouts ' . addslashes($to['name']) . '', $data2, $AttackArrivalTime); + }else{ + $database->addNotice($from['owner'], $to['wref'], $ownally, 21, '' . addslashes($from['name']) . ' scouts ' . addslashes($to['name']) . '', $data2, $AttackArrivalTime); + } + }else{ + if((empty($totaldead_att) || $totaldead_att == 0) && (empty($totaltraped_att) || $totaltraped_att == 0)){ + $database->addNotice($from['owner'], $to['wref'], $ownally, 1, '' . addslashes($from['name']) . ' attacks ' . addslashes($to['name']) . '', $data2, $AttackArrivalTime); + }else{ + $database->addNotice($from['owner'], $to['wref'], $ownally, 2, '' . addslashes($from['name']) . ' attacks ' . addslashes($to['name']) . '', $data2, $AttackArrivalTime); + } + } + + $database->setMovementProc($data['moveid']); + + if (!isset($chiefing_village)) $chiefing_village = 0; + + if($chiefing_village != 1){ + $database->addMovement(4, $DefenderWref, $AttackerWref, $data['ref'], $AttackArrivalTime, $endtime, 1, $steal[0], $steal[1], $steal[2], $steal[3]); + if($type !== 1){ + if ($isoasis == 0) $database->modifyResource($DefenderWref, $steal[0], $steal[1], $steal[2], $steal[3], 0); + else + { + //if it's an oasis but it's conquered by someone, resources must be modified in the owner's village + if($conqureby > 0) $database->modifyResource($conqureby, $steal[0], $steal[1], $steal[2], $steal[3], 0); + else $database->modifyOasisResource($DefenderWref, $steal[0], $steal[1], $steal[2], $steal[3], 0); + } + $totalstolengain = $steal[0] + $steal[1] + $steal[2] + $steal[3]; + $totalstolentaken = ((isset($totalstolentaken) ? $totalstolentaken : 0) - ($steal[0] + $steal[1] + $steal[2] + $steal[3])); + $database->modifyPoints($from['owner'], 'RR', $totalstolengain); + $database->modifyPoints($to['owner'], 'RR', $totalstolentaken); + $database->modifyPointsAlly($targetally, 'RR', $totalstolentaken); + $database->modifyPointsAlly($ownally, 'RR', $totalstolengain); + } + }else{ //fix by ronix if only 1 chief left to conqured - don't add with zero enforces + if($totalsend_att - ($totaldead_att + (isset($totaltraped_att) ? $totaltraped_att : 0)) > 1){ + $database->addEnforce2($data, $owntribe, $troopsdead1, $troopsdead2, $troopsdead3, $troopsdead4, $troopsdead5, $troopsdead6, $troopsdead7, $troopsdead8, $troopsdead9, $troopsdead10, $troopsdead11); + } + } + } + else //else they die and don't return or report. + { + $database->setMovementProc($data['moveid']); + if($type == 1){ + $database->addNotice($from['owner'], $to['wref'], $ownally, 19, addslashes($from['name']) . ' scouts ' . addslashes($to['name']) . '', $data_fail, $AttackArrivalTime); + }else{ + $database->addNotice($from['owner'], $to['wref'], $ownally, 3, '' . addslashes($from['name']) . ' attacks ' . addslashes($to['name']) . '', $data_fail, $AttackArrivalTime); + } + } + if($type == 3 || $type == 4) $database->addGeneralAttack($totalattackdead); + + if (!isset($village_destroyed)) $village_destroyed = 0; + + if ($village_destroyed == 1 && $can_destroy == 1) + { + if($to['capital'] == 1){ + $mostPopulatedVillage = []; + //Search for the most populated village + foreach($varray as $village){ + if($village['wref'] != $data['to'] && (empty($mostPopulatedVillage) || $mostPopulatedVillage['pop'] < $village['pop'])){ + $mostPopulatedVillage = $village; + } + } + //Set the new capital + $database->changeCapital($mostPopulatedVillage['wref']); + } + + //Delete the village + $this->DelVillage($data['to']); + + //Reassign the hero, if dead and assigned to the deleted village + $database->reassignHero($data['to']); + } + }else{ + //units attack string for battleraport + $unitssend_att1 = ''.$data['t1'].','.$data['t2'].','.$data['t3'].','.$data['t4'].','.$data['t5'].','.$data['t6'].','.$data['t7'].','.$data['t8'].','.$data['t9'].','.$data['t10'].''; + $herosend_att = $data['t11']; + $unitssend_att= $unitssend_att1.','.$herosend_att; + + $troopsTime = $units->getWalkingTroopsTime($from['wref'], $to['wref'], $from['owner'], $owntribe, $data, 1, 't'); + $endtime = $database->getArtifactsValueInfluence($from['owner'], $from['wref'], 2, $troopsTime); + $endtime += $AttackArrivalTime; + + $database->setMovementProc($data['moveid']); + $database->addMovement(4, $to['wref'], $from['wref'], $data['ref'], $AttackArrivalTime, $endtime); + $peace = PEACE; + $data2 = $from['owner'].','.$from['wref'].','.$to['owner'].','.$owntribe.','.$unitssend_att.','.$peace; + $time = time(); + $database->addNotice($from['owner'], $to['wref'], $ownally, 22,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'', $data2, $time); + $database->addNotice($to['owner'], $to['wref'], $targetally, 23,''.addslashes($from['name']).' attacks '.addslashes($to['name']).'', $data2, $time); + } + + //Update starvation data + $this->addStarvationData($to['wref']); + + //Returning units back to village is not necessary because it will be taken care when processing movement + // Fix by AL-Kateb + // if evasion was active, return units back to base + /* + if (isset($evaded)) { + foreach ($evasionUnitModifications_modes as $index => $mode) { + $evasionUnitModifications_modes[$index] = 1; + } + + $database->modifyUnit($data['to'], $evasionUnitModifications_units, $evasionUnitModifications_amounts, $evasionUnitModifications_modes); + } + */ + + ################################################# + ################FIXED BY SONGER################ + ################################################# + + ################################################################################ + ##############ISUE: Lag, fixed3#################################################### + #### PHP.NET manual: unset() destroy more than one variable unset($foo1, $foo2, $foo3);###### + ################################################################################ + $data_num++; + + unset( + $Attacker + ,$Defender + ,$DefenderEnf + ,$DefenderHeroesTotArray + ,$DefenderHeroesDeadArray + ,$DefenderHeroesTot + ,$DefenderHeroesDead + ,$enforce + ,$unitssend_att + ,$unitssend_def + ,$battlepart + ,$unitlist + ,$unitsdead_def + ,$dead + ,$steal + ,$from + ,$data + ,$data2 + ,$to + ,$artifact + ,$artifactBig + ,$canclaim + ,$data_fail + ,$owntribe + ,$unitsdead_att + ,$herosend_def + ,$deadhero + ,$heroxp + ,$AttackerID + ,$DefenderID + ,$totalsend_att + ,$totalsend_alldef + ,$totaldead_att + ,$totaltraped_att + ,$totaldead_def + ,$unitsdead_att_check + ,$totalattackdead + ,$enforce1 + ,$defheroowner + ,$enforceowner + ,$defheroxp + ,$reinfheroxp + ,$AttackerWref + ,$DefenderWref + ,$troopsdead1 + ,$troopsdead2 + ,$troopsdead3 + ,$troopsdead4 + ,$troopsdead5 + ,$troopsdead6 + ,$troopsdead7 + ,$troopsdead8 + ,$troopsdead9 + ,$troopsdead10 + ,$troopsdead11 + ,$DefenderUnit + ,$info_trap); + + ################################################# + + } + } + } + + function DelVillage($wref){ + global $database, $units; + + $database->clearExpansionSlot($wref); + $wref = (int) $wref; + $q = "DELETE FROM ".TB_PREFIX."abdata where vref = $wref"; + $database->query($q); + $q = "DELETE FROM ".TB_PREFIX."bdata where wid = $wref"; + $database->query($q); + $q = "DELETE FROM ".TB_PREFIX."market where vref = $wref"; + $database->query($q); + $q = "DELETE FROM ".TB_PREFIX."research where vref = $wref"; + $database->query($q); + $q = "DELETE FROM ".TB_PREFIX."tdata where vref = $wref"; + $database->query($q); + $q = "DELETE FROM ".TB_PREFIX."fdata where vref = $wref"; + $database->query($q); + $q = "DELETE FROM ".TB_PREFIX."training where vref = $wref"; + $database->query($q); + $q = "DELETE FROM ".TB_PREFIX."units where vref = $wref"; + $database->query($q); + $q = "DELETE FROM ".TB_PREFIX."farmlist where wref = $wref"; + $database->query($q); + $q = "DELETE FROM ".TB_PREFIX."raidlist where towref = $wref"; + $database->query($q); + $q = "DELETE FROM ".TB_PREFIX."route where wid = $wref OR `from` = $wref"; + $database->query($q); + $q = "DELETE FROM ".TB_PREFIX."movement where proc = 0 AND ((`to` = $wref AND sort_type=4) OR (`from` = $wref AND sort_type=3))"; + $database->query($q); + $database->removeOases($wref, 1); + + $getmovement = $database->getMovement(3, $wref, 1); + + $moveIDs = []; + $time = microtime(true); + $types = []; + $froms = []; + $tos = []; + $refs = []; + $times = []; + $endtimes = []; + + foreach($getmovement as $movedata) { + $time2 = $time - $movedata['starttime']; + $moveIDs[] = $movedata['moveid']; + $types[] = 4; + $froms[] = $movedata['to']; + $tos[] = $movedata['from']; + $refs[] = $movedata['ref']; + $times[] = $time; + $endtimes[] = $time+$time2; + } + + $database->setMovementProc(implode(', ', $moveIDs)); + $database->addMovement($types, $froms, $tos, $refs, $times, $endtimes); + + $q = "DELETE FROM ".TB_PREFIX."enforcement WHERE `from` = $wref"; + $database->query($q); + + //check return enforcement from del village + $units->returnTroops($wref); + + $q = "DELETE FROM ".TB_PREFIX."vdata WHERE `wref` = $wref"; + $database->query($q); + + if (mysqli_affected_rows($database->dblink) > 0) { + $q = "UPDATE ".TB_PREFIX."wdata set occupied = 0 where id = $wref"; + $database->query($q); + + // clear expansion slots, if this village is an expansion of any other village + $database->clearExpansionSlot($wref, 1); + + $getprisoners = $database->getPrisoners($wref); + foreach($getprisoners as $pris) { + $troops = 0; + for($i = 1; $i < 12; $i++) $troops += $pris['t'.$i]; + $database->modifyUnit($pris['wref'], ["99o"], [$troops], [0]); + $database->deletePrisoners($pris['id']); + } + + $getprisoners = $database->getPrisoners3($wref); + foreach($getprisoners as $pris) { + $troops = 0; + for($i = 1;$i < 12; $i++) $troops += $pris['t'.$i]; + $database->modifyUnit($pris['wref'], ["99o"], [$troops], [0]); + $database->deletePrisoners($pris['id']); + } + } + } + + private function sendreinfunitsComplete() { + global $bid23, $database, $battle; + + $time = time(); + $q = " + SELECT + `to`, `from`, moveid, + t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 + FROM + ".TB_PREFIX."movement, + ".TB_PREFIX."attacks + WHERE + ".TB_PREFIX."movement.ref = ".TB_PREFIX."attacks.id + AND + ".TB_PREFIX."movement.proc = 0 + AND + ".TB_PREFIX."movement.sort_type = 3 + AND + ".TB_PREFIX."attacks.attack_type = 2 + AND + endtime < $time"; + $dataarray = $database->query_return($q); + + if ($dataarray && count($dataarray)) { + // preload village data + $vilIDs = []; + $tos = []; + $froms = []; + foreach($dataarray as $data) { + $vilIDs[$data['from']] = true; + $vilIDs[$data['to']] = true; + $tos[$data['to']] = true; + $froms[$data['from']] = true; + } + $vilIDs = array_keys($vilIDs); + $database->getProfileVillages($vilIDs, 5); + $database->getUnit($vilIDs); + $database->getEnforce(array_keys($tos), array_keys($froms)); + $database->getVillageByWorldID($vilIDs); + + // calculate reinforcements data + $movementProcIDs = []; + foreach($dataarray as $data) { + $isoasis = $database->isVillageOases($data['to']); + if($isoasis == 0){ + $to = $database->getMInfo($data['to']); + $toF = $database->getVillage($data['to']); + $DefenderID = $to['owner']; + $targettribe = $database->getUserField($DefenderID, "tribe", 0); + $conqureby = 0; + }else{ + $to = $database->getOMInfo($data['to']); + $toF = $database->getOasisV($data['to']); + $DefenderID = $to['owner']; + $targettribe = $database->getUserField($DefenderID, "tribe", 0); + $conqureby = $toF['conqured']; + } + + if($data['from'] == 0){ + $DefenderID = $database->getVillageField($data['to'], "owner"); + $database->addEnforce($data); + $reinf = $database->getEnforce($data['to'], $data['from']); + $database->modifyEnforce($reinf['id'], 31, 1, 1); + $data_fail = '0,0,4,1,0,0,0,0,0,0,0,0,0,0'; + $database->addNotice($to['owner'], $to['wref'], (isset($targetally) ? $targetally : 0), 8, 'village of the elders reinforcement ' . addslashes($to['name']), $data_fail, $AttackArrivalTime); + $movementProcIDs[] = $data['moveid']; + }else{ + //set base things + $from = $database->getMInfo($data['from']); + $fromF = $database->getVillage($data['from']); + $AttackerID = $from['owner']; + $owntribe = $database->getUserField($AttackerID,"tribe",0); + + $HeroTransfer = $troopsPresent = 0; + for($i = 1;$i <= 10; $i++) { + if($data['t'.$i] > 0) { + $troopsPresent = 1; + break; + } + } + + //check if the hero is present and we're not sending him to an occupied oasis + //only add hero if we're sending him alone + if($data['t11'] > 0 && !$isoasis && !$troopsPresent) { + //check if we're sending a hero between own villages + if($AttackerID == $DefenderID) { + //check if there's a Mansion at target village + if($this->getTypeLevel(37, $data['to']) > 0){ + //don't reinforce, addunit instead + $database->modifyUnit($data['to'], ["hero"], [1], [1]); + $heroid = $database->getHeroField($DefenderID, 'heroid'); + $database->modifyHero("wref", $data['to'], $heroid); + $HeroTransfer = 1; + } + } + } + + if($data['t11'] > 0 || $troopsPresent) { + $temphero = $data['t11']; + if ($HeroTransfer) $data['t11'] = 0; + //check if there is defence from town in to town + $check = $database->getEnforce($data['to'], $data['from']); + if (!isset($check['id'])) $database->addEnforce($data); + else + { + //yes + $start = ($owntribe - 1) * 10 + 1; + $end = ($owntribe * 10); + + //add unit. + $t_units = ''; + for($i = $start, $j = 1; $i <= $end; $i++, $j++) + { + $t_units .= "u".$i." = u".$i." + ".$data['t'.$j].(($j > 9) ? '' : ', '); + } + + $q = "UPDATE ".TB_PREFIX."enforcement set $t_units where id =".(int) $check['id']; + $database->query($q); + $database->modifyEnforce($check['id'], 'hero', $data['t11'], 1); + } + $data['t11'] = $temphero; + } + //send rapport + $unitssend_att = ''.$data['t1'].','.$data['t2'].','.$data['t3'].','.$data['t4'].','.$data['t5'].','.$data['t6'].','.$data['t7'].','.$data['t8'].','.$data['t9'].','.$data['t10'].','.$data['t11'].''; + $data_fail = ''.$from['wref'].','.$from['owner'].','.$owntribe.','.$unitssend_att.''; + + + if($isoasis == 0) $to_name = $to['name']; + else $to_name = "Oasis ".$database->getVillageField($to['conqured'],"name"); + + $database->addNotice($from['owner'],$from['wref'],(isset($ownally) ? $ownally : 0),8,''.addslashes($from['name']).' reinforcement '.addslashes($to_name).'',$data_fail,(isset($AttackArrivalTime) ? $AttackArrivalTime : time())); + if($from['owner'] != $to['owner']) { + $database->addNotice($to['owner'],$to['wref'],(isset($targetally) ? $targetally : 0),8,''.addslashes($from['name']).' reinforcement '.addslashes($to_name).'',$data_fail,(isset($AttackArrivalTime) ? $AttackArrivalTime : time())); + } + //update status + $movementProcIDs[] = $data['moveid']; + } + + //Update starvation data + $this->addStarvationData($data['to']); + + //check empty reinforcement in rally point + $e_units = ''; + for ($i = 1; $i <= 50; $i++) $e_units.= 'u'.$i.'= 0 AND '; + + $e_units.= 'hero = 0'; + $q = "DELETE FROM ".TB_PREFIX."enforcement WHERE ".$e_units." AND (vref=".(int) $data['to']." OR `from`=".(int) $data['to'].")"; + $database->query($q); + } + + $database->setMovementProc(implode(', ', $movementProcIDs)); + } + } + + private function returnunitsComplete() { + global $database; + + $time = time(); + $q = " + SELECT + `to`, `from`, moveid, starttime, endtime, wood, clay, iron, crop, + t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 + FROM + ".TB_PREFIX."movement, + ".TB_PREFIX."attacks + WHERE + ".TB_PREFIX."movement.ref = ".TB_PREFIX."attacks.id + AND + ".TB_PREFIX."movement.proc = 0 + AND + ".TB_PREFIX."movement.sort_type = 4 + AND + endtime < $time"; + $dataarray = $database->query_return($q); + + if ($dataarray && count($dataarray)) { + // preload village data + $vilIDs = []; + foreach($dataarray as $data) { + $vilIDs[$data['from']] = true; + $vilIDs[$data['to']] = true; + } + $database->getProfileVillages(array_keys($vilIDs), 5); + $database->getOasisEnforce($vilIDs, 0); + $database->getOasisEnforce($vilIDs, 1); + + $movementProcIDs = []; + foreach($dataarray as $data) { + $tribe = $database->getUserField($database->getVillageField($data['to'], "owner"), "tribe", 0); + $u = $tribe == 1 ? "" : $tribe - 1; + $database->modifyUnit( + $data['to'], + [$u."1", $u."2", $u."3", $u."4", $u."5", $u."6", $u."7", $u."8", $u."9", $tribe."0", "hero"], + [$data['t1'], $data['t2'], $data['t3'], $data['t4'], $data['t5'], $data['t6'], $data['t7'], $data['t8'], $data['t9'], $data['t10'], $data['t11']], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ); + + //If there's at least 1 resource, add it to the village + if($data['wood'] + $data['clay'] + $data['iron'] + $data['crop'] > 0){ + $database->modifyResource($data['to'], $data['wood'], $data['clay'], $data['iron'], $data['crop'], 1); + } + + $movementProcIDs[] = $data['moveid']; + + //Update starvation data + $this->addStarvationData($data['to']); + } + + $database->setMovementProc(implode(', ', $movementProcIDs)); + $this->pruneResource(); + } + + // Settlers + $q = "SELECT `to`, moveid FROM ".TB_PREFIX."movement where ref = 0 and proc = '0' and sort_type = '4' and endtime < $time"; + $dataarray = $database->query_return($q); + $movementProcIDs = []; + + if ($dataarray && count($dataarray)) { + foreach($dataarray as $data) { + $tribe = $database->getUserField($database->getVillageField($data['to'], "owner"), "tribe", 0); + $database->modifyUnit($data['to'], [$tribe."0"], [3], [1]); + + //If a settling is canceled, add 750 for each resource type + $database->modifyResource($data['to'], 750, 750, 750, 750, 1); + $movementProcIDs[] = $data['moveid']; + } + $database->setMovementProc(implode(', ', $movementProcIDs)); + } + } + + private function sendSettlersComplete() { + global $database; + + $time = microtime(true); + $q = "SELECT `to`, `from`, moveid, starttime, ref FROM ".TB_PREFIX."movement where proc = 0 and sort_type = 5 and endtime < $time"; + + $dataarray = $database->query_return($q); + $movementProcIDs = []; + $fieldIDs = []; + $addUnitsWrefs = []; + $addTechWrefs = []; + $addABTechWrefs = []; + $time = microtime(true); + $types = []; + $froms = []; + $tos = []; + $refs = []; + $times = []; + $endtimes = []; + + // preload village data + $vilIDs = []; + foreach($dataarray as $data) { + $vilIDs[$data['from']] = true; + $vilIDs[$data['to']] = true; + } + $vilIDs = array_keys($vilIDs); + $database->getProfileVillages($vilIDs, 5); + $database->getVillageByWorldID($vilIDs); + + foreach($dataarray as $data) { + $ownerID = $database->getUserField($database->getVillageField($data['from'], "owner"), "id", 0); + $to = $database->getMInfo($data['from']); + $user = addslashes($database->getUserField($to['owner'], 'username', 0)); + $taken = $database->getVillageState($data['to']); + if($taken != 1){ + $fieldIDs[] = $data['to']; + $database->addVillage($data['to'], $to['owner'], $user, '0'); + $database->addResourceFields($data['to'], $database->getVillageType($data['to'])); + $addUnitsWrefs[] = $data['to']; + $addTechWrefs[] = $data['to']; + $addABTechWrefs[] = $data['to']; + $movementProcIDs[] = $data['moveid']; + + $exp1 = $database->getVillageField($data['from'], 'exp1'); + $exp2 = $database->getVillageField($data['from'], 'exp2'); + $exp3 = $database->getVillageField($data['from'], 'exp3'); + + if($exp1 == 0){ + $exp = 'exp1'; + $value = $data['to']; + }elseif($exp2 == 0){ + $exp = 'exp2'; + $value = $data['to']; + }else{ + $exp = 'exp3'; + $value = $data['to']; + } + + $database->setVillageField($data['from'], $exp, $value); + }else{ + // here must come movement from returning settlers + $types[] = 4; + $froms[] = $data['to']; + $tos[] = $data['from']; + $refs[] = $data['ref']; + $times[] = $time; + $endtimes[] = $time + ($time - $data['starttime']); + $movementProcIDs[] = $data['moveid']; + } + } + + $database->addMovement($types, $froms, $tos, $refs, $times, $endtimes); + $database->setMovementProc(implode(', ', $movementProcIDs)); + $database->setFieldTaken($fieldIDs); + $database->addUnits($addUnitsWrefs); + $database->addTech($addTechWrefs); + $database->addABTech($addABTechWrefs); + + } + + /** + * Create the Natars account and spawn artifacts + * + */ + + private function spawnNatars(){ + global $database; + + //Check if Natars account is already created and if the time + //is come and we have to create Natars and spawn their artifacts + if($database->areArtifactsSpawned() || strtotime(START_DATE) + (NATARS_SPAWN_TIME * 86400) > time()) return; + + //Create the Natars account and his capital + $database->createNatars(); + + //Artifacts constants + $artifactArrays = [ARCHITECTS_DESC => [["type" => 1, "size" => 1, "name" => ARCHITECTS_SMALL, "vname" => ARCHITECTS_SMALLVILLAGE, "effect" => "(4x)", "quantity" => 6, "img" => 2], + ["type" => 1, "size" => 2, "name" => ARCHITECTS_LARGE, "vname" => ARCHITECTS_LARGEVILLAGE, "effect" => "(3x)", "quantity" => 4, "img" => 2], + ["type" => 1, "size" => 3, "name" => ARCHITECTS_UNIQUE,"vname" => ARCHITECTS_UNIQUEVILLAGE, "effect" => "(5x)", "quantity" => 1, "img" => 2]], + + HASTE_DESC => [["type" => 2, "size" => 1, "name" => HASTE_SMALL, "vname" => HASTE_SMALLVILLAGE, "effect" => "(2x)", "quantity" => 6, "img" => 4], + ["type" => 2, "size" => 2, "name" => HASTE_LARGE, "vname" => HASTE_LARGEVILLAGE, "effect" => "(1.5x)", "quantity" => 4, "img" => 4], + ["type" => 2, "size" => 3, "name" => HASTE_UNIQUE, "vname" => HASTE_UNIQUEVILLAGE, "effect" => "(3x)", "quantity" => 1, "img" => 4]], + + EYESIGHT_DESC => [["type" => 3, "size" => 1, "name" => EYESIGHT_SMALL, "vname" => EYESIGHT_SMALLVILLAGE, "effect" => "(5x)", "quantity" => 6, "img" => 5], + ["type" => 3, "size" => 2, "name" => EYESIGHT_LARGE, "vname" => EYESIGHT_LARGEVILLAGE, "effect" => "(3x)", "quantity" => 4, "img" => 5], + ["type" => 3, "size" => 3, "name" => EYESIGHT_UNIQUE, "vname" => EYESIGHT_UNIQUEVILLAGE, "effect" => "(10x)", "quantity" => 1, "img" => 5]], + + DIET_DESC => [["type" => 4, "size" => 1, "name" => DIET_SMALL, "vname" => DIET_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 6], + ["type" => 4, "size" => 2, "name" => DIET_LARGE, "vname" => DIET_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 6], + ["type" => 4, "size" => 3, "name" => DIET_UNIQUE, "vname" => DIET_UNIQUEVILLAGE, "effect" => "(50%)", "quantity" => 1, "img" => 6]], + + ACADEMIC_DESC => [["type" => 5, "size" => 1, "name" => ACADEMIC_SMALL, "vname" => ACADEMIC_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 8], + ["type" => 5, "size" => 2, "name" => ACADEMIC_LARGE, "vname" => ACADEMIC_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 8], + ["type" => 5, "size" => 3, "name" => ACADEMIC_UNIQUE, "vname" => ACADEMIC_UNIQUEVILLAGE, "effect" => "(50%)", "quantity" => 1, "img" => 8]], + + STORAGE_DESC => [["type" => 6, "size" => 1, "name" => STORAGE_SMALL, "vname" => STORAGE_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 9], + ["type" => 6, "size" => 2, "name" => STORAGE_LARGE, "vname" => STORAGE_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 9]], + + CONFUSION_DESC => [["type" => 7, "size" => 1, "name" => CONFUSION_SMALL, "vname" => CONFUSION_SMALLVILLAGE, "effect" => "(200)", "quantity" => 6, "img" => 10], + ["type" => 7, "size" => 2, "name" => CONFUSION_LARGE, "vname" => CONFUSION_LARGEVILLAGE, "effect" => "(100)", "quantity" => 4, "img" => 10], + ["type" => 7, "size" => 3, "name" => CONFUSION_UNIQUE, "vname" => CONFUSION_UNIQUEVILLAGE, "effect" => "(500)", "quantity" => 1, "img" => 10]], + + FOOL_DESC => [["type" => 8, "size" => 1, "name" => FOOL_SMALL, "vname" => FOOL_SMALLVILLAGE, "effect" => "", "quantity" => 10, "img" => "fool"], + ["type" => 8, "size" => 3, "name" => FOOL_UNIQUE, "vname" => FOOL_UNIQUEVILLAGE, "effect" => "", "quantity" => 1, "img" => "fool"]]]; + + //Add artifacts and their villages + $database->addArtifactVillages($artifactArrays); + + //Write the system message + $database->displaySystemMessage(ARTEFACT); + } + + /** + * Spawn WW Villages + * + */ + + private function spawnWWVillages(){ + global $database; + + //Check if Natars account has already been created, if WW villages have already been spawned + //and if it's the time to spawn them or not + if(!$database->areArtifactsSpawned() || $database->areWWVillagesSpawned() || strtotime(START_DATE) + (NATARS_WW_SPAWN_TIME * 86400) > time()) return; + + //WW village Natars' troops + $unitArrays = [41 => rand(500, 12000) * NATARS_UNITS, + 42 => rand(1000 , 14000) * NATARS_UNITS, + 43 => rand(2000, 16000) * NATARS_UNITS, + 44 => rand(100, 500) * NATARS_UNITS, + 45 => rand(480, 17000) * NATARS_UNITS, + 46 => rand(600, 18000) * NATARS_UNITS, + 47 => rand(2000, 16000) * NATARS_UNITS, + 48 => rand(400, 2000) * NATARS_UNITS, + 49 => rand(40, 200) * NATARS_UNITS, + 50 => rand(50, 250) * NATARS_UNITS]; + + //WW village buildings + $buildingArrays = [ + //WW of the 0th level, Main Building of the 10th level, Marketplace of the 1th level, Delete Main Building of the 1th level + "f99t" => 40, "f99" => 0, "f22t" => 15, "f22" => 10, "f34t" => 17, "f34" => 1, "f26t" => 0, "f26" => 0, + //Warehouse of the 20th & 10th level, Granary of the 20th & 10th level + "f20t" => 10, "f20" => 20, "f19t" => 10, "f19" => 10, "f23t" => 11, "f23" => 20, "f27t" => 11, "f27" => 10, + //All Woodcutter of the 5th level + "f1t" => 1, "f1" => 5, "f3t" => 1, "f3" => 5, "f14t" => 1, "f14" => 5, "f17t" => 1, "f17" => 5, + //All Clay Pit of the 5th level + "f5t" => 2, "f5" => 5, "f6t" => 2, "f6" => 5, "f16t" => 2, "f16" => 5, "f18t" => 2, "f18" => 5, + //All Iron Mine of the 5th level + "f4t" => 3, "f4" => 5, "f7t" => 3, "f7" => 5, "f10t" => 3, "f10" => 5, "f11t" => 3, "f11" => 5, + //All Cropland of the 6th level + "f2t" => 4, "f2" => 6, "f8t" => 4, "f8" => 6, "f9t" => 4, "f9" => 6, "f12t" => 4, "f12" => 6, "f13t" => 4, "f13" => 6, "f15t" => 4, "f15" => 6]; + + $villageArrays = $wids = []; + for($i = 1; $i <= 13; $i++) $villageArrays[] = ['wid' => 0, 'kid' => ($i == 13 ? rand(1, 4) : ($i % 4) + 1), 'capital' => 0]; + + $wids = $database->generateVillages($villageArrays, 3, "Natars"); + + foreach($wids as $wid){ + $database->modifyUnit($wid, array_keys($unitArrays), array_values($unitArrays), [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]); + $database->setVillageLevel($wid, array_keys($buildingArrays), array_values($buildingArrays)); + $database->setVillageFields($wid, ['natar', 'pop', 'name'], [1, 233, WWVILLAGE]); + // $this->recountPop($wid); //it is necessary to comment out otherwise the population will be 198 + } + + //Write the system message + $database->displaySystemMessage(WWVILLAGEMSG); + } + + /** + * Spawn WW Building plans + * + */ + + private function spawnWWBuildingPlans(){ + global $database; + + //Check if Natars account is already spawned, if WW building plans have already been spawned + //and if it's the time to spawn them or not + if(!$database->areArtifactsSpawned() || $database->areArtifactsSpawned(true) || strtotime(START_DATE) + (NATARS_WW_BUILDING_PLAN_SPAWN_TIME * 86400) > time()) return; + + $artifactArrays = [PLAN_DESC => [["type" => 11, "size" => 1, "name" => PLAN,"vname" => PLANVILLAGE, "effect" => "", "quantity" => 13, "img" => 1]]]; + + //Add the artifacts and villages + $database->addArtifactVillages($artifactArrays); + + //Set the system message to contain the infos of the WW building plans + $database->displaySystemMessage(PLAN_INFO); + } + + /** + * Automatically activate all artifacts that need to be activated + * + */ + + private function activateArtifacts() { + global $database; + + //Check if there's at least one artifact, if not, return + if(!$database->areArtifactsSpawned()) return; + + //Get all inactive artifacts that have to be activated --> (24 hours / Speed of the server) + $time = time(); + $artifacts = $database->getInactiveArtifacts(round($time - (86400 / (SPEED == 2 ? 1.5 : (SPEED == 3 ? 2 : SPEED))))); + + if(!empty($artifacts)){ + + //Cache inactive artifacts by owner + $inactiveArtifactsCache = []; + foreach($artifacts as $artifact) $inactiveArtifactsCache[$artifact['owner']][] = $artifact; + + foreach($inactiveArtifactsCache as $owner => $inactiveArtifacts){ + + //Initialize the array + $activeArtifacts = []; + + //Get cached active artifacts + $ownArtifacts = $database->getOwnArtifactsSum($owner, true); + + //Activate activable artifacts + foreach($inactiveArtifacts as $artifact){ + if($ownArtifacts['totals'] < 3){ + if($artifact['size'] == 1){ //Village effect + $database->activateArtifact($artifact['id']); + $ownArtifacts['totals']++; + $ownArtifacts['small']++; + }elseif($artifact['size'] == 2 && !$ownArtifacts['unique'] && !$ownArtifacts['great']){ //Account effect + $database->activateArtifact($artifact['id']); + $ownArtifacts['totals']++; + $ownArtifacts['great']++; + }elseif($artifact['size'] == 3 && !$ownArtifacts['unique'] && !$ownArtifacts['great']){ //Unique effect + $database->activateArtifact($artifact['id']); + $ownArtifacts['totals']++; + $ownArtifacts['unique']++; + } + }elseif($ownArtifacts['small'] == 3 && $artifact['size'] > 1){ + //If we've 3 village effect artifacts activated and at least one account/unique effect not activated + //then we need to deactivate the most recent village effect artifact and activate the oldest account + //or unique effect artifact + + //Deactivate the most recent village effect artifact + $database->activateArtifact($database->getNewestArtifactBySize($owner, 1)['id'], 0); + + //Activate the great/unique artifact + $database->activateArtifact($artifact['id']); + + $ownArtifacts['small']--; + $ownArtifacts['totals']++; + if($artifact['size'] == 2) $ownArtifacts['great']++; + else $ownArtifacts['unique']++; + } + } + } + } + } + + private function researchComplete() { + global $database; + + $time = time(); + $deleteIDs = []; + $tdata = []; + $abdata = []; + + $q = "SELECT tech, vref, id FROM ".TB_PREFIX."research where timestamp < $time"; + $dataarray = $database->query_return($q); + + foreach($dataarray as $data) { + $sort_type = substr($data['tech'],0,1); + switch($sort_type) { + case "t": + if (!isset($tdata[$data['vref']])) $tdata[$data['vref']] = []; + $tdata[$data['vref']][] = $data['tech'].' = 1'; + break; + case "a": + case "b": + if (!isset($abdata[$data['vref']])) $abdata[$data['vref']] = []; + $abdata[$data['vref']][] = $data['tech']." = ".$data['tech']." + 1"; + break; + } + $deleteIDs[] = (int) $data['id']; + } + + // execute queries with consolidated research data + if (count($tdata)) { + foreach ( $tdata as $vid => $preparedData ) { + $q = "UPDATE ".TB_PREFIX."tdata SET ".implode(', ', $preparedData)." WHERE vref = ".$vid; + $database->query($q); + } + } + + if (count($abdata)) { + foreach ( $abdata as $vid => $preparedData ) { + $q = "UPDATE ".TB_PREFIX."abdata SET ".implode(', ', $preparedData)." WHERE vref = ".$vid; + $database->query($q); + } + } + + if (count($deleteIDs)) { + $q = "DELETE FROM " . TB_PREFIX . "research where id IN(" . implode( ', ', $deleteIDs ) . ")"; + $database->query( $q ); + } + } + + private function updateORes($bountywid) { + global $database; + + $oasisInfoArray = $database->getOasisV($bountywid); + $timepast = time() - $oasisInfoArray['lastupdated']; + $nwood = (OASIS_WOOD_PRODUCTION / 3600) * $timepast; + $nclay = (OASIS_CLAY_PRODUCTION / 3600) * $timepast; + $niron = (OASIS_IRON_PRODUCTION / 3600) * $timepast; + $ncrop = (OASIS_CROP_PRODUCTION / 3600) * $timepast; + $database->modifyOasisResource($bountywid, $nwood, $nclay, $niron, $ncrop, 1); + $database->updateOasis($bountywid); + } + + private function updateRes($bountywid) { + global $database, $technology; + + //Get village infos + $villageInfoArray = $database->getVillage($bountywid); + + //Get building and resource fields array + $resArray = $database->getResourceLevel($bountywid, false); + + //Get oasis array + $oasisArray = $database->getOasis($bountywid); + + //Get an array with the numbers of the oasis + $numberOfOasis = $this->bountysortOasis($oasisArray); + + //Set the village population (if WW Villages, it's halved) + $villagePopulation = !$villageInfoArray['natar'] ? $villageInfoArray['pop'] : round($villageInfoArray['pop'] / 2); + + //Get the upkeep of the village + $upkeep = $technology->getUpkeep($this->getAllUnits($bountywid), 0, $bountywid); + + //Calculate the produced resources + $timepast = time() - $villageInfoArray['lastupdate']; + $nwood = ($this->bountyGetWoodProd($resArray, $numberOfOasis) / 3600) * $timepast; + $nclay = ($this->bountyGetClayProd($resArray, $numberOfOasis) / 3600) * $timepast; + $niron = ($this->bountyGetIronProd($resArray, $numberOfOasis) / 3600) * $timepast; + $ncrop = (($this->bountyGetCropProd($resArray, $numberOfOasis) - $villagePopulation - $upkeep) / 3600) * $timepast; + $database->modifyResource($bountywid, $nwood, $nclay, $niron, $ncrop, 1); + $database->updateVillage($bountywid); + } + + private function bountysortOasis($oasisArray) { + $crop = $clay = $wood = $iron = 0; + foreach ($oasisArray as $oasis) { + switch($oasis['type']) { + case 1: + case 2: + $wood++; + break; + case 3: + $wood++; + $crop++; + break; + case 4: + case 5: + $clay++; + break; + case 6: + $clay++; + $crop++; + break; + case 7: + case 8: + $iron++; + break; + case 9: + $iron++; + $crop++; + break; + case 10: + case 11: + $crop++; + break; + case 12: + $crop += 2; + break; + } + } + return [$wood, $clay, $iron, $crop]; + } + + function getAllUnits($base, $use_cache = true) { + global $database; + + $ownunit = $database->getUnit($base, $use_cache); + $enforcementarray = $database->getEnforceVillage($base, 0); + + if(count($enforcementarray) > 0){ + foreach($enforcementarray as $enforce){ + for($i = 1; $i <= 50; $i++){ + $ownunit['u'.$i] += $enforce['u'.$i]; + } + } + } + + $enforceoasis = $database->getOasisEnforce($base, 0, $use_cache); + if(count($enforceoasis) > 0){ + foreach($enforceoasis as $enforce){ + for($i = 1; $i <= 50; $i++){ + $ownunit['u'.$i] += $enforce['u'.$i]; + } + } + } + + $enforceoasis1 = $database->getOasisEnforce($base, 1, $use_cache); + if(count($enforceoasis1) > 0){ + foreach($enforceoasis1 as $enforce){ + for($i = 1; $i <= 50; $i++){ + $ownunit['u'.$i] += $enforce['u'.$i]; + } + } + } + + $movement = $database->getVillageMovement($base); + if(!empty($movement)){ + for($i = 1; $i <= 50; $i++){ + if(!isset($ownunit['u' . $i])){ + $ownunit['u'.$i] = 0; + } + + $ownunit['u'.$i] += (isset($movement['u'.$i]) ? $movement['u'.$i] : 0); + } + } + + $prisoners = $database->getPrisoners($base, 1); + if(!empty($prisoners)){ + foreach($prisoners as $prisoner){ + $owner = $database->getVillageField($base, "owner"); + $ownertribe = $database->getUserField($owner, "tribe", 0); + $start = ($ownertribe - 1) * 10 + 1; + $end = ($ownertribe * 10); + for($i = $start; $i <= $end; $i++){ + $j = $i - $start + 1; + $ownunit['u'.$i] += $prisoner['t'.$j]; + } + $ownunit['hero'] += $prisoner['t11']; + } + } + return $ownunit; + } + + private function bountyGetWoodProd($resArray, $oasisNumber) { + global $bid1, $bid5; + + $wood = $sawmill = 0; + $woodholder = []; + for($i = 1; $i <= 38; $i++) { + if($resArray['f'.$i.'t'] == 1) array_push($woodholder,'f'.$i); + if($resArray['f'.$i.'t'] == 5) $sawmill = $resArray['f'.$i]; + } + + for($i = 0; $i <= count($woodholder) - 1; $i++) $wood += $bid1[$resArray[$woodholder[$i]]]['prod']; + + if($sawmill >= 1) $wood += $wood / 100 * $bid5[$sawmill]['attri']; + if($oasisNumber[0] > 0) $wood += $wood * 0.25 * $oasisNumber[0]; + + return round($wood * SPEED); + } + + private function bountyGetClayProd($resArray, $oasisNumber) { + global $bid2, $bid6; + + $clay = $brick = 0; + $clayholder = []; + for($i = 1; $i <= 38; $i++) { + if($resArray['f'.$i.'t'] == 2) array_push($clayholder, 'f'.$i); + if($resArray['f'.$i.'t'] == 6) $brick = $resArray['f'.$i]; + } + + for($i = 0; $i <= count($clayholder) - 1; $i++) $clay += $bid2[$resArray[$clayholder[$i]]]['prod']; + + if($brick >= 1) $clay += $clay / 100 * $bid6[$brick]['attri']; + if($oasisNumber[1] > 0) $clay += $clay * 0.25 * $oasisNumber[1]; + + return round($clay * SPEED); + } + + private function bountyGetIronProd($resArray, $oasisNumber) { + global $bid3, $bid7; + + $iron = $foundry = 0; + $ironholder = []; + for($i = 1; $i <= 38; $i++) { + if($resArray['f'.$i.'t'] == 3) array_push($ironholder, 'f'.$i); + if($resArray['f'.$i.'t'] == 7) $foundry = $resArray['f'.$i]; + } + + for($i = 0; $i <= count($ironholder) - 1; $i++) $iron += $bid3[$resArray[$ironholder[$i]]]['prod']; + + if($foundry >= 1) $iron += $iron / 100 * $bid7[$foundry]['attri']; + if($oasisNumber[2] > 0) $iron += $iron * 0.25 * $oasisNumber[2]; + + return round($iron * SPEED); + } + + private function bountyGetCropProd($resArray, $oasisNumber) { + global $bid4, $bid8, $bid9, $database; + + $crop = $grainmill = $bakery = 0; + $cropholder = []; + for($i = 1; $i <= 38;$i++) { + if($resArray['f'.$i.'t'] == 4) array_push($cropholder, 'f'.$i); + if($resArray['f'.$i.'t'] == 8) $grainmill = $resArray['f'.$i]; + if($resArray['f'.$i.'t'] == 9) $bakery = $resArray['f'.$i]; + } + for($i = 0; $i <= count($cropholder) - 1; $i++) $crop += $bid4[$resArray[$cropholder[$i]]]['prod']; + + if($grainmill >= 1) $crop += $crop / 100 * (isset($bid8[$grainmill]['attri']) ? $bid8[$grainmill]['attri'] : 0); + if($bakery >= 1) $crop += $crop / 100 * (isset($bid9[$bakery]['attri']) ? $bid9[$bakery]['attri'] : 0); + if($oasisNumber[3] > 0) $crop += $crop * 0.25 * $oasisNumber[3]; + + if(!empty($resArray['vref']) && is_numeric($resArray['vref'])){ + $who = $database->getVillageField($resArray['vref'], "owner"); + $croptrue = $database->getUserField($who, "b4", 0); + if($croptrue > time()) $crop *= 1.25; + } + + return round($crop * SPEED); + } + + private function trainingComplete() { + global $database; + + $time = time(); + $trainlist = $database->getTrainingList(); + if(count($trainlist) > 0){ + // preload village data + $vilIDs = []; + foreach($trainlist as $train){ + $vilIDs[$train['vref']] = true; + } + $vilIDs = array_keys($vilIDs); + $database->getProfileVillages($vilIDs, 5); + $database->cacheResourceLevels($vilIDs); + $database->getUnit($vilIDs); + $database->getEnforceVillage($vilIDs, 0 ); + $database->getMovement(3, $vilIDs, 0); + $database->getMovement(4, $vilIDs, 1); + $database->getMovement(5, $vilIDs, 0); + $database->getOasisEnforce($vilIDs, 0); + $database->getOasisEnforce($vilIDs, 1); + $database->getPrisoners($vilIDs, 1); + + // calculate training updates + foreach($trainlist as $train){ + $timepast = $train['timestamp2'] - $time; + $pop = $train['pop']; + $valuesUpdated = false; + if($timepast <= 0 && $train['amt'] > 0) { + $valuesUpdated = true; + if($train['eachtime'] > 0){ + $timepast2 = $time - $train['timestamp2']; + $trained = 1; + while($timepast2 >= $train['eachtime']){ + $timepast2 -= $train['eachtime']; + $trained += 1; + } + + if($trained > $train['amt']) $trained = $train['amt']; + } + else $trained = $train['amt']; + + if($train['unit'] > 60 && $train['unit'] != 99){ + $database->modifyUnit($train['vref'], [$train['unit'] - 60], [$trained], [1]); + } + else $database->modifyUnit($train['vref'], [$train['unit']], [$trained], [1]); + + $database->updateTraining($train['id'], $trained, $trained * $train['eachtime']); + + if($train['amt'] - $trained <= 0) $database->trainUnit($train['id'], 0, 0, 0, 0, 1); + } + + if ($valuesUpdated) call_user_func(get_class($database).'::clearUnitsCache'); + + //Update starvation data + $this->addStarvationData($train['vref']); + } + } + } + + private function getsort_typeLevel($tid, $resarray) { + $keyholder = []; + + foreach(array_keys($resarray, $tid) as $key) { + if(strpos($key, 't')) { + $key = preg_replace("/[^0-9]/", '', $key); + array_push($keyholder, $key); + } + } + + $element = count($keyholder); + if($element >= 2) { + if($tid <= 4) { + $temparray = []; + + for($i = 0; $i <= $element - 1; $i++) { + array_push($temparray, $resarray['f'.$keyholder[$i]]); + } + + foreach ($temparray as $key => $val) { + if ($val == max($temparray)) $target = $key; + } + } + } + else if($element == 1) $target = 0; + else return 0; + + if(!empty($keyholder[$target])) return $resarray['f'.$keyholder[$target]]; + else return 0; + } + + private function celebrationComplete() { + global $database; + + $varray = $database->getCel(); + foreach($varray as $vil){ + $id = $vil['wref']; + $type = $vil['type']; + $user = $vil['owner']; + $cp = ($type == 1) ? 500 : 2000; + $database->clearCel($id); + $database->setCelCp($user, $cp); + } + } + + private function demolitionComplete() { + global $database; + + $varray = $database->getDemolition(); + foreach($varray as $vil) { + if ($vil['timetofinish'] <= time()) { + $type = $database->getFieldType($vil['vref'],$vil['buildnumber']); + $level = $database->getFieldLevel($vil['vref'],$vil['buildnumber']); + + if ($level < 0) $level = 0; + + $buildarray = $GLOBALS["bid".$type]; + + if ($type == 10 || $type == 38) { + $database->query(" + UPDATE ".TB_PREFIX."vdata + SET + `maxstore` = IF(`maxstore` - ".$buildarray[$level]['attri']." <= ".STORAGE_BASE.", ".STORAGE_BASE.", `maxstore` - ".$buildarray[$level]['attri']."), + WHERE + wref=".(int) $vil['vref']); + } + + if ($type == 11 || $type == 39) { + $database->query(" + UPDATE ".TB_PREFIX."vdata + SET + `maxcrop` = IF(`maxcrop` - ".$buildarray[$level]['attri']." <= ".STORAGE_BASE.", ".STORAGE_BASE.", `maxcrop` - ".$buildarray[$level]['attri']."), + WHERE + wref=".(int) $vil['vref']); + } + + if ($level == 1) $clear = ",f".$vil['buildnumber']."t=0"; + else $clear = ""; + + if ($database->getVillageField($vil['vref'], 'natar') == 1 && $type == 40) $clear = ""; //fix by ronix - fixed by iopietro + + $q = "UPDATE ".TB_PREFIX."fdata SET f".$vil['buildnumber']."=".(($level - 1 >= 0) ? $level - 1 : 0).$clear." WHERE vref=".(int) $vil['vref']; + $database->query($q); + + $pop = $this->getPop($type, $level - 1); + $database->modifyPop($vil['vref'], $pop[0], 1); + $this->procClimbers($database->getVillageField($vil['vref'], 'owner')); + $database->delDemolition($vil['vref'], true); + + if ($type == 18) Automation::updateMax($database->getVillageField($vil['vref'], 'owner')); + } + } + + } + + private function updateHero() { + global $database, $hero_levels; + + $harray = $database->getHero(); + if(!empty($harray)){ + // first of all, prepare all unit data at once for these heroes + $heroVillageIDs = []; + foreach($harray as $hdata) { + $heroVillageIDs[] = $hdata['wref']; + } + + // load data for those prepared IDs + $unitData = $database->getUnit($heroVillageIDs); + + // now do the math + $lastUpdateIDs = []; + $timeNow = time(); + foreach($harray as $hdata){ + $columns = []; + $columnValues = []; + $modes = []; + $lastUpdateTime = $timeNow; + $newHealth = -1; + + if((time()-$hdata['lastupdate']) >= 1){ + if($hdata['health'] < 100 and $hdata['health'] > 0){ + if(SPEED <= 10) $speed = SPEED; + else if(SPEED <= 100) $speed = ceil(SPEED / 10); + else $speed = ceil(SPEED / 100); + + $reg = $hdata['health'] + $hdata['regeneration'] * 5 * $speed / 86400 * (time() - $hdata['lastupdate']); + + if($reg <= 100) $newHealth = $reg; + else $newHealth = 100; + } + } + + $herolevel = $hdata['level']; + $newLevel = - 1; + $scorePoints = false; + for ($i = $herolevel + 1; $i < 100; $i++){ + if($hdata['experience'] >= $hero_levels[$i]){ + $newLevel = $i; + if ($i < 99) $scorePoints = true; + } + } + + // upgrade hero to a new level, if needed + if ($newLevel > -1) { + $columns[] = 'level'; + $columnValues[] = $newLevel; + $modes[] = null; + } + + // add as many points as needed, if we're below level 100 + if ($scorePoints) { + $columns[] = 'points'; + $columnValues[] = (5 * ($newLevel - $herolevel)); + $modes[] = 1; + } + + $villunits = $unitData[$hdata['wref']]; + if($hdata['trainingtime'] < time() && $hdata['inrevive'] == 1){ + mysqli_query($database->dblink,"UPDATE " . TB_PREFIX . "units SET hero = 1 WHERE vref = ".(int) $hdata['wref'].""); + + $columns[] = 'dead'; + $columnValues[] = 0; + $modes[] = null; + + $columns[] = 'inrevive'; + $columnValues[] = 0; + $modes[] = null; + + $columns[] = 'inrevive'; + $columnValues[] = 0; + $modes[] = null; + + $newHealth = 100; + $lastUpdateTime = (int) $hdata['trainingtime']; + } + + if($hdata['trainingtime'] < time() && $hdata['intraining'] == 1){ + mysqli_query($database->dblink,"UPDATE " . TB_PREFIX . "units SET hero = 1 WHERE vref = ".(int) $hdata['wref']); + + $columns[] = 'dead'; + $columnValues[] = 0; + $modes[] = null; + + $columns[] = 'intraining'; + $columnValues[] = 0; + $modes[] = null; + + $lastUpdateTime = (int) $hdata['trainingtime']; + } + + // update health, if needed + if ($newHealth > -1) { + $columns[] = 'health'; + $columnValues[] = $newHealth; + $modes[] = null; + } + + if ($lastUpdateTime != $timeNow) { + // last update timestamp + $columns[] = 'lastupdate'; + $columnValues[] = $lastUpdateTime; + $modes[] = null; + } else { + // leave same last update values for multiple heroes to the end + $lastUpdateIDs[] = $hdata['heroid']; + } + + if (count($columns)) $database->modifyHero($columns, $columnValues, $hdata['heroid'], $modes); + } + + if (count($lastUpdateIDs)) { + mysqli_query($database->dblink,"UPDATE " . TB_PREFIX . "hero SET lastupdate = $timeNow WHERE heroid IN(".implode(', ', $lastUpdateIDs).")"); + } + } + } + + // by SlimShady95, aka Manuel Mannhardt < manuel_mannhardt@web.de > UPDATED FROM songeriux < haroldas.snei@gmail.com > + private function updateStore() { + global $database, $bid10, $bid38, $bid11, $bid39; + + $result = mysqli_query($database->dblink, 'SELECT * FROM `' . TB_PREFIX . 'fdata`'); + + mysqli_begin_transaction($database->dblink); + while ($row = mysqli_fetch_assoc($result)) + { + $ress = $crop = 0; + for ($i = 19; $i < 40; ++$i) + { + //Warehouse + if ($row['f' . $i . 't'] == 10) + { + $ress += ((isset($bid10[$row['f' . $i]]) && isset($bid10[$row['f' . $i]]['attri'])) ? $bid10[$row['f' . $i]]['attri'] * STORAGE_MULTIPLIER : 0); + } + + //Great warehouse + if ($row['f' . $i . 't'] == 38) + { + $ress += ((isset($bid38[$row['f' . $i]]) && isset($bid38[$row['f' . $i]]['attri'])) ? $bid38[$row['f' . $i]]['attri'] * STORAGE_MULTIPLIER : 0); + } + + //Granary + if ($row['f' . $i . 't'] == 11) + { + $crop += ((isset($bid11[$row['f' . $i]]) && isset($bid11[$row['f' . $i]]['attri'])) ? $bid11[$row['f' . $i]]['attri'] * STORAGE_MULTIPLIER : 0); + } + + //Great granary + if ($row['f' . $i . 't'] == 39) + { + $crop += ((isset($bid39[$row['f' . $i]]) && isset($bid39[$row['f' . $i]]['attri'])) ? $bid39[$row['f' . $i]]['attri'] * STORAGE_MULTIPLIER : 0); + } + } + + // no need for update, since we didn't find any warehouses or granaries + // and maximums would have been set to correct values inside prune* functions already + if ($ress == 0 && $crop == 0) continue; + + // maxstore nor maxcrop can go below the minimum threshold + if ($ress < STORAGE_BASE) $ress = STORAGE_BASE; + if ($crop < STORAGE_BASE) $crop = STORAGE_BASE; + + mysqli_query($database->dblink,'UPDATE `' . TB_PREFIX . 'vdata` SET `maxstore` = ' . (int) $ress . ', `maxcrop` = ' . (int) $crop . ' WHERE `wref` = ' . (int) $row['vref']); + } + mysqli_commit($database->dblink); + } + + /*private function oasisResourcesProduce() { + global $database; + + $speedMultiplier = (8 * (SPEED/3600)); + $database->query(" + UPDATE " . TB_PREFIX . "odata + SET + lastupdated = UNIX_TIMESTAMP(), + wood = IF(wood + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxstore, maxstore, wood + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))), + clay = IF(clay + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxstore, maxstore, clay + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))), + iron = IF(iron + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxstore, maxstore, iron + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))), + crop = IF(crop + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxcrop, maxcrop, crop + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))) + WHERE + wood < 800 OR + clay < 800 OR + iron < 800 OR + crop < 800"); + }*/ + + private function checkInvitedPlayes() { + global $database; + + $q = "SELECT id, invited FROM ".TB_PREFIX."users WHERE invited > 0"; + $array = $database->query_return($q); + + // preload villages data + $userIDs = []; + foreach($array as $user) { + $userIDs[] = $user['id']; + } + $database->getProfileVillages($userIDs); + + // continue... + foreach($array as $user) { + $numusers = mysqli_fetch_array(mysqli_query($database->dblink,"SELECT Count(*) as Total FROM ".TB_PREFIX."users WHERE id = ".(int) $user['invited']), MYSQLI_ASSOC); + if($numusers['Total'] > 0){ + $varray = count($database->getProfileVillages($user['id'])); + if($varray > 1){ + $usergold = $database->getUserField($user['invited'],"gold",0); + $gold = $usergold+50; + $database->updateUserField($user['invited'],"gold",$gold,1); + $database->updateUserField($user['id'],"invited",0,1); + } + } + } + } + + private function updateGeneralAttack() { + global $database; + + mysqli_query($database->dblink, " + UPDATE ".TB_PREFIX."general + SET + shown = 0 + WHERE + shown = 1 AND + `time` < (UNIX_TIMESTAMP() - (86400 * 8))"); + } + + private function MasterBuilder() { + global $database; + + $q = "SELECT id, wid, type, level, field, timestamp FROM ".TB_PREFIX."bdata WHERE master = 1"; + $array = $database->query_return($q); + + foreach($array as $master) { + $owner = $database->getVillageField($master['wid'], 'owner'); + $tribe = $database->getUserField($owner, 'tribe', 0); + $villwood = $database->getVillageField($master['wid'], 'wood'); + $villclay = $database->getVillageField($master['wid'], 'clay'); + $villiron = $database->getVillageField($master['wid'], 'iron'); + $villcrop = $database->getVillageField($master['wid'], 'crop'); + $type = $master['type']; + $level = $master['level']; + $buildarray = $GLOBALS["bid".$type]; + $buildwood = $buildarray[$level]['wood']; + $buildclay = $buildarray[$level]['clay']; + $buildiron = $buildarray[$level]['iron']; + $buildcrop = $buildarray[$level]['crop']; + $ww = count($database->getBuildingByType($master['wid'], 40)); + + if($tribe == 1){ + if($master['field'] < 19){ + $bdata = $database->getDorf1Building($master['wid']); + $bdataTotal = count($bdata); + $bbdata = count($database->getDorf2Building($master['wid'])); + }else{ + $bdata = $database->getDorf2Building($master['wid']); + $bdataTotal = count($bdata); + $bbdata = count($database->getDorf1Building($master['wid'])); + } + }else{ + $bdata = array_merge($database->getDorf1Building($master['wid']), $database->getDorf2Building($master['wid'])); + $bdataTotal = $bbdata = count($bdata); + } + + if($database->getUserField($owner, 'plus', 0) > time() || $ww > 0){ + if($bbdata < 2) $inbuild = 2; + else $inbuild = 1; + } + else $inbuild = 1; + + $usergold = $database->getUserField($owner, 'gold', 0); + + if($bdataTotal < $inbuild && $buildwood <= $villwood && $buildclay <= $villclay && $buildiron <= $villiron && $buildcrop <= $villcrop && $usergold > 0){ + $time = $master['timestamp'] + time(); + + if(!empty($bdata)){ + foreach($bdata as $masterLoop) $time += ($masterLoop['timestamp'] - time()); + } + + if($bdataTotal == 0) $database->updateBuildingWithMaster($master['id'], $time, 0); + else $database->updateBuildingWithMaster($master['id'], $time, 1); + + $database->updateUserField($owner, 'gold', --$usergold, 1); + $database->modifyResource($master['wid'], $buildwood, $buildclay, $buildiron, $buildcrop, 0); + } + } + } + + /** + * Adds the starvation data in villages with a negative value of crop + * + * @param int $wref The village ID where the crop is negative + */ + + private function addStarvationData($wref){ + global $database, $technology; + + $getVillage = $database->getVillage($wref); + + //Exlude Support, Nature, Natars, TaskMaster and Multihunter + if ($getVillage['owner'] > 5){ + $crop = $database->getCropProdstarv($wref, false); + $unitArrays = $this->getAllUnits($wref, false); + $villageUpkeep = $getVillage['pop'] + $technology->getUpkeep($unitArrays, 0, $wref); + $starv = $getVillage['starv']; + if ($crop < $villageUpkeep){ + //Add starvation data + $database->setVillageFields($wref, ['starv'], [$villageUpkeep]); + } + } + } + + /** + * Function for starvation - by brainiacX and Shadow + * Rework by ronix + * Refactored by iopietro + */ + + //TODO: This function needs to be splitted in many subfunctions (for TravianZ refactor) + private function starvation() { + global $database, $technology; + + //starvation is disabled during Easter/Holidays/Christmas + if(PEACE) return; + + $time = time(); + + //update starvation in every village + $starvarray = $database->getProfileVillages(0, 7); + foreach($starvarray as $starv) $this->addStarvationData($starv['wref']); + + // load villages with minus prod + $starvarray = []; + $starvarray = $database->getStarvation(); + + $vilIDs = []; + foreach ($starvarray as $starv) $vilIDs[] = $starv['wref']; + + // cache + $database->getEnforceVillage($vilIDs, 0); + $database->getOasisEnforce($vilIDs, 2); + $database->getOasisEnforce($vilIDs, 3); + $database->getPrisoners($vilIDs, 1); + $database->getMovement(3, $vilIDs, 0); + $database->getMovement(4, $vilIDs, 1); + + foreach ($starvarray as $starv) + { + $unitarrays = $this->getAllUnits($starv['wref']); + + $upkeep = $starv['pop'] + $technology->getUpkeep($unitarrays, 0, $starv['wref']); + + $enforceArrays = $prisonerArrays = $unitArrays = $attackArrays = $allTroopsArray = $starvingTroops = $killedUnits = []; + + $enforceArrays = [$database->getOasisEnforce($starv['wref'], 2), + $database->getOasisEnforce($starv['wref'], 3), + $database->getEnforceVillage($starv['wref'], 2), + $database->getEnforceVillage($starv['wref'], 3)]; + + $prisonerArrays = [$database->getPrisoners($starv['wref'], 1)]; + + $unitArrays = ($database->getUnitsNumber($starv['wref'], 0) > 0) ? [[$database->getUnit($starv['wref'])]] : []; + + $attackArrays = [$database->getMovement(3, $starv['wref'], 0), + $database->getMovement(4, $starv['wref'], 1)]; + + $allTroopsArray = [$enforceArrays, $prisonerArrays, $unitArrays, $attackArrays]; + + // find the first not-empty array + foreach($allTroopsArray as $type => $allTroops) + { + if(!empty($allTroops)){ + foreach($allTroops as $subtype => $troops){ + if(!empty($troops)){ + $starvingTroops = reset($troops); + break 2; + } + } + } + } + + // if the player has no troops, then skip the next instructions + if(empty($starvingTroops)) continue; + + // counting + $timedif = $time - $starv['starvupdate']; + $cropProd = $database->getCropProdstarv($starv['wref']) - $starv['starv']; + if($cropProd < 0){ + $starvsec = (abs($cropProd) / 3600); + $difcrop = ($timedif * $starvsec); //crop eat up over time + $newcrop = 0; + $oldcrop = $database->getVillageField($starv['wref'], 'crop'); + + //if the grain is then tries to send all + if ($oldcrop > 100){ + $difcrop = $difcrop - $oldcrop; + if($difcrop < 0){ + $difcrop = 0; + $newcrop = $oldcrop - $difcrop; + $database->setVillageField($starv['wref'], 'crop', $newcrop); + } + } + + if($difcrop > 0 && $oldcrop <= 0){ + $tribe = $database->getUserField(($type == 2) ? $starv['owner'] : $database->getVillageField($starvingTroops['from'], "owner"), "tribe", 0); + $start = ($special = in_array($type, [1, 3])) ? 1 : ($tribe - 1) * 10 + 1; + $end = ($special) ? 10 : $tribe * 10 ; + $utype = ($special) ? 't' : 'u'; + $heroType = ($special) ? 't11' : 'hero'; + + $totalUnits = 0; + $counting = true; + while($difcrop > 0) + { + // search the highest troop + $maxcount = $maxtype = 0; + for($i = $start ; $i <= $end ; $i++) + { + $units = (isset($starvingTroops[$utype.$i]) ? $starvingTroops[$utype.$i] : 0); + if($counting) $totalUnits += $units; + if($units > $maxcount){ + $maxcount = $units; + $maxtype = $i; + } + } + if($counting) $counting = false; + + if($maxtype > 0){ + $starvingTroops[$utype.$maxtype]--; + $killedUnits[$maxtype]++; + $difcrop -= $GLOBALS['u'.(($special) ? $maxtype + ($tribe - 1) * 10 : $maxtype)]['crop']; + } + else break; + } + + $totalKilledUnits = array_sum($killedUnits); + if($starvingTroops[$heroType] > 0 && ($totalUnits == 0 || $totalUnits == $totalKilledUnits)){ + $totalKilledUnits += $starvingTroops[$heroType]; + $totalUnits += $starvingTroops[$heroType]; + $starvingTroops['heroinfo'] = $database->getHero(($type == 2) ? $starv['owner'] : $database->getVillageField(($type == 3 && $subtype == 1) ? $starvingTroops['to'] : $starvingTroops['from'], "owner"))[0]; + $database->modifyHero("dead", 1, $starvingTroops['heroinfo']['heroid']); + $database->modifyHero("health", 0, $starvingTroops['heroinfo']['heroid']); + $newCrop = $GLOBALS['h'.$starvingTroops['heroinfo']['unit'].'_full'][min($starvingTroops['heroinfo']['level'], 60)]['crop'] + $difcrop; + } + else if($maxtype == 0) $newCrop = 0; + else $newCrop = $GLOBALS['u'.$maxtype]['crop']; + + if($totalKilledUnits > 0) + { + switch($type) + { + case 0: + if($totalKilledUnits < $totalUnits){ + $database->modifyEnforce($starvingTroops['id'], array_keys($killedUnits), array_values($killedUnits), 0); + } + else $database->deleteReinf($starvingTroops['id']); + break; + + case 1: + if($totalKilledUnits < $totalUnits){ + $database->modifyPrisoners($starvingTroops['id'], array_keys($killedUnits), array_values($killedUnits), 0); + $database->modifyUnit($starvingTroops['wref'], ["99o"], [$totalKilledUnits], [0]); + }else{ + $database->deletePrisoners($starvingTroops['id']); + $database->modifyUnit($starvingTroops['wref'], ["99o"], [$totalUnits], [0]); + } + break; + + case 2: + $database->modifyUnit($starv['wref'], array_keys($killedUnits), array_values($killedUnits), [0]); + break; + + case 3: + if($totalKilledUnits < $totalUnits){ + $database->modifyAttack2($starvingTroops['id'], array_keys($killedUnits), array_values($killedUnits), 0); + } + else $database->setMovementProc($starvingTroops['moveid']); + break; + } + + $database->modifyResource($starv['wref'], 0, 0, 0, max($newCrop, 0), 1); + $database->setVillageField($starv['wref'], ['starv', 'starvupdate'], [$upkeep, $time]); + } + } + } + + $crop = $database->getCropProdstarv($starv['wref'], false); + if ($crop > $upkeep) $database->setVillageFields($starv['wref'], ['starv', 'starvupdate'], [0, 0]); + + unset ($unitarrays, $type, $subtype); + } + } + + private function procNewClimbers() { + global $database, $ranking; + + $ranking->procRankArray(); + $climbers = $ranking->getRank(); + if(count($climbers) > 0){ + $q = "SELECT week FROM ".TB_PREFIX."medal order by week DESC LIMIT 0, 1"; + $result = mysqli_query($database->dblink,$q); + if(mysqli_num_rows($result)) { + $row = mysqli_fetch_assoc($result); + $week = $row['week'] + 1; + } + else $week = 1; + + $q = "SELECT id FROM ".TB_PREFIX."users where oldrank = 0 and id > 5"; + $array = $database->query_return($q); + foreach($array as $user){ + $newrank = $ranking->getUserRank($user['id']); + if($week > 1){ + for($i = $newrank + 1; $i < count($climbers); $i++) { + if(isset($climbers[$i]['userid'])){ + $oldrank = $ranking->getUserRank($climbers[$i]['userid']); + $totalpoints = $oldrank - $climbers[$i]['oldrank']; + $database->removeclimberrankpop($climbers[$i]['userid'], $totalpoints); + $database->updateoldrank($climbers[$i]['userid'], $oldrank); + } + } + $database->updateoldrank($user['id'], $newrank); + }else{ + $totalpoints = count($climbers) - $newrank; + $database->setclimberrankpop($user['id'], $totalpoints); + $database->updateoldrank($user['id'], $newrank); + for($i = 1; $i < $newrank; $i++){ + if(isset($climbers[$i]['userid'])){ + $oldrank = $ranking->getUserRank($climbers[$i]['userid']); + $totalpoints = count($climbers) - $oldrank; + $database->setclimberrankpop($climbers[$i]['userid'], $totalpoints); + $database->updateoldrank($climbers[$i]['userid'], $oldrank); + } + } + for($i = $newrank + 1; $i < count($climbers); $i++){ + if(isset($climbers[$i]['userid'])){ + $oldrank = $ranking->getUserRank($climbers[$i]['userid']); + $totalpoints = count($climbers) - $oldrank; + $database->setclimberrankpop($climbers[$i]['userid'], $totalpoints); + $database->updateoldrank($climbers[$i]['userid'], $oldrank); + } + } + } + } + } + } + + private function procClimbers($uid) { + global $database, $ranking; + + $ranking->procRankArray(); + $climbers = $ranking->getRank(); + if(count($ranking->getRank()) > 0){ + $q = "SELECT week FROM ".TB_PREFIX."medal order by week DESC LIMIT 0, 1"; + $result = mysqli_query($database->dblink,$q); + if(mysqli_num_rows($result)) { + $row = mysqli_fetch_assoc($result); + $week = $row['week'] + 1; + } + else $week = 1; + + $myrank = $ranking->getUserRank($uid); + if(isset($climbers[$myrank]['oldrank']) && $climbers[$myrank]['oldrank'] > $myrank){ + for($i = $myrank + 1; $i <= $climbers[$myrank]['oldrank']; $i++) { + if(isset($climbers[$i]['oldrank'])){ + $oldrank = $ranking->getUserRank($climbers[$i]['userid']); + if($week > 1){ + $totalpoints = $oldrank - $climbers[$i]['oldrank']; + $database->removeclimberrankpop($climbers[$i]['userid'], $totalpoints); + $database->updateoldrank($climbers[$i]['userid'], $oldrank); + }else{ + $totalpoints = count($ranking->getRank()) - $oldrank; + $database->setclimberrankpop($climbers[$i]['userid'], $totalpoints); + $database->updateoldrank($climbers[$i]['userid'], $oldrank); + } + } + } + if(isset($climbers[$myrank]['oldrank'])){ + if($week > 1){ + $totalpoints = $climbers[$myrank]['oldrank'] - $myrank; + $database->addclimberrankpop($climbers[$myrank]['userid'], $totalpoints); + $database->updateoldrank($climbers[$myrank]['userid'], $myrank); + }else{ + $totalpoints = count($ranking->getRank()) - $myrank; + $database->setclimberrankpop($climbers[$myrank]['userid'], $totalpoints); + $database->updateoldrank($climbers[$myrank]['userid'], $myrank); + } + } + }else if(isset($climbers[$myrank]['oldrank']) && $climbers[$myrank]['oldrank'] < $myrank){ + for($i = $climbers[$myrank]['oldrank']; $i < $myrank; $i++) { + if(isset($climbers[$i]['oldrank'])){ + $oldrank = $ranking->getUserRank($climbers[$i]['userid']); + if($week > 1){ + $totalpoints = $climbers[$i]['oldrank'] - $oldrank; + $database->addclimberrankpop($climbers[$i]['userid'], $totalpoints); + $database->updateoldrank($climbers[$i]['userid'], $oldrank); + }else{ + $totalpoints = count($ranking->getRank()) - $oldrank; + $database->setclimberrankpop($climbers[$i]['userid'], $totalpoints); + $database->updateoldrank($climbers[$i]['userid'], $oldrank); + } + } + } + if(isset($climbers[$myrank-1]['oldrank'])){ + if($week > 1){ + $totalpoints = $myrank - $climbers[$myrank-1]['oldrank']; + $database->removeclimberrankpop($climbers[$myrank-1]['userid'], $totalpoints); + $database->updateoldrank($climbers[$myrank-1]['userid'], $myrank); + }else{ + $totalpoints = count($ranking->getRank()) - $myrank; + $database->setclimberrankpop($climbers[$myrank-1]['userid'], $totalpoints); + $database->updateoldrank($climbers[$myrank-1]['userid'], $myrank); + } + } + } + } + $ranking->procARankArray(); + $aid = $database->getUserField($uid,"alliance",0); + if(count($ranking->getRank()) > 0 && $aid != 0){ + $ally = $database->getAlliance($aid); + $memberlist = $database->getAllMember($ally['id']); + $oldrank = 0; + + $memberIDs = []; + foreach($memberlist as $member) { + $memberIDs[] = $member['id']; + } + $data = $database->getVSumField($memberIDs,"pop"); + + if (count($data)) { + foreach ($data as $row) { + $oldrank += $row['Total']; + } + } + + if($ally['oldrank'] != $oldrank){ + if($ally['oldrank'] < $oldrank) { + $totalpoints = $oldrank - $ally['oldrank']; + $database->addclimberrankpopAlly($ally['id'], $totalpoints); + $database->updateoldrankAlly($ally['id'], $oldrank); + } else + if($ally['oldrank'] > $oldrank) { + $totalpoints = $ally['oldrank'] - $oldrank; + $database->removeclimberrankpopAlly($ally['id'], $totalpoints); + $database->updateoldrankAlly($ally['id'], $oldrank); + } + } + } + } + + private function checkBan() { + global $database; + + mysqli_query($database->dblink, " + UPDATE ".TB_PREFIX."banlist as b + JOIN ".TB_PREFIX."users as u ON b.uid = u.id + SET + b.active = 0, + u.access = 2 + WHERE + b.active = 1 AND + b.`end` < UNIX_TIMESTAMP() AND + b.`end` > 0"); + } + + private function regenerateOasisTroops() { + global $database; + + $timeFinal = time() - NATURE_REGTIME; + $q = "SELECT wref FROM " . TB_PREFIX . "odata where conqured = 0 and lastupdated2 < $timeFinal"; + $array = $database->query_return($q); + if (count($array)) { + $ids = []; + foreach($array as $oasis) $ids[] = $oasis['wref']; + $database->regenerateOasisUnits($ids, true); + } + } + + public static function updateMax($leader) { + global $bid18, $database; + + $q = mysqli_fetch_array(mysqli_query($database->dblink,"SELECT Count(*) as Total FROM " . TB_PREFIX . "alidata where leader = ". (int) $leader), MYSQLI_ASSOC); + if ($q['Total'] > 0) { + $villages = $database->getVillagesID2($leader); + $max = 0; + + // cache resource levels + $vilIDs = []; + foreach($villages as $village){ + $vilIDs[$village['wref']] = true; + } + $database->cacheResourceLevels(array_keys($vilIDs)); + + foreach($villages as $village){ + $field = $database->getResourceLevel($village['wref'], false); + for($i = 19; $i <= 40; $i++){ + if($field['f'.$i.'t'] == 18){ + $level = $field['f'.$i]; + $attri = $bid18[$level]['attri']; + } + } + if($attri > $max){ + $max = $attri; + } + } + $q = "UPDATE ".TB_PREFIX."alidata set max = ".(int) $max." where leader = ".(int) $leader; + $database->query($q); + } + } + + /** + * Function for automate medals - by yi12345 and Shadow + * + */ + + function medals(){ + global $ranking, $database; + + //we may give away ribbons + $giveMedal = false; + $q = "SELECT lastgavemedal FROM ".TB_PREFIX."config"; + $result = mysqli_query($database->dblink,$q); + if($result) { + $row = mysqli_fetch_assoc($result); + $stime = strtotime(START_DATE) - strtotime(date('d.m.Y')) + strtotime(START_TIME); + if($row['lastgavemedal'] == 0 && $stime < time()){ + $newtime = strtotime('next monday'); + $q = "UPDATE ".TB_PREFIX."config SET lastgavemedal = ".(int) $newtime; + $database->query($q); + }elseif($row['lastgavemedal'] != 0){ + $time = $row['lastgavemedal'] + MEDALINTERVAL; + $giveMedal = $row['lastgavemedal'] < time(); + } + } + + if($giveMedal && MEDALINTERVAL > 0){ + + //determine which week we are + + $q = "SELECT week FROM ".TB_PREFIX."medal order by week DESC LIMIT 0, 1"; + $result = mysqli_query($database->dblink,$q); + if(mysqli_num_rows($result)) { + $row=mysqli_fetch_assoc($result); + $week=($row['week']+1); + } else { + $week='1'; + } + + //Do same for ally week + + $q = "SELECT week FROM ".TB_PREFIX."allimedal order by week DESC LIMIT 0, 1"; + $result = mysqli_query($database->dblink,$q); + if(mysqli_num_rows($result)) { + $row=mysqli_fetch_assoc($result); + $allyweek=($row['week']+1); + } else { + $allyweek='1'; + } + + + //Attackers of the week + $result = mysqli_query($database->dblink,"SELECT id, ap FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY ap DESC, id DESC Limit 10"); + $i=0; + while($row = mysqli_fetch_array($result)){ + $i++; + $img="t2_".($i).""; + $quer="insert into ".TB_PREFIX."medal (userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", 1, ".($i).", ".(int) $week.", '".$row['ap']."', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + //Defender of the week + $result = mysqli_query($database->dblink,"SELECT id, dp FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY dp DESC, id DESC Limit 10"); + $i=0; + while($row = mysqli_fetch_array($result)){ + $i++; + $img="t3_".($i).""; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '2', ".($i).", '".(int) $week."', '".$row['dp']."', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + //Climbers of the week + $result = mysqli_query($database->dblink,"SELECT id, Rc FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY Rc DESC, id DESC Limit 10"); + $i=0; + while($row = mysqli_fetch_array($result)){ + $i++; + $img="t1_".($i).""; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '3', ".($i).", '".(int) $week."', '".$row['Rc']."', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + //Rank climbers of the week + $result = mysqli_query($database->dblink,"SELECT id, clp FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY clp DESC Limit 10"); + $i=0; + while($row = mysqli_fetch_array($result)){ + $i++; + $img="t6_".($i).""; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '10', ".($i).", '".(int) $week."', '".$row['clp']."', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + //Robbers of the week + $result = mysqli_query($database->dblink,"SELECT id, RR FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY RR DESC, id DESC Limit 10"); + $i=0; + while($row = mysqli_fetch_array($result)){ + $i++; + $img="t4_".($i).""; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '4', ".($i).", '".(int) $week."', '".$row['RR']."', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + //Part of the bonus for top 10 attack + defense out + //Top10 attackers + $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY ap DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + //Top 10 defenders + $result2 = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY dp DESC, id DESC Limit 10"); + while($row2 = mysqli_fetch_array($result2)){ + if($row['id']==$row2['id']){ + + $query3="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 5"; + $result3=mysqli_query($database->dblink,$query3); + $row3=mysqli_fetch_row($result3); + + //Look what color the ribbon must have + if($row3[0]<='2'){ + $img="t22".$row3[0]."_1"; + switch ($row3[0]) { + case "0": + $tekst=""; + break; + case "1": + $tekst="twice "; + break; + case "2": + $tekst="three times "; + break; + } + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '5', '0', '".(int) $week."', '".$tekst."', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + } + } + } + + //you stand for 3rd / 5th / 10th time in the top 3 strikers + //top10 attackers + $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY ap DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 1 AND plaats<=3"; + $result1=mysqli_query($database->dblink,$query1); + $row1=mysqli_fetch_row($result1); + + + //2x at present as it is so ribbon 3rd (bronze) + if($row1[0]=='3'){ + $img="t120_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '6', '0', '".(int) $week."', 'Three', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //4x at present as it is so 5th medal (silver) + if($row1[0]=='5'){ + $img="t121_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '6', '0', '".(int) $week."', 'Five', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //9x at present as it is so 10th medal (gold) + if($row1[0]=='10'){ + $img="t122_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '6', '0', '".(int) $week."', 'Ten', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + } + //you stand for 3rd / 5th / 10th time in the top 10 attackers + //top10 attackers + $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY ap DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 1 AND plaats<=10"; + $result1=mysqli_query($database->dblink,$query1); + $row1=mysqli_fetch_row($result1); + + + //2x in gestaan, dit is 3e dus lintje (brons) + if($row1[0]=='3'){ + $img="t130_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '12', '0', '".(int) $week."', 'Three', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //4x in gestaan, dit is 5e dus lintje (zilver) + if($row1[0]=='5'){ + $img="t131_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '12', '0', '".(int) $week."', 'Five', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //9x at present as it is so 10th medal (gold) + if($row1[0]=='10'){ + $img="t132_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '12', '0', '".(int) $week."', 'Ten', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + } + //je staat voor 3e / 5e / 10e keer in de top 3 verdedigers + //Pak de top10 verdedigers + $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY dp DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 2 AND plaats<=3"; + $result1=mysqli_query($database->dblink,$query1); + $row1=mysqli_fetch_row($result1); + + + //2x in gestaan, dit is 3e dus lintje (brons) + if($row1[0]=='3'){ + $img="t140_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '7', '0', '".(int) $week."', 'Three', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //4x in gestaan, dit is 5e dus lintje (zilver) + if($row1[0]=='5'){ + $img="t141_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '7', '0', '".(int) $week."', 'Five', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //9x at present as it is so 10th medal (gold) + if($row1[0]=='10'){ + $img="t142_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '7', '0', '".(int) $week."', 'Ten', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + } + //je staat voor 3e / 5e / 10e keer in de top 3 verdedigers + //Pak de top10 verdedigers + $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY dp DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 2 AND plaats<=10"; + $result1=mysqli_query($database->dblink,$query1); + $row1=mysqli_fetch_row($result1); + + + //2x in gestaan, dit is 3e dus lintje (brons) + if($row1[0]=='3'){ + $img="t150_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '13', '0', '".(int) $week."', 'Three', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //4x in gestaan, dit is 5e dus lintje (zilver) + if($row1[0]=='5'){ + $img="t151_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '13', '0', '".(int) $week."', 'Five', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //9x at present as it is so 10th medal (gold) + if($row1[0]=='10'){ + $img="t152_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '13', '0', '".(int) $week."', 'Ten', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + } + + //je staat voor 3e / 5e / 10e keer in de top 3 klimmers + //Pak de top10 klimmers + $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY Rc DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 3 AND plaats<=3"; + $result1=mysqli_query($database->dblink,$query1); + $row1=mysqli_fetch_row($result1); + + + //2x in gestaan, dit is 3e dus lintje (brons) + if($row1[0]=='3'){ + $img="t100_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '8', '0', '".(int) $week."', 'Three', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //4x in gestaan, dit is 5e dus lintje (zilver) + if($row1[0]=='5'){ + $img="t101_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '8', '0', '".(int) $week."', 'Five', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //9x at present as it is so 10th medal (gold) + if($row1[0]=='10'){ + $img="t102_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '8', '0', '".(int) $week."', 'Ten', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + } + //je staat voor 3e / 5e / 10e keer in de top 3 klimmers + //Pak de top10 klimmers + $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY Rc DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 3 AND plaats<=10"; + $result1=mysqli_query($database->dblink,$query1); + $row1=mysqli_fetch_row($result1); + + + //2x in gestaan, dit is 3e dus lintje (brons) + if($row1[0]=='3'){ + $img="t110_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '14', '0', '".(int) $week."', 'Three', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //4x in gestaan, dit is 5e dus lintje (zilver) + if($row1[0]=='5'){ + $img="t111_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '14', '0', '".(int) $week."', 'Five', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //9x at present as it is so 10th medal (gold) + if($row1[0]=='10'){ + $img="t112_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '14', '0', '".(int) $week."', 'Ten', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + } + + //je staat voor 3e / 5e / 10e keer in de top 3 klimmers + //Pak de top3 rank climbers + $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY clp DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 10 AND plaats<=3"; + $result1=mysqli_query($database->dblink,$query1); + $row1=mysqli_fetch_row($result1); + + + //2x in gestaan, dit is 3e dus lintje (brons) + if($row1[0]=='3'){ + $img="t200_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '11', '0', '".(int) $week."', 'Three', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //4x in gestaan, dit is 5e dus lintje (zilver) + if($row1[0]=='5'){ + $img="t201_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '11', '0', '".(int) $week."', 'Five', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //9x at present as it is so 10th medal (gold) + if($row1[0]=='10'){ + $img="t202_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '11', '0', '".(int) $week."', 'Ten', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + } + //je staat voor 3e / 5e / 10e keer in de top 10klimmers + //Pak de top3 rank climbers + $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY clp DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 10 AND plaats<=10"; + $result1=mysqli_query($database->dblink,$query1); + $row1=mysqli_fetch_row($result1); + + + //2x in gestaan, dit is 3e dus lintje (brons) + if($row1[0]=='3'){ + $img="t210_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '16', '0', '".(int) $week."', 'Three', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //4x in gestaan, dit is 5e dus lintje (zilver) + if($row1[0]=='5'){ + $img="t211_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '16', '0', '".(int) $week."', 'Five', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //9x at present as it is so 10th medal (gold) + if($row1[0]=='10'){ + $img="t212_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '16', '0', '".(int) $week."', 'Ten', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + } + + //je staat voor 3e / 5e / 10e keer in de top 10 overvallers + //Pak de top10 overvallers + $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY RR DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 4 AND plaats<=3"; + $result1=mysqli_query($database->dblink,$query1); + $row1=mysqli_fetch_row($result1); + + + //2x in gestaan, dit is 3e dus lintje (brons) + if($row1[0]=='3'){ + $img="t160_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '9', '0', '".(int) $week."', 'Three', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //4x in gestaan, dit is 5e dus lintje (zilver) + if($row1[0]=='5'){ + $img="t161_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '9', '0', '".(int) $week."', 'Five', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //9x at present as it is so 10th medal (gold) + if($row1[0]=='10'){ + $img="t162_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '9', '0', '".(int) $week."', 'Ten', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + } + //je staat voor 3e / 5e / 10e keer in de top 10 overvallers + //Pak de top10 overvallers + $result = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY RR DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + $query1="SELECT Count(*) FROM ".TB_PREFIX."medal WHERE userid=".(int) $row['id']." AND categorie = 4 AND plaats<=10"; + $result1=mysqli_query($database->dblink,$query1); + $row1=mysqli_fetch_row($result1); + + + //2x in gestaan, dit is 3e dus lintje (brons) + if($row1[0]=='3'){ + $img="t170_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '15', '0', '".(int) $week."', 'Three', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //4x in gestaan, dit is 5e dus lintje (zilver) + if($row1[0]=='5'){ + $img="t171_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '15', '0', '".(int) $week."', 'Five', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + //9x at present as it is so 10th medal (gold) + if($row1[0]=='10'){ + $img="t172_1"; + $quer="insert into ".TB_PREFIX."medal(userid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '15', '0', '".(int) $week."', 'Ten', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + } + + //Put all true dens to 0 + $query="SELECT id FROM ".TB_PREFIX."users WHERE id > 5 AND access < 8 ORDER BY id+0 DESC"; + $result=mysqli_query($database->dblink,$query); + $userIDs = []; + for ($i=0; $row=mysqli_fetch_row($result); $i++){ + $userIDs[] = (int) $row[0]; + } + + if (count($userIDs)) { + mysqli_query($database->dblink,"UPDATE ".TB_PREFIX."users SET ap=0, dp=0,Rc=0,clp=0, RR=0 WHERE id IN(".implode(', ', $userIDs).")"); + } + + //Start alliance Medals wooot + + //Aanvallers v/d Week + $result = mysqli_query($database->dblink,"SELECT id, ap FROM ".TB_PREFIX."alidata ORDER BY ap DESC, id DESC Limit 10"); + $i=0; while($row = mysqli_fetch_array($result)){ + $i++; $img="a2_".($i).""; + $quer="insert into ".TB_PREFIX."allimedal(allyid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '1', ".($i).", '".$allyweek."', '".$row['ap']."', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + //Verdediger v/d Week + $result = mysqli_query($database->dblink,"SELECT id, dp FROM ".TB_PREFIX."alidata ORDER BY dp DESC Limit 10"); + $i=0; while($row = mysqli_fetch_array($result)){ + $i++; $img="a3_".($i).""; + $quer="insert into ".TB_PREFIX."allimedal(allyid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '2', ".($i).", '".$allyweek."', '".$row['dp']."', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + //Overvallers v/d Week + $result = mysqli_query($database->dblink,"SELECT id, RR FROM ".TB_PREFIX."alidata ORDER BY RR DESC, id DESC Limit 10"); + $i=0; while($row = mysqli_fetch_array($result)){ + $i++; $img="a4_".($i).""; + $quer="insert into ".TB_PREFIX."allimedal(allyid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '4', ".($i).", '".$allyweek."', '".$row['RR']."', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + //Rank climbers of the week + $result = mysqli_query($database->dblink,"SELECT id, clp FROM ".TB_PREFIX."alidata ORDER BY clp DESC Limit 10"); + $i=0; while($row = mysqli_fetch_array($result)){ + $i++; $img="a1_".($i).""; + $quer="insert into ".TB_PREFIX."allimedal(allyid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '3', ".($i).", '".$allyweek."', '".$row['clp']."', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + + $result = mysqli_query($database->dblink,"SELECT * FROM ".TB_PREFIX."alidata ORDER BY ap DESC, id DESC Limit 10"); + while($row = mysqli_fetch_array($result)){ + + //Pak de top10 verdedigers + $result2 = mysqli_query($database->dblink,"SELECT id FROM ".TB_PREFIX."alidata ORDER BY dp DESC, id DESC Limit 10"); + while($row2 = mysqli_fetch_array($result2)){ + if($row['id']==$row2['id']){ + + $query3="SELECT Count(*) FROM ".TB_PREFIX."allimedal WHERE allyid=".(int) $row['id']." AND categorie = 5"; + $result3=mysqli_query($database->dblink,$query3); + $row3=mysqli_fetch_row($result3); + + //Look what color the ribbon must have + if($row3[0]<='2'){ + $img="t22".$row3[0]."_1"; + switch ($row3[0]) { + case "0": + $tekst=""; + break; + case "1": + $tekst="twice "; + break; + case "2": + $tekst="three times "; + break; + } + $quer="insert into ".TB_PREFIX."allimedal(allyid, categorie, plaats, week, points, img) values(".(int) $row['id'].", '5', '0', '".$allyweek."', '".$tekst."', '".$img."')"; + $resul=mysqli_query($database->dblink,$quer); + } + } + } + } + + $query="SELECT id FROM ".TB_PREFIX."alidata ORDER BY id+0 DESC"; + $result=mysqli_query($database->dblink,$query); + + $aliIDs = []; + for ($i=0; $row=mysqli_fetch_row($result); $i++){ + $aliIDs[] = (int) $row[0]; + } + + if (count($aliIDs)) { + mysqli_query($database->dblink,"UPDATE ".TB_PREFIX."alidata SET ap=0, dp=0,RR=0,clp=0 WHERE id IN(".implode(', ', $aliIDs).")"); + } + + $q = "UPDATE ".TB_PREFIX."config SET lastgavemedal=".$time; + $database->query($q); + } + } + + private function artefactOfTheFool() { + global $database; + + $time = time(); + $q = "SELECT id, size FROM " . TB_PREFIX . "artefacts where type = 8 AND active = 1 AND lastupdate <= ".($time - (86400 / (SPEED == 2 ? 1.5 : (SPEED == 3 ? 2 : SPEED)))); + $array = $database->query_return($q); + if ($array) { + foreach($array as $artefact) { + $kind = rand(1, 7); + + while($kind == 6) $kind = rand(1, 7); + + if($artefact['size'] != 3) $bad_effect = rand(0, 1); + else $bad_effect = 0; + + switch($kind) { + case 1: + $effect = rand(1, 5); + break; + case 2: + $effect = rand(1, 3); + break; + case 3: + $effect = rand(3, 10); + break; + case 4: + case 5: + $effect = rand(2, 4); + break; + case 7: + $effect = rand(1, 6); + break; + } + mysqli_query($database->dblink,"UPDATE ".TB_PREFIX."artefacts SET kind = ". (int) $kind. ", bad_effect = $bad_effect, effect2 = $effect, lastupdate = $time WHERE id = ".(int) $artefact['id']); + } + } + } +} +$automation = new Automation; +?>