mirror of
https://github.com/Shadowss/TravianZ.git
synced 2026-06-28 08:34:33 +00:00
90221cf19f
+Natars will now spawn automatically, you can set how many day should
pass before the spawn of Natars (and artifacts), WW Villages and WW
building plans (Note: WW villages and WW building plans won't spawn
until the creation of the natar account)
+Added 3 timers under the left menu which indicate the spawn of
Natars/Artifacts, WW villages and WW building plans
+Added an option in the installation, to set the resource production of
oasis
+Fixed a bug that didn't permit to add multiple Units, Abtech and tech
rows with one query
+Added a new information to the Artifact of the fool, the next effect
reroll will now be displayed in his informations (in the treasury)
+Fixed a bug that dind't permit the correct timers flow in Dorf3.php
(Warehouse tab), they'll now flow correctly
+Timers and resources percentage of villages with a negative production
of crop will now be marked in red (in the Warehouse tab, Dorf3.php) and
will now be displayed in how much time the granary will be emptied
+Fixed a possible bug that prevented to add raids to farm lists
+Fixed a bug that didn't permit to create WW Villages from the
Multihunter control panel
+Reworked all timers, there will be only one timer field now (in
Session.php)
+Minor bug fixing and optimization
NOTE: To play this version of the game, you need to reinstall the server
OR you can simply add these lines of code into your "config.php" file:
// ***** Natars Spawn Time
define("NATARS_SPAWN_TIME",260);
define("NATARS_WW_SPAWN_TIME",260);
define("NATARS_WW_BUILDING_PLAN_SPAWN_TIME",260);
// ***** Oasis production
define("OASIS_WOOD_MULTIPLIER",40);
define("OASIS_CLAY_MULTIPLIER",40);
define("OASIS_IRON_MULTIPLIER",40);
define("OASIS_CROP_MULTIPLIER",40);
define("OASIS_WOOD_PRODUCTION",OASIS_WOOD_MULTIPLIER*SPEED);
define("OASIS_CLAY_PRODUCTION",OASIS_CLAY_MULTIPLIER*SPEED);
define("OASIS_IRON_PRODUCTION",OASIS_IRON_MULTIPLIER*SPEED);
define("OASIS_CROP_PRODUCTION",OASIS_CROP_MULTIPLIER*SPEED);
P.S: from the next version, the possibility to add manual WWs, WW
building plans and to create the natar account will be REMOVED.
5132 lines
260 KiB
PHP
Executable File
5132 lines
260 KiB
PHP
Executable File
<?php
|
|
|
|
#################################################################################
|
|
## -= YOU MAY NOT REMOVE OR CHANGE THIS NOTICE =- ##
|
|
## --------------------------------------------------------------------------- ##
|
|
## Project: TravianZ ##
|
|
## Version: 22.06.2015 ##
|
|
## Filename Automation.php ##
|
|
## Developed by: Mr.php , Advocaite , brainiacX , yi12345 , Shadow , ronix ##
|
|
## Fixed by: Shadow - STARVATION , HERO FIXED COMPL. ##
|
|
## Fixed by: InCube - double troops ##
|
|
## License: TravianZ Project ##
|
|
## Copyright: TravianZ (c) 2010-2018. All rights reserved. ##
|
|
## URLs: http://travian.shadowss.ro ##
|
|
## Source code: https://github.com/Shadowss/TravianZ ##
|
|
## ##
|
|
#################################################################################
|
|
|
|
class Automation {
|
|
|
|
private $bountyresarray = [];
|
|
private $bountyinfoarray = [];
|
|
private $bountyproduction = [];
|
|
private $bountyocounter = [];
|
|
private $bountyunitall = [];
|
|
private $bountypop;
|
|
private $bountyOresarray = [];
|
|
private $bountyOinfoarray = [];
|
|
private $bountyOproduction = [];
|
|
private $bountyOpop = 1;
|
|
|
|
public function __construct() {
|
|
$this->procNewClimbers();
|
|
$this->ClearUser();
|
|
$this->ClearInactive();
|
|
//$this->oasisResourcesProduce();
|
|
$this->pruneResource();
|
|
$this->pruneOResource();
|
|
$this->checkWWAttacks();
|
|
if(!file_exists("GameEngine/Prevention/culturepoints.txt") or time() - filemtime("GameEngine/Prevention/culturepoints.txt") > 50) {
|
|
$this->culturePoints();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/updatehero.txt") or time() - filemtime("GameEngine/Prevention/updatehero.txt") > 50) {
|
|
$this->updateHero();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/cleardeleting.txt") or time() - filemtime("GameEngine/Prevention/cleardeleting.txt") > 50) {
|
|
$this->clearDeleting();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/build.txt") or time() - filemtime("GameEngine/Prevention/build.txt") > 50)
|
|
{
|
|
$this->buildComplete();
|
|
}
|
|
$this->MasterBuilder();
|
|
if(!file_exists("GameEngine/Prevention/demolition.txt") or time() - filemtime("GameEngine/Prevention/demolition.txt") > 50)
|
|
{
|
|
$this->demolitionComplete();
|
|
}
|
|
$this->delTradeRoute();
|
|
$this->TradeRoute();
|
|
if(!file_exists("GameEngine/Prevention/market.txt") or time() - filemtime("GameEngine/Prevention/market.txt") > 50) {
|
|
$this->marketComplete();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/research.txt") or time() - filemtime("GameEngine/Prevention/research.txt") > 50) {
|
|
$this->researchComplete();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/training.txt") or time() - filemtime("GameEngine/Prevention/training.txt") > 50) {
|
|
$this->trainingComplete();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/starvation.txt") or time() - filemtime("GameEngine/Prevention/starvation.txt") > 50) {
|
|
$this->starvation();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/celebration.txt") or time() - filemtime("GameEngine/Prevention/celebration.txt") > 50) {
|
|
$this->celebrationComplete();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/sendunits.txt") or time() - filemtime("GameEngine/Prevention/sendunits.txt") > 50) {
|
|
$this->sendunitsComplete();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/loyalty.txt") or time() - filemtime("GameEngine/Prevention/loyalty.txt") > 60) {
|
|
$this->loyaltyRegeneration();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/sendreinfunits.txt") or time() - filemtime("GameEngine/Prevention/sendreinfunits.txt") > 50) {
|
|
$this->sendreinfunitsComplete();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/returnunits.txt") or time() - filemtime("GameEngine/Prevention/returnunits.txt") > 50) {
|
|
$this->returnunitsComplete();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/settlers.txt") or time() - filemtime("GameEngine/Prevention/settlers.txt") > 50) {
|
|
$this->sendSettlersComplete();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/spawnNatars.txt") or time() - filemtime("GameEngine/Prevention/spawnNatars.txt") > 120) {
|
|
$this->spawnNatars();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/spawnWWVillages.txt") or time() - filemtime("GameEngine/Prevention/spawnWWVillages.txt") > 120) {
|
|
$this->spawnWWVillages();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/spawnWWBuildingPlans.txt") or time() - filemtime("GameEngine/Prevention/spawnWWBuildingPlans.txt") > 120) {
|
|
$this->spawnWWBuildingPlans();
|
|
}
|
|
if(!file_exists("GameEngine/Prevention/artifacts.txt") or time() - filemtime("GameEngine/Prevention/artifacts.txt") > 60) {
|
|
$this->activateArtifacts();
|
|
}
|
|
$this->updateGeneralAttack();
|
|
$this->checkInvitedPlayes();
|
|
$this->updateStore();
|
|
$this->CheckBan();
|
|
$this->regenerateOasisTroops();
|
|
$this->medals();
|
|
$this->artefactOfTheFool();
|
|
}
|
|
|
|
public function isWinner() {
|
|
global $database;
|
|
// check whether someone already built a level 100 Wonder of the World
|
|
$q = mysqli_fetch_array(mysqli_query($database->dblink,"SELECT Count(*) as Total FROM ".TB_PREFIX."fdata WHERE f99 = 100 and f99t = 40"), MYSQLI_ASSOC);
|
|
if($q['Total'] > 0)
|
|
{
|
|
header('Location: winner.php');
|
|
exit;
|
|
}
|
|
}
|
|
|
|
public function procResType($ref, $mode = 0) {
|
|
global $building;
|
|
//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 $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/loyalty.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/loyalty.txt");
|
|
}
|
|
//fix by ronix
|
|
//create new file to check filetime
|
|
//not every click regenerate but 1 minute or after
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/loyalty.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private function getfieldDistance($coorx1, $coory1, $coorx2, $coory2) {
|
|
$max = 2 * WORLD_MAX + 1;
|
|
$x1 = intval($coorx1);
|
|
$y1 = intval($coory1);
|
|
$x2 = intval($coorx2);
|
|
$y2 = intval($coory2);
|
|
$distanceX = min(abs($x2 - $x1), abs($max - abs($x2 - $x1)));
|
|
$distanceY = min(abs($y2 - $y1), abs($max - abs($y2 - $y1)));
|
|
$dist = sqrt(pow($distanceX, 2) + pow($distanceY, 2));
|
|
return round($dist, 1);
|
|
}
|
|
|
|
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 $autoprefix, $units, $database;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/cleardeleting.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/cleardeleting.txt");
|
|
}
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/cleardeleting.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
|
|
$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 = "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);
|
|
}
|
|
}
|
|
if(file_exists("GameEngine/Prevention/cleardeleting.txt")) {
|
|
unlink("GameEngine/Prevention/cleardeleting.txt");
|
|
}
|
|
}
|
|
|
|
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;
|
|
|
|
if(file_exists("GameEngine/Prevention/culturepoints.txt")) {
|
|
unlink("GameEngine/Prevention/culturepoints.txt");
|
|
}
|
|
|
|
$database->updateVSumField('cp');
|
|
|
|
if(file_exists("GameEngine/Prevention/culturepoints.txt")) {
|
|
unlink("GameEngine/Prevention/culturepoints.txt");
|
|
}
|
|
}
|
|
|
|
private function buildComplete() {
|
|
global $database, $bid18, $bid10, $bid11, $bid38, $bid39;
|
|
|
|
if(file_exists("GameEngine/Prevention/build.txt")) {
|
|
unlink("GameEngine/Prevention/build.txt");
|
|
}
|
|
|
|
$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);
|
|
|
|
// 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 ) . ")" );
|
|
}
|
|
|
|
if(file_exists("GameEngine/Prevention/build.txt")) {
|
|
unlink("GameEngine/Prevention/build.txt");
|
|
}
|
|
}
|
|
|
|
// 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, $autoprefix, $units;
|
|
if(file_exists($autoprefix."GameEngine/Prevention/market.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/market.txt");
|
|
}
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/market.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
$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);
|
|
}
|
|
}
|
|
|
|
if(file_exists("GameEngine/Prevention/market.txt")) {
|
|
unlink("GameEngine/Prevention/market.txt");
|
|
}
|
|
}
|
|
|
|
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) {
|
|
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']['updown'], $tblevel, $battlepart['catapults']['realAttackers'], $data['t8']);
|
|
|
|
// 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) {
|
|
if($pop == 0 && $can_destroy == 1) $village_destroyed = 1;
|
|
}
|
|
|
|
if ($isSecondRow) {
|
|
if ($tbid > 0) {
|
|
$info_cat .= "<tbody class=\"goods\"><tr><th>Information</th><td colspan=\"11\">
|
|
<img class=\"unit u".$catp_pic."\" src=\"img/x.gif\" alt=\"Catapult\" title=\"Catapult\" /> ".$this->procResType($tbgid, $can_destroy)." <b>destroyed</b>.";
|
|
}
|
|
|
|
// embassy level was changed
|
|
if ($tbgid==18){
|
|
$info_cat .= $database->checkEmbassiesAfterBattle($data['to'], $bdo['f'.$catapultTarget], false);
|
|
}
|
|
|
|
$info_cat .= "</td></tr></tbody>";
|
|
} else {
|
|
$info_cat = "".$catp_pic.", ".$this->procResType($tbgid, $can_destroy)." <b>destroyed</b>.";
|
|
|
|
// 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 .= "<tbody class=\"goods\"><tr><th>Information</th><td colspan=\"11\">
|
|
<img class=\"unit u".$catp_pic."\" src=\"img/x.gif\" alt=\"Catapult\" title=\"Catapult\" /> ".$this->procResType($tbgid, $can_destroy)." was not damaged.</td></tr></tbody>";
|
|
}
|
|
} else {
|
|
$info_cat = "".$catp_pic.",".$this->procResType($tbgid, $can_destroy)." was not damaged.";
|
|
}
|
|
}
|
|
else
|
|
// building/field was damaged, let's calculate the actual damage
|
|
{
|
|
// 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 <b>".$tblevel."</b> to level <b>".$newLevel."</b>.";
|
|
|
|
$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 .= "<tbody class=\"goods\"><tr><th>Information</th><td colspan=\"11\">
|
|
<img class=\"unit u".$catp_pic."\" src=\"img/x.gif\" alt=\"Catapult\" title=\"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 .= "</td></tr></tbody>";
|
|
} 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 .= "<tbody class=\"goods\"><tr><th>Information</th><td colspan=\"11\">
|
|
<img class=\"unit u".$catp_pic."\" src=\"img/x.gif\" alt=\"Catapult\" title=\"Catapult\" /> There are no buildings left to destroy.</td></tr></tbody>";
|
|
}
|
|
}
|
|
}
|
|
|
|
private function sendunitsComplete() {
|
|
global $bid19, $bid23, $bid34, $u99, $database, $battle, $technology, $logging, $generator, $units, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/sendunits.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/sendunits.txt");
|
|
}
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/sendunits.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
$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']);
|
|
|
|
if ($isoasis == 0){ //village
|
|
$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']) || $to['name'] == '') $to['name'] = "[?]";
|
|
|
|
$DefenderUnit = [];
|
|
$DefenderUnit = $database->getUnit($data['to']);
|
|
$evasion = $toF["evasion"];
|
|
$maxevasion = $DefenderUserData["maxevasion"];
|
|
$gold = $DefenderUserData["gold"];
|
|
$playerunit = (($targettribe - 1) * 10);
|
|
$cannotsend = 0;
|
|
$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 = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if($evasion == 1 && $maxevasion > 0 && $gold > 1 && $cannotsend == 0 && $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;
|
|
}
|
|
else $empty = 1;
|
|
}
|
|
|
|
$tblevel = 1;
|
|
$stonemason = $database->getFieldLevelInVillage($data['to'], 34);
|
|
|
|
/*--------------------------------
|
|
// End village Battle part
|
|
--------------------------------*/
|
|
}else{
|
|
$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 = 1;
|
|
$att_tribe = $owntribe;
|
|
$def_tribe = $targettribe;
|
|
$residence = 0;
|
|
$attpop = 0;
|
|
$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;
|
|
|
|
$empty = 1;
|
|
$tblevel = 0;
|
|
$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['u54'];
|
|
|
|
//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);
|
|
|
|
//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'], $to['owner']);
|
|
$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, $to['owner']);
|
|
$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;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 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;
|
|
|
|
if($isoasis == 0)
|
|
{
|
|
if ($type == 3)
|
|
{
|
|
if (($data['t7'] - $traped7) > 0){
|
|
$newLevel = $battle->CalculateNewBuildingLevel($battlepart['rams']['moral'], $battlepart['rams']['updown'], $walllevel, $battlepart['rams']['realAttackers'], $data['t7']);
|
|
if (isset($empty)){
|
|
$info_ram = "".$ram_pic.",There is no wall to destroy.";
|
|
} elseif ($newLevel == 0){
|
|
$info_ram = "".$ram_pic.",Wall <b>destroyed</b>.";
|
|
$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 <b>".$walllevel."</b> to level <b>".$newLevel."</b>.";
|
|
$database->setVillageLevel($data['to'],"f".$wallid."",$newLevel);
|
|
}
|
|
}
|
|
|
|
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);
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
// 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;
|
|
|
|
//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 <b>".floor($toF['loyalty'])."</b> to <b>".floor($toF['loyalty'] - $reducedLoyaltyTotal)."</b>.";
|
|
$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){
|
|
$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 <b>".$heroxp."</b> XP from the battle.";
|
|
$info_hero = $hero_pic.",Your hero gained <b>".$heroxp."</b> 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 {
|
|
global $form;
|
|
if ($heroxp == 0) $xp=" no XP from the battle.";
|
|
else $xp=" gained <b>".$heroxp."</b> XP from the battle.";
|
|
|
|
$artifact = reset($database->getOwnArtefactInfo($data['to']));
|
|
if (!empty($artifact)) {
|
|
if ($type == 3) {
|
|
if ($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 <b>".$artifact['name']."</b> and".$xp;
|
|
|
|
// if the defender pop is 0 with no artefact, then destroy the village
|
|
if($database->getVillageField($data['to'], "pop") == 0){
|
|
$can_destroy = $village_destroyed = 1;
|
|
$info_hero .= " The village has been destroyed.";
|
|
}
|
|
}
|
|
else $info_hero = $hero_pic.",".$form->getError("error").$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 <b>".$heroxp."</b> 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.",<div class=\"res\"><img class=\"r1\" src=\"img/x.gif\" alt=\"Lumber\" title=\"Lumber\" />".round($totwood)." |
|
|
<img class=\"r2\" src=\"img/x.gif\" alt=\"Clay\" title=\"Clay\" />".round($totclay)." |
|
|
<img class=\"r3\" src=\"img/x.gif\" alt=\"Iron\" title=\"Iron\" />".round($totiron)." |
|
|
<img class=\"r4\" src=\"img/x.gif\" alt=\"Crop\" title=\"Crop\" />".round($totcrop)."</div>
|
|
<div class=\"carry\"><img class=\"car\" src=\"img/x.gif\" alt=\"carry\" title=\"carry\" />Total Resources: ".round($totwood+$totclay+$totiron+$totcrop)."</div>
|
|
";
|
|
}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 = "<img src=\"".GP_LOCATE."img/g/g25.gif\" height=\"20\" width=\"15\" alt=\"Residence\" title=\"Residence\" />";
|
|
$palaceimg = "<img src=\"".GP_LOCATE."img/g/g26.gif\" height=\"20\" width=\"15\" alt=\"Palace\" title=\"Palace\" />";
|
|
$crannyimg = "<img src=\"".GP_LOCATE."img/g/g23.gif\" height=\"20\" width=\"15\" alt=\"Cranny\" title=\"Cranny\" />";
|
|
$wallimg = "<img src=\"".GP_LOCATE."img/g/g3".$targettribe."Icon.gif\" height=\"20\" width=\"15\" alt=\"Wall\" title=\"Wall\" />";
|
|
$info_spy = "".$spy_pic.",";
|
|
if($residencelevel > 0) $info_spy .= $residenceimg." Residence level:<b>".$residencelevel."</b><br />";
|
|
elseif($palacelevel > 0) $info_spy .= $palaceimg." Palace level: <b>".$palacelevel."</b><br />";
|
|
|
|
if($walllevel > 0) $info_spy .= $wallimg." Wall level: <b>".$walllevel."</b><br />";
|
|
$info_spy .= $crannyimg." Total crannies capacity: <b>".$crannySpy."</b>";
|
|
}
|
|
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 .= "<tbody class=\"goods\"><tr><th>Information</th><td colspan=\"11\">
|
|
<img class=\"unit u".$catp_pic."\" src=\"img/x.gif\" alt=\"Catapult\" title=\"Catapult\" /> The village has been destroyed.</td></tr></tbody>";
|
|
}
|
|
}
|
|
$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;
|
|
}
|
|
|
|
// When all troops die, sends no info...send info
|
|
$info_troop= "None of your soldiers have returned";
|
|
$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 <b>".$ownAlive."</b> have been saved" : "";
|
|
$anotherDeadsText = ($anotherAlive = $anothertroops - $anotherDeads) > 0 ? " of which <b>".$anotherAlive."</b> 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 = "<img src=\"".GP_LOCATE."img/u/98.gif\" alt=\"Trap\" title=\"Trap\" />";
|
|
$p_username = $database->getUserField($from['owner'], "username", 0);
|
|
|
|
if($mytroops > 0 && $anothertroops > 0){
|
|
$info_trap = "".$trapper_pic." <b>".$p_username."</b> freed <b>".$mytroops."</b> from his troops".$ownDeadsText." and <b>".$anothertroops."</b> friendly troops".$anotherDeadsText.".";
|
|
}elseif($mytroops > 0){
|
|
$info_trap = "".$trapper_pic." <b>".$p_username."</b> freed <b>".$mytroops."</b> from his troops".$ownDeadsText.".";
|
|
}elseif($anothertroops > 0){
|
|
$info_trap = "".$trapper_pic." <b>".$p_username."</b> freed <b>".$anothertroops."</b> friendly troops".$anotherDeadsText.".";
|
|
}
|
|
}
|
|
}
|
|
|
|
$info_troop = "";
|
|
$data2 = $data2.','.(isset($info_trap) ? addslashes($info_trap) : '').',,'.$info_troop.','.$info_hero;
|
|
|
|
if($totalsend_alldef == 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);
|
|
|
|
#################################################
|
|
|
|
}
|
|
}
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/sendunits.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/sendunits.txt");
|
|
}
|
|
}
|
|
|
|
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, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/sendreinfunits.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/sendreinfunits.txt");
|
|
}
|
|
$time = time();
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/sendreinfunits.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
$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));
|
|
}
|
|
|
|
if(file_exists("GameEngine/Prevention/sendreinfunits.txt")) {
|
|
unlink("GameEngine/Prevention/sendreinfunits.txt");
|
|
}
|
|
}
|
|
|
|
private function returnunitsComplete() {
|
|
global $database, $autoprefix;
|
|
if(file_exists($autoprefix."GameEngine/Prevention/returnunits.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/returnunits.txt");
|
|
}
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/returnunits.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
$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);
|
|
|
|
// because of a yet-to-be-discovered but, movements sometimes get inserted into the database twice,
|
|
// so we need to de-duplicate them here by checking for the same wave properties sent out at the
|
|
// same time (i.e. with exactly the same timestamp)
|
|
$wavesData = [];
|
|
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) {
|
|
if (!isset($wavesData[$data['from'].$data['to'].$data['starttime'].$data['endtime']])) {
|
|
$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']);
|
|
|
|
// make sure we don't process duplicate movements until the big bad bug which inserts them into DB is fixed
|
|
$wavesData[$data['from'].$data['to'].$data['starttime'].$data['endtime']] = true;
|
|
} // duplicate record, just mark it as processed
|
|
else $movementProcIDs[] = $data['moveid'];
|
|
}
|
|
$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));
|
|
}
|
|
|
|
if(file_exists("GameEngine/Prevention/returnunits.txt")) {
|
|
unlink("GameEngine/Prevention/returnunits.txt");
|
|
}
|
|
}
|
|
|
|
private function sendSettlersComplete() {
|
|
global $database, $building, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/settlers.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/settlers.txt");
|
|
}
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/settlers.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
$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);
|
|
|
|
if(file_exists("GameEngine/Prevention/settlers.txt")) {
|
|
unlink("GameEngine/Prevention/settlers.txt");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create the Natars account and spawn artifacts
|
|
*
|
|
*/
|
|
|
|
private function spawnNatars(){
|
|
global $database, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/spawnNatars.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/spawnNatars.txt");
|
|
}
|
|
|
|
//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() || COMMENCE + (NATARS_SPAWN_TIME * 86400) > time()) return;
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/spawnNatars.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
|
|
//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" => 5, "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);
|
|
|
|
if(file_exists("GameEngine/Prevention/spawnNatars.txt")) {
|
|
unlink("GameEngine/Prevention/spawnNatars.txt");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Spawn WW Villages
|
|
*
|
|
*/
|
|
|
|
private function spawnWWVillages(){
|
|
global $database, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/spawnWWVillages.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/spawnWWVillages.txt");
|
|
}
|
|
|
|
//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() || COMMENCE + (NATARS_WW_SPAWN_TIME * 86400) > time()) return;
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/spawnWWVillages.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
|
|
//WW village Natars' troops
|
|
$unitArrays = [41 => rand(50, 1200) * NATARS_UNITS,
|
|
42 => rand(100 , 1400) * NATARS_UNITS,
|
|
43 => rand(200, 1600) * NATARS_UNITS,
|
|
44 => rand(10, 50) * NATARS_UNITS,
|
|
45 => rand(48, 1700) * NATARS_UNITS,
|
|
46 => rand(60, 1800) * NATARS_UNITS,
|
|
47 => rand(200, 1600) * NATARS_UNITS,
|
|
48 => rand(40, 200) * NATARS_UNITS,
|
|
49 => rand(4, 20) * NATARS_UNITS,
|
|
50 => rand(5, 25) * 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);
|
|
}
|
|
|
|
if(file_exists("GameEngine/Prevention/spawnWWVillages.txt")) {
|
|
unlink("GameEngine/Prevention/spawnWWVillages.txt");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Spawn WW Building plans
|
|
*
|
|
*/
|
|
|
|
private function spawnWWBuildingPlans(){
|
|
global $database, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/spawnWWBuildingPlans.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/spawnWWBuildingPlans.txt");
|
|
}
|
|
|
|
//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) || COMMENCE + (NATARS_WW_BUILDING_PLAN_SPAWN_TIME * 86400) > time()) return;
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/spawnWWBuildingPlans.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
|
|
$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);
|
|
|
|
if(file_exists("GameEngine/Prevention/spawnWWBuildingPlans.txt")) {
|
|
unlink("GameEngine/Prevention/spawnWWBuildingPlans.txt");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Automatically activate all artifacts that need to be activated
|
|
*
|
|
*/
|
|
|
|
private function activateArtifacts() {
|
|
global $database, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/artifacts.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/artifacts.txt");
|
|
}
|
|
|
|
//Check if there's at least one artifact, if not, return
|
|
if(!$database->areArtifactsSpawned()) return;
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/artifacts.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
|
|
//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']++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(file_exists("GameEngine/Prevention/artifacts.txt")) {
|
|
unlink("GameEngine/Prevention/artifacts.txt");
|
|
}
|
|
}
|
|
|
|
private function researchComplete() {
|
|
global $database, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/research.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/research.txt");
|
|
}
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/research.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
|
|
$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 );
|
|
}
|
|
|
|
if(file_exists("GameEngine/Prevention/research.txt")) {
|
|
unlink("GameEngine/Prevention/research.txt");
|
|
}
|
|
}
|
|
|
|
private function updateRes($bountywid, $uid) {
|
|
$this->bountyLoadTown($bountywid);
|
|
$this->bountycalculateProduction($bountywid, $uid);
|
|
$this->bountyprocessProduction($bountywid);
|
|
}
|
|
|
|
private function updateORes($bountywid) {
|
|
$this->bountyLoadOTown($bountywid);
|
|
$this->bountycalculateOProduction($bountywid);
|
|
$this->bountyprocessOProduction($bountywid);
|
|
}
|
|
|
|
private function bountyLoadOTown($bountywid) {
|
|
global $database;
|
|
$this->bountyinfoarray = $database->getOasisV($bountywid);
|
|
$this->bountypop = 2;
|
|
}
|
|
|
|
private function bountyLoadTown($bountywid) {
|
|
global $database;
|
|
$this->bountyinfoarray = $database->getVillage($bountywid);
|
|
$this->bountyresarray = $database->getResourceLevel($bountywid);
|
|
$this->bountyoasisowned = $database->getOasis($bountywid);
|
|
$this->bountyocounter = $this->bountysortOasis();
|
|
$this->bountypop = $this->bountyinfoarray['pop'];
|
|
}
|
|
|
|
private function bountysortOasis() {
|
|
$crop = $clay = $wood = $iron = 0;
|
|
foreach ($this->bountyoasisowned 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 bountycalculateOProduction($bountywid) {
|
|
$this->bountyOproduction['wood'] = OASIS_WOOD_PRODUCTION;
|
|
$this->bountyOproduction['clay'] = OASIS_CLAY_PRODUCTION;
|
|
$this->bountyOproduction['iron'] = OASIS_IRON_PRODUCTION;
|
|
$this->bountyOproduction['crop'] = OASIS_CROP_PRODUCTION;
|
|
}
|
|
|
|
private function bountycalculateProduction($bountywid, $uid) {
|
|
global $technology;
|
|
|
|
$upkeep = $technology->getUpkeep($this->getAllUnits($bountywid), 0, $bountywid);
|
|
$this->bountyproduction['wood'] = $this->bountyGetWoodProd();
|
|
$this->bountyproduction['clay'] = $this->bountyGetClayProd();
|
|
$this->bountyproduction['iron'] = $this->bountyGetIronProd();
|
|
$this->bountyproduction['crop'] = $this->bountyGetCropProd() - $this->bountypop - $upkeep;
|
|
}
|
|
|
|
private function bountyprocessProduction($bountywid) {
|
|
global $database;
|
|
|
|
$timepast = time() - $this->bountyinfoarray['lastupdate'];
|
|
$nwood = ($this->bountyproduction['wood'] / 3600) * $timepast;
|
|
$nclay = ($this->bountyproduction['clay'] / 3600) * $timepast;
|
|
$niron = ($this->bountyproduction['iron'] / 3600) * $timepast;
|
|
$ncrop = ($this->bountyproduction['crop'] / 3600) * $timepast;
|
|
$database->modifyResource($bountywid, $nwood, $nclay, $niron, $ncrop, 1);
|
|
$database->updateVillage($bountywid);
|
|
}
|
|
private function bountyprocessOProduction($bountywid) {
|
|
global $database;
|
|
|
|
$timepast = time() - $this->bountyinfoarray['lastupdated'];
|
|
$nwood = ($this->bountyOproduction['wood'] / 3600) * $timepast;
|
|
$nclay = ($this->bountyOproduction['clay'] / 3600) * $timepast;
|
|
$niron = ($this->bountyOproduction['iron'] / 3600) * $timepast;
|
|
$ncrop = ($this->bountyOproduction['crop'] / 3600) * $timepast;
|
|
$database->modifyOasisResource($bountywid, $nwood, $nclay, $niron, $ncrop, 1);
|
|
$database->updateOasis($bountywid);
|
|
}
|
|
|
|
private function bountyGetWoodProd() {
|
|
global $bid1, $bid5;
|
|
|
|
$wood = $sawmill = 0;
|
|
$woodholder = [];
|
|
for($i = 1; $i <= 38; $i++) {
|
|
if($this->bountyresarray['f'.$i.'t'] == 1) array_push($woodholder,'f'.$i);
|
|
if($this->bountyresarray['f'.$i.'t'] == 5) $sawmill = $this->bountyresarray['f'.$i];
|
|
}
|
|
|
|
for($i = 0; $i <= count($woodholder) - 1; $i++) $wood += $bid1[$this->bountyresarray[$woodholder[$i]]]['prod'];
|
|
|
|
if($sawmill >= 1) $wood += $wood / 100 * $bid5[$sawmill]['attri'];
|
|
if($this->bountyocounter[0] != 0) $wood += $wood * 0.25 * $this->bountyocounter[0];
|
|
|
|
return round($wood * SPEED);
|
|
}
|
|
|
|
private function bountyGetClayProd() {
|
|
global $bid2, $bid6;
|
|
|
|
$clay = $brick = 0;
|
|
$clayholder = [];
|
|
for($i = 1; $i <= 38; $i++) {
|
|
if($this->bountyresarray['f'.$i.'t'] == 2) array_push($clayholder,'f'.$i);
|
|
if($this->bountyresarray['f'.$i.'t'] == 6) $brick = $this->bountyresarray['f'.$i];
|
|
}
|
|
|
|
for($i = 0; $i <= count($clayholder) - 1; $i++) $clay+= $bid2[$this->bountyresarray[$clayholder[$i]]]['prod'];
|
|
|
|
if($brick >= 1) $clay += $clay / 100 * $bid6[$brick]['attri'];
|
|
if($this->bountyocounter[1] != 0) $clay += $clay * 0.25 * $this->bountyocounter[1];
|
|
|
|
return round($clay * SPEED);
|
|
}
|
|
|
|
private function bountyGetIronProd() {
|
|
global $bid3, $bid7;
|
|
|
|
$iron = $foundry = 0;
|
|
$ironholder = [];
|
|
for($i = 1; $i <= 38; $i++) {
|
|
if($this->bountyresarray['f'.$i.'t'] == 3) array_push($ironholder,'f'.$i);
|
|
if($this->bountyresarray['f'.$i.'t'] == 7) $foundry = $this->bountyresarray['f'.$i];
|
|
}
|
|
|
|
for($i = 0; $i <= count($ironholder) - 1; $i++) $iron+= $bid3[$this->bountyresarray[$ironholder[$i]]]['prod'];
|
|
|
|
if($foundry >= 1) $iron += $iron / 100 * $bid7[$foundry]['attri'];
|
|
if($this->bountyocounter[2] != 0) $iron += $iron * 0.25 * $this->bountyocounter[2];
|
|
|
|
return round($iron * SPEED);
|
|
}
|
|
|
|
private function bountyGetCropProd() {
|
|
global $bid4, $bid8, $bid9;
|
|
|
|
$crop = $grainmill = $bakery = 0;
|
|
$cropholder = [];
|
|
for($i = 1; $i <= 38;$i++) {
|
|
if($this->bountyresarray['f'.$i.'t'] == 4) array_push($cropholder,'f'.$i);
|
|
if($this->bountyresarray['f'.$i.'t'] == 8) $grainmill = $this->bountyresarray['f'.$i];
|
|
if($this->bountyresarray['f'.$i.'t'] == 9) $bakery = $this->bountyresarray['f'.$i];
|
|
}
|
|
for($i = 0; $i <= count($cropholder) - 1; $i++) $crop+= $bid4[$this->bountyresarray[$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($this->bountyocounter[3] != 0) $crop += $crop * 0.25 * $this->bountyocounter[3];
|
|
|
|
if(!empty($bountyresarray['vref']) && is_numeric($bountyresarray['vref'])){
|
|
$who=$database->getVillageField($bountyresarray['vref'],"owner");
|
|
$croptrue = $database->getUserField($who, "b4", 0);
|
|
if($croptrue > time()) $crop *= 1.25;
|
|
}
|
|
|
|
return round($crop * SPEED);
|
|
}
|
|
|
|
private function trainingComplete() {
|
|
global $database, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/training.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/training.txt");
|
|
}
|
|
|
|
$time = time();
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/training.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
$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']);
|
|
}
|
|
}
|
|
if(file_exists("GameEngine/Prevention/training.txt")) {
|
|
unlink("GameEngine/Prevention/training.txt");
|
|
}
|
|
}
|
|
|
|
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, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/celebration.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/celebration.txt");
|
|
}
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/celebration.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
|
|
$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);
|
|
}
|
|
|
|
if(file_exists("GameEngine/Prevention/celebration.txt")) {
|
|
unlink("GameEngine/Prevention/celebration.txt");
|
|
}
|
|
}
|
|
|
|
private function demolitionComplete() {
|
|
global $building, $database, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/demolition.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/demolition.txt");
|
|
}
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/demolition.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
|
|
$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'));
|
|
}
|
|
}
|
|
|
|
if(file_exists("GameEngine/Prevention/demolition.txt")) {
|
|
unlink("GameEngine/Prevention/demolition.txt");
|
|
}
|
|
}
|
|
|
|
private function updateHero() {
|
|
global $database, $hero_levels;
|
|
|
|
if(file_exists("GameEngine/Prevention/updatehero.txt")) {
|
|
unlink("GameEngine/Prevention/updatehero.txt");
|
|
}
|
|
|
|
$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).")");
|
|
}
|
|
}
|
|
if(file_exists("GameEngine/Prevention/updatehero.txt")) {
|
|
unlink("GameEngine/Prevention/updatehero.txt");
|
|
}
|
|
|
|
|
|
}
|
|
|
|
// 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){
|
|
$dorf1Buildings = $database->getDorf1Building($master['wid']);
|
|
$bdata = count($dorf1Buildings);
|
|
$bbdata = count($database->getDorf2Building($master['wid']));
|
|
$bdata1 = $dorf1Buildings;
|
|
}else{
|
|
$dorf2Buildings = $database->getDorf2Building($master['wid']);
|
|
$bdata = count($database->getDorf2Building($master['wid']));
|
|
$bbdata = count($database->getDorf1Building($master['wid']));
|
|
$bdata1 = $database->getDorf2Building($master['wid']);
|
|
}
|
|
|
|
}else{
|
|
$dorf1Buildings = $database->getDorf1Building($master['wid']);
|
|
$bdata = $bbdata = count($dorf1Buildings) + count($database->getDorf2Building($master['wid']));
|
|
$bdata1 = $dorf1Buildings;
|
|
}
|
|
|
|
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($bdata < $inbuild && $buildwood < $villwood && $buildclay < $villclay && $buildiron < $villiron && $buildcrop < $villcrop && $usergold > 0){
|
|
$time = $master['timestamp']+time();
|
|
|
|
if(!empty($bdata1)){
|
|
foreach($bdata1 as $master1) {
|
|
$time += ($master1['timestamp'] - time());
|
|
}
|
|
}
|
|
|
|
if($bdata == 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', 'starvupdate'], [$villageUpkeep, time()]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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, $autoprefix;
|
|
|
|
if(file_exists($autoprefix."GameEngine/Prevention/starvation.txt")) {
|
|
unlink($autoprefix."GameEngine/Prevention/starvation.txt");
|
|
}
|
|
|
|
//starvation is disabled during Easter/Holidays/Christmas
|
|
if(PEACE) return;
|
|
|
|
$ourFileHandle = fopen($autoprefix."GameEngine/Prevention/starvation.txt", 'w');
|
|
fclose($ourFileHandle);
|
|
$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);
|
|
}
|
|
|
|
if(file_exists("GameEngine/Prevention/starvation.txt")) {
|
|
unlink("GameEngine/Prevention/starvation.txt");
|
|
}
|
|
}
|
|
|
|
private function procNewClimbers() {
|
|
if(file_exists("GameEngine/Prevention/climbers.txt")) {
|
|
unlink("GameEngine/Prevention/climbers.txt");
|
|
}
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(file_exists("GameEngine/Prevention/climbers.txt")) {
|
|
unlink("GameEngine/Prevention/climbers.txt");
|
|
}
|
|
}
|
|
|
|
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('m/d/Y'))+strtotime(START_TIME);
|
|
if($row['lastgavemedal'] == 0 && $stime < time()){
|
|
$newtime = time()+MEDALINTERVAL;
|
|
$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;
|
|
?>
|