From 39acea80a8b45421cae24d67380cbaf7479450f6 Mon Sep 17 00:00:00 2001 From: Catalin Novgorodschi <1140613+Shadowss@users.noreply.github.com> Date: Thu, 7 May 2026 12:34:31 +0300 Subject: [PATCH] Incremental Refactor Templates 4 Incremental Refactor Templates 4 + Notice bugfix --- GameEngine/Artifacts.php | 1027 ++++++++++++++++++++---------------- Templates/Notice/1.tpl | 12 +- Templates/Notice/10.tpl | 14 +- Templates/Notice/15.tpl | 14 +- Templates/Notice/3.tpl | 14 +- Templates/Notice/8.tpl | 14 +- Templates/Notice/index.php | 38 +- 7 files changed, 638 insertions(+), 495 deletions(-) diff --git a/GameEngine/Artifacts.php b/GameEngine/Artifacts.php index c005d218..9b2a71fc 100644 --- a/GameEngine/Artifacts.php +++ b/GameEngine/Artifacts.php @@ -1,527 +1,668 @@ - [["type" => 1, "size" => 1, "name" => ARCHITECTS_SMALL, "vname" => ARCHITECTS_SMALLVILLAGE, "effect" => "(4x)", "quantity" => 6, "img" => 2], - ["type" => 1, "size" => 2, "name" => ARCHITECTS_LARGE, "vname" => ARCHITECTS_LARGEVILLAGE, "effect" => "(3x)", "quantity" => 4, "img" => 2], - ["type" => 1, "size" => 3, "name" => ARCHITECTS_UNIQUE,"vname" => ARCHITECTS_UNIQUEVILLAGE, "effect" => "(5x)", "quantity" => 1, "img" => 2]], - - HASTE_DESC => [["type" => 2, "size" => 1, "name" => HASTE_SMALL, "vname" => HASTE_SMALLVILLAGE, "effect" => "(2x)", "quantity" => 6, "img" => 4], - ["type" => 2, "size" => 2, "name" => HASTE_LARGE, "vname" => HASTE_LARGEVILLAGE, "effect" => "(1.5x)", "quantity" => 4, "img" => 4], - ["type" => 2, "size" => 3, "name" => HASTE_UNIQUE, "vname" => HASTE_UNIQUEVILLAGE, "effect" => "(3x)", "quantity" => 1, "img" => 4]], - - EYESIGHT_DESC => [["type" => 3, "size" => 1, "name" => EYESIGHT_SMALL, "vname" => EYESIGHT_SMALLVILLAGE, "effect" => "(5x)", "quantity" => 6, "img" => 5], - ["type" => 3, "size" => 2, "name" => EYESIGHT_LARGE, "vname" => EYESIGHT_LARGEVILLAGE, "effect" => "(3x)", "quantity" => 4, "img" => 5], - ["type" => 3, "size" => 3, "name" => EYESIGHT_UNIQUE, "vname" => EYESIGHT_UNIQUEVILLAGE, "effect" => "(10x)", "quantity" => 1, "img" => 5]], - - DIET_DESC => [["type" => 4, "size" => 1, "name" => DIET_SMALL, "vname" => DIET_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 6], - ["type" => 4, "size" => 2, "name" => DIET_LARGE, "vname" => DIET_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 6], - ["type" => 4, "size" => 3, "name" => DIET_UNIQUE, "vname" => DIET_UNIQUEVILLAGE, "effect" => "(50%)", "quantity" => 1, "img" => 6]], - - ACADEMIC_DESC => [["type" => 5, "size" => 1, "name" => ACADEMIC_SMALL, "vname" => ACADEMIC_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 8], - ["type" => 5, "size" => 2, "name" => ACADEMIC_LARGE, "vname" => ACADEMIC_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 8], - ["type" => 5, "size" => 3, "name" => ACADEMIC_UNIQUE, "vname" => ACADEMIC_UNIQUEVILLAGE, "effect" => "(50%)", "quantity" => 1, "img" => 8]], - - STORAGE_DESC => [["type" => 6, "size" => 1, "name" => STORAGE_SMALL, "vname" => STORAGE_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 9], - ["type" => 6, "size" => 2, "name" => STORAGE_LARGE, "vname" => STORAGE_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 9]], - - CONFUSION_DESC => [["type" => 7, "size" => 1, "name" => CONFUSION_SMALL, "vname" => CONFUSION_SMALLVILLAGE, "effect" => "(200)", "quantity" => 6, "img" => 10], - ["type" => 7, "size" => 2, "name" => CONFUSION_LARGE, "vname" => CONFUSION_LARGEVILLAGE, "effect" => "(100)", "quantity" => 4, "img" => 10], - ["type" => 7, "size" => 3, "name" => CONFUSION_UNIQUE, "vname" => CONFUSION_UNIQUEVILLAGE, "effect" => "(500)", "quantity" => 1, "img" => 10]], - - FOOL_DESC => [["type" => 8, "size" => 1, "name" => FOOL_SMALL, "vname" => FOOL_SMALLVILLAGE, "effect" => "", "quantity" => 10, "img" => "fool"], - 2 => ["type" => 8, "size" => 3, "name" => FOOL_UNIQUE, "vname" => FOOL_UNIQUEVILLAGE, "effect" => "", "quantity" => 1, "img" => "fool"]]], - - /** - * @var array WW building plans Natars' artifacts - */ - - NATARS_WW_BUILDING_PLANS = [PLAN_DESC => [["type" => 11, "size" => 1, "name" => PLAN, "vname" => PLANVILLAGE, "effect" => "", "quantity" => 13, "img" => 1]]], - - /** - * @var array Natars' normal artifacts buildings - */ - - NATARS_ARTIFACTS_BUILDINGS = [ - //Treasury of the 20th level, Residence of the 10th level, Rally Point of the 1th level - "f22t" => 27, "f22" => 20, "f28t" => 25, "f28" => 10, "f39t" => 16, "f39" => 1, - //18 Cranny of the 10th level - "f19t" => 23, "f19" => 10, "f20t" => 23, "f20" => 10, "f21t" => 23, "f21" => 10, - "f23t" => 23, "f23" => 10, "f24t" => 23, "f24" => 10, "f25t" => 23, "f25" => 10, - "f26t" => 23, "f26" => 10, "f27t" => 23, "f27" => 10, "f29t" => 23, "f29" => 10, - "f30t" => 23, "f30" => 10, "f31t" => 23, "f31" => 10, "f32t" => 23, "f32" => 10, - "f33t" => 23, "f33" => 10, "f34t" => 23, "f34" => 10, "f35t" => 23, "f35" => 10, - "f36t" => 23, "f36" => 10, "f37t" => 23, "f37" => 10, "f38t" => 23, "f38" => 10], - - - /** - * @var array Natars' WW villages buildings - */ - - NATARS_WW_VILLAGES_BUILDINGS = [ - //WW of the 0th level, Main Building of the 10th level, Marketplace of the 1th level - "f99t" => 40, "f99" => 0, "f22t" => 15, "f22" => 10, "f34t" => 17, "f34" => 1, - //Warehouse of the 20th & 10th level, Granary of the 20th & 10th level - "f20t" => 10, "f20" => 20, "f19t" => 10, "f19" => 10, "f23t" => 11, "f23" => 20, "f27t" => 11, "f27" => 10, - //All Woodcutter of the 5th level - "f1" => 5, "f3" => 5, "f14" => 5, "f17" => 5, - //All Clay Pit of the 5th level - "f5" => 5, "f6" => 5, "f16" => 5, "f18" => 5, - //All Iron Mine of the 5th level - "f4" => 5, "f7" => 5, "f10" => 5, "f11" => 5, - //All Cropland of the 6th level - "f2" => 6, "f8" => 6, "f9" => 6, "f12" => 6, "f13" => 6, "f15" => 6], - - /** - * @var int The base amount of Natars' spying units, used when Natars account is created - */ - - NATARS_BASE_SPY = 1500, + const NATARS_UID = 3; // Natars user ID + const NATARS_TRIBE = 5; // Natars tribe ID + + const NATARS_EMAIL = TRIBE5 . "natars@travian.com"; + + const NATARS_DESC = "************************** +[#natars] +**************************"; /** - * @var int the base amount of Natars' WW villages + * Helper: speed factor for time-based systems + * (centralized to avoid duplication) */ - - NATARS_BASE_WW_VILLAGES = 13; - - public - - /** - * @var funct Natars' troops for normal artifact - */ - - $natarsArtifactsUnits, - - /** - * @var funct WW villages Natars' troops - */ - - $natarsWWVillagesUnits; - - public function __construct(){ - - $this->natarsArtifactsUnits = function($multiplier){ - return [41 => rand(1000 * $multiplier, 2000 * $multiplier) * NATARS_UNITS, - 42 => rand(1500 * $multiplier, 2000 * $multiplier) * NATARS_UNITS, - 43 => rand(2300 * $multiplier, 2800 * $multiplier) * NATARS_UNITS, - 44 => rand(25 * $multiplier, 75 * $multiplier) * NATARS_UNITS, - 45 => rand(1200 * $multiplier, 1900 * $multiplier) * NATARS_UNITS, - 46 => rand(1500 * $multiplier, 2000 * $multiplier) * NATARS_UNITS, - 47 => rand(500 * $multiplier, 900 * $multiplier) * NATARS_UNITS, - 48 => rand(100 * $multiplier, 300 * $multiplier) * NATARS_UNITS, - 49 => rand(1 * $multiplier, 5 * $multiplier) * NATARS_UNITS, - 50 => rand(1 * $multiplier, 5 * $multiplier) * NATARS_UNITS]; - }; - - $this->natarsWWVillagesUnits = function(){ - return [41 => rand(500, 12000) * NATARS_UNITS, - 42 => rand(1000 , 14000) * NATARS_UNITS, - 43 => rand(2000, 16000) * NATARS_UNITS, - 44 => rand(100, 500) * NATARS_UNITS, - 45 => rand(480, 17000) * NATARS_UNITS, - 46 => rand(600, 18000) * NATARS_UNITS, - 47 => rand(2000, 16000) * NATARS_UNITS, - 48 => rand(400, 2000) * NATARS_UNITS, - 49 => rand(40, 200) * NATARS_UNITS, - 50 => rand(50, 250) * NATARS_UNITS]; - }; - + private function getSpeedFactor() + { + if (SPEED == 2) return 1.5; + if (SPEED == 3) return 2; + return SPEED; } - + /** - * Called when Natars account needs to be created, creates his account and capital village - * + * Helper: artifact activation time */ - - public function createNatars(){ + private function getActivationTime() + { + return 86400 / $this->getSpeedFactor(); + } + + /* + |-------------------------------------------------------------------------- + | NATARS CAPITAL LOCATIONS + |-------------------------------------------------------------------------- + */ + + const NATARS_CAPITAL_COORDINATES = [ + [WORLD_MAX, WORLD_MAX], + [WORLD_MAX, 0], + [WORLD_MAX, -WORLD_MAX], + [0, -WORLD_MAX], + [-WORLD_MAX, -WORLD_MAX], + [-WORLD_MAX, 0], + [-WORLD_MAX, WORLD_MAX], + [0, WORLD_MAX], + [WORLD_MAX / 10, WORLD_MAX / 20], + [WORLD_MAX / 10, -WORLD_MAX / 10], + [-WORLD_MAX / 20, -WORLD_MAX / 10], + [-WORLD_MAX / 10, 0], + [-WORLD_MAX / 20, WORLD_MAX / 10] + ]; + + /* + |-------------------------------------------------------------------------- + | ARTIFACT DEFINITIONS + |-------------------------------------------------------------------------- + */ + + const NATARS_ARTIFACTS = [ + ARCHITECTS_DESC => [ + ["type" => 1, "size" => 1, "name" => ARCHITECTS_SMALL, "vname" => ARCHITECTS_SMALLVILLAGE, "effect" => "(4x)", "quantity" => 6, "img" => 2], + ["type" => 1, "size" => 2, "name" => ARCHITECTS_LARGE, "vname" => ARCHITECTS_LARGEVILLAGE, "effect" => "(3x)", "quantity" => 4, "img" => 2], + ["type" => 1, "size" => 3, "name" => ARCHITECTS_UNIQUE, "vname" => ARCHITECTS_UNIQUEVILLAGE, "effect" => "(5x)", "quantity" => 1, "img" => 2], + ], + + HASTE_DESC => [ + ["type" => 2, "size" => 1, "name" => HASTE_SMALL, "vname" => HASTE_SMALLVILLAGE, "effect" => "(2x)", "quantity" => 6, "img" => 4], + ["type" => 2, "size" => 2, "name" => HASTE_LARGE, "vname" => HASTE_LARGEVILLAGE, "effect" => "(1.5x)", "quantity" => 4, "img" => 4], + ["type" => 2, "size" => 3, "name" => HASTE_UNIQUE, "vname" => HASTE_UNIQUEVILLAGE, "effect" => "(3x)", "quantity" => 1, "img" => 4], + ], + + EYESIGHT_DESC => [ + ["type" => 3, "size" => 1, "name" => EYESIGHT_SMALL, "vname" => EYESIGHT_SMALLVILLAGE, "effect" => "(5x)", "quantity" => 6, "img" => 5], + ["type" => 3, "size" => 2, "name" => EYESIGHT_LARGE, "vname" => EYESIGHT_LARGEVILLAGE, "effect" => "(3x)", "quantity" => 4, "img" => 5], + ["type" => 3, "size" => 3, "name" => EYESIGHT_UNIQUE, "vname" => EYESIGHT_UNIQUEVILLAGE, "effect" => "(10x)", "quantity" => 1, "img" => 5], + ], + + DIET_DESC => [ + ["type" => 4, "size" => 1, "name" => DIET_SMALL, "vname" => DIET_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 6], + ["type" => 4, "size" => 2, "name" => DIET_LARGE, "vname" => DIET_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 6], + ["type" => 4, "size" => 3, "name" => DIET_UNIQUE, "vname" => DIET_UNIQUEVILLAGE, "effect" => "(50%)", "quantity" => 1, "img" => 6], + ], + + ACADEMIC_DESC => [ + ["type" => 5, "size" => 1, "name" => ACADEMIC_SMALL, "vname" => ACADEMIC_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 8], + ["type" => 5, "size" => 2, "name" => ACADEMIC_LARGE, "vname" => ACADEMIC_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 8], + ["type" => 5, "size" => 3, "name" => ACADEMIC_UNIQUE, "vname" => ACADEMIC_UNIQUEVILLAGE, "effect" => "(50%)", "quantity" => 1, "img" => 8], + ], + + STORAGE_DESC => [ + ["type" => 6, "size" => 1, "name" => STORAGE_SMALL, "vname" => STORAGE_SMALLVILLAGE, "effect" => "(50%)", "quantity" => 6, "img" => 9], + ["type" => 6, "size" => 2, "name" => STORAGE_LARGE, "vname" => STORAGE_LARGEVILLAGE, "effect" => "(25%)", "quantity" => 4, "img" => 9], + ], + + CONFUSION_DESC => [ + ["type" => 7, "size" => 1, "name" => CONFUSION_SMALL, "vname" => CONFUSION_SMALLVILLAGE, "effect" => "(200)", "quantity" => 6, "img" => 10], + ["type" => 7, "size" => 2, "name" => CONFUSION_LARGE, "vname" => CONFUSION_LARGEVILLAGE, "effect" => "(100)", "quantity" => 4, "img" => 10], + ["type" => 7, "size" => 3, "name" => CONFUSION_UNIQUE, "vname" => CONFUSION_UNIQUEVILLAGE, "effect" => "(500)", "quantity" => 1, "img" => 10], + ], + + FOOL_DESC => [ + ["type" => 8, "size" => 1, "name" => FOOL_SMALL, "vname" => FOOL_SMALLVILLAGE, "effect" => "", "quantity" => 10, "img" => "fool"], + 2 => ["type" => 8, "size" => 3, "name" => FOOL_UNIQUE, "vname" => FOOL_UNIQUEVILLAGE, "effect" => "", "quantity" => 1, "img" => "fool"] + ] + ]; + + /* + |-------------------------------------------------------------------------- + | WW BUILDING PLANS + |-------------------------------------------------------------------------- + */ + + const NATARS_WW_BUILDING_PLANS = [ + PLAN_DESC => [ + ["type" => 11, "size" => 1, "name" => PLAN, "vname" => PLANVILLAGE, "effect" => "", "quantity" => 13, "img" => 1] + ] + ]; + + /* + |-------------------------------------------------------------------------- + | BUILDINGS SETUP + |-------------------------------------------------------------------------- + */ + + const NATARS_ARTIFACTS_BUILDINGS = [ + "f22t" => 27, "f22" => 20, + "f28t" => 25, "f28" => 10, + "f39t" => 16, "f39" => 1, + + "f19t" => 23, "f19" => 10, + "f20t" => 23, "f20" => 10, + "f21t" => 23, "f21" => 10, + "f23t" => 23, "f23" => 10, + "f24t" => 23, "f24" => 10, + "f25t" => 23, "f25" => 10, + "f26t" => 23, "f26" => 10, + "f27t" => 23, "f27" => 10, + "f29t" => 23, "f29" => 10, + "f30t" => 23, "f30" => 10, + "f31t" => 23, "f31" => 10, + "f32t" => 23, "f32" => 10, + "f33t" => 23, "f33" => 10, + "f34t" => 23, "f34" => 10, + "f35t" => 23, "f35" => 10, + "f36t" => 23, "f36" => 10, + "f37t" => 23, "f37" => 10, + "f38t" => 23, "f38" => 10, + ]; + + const NATARS_WW_VILLAGES_BUILDINGS = [ + "f99t" => 40, "f99" => 0, + "f22t" => 15, "f22" => 10, + "f34t" => 17, "f34" => 1, + + "f20t" => 10, "f20" => 20, + "f19t" => 10, "f19" => 10, + "f23t" => 11, "f23" => 20, + "f27t" => 11, "f27" => 10, + + "f1" => 5, "f3" => 5, "f14" => 5, "f17" => 5, + "f5" => 5, "f6" => 5, "f16" => 5, "f18" => 5, + "f4" => 5, "f7" => 5, "f10" => 5, "f11" => 5, + "f2" => 6, "f8" => 6, "f9" => 6, "f12" => 6, "f13" => 6, "f15" => 6, + ]; + + const NATARS_BASE_SPY = 1500; + const NATARS_BASE_WW_VILLAGES = 13; + + /* + |-------------------------------------------------------------------------- + | TROOP GENERATORS + |-------------------------------------------------------------------------- + */ + + public $natarsArtifactsUnits; + public $natarsWWVillagesUnits; + + public function __construct() + { + /** + * Units for artifact villages + */ + $this->natarsArtifactsUnits = function ($multiplier) { + return [ + 41 => rand(1000 * $multiplier, 2000 * $multiplier) * NATARS_UNITS, + 42 => rand(1500 * $multiplier, 2000 * $multiplier) * NATARS_UNITS, + 43 => rand(2300 * $multiplier, 2800 * $multiplier) * NATARS_UNITS, + 44 => rand(25 * $multiplier, 75 * $multiplier) * NATARS_UNITS, + 45 => rand(1200 * $multiplier, 1900 * $multiplier) * NATARS_UNITS, + 46 => rand(1500 * $multiplier, 2000 * $multiplier) * NATARS_UNITS, + 47 => rand(500 * $multiplier, 900 * $multiplier) * NATARS_UNITS, + 48 => rand(100 * $multiplier, 300 * $multiplier) * NATARS_UNITS, + 49 => rand(1 * $multiplier, 5 * $multiplier) * NATARS_UNITS, + 50 => rand(1 * $multiplier, 5 * $multiplier) * NATARS_UNITS, + ]; + }; + + /** + * Units for WW villages + */ + $this->natarsWWVillagesUnits = function () { + return [ + 41 => rand(500, 12000) * NATARS_UNITS, + 42 => rand(1000, 14000) * NATARS_UNITS, + 43 => rand(2000, 16000) * NATARS_UNITS, + 44 => rand(100, 500) * NATARS_UNITS, + 45 => rand(480, 17000) * NATARS_UNITS, + 46 => rand(600, 18000) * NATARS_UNITS, + 47 => rand(2000, 16000) * NATARS_UNITS, + 48 => rand(400, 2000) * NATARS_UNITS, + 49 => rand(40, 200) * NATARS_UNITS, + 50 => rand(50, 250) * NATARS_UNITS, + ]; + }; + } + + /* + |-------------------------------------------------------------------------- + | NATARS CREATION + |-------------------------------------------------------------------------- + */ + + public function createNatars() + { global $database; - - //Register the Natars account, the Natars' password is the same as the MH's one + $password = $database->getUserField(5, 'password', 0); - $database->register(TRIBE5, $password, self::NATARS_EMAIL, self::NATARS_TRIBE, null, self::NATARS_UID, self::NATARS_DESC); - - //Convert from coordinates to village IDs + + $database->register( + TRIBE5, + $password, + self::NATARS_EMAIL, + self::NATARS_TRIBE, + null, + self::NATARS_UID, + self::NATARS_DESC + ); + $possibleWids = $database->getVilWrefs(self::NATARS_CAPITAL_COORDINATES); - - //Check if the villages aren't already taken $wid = $database->getFreeVillage($possibleWids); - //Generate the Natars' capital - $wid = $database->generateVillages([['wid' => $wid, 'mode' => 2, 'type' => 3, 'kid' => 0, 'capital' => 1, 'pop' => 834, 'name' => null, 'natar' => 0]], self::NATARS_UID, TRIBE5); + $wid = $database->generateVillages( + [ + [ + 'wid' => $wid, + 'mode' => 2, + 'type' => 3, + 'kid' => 0, + 'capital' => 1, + 'pop' => 834, + 'name' => null, + 'natar' => 0 + ] + ], + self::NATARS_UID, + TRIBE5 + ); - //Scouts all players $this->scoutAllPlayers($wid); - - //Add artifacts $this->addArtifactVillages(self::NATARS_ARTIFACTS); } - - /** - * Called when Natars account has been created - * - * @param int $wid The village ID of the Natars' capital - */ - - public function scoutAllPlayers($wid){ + + /* + |-------------------------------------------------------------------------- + | SCOUT SYSTEM + |-------------------------------------------------------------------------- + */ + + public function scoutAllPlayers($wid) + { global $database; - + $array = $database->getProfileVillages(0, 1); + $refs = []; $vils = []; - - foreach($array as $vill){ - $refs[] = $database->addAttack($wid, 0, 0, 0, self::NATARS_BASE_SPY * NATARS_UNITS, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 0); + + foreach ($array as $vill) { + $refs[] = $database->addAttack( + $wid, + 0, + 0, + 0, + self::NATARS_BASE_SPY * NATARS_UNITS, + 0, 0, 0, 0, 0, 0, 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 20, + 0, 0, 0, 0 + ); + $vils[] = $vill['wref']; } - - $type = []; - $from = []; - $to = []; - $ref = []; - $time = []; - $timeValue = time(); - $endtime = []; - $endtimeValue = $timeValue + round(10000 / SPEED); + + $type = $from = $to = $ref = $time = $endtime = []; $counter = 0; - + + $timeValue = time(); + $endtimeValue = $timeValue + round(10000 / SPEED); + foreach ($refs as $index => $refID) { + $type[] = 3; $from[] = $wid; $to[] = $vils[$index]; $ref[] = $refID; $time[] = $timeValue; $endtime[] = $endtimeValue; - - // limit the insert, so it can push through any reasonable network limits imposed + if (++$counter > 25) { $database->addMovement($type, $from, $to, $ref, $time, $endtime); - - $type = []; - $from = []; - $to = []; - $ref = []; - $time = []; - $endtime = []; + + $type = $from = $to = $ref = $time = $endtime = []; $counter = 0; } } - - if ($counter > 0) $database->addMovement($type, $from, $to, $ref, $time, $endtime); + + if ($counter > 0) { + $database->addMovement($type, $from, $to, $ref, $time, $endtime); + } } - - /** - * Creates villages and puts the desired artifacts in it - * - * @param array $artifactArrays The array containing the artifacts to insert - * @param int $uid The owner's user ID (Natars) - * @param bool $addTroops Add troops to the village if true, and vice versa if false - */ - - public function addArtifactVillages($artifactArrays, $uid = self::NATARS_UID, $addTroops = true) { + + /* + |-------------------------------------------------------------------------- + | ARTIFACT VILLAGES + |-------------------------------------------------------------------------- + */ + + public function addArtifactVillages($artifactArrays, $uid = self::NATARS_UID, $addTroops = true) + { global $database; - //Variables initialization - $artifactNumber = 0; $artifactVillages = $artifactTroops = $artifactBuildings = $artifactsToAdd = $wids = []; - - //Create the artifact villages array - foreach($artifactArrays as $desc => $artifactType){ - foreach($artifactType as $artifact){ - for($i = 0; $i < $artifact['quantity']; $i++){ - //Generate the villages array - $artifactVillages[] = ['wid' => 0, 'mode' => $artifact['size'] + 1, 'type' => 3, 'kid' => rand(1, 4), 'capital' => 0, 'pop' => 163, 'name' => $artifact['vname'], 'natar' => 0]; - - //Set the unit arrays (1, 2 or 4) - $multiplier = $artifact['size'] == 3 ? 4 : $artifact['size']; + + foreach ($artifactArrays as $desc => $artifactType) { + foreach ($artifactType as $artifact) { + for ($i = 0; $i < $artifact['quantity']; $i++) { + + $artifactVillages[] = [ + 'wid' => 0, + 'mode' => $artifact['size'] + 1, + 'type' => 3, + 'kid' => rand(1, 4), + 'capital' => 0, + 'pop' => 163, + 'name' => $artifact['vname'], + 'natar' => 0 + ]; + + $multiplier = ($artifact['size'] == 3) ? 4 : $artifact['size']; $unitArrays = ($this->natarsArtifactsUnits)($multiplier); - - //Generate the unit arrays - if($addTroops) $artifactTroops[1][] = array_values($unitArrays); + + if ($addTroops) { + $artifactTroops[1][] = array_values($unitArrays); + } + $artifactBuildings[1][] = array_values(self::NATARS_ARTIFACTS_BUILDINGS); - - //Generate the artifacts array - $artifactsToAdd[] = ['owner' => $uid, 'type' => $artifact['type'], 'size' => $artifact['size'], - 'name' => $artifact['name'], 'desc' => $desc, 'effect' => $artifact['effect'], - 'img' => "type".$artifact['img'].".gif"]; - } + + $artifactsToAdd[] = [ + 'owner' => $uid, + 'type' => $artifact['type'], + 'size' => $artifact['size'], + 'name' => $artifact['name'], + 'desc' => $desc, + 'effect' => $artifact['effect'], + 'img' => "type" . $artifact['img'] . ".gif" + ]; + } } - } - - //Set the unit types by using the last $unitArrays - if($addTroops) $artifactTroops[0] = array_keys($unitArrays); + } + + if ($addTroops) { + $artifactTroops[0] = array_keys($unitArrays); + } + $artifactBuildings[0] = array_keys(self::NATARS_ARTIFACTS_BUILDINGS); - - //Generate the wids - $wids = array_merge($wids, (array)$database->generateVillages($artifactVillages, $uid, TRIBE5, $addTroops ? $artifactTroops : null, $artifactBuildings)); - - //Create the artifacts for the generated wids + + $wids = $database->generateVillages( + $artifactVillages, + $uid, + TRIBE5, + $addTroops ? $artifactTroops : null, + $artifactBuildings + ); + $database->addArtefacts($wids, $artifactsToAdd); } - - /** - * Called when WW villages need to be created - * - * @param int $numberOfVillages The number of villages that have to be added - * @param int $uid The player ID - * @param bool $addTroops Add troops to the village if true, and vice versa if false - */ - - public function createWWVillages($numberOfVillages = self::NATARS_BASE_WW_VILLAGES, $uid = self::NATARS_UID, $addTroops = true){ + + /* + |-------------------------------------------------------------------------- + | WW VILLAGES + |-------------------------------------------------------------------------- + */ + + public function createWWVillages($numberOfVillages = self::NATARS_BASE_WW_VILLAGES, $uid = self::NATARS_UID, $addTroops = true) + { global $database; - - $villageArrays = $troopArrays = $buildingArrays = $wids = []; - for($i = 1; $i <= $numberOfVillages; $i++){ - $villageArrays[] = ['wid' => 0, 'mode' => 5, 'type' => 3, 'kid' => ($i == $numberOfVillages ? rand(1, 4) : ($i % 4) + 1), 'capital' => 0, 'pop' => 233, 'name' => WWVILLAGE, 'natar' => 1]; - if($addTroops) $troopArrays[1][] = array_values(($this->natarsWWVillagesUnits)()); + + $villageArrays = $troopArrays = $buildingArrays = []; + + for ($i = 1; $i <= $numberOfVillages; $i++) { + + $villageArrays[] = [ + 'wid' => 0, + 'mode' => 5, + 'type' => 3, + 'kid' => ($i == $numberOfVillages ? rand(1, 4) : ($i % 4) + 1), + 'capital' => 0, + 'pop' => 233, + 'name' => WWVILLAGE, + 'natar' => 1 + ]; + + if ($addTroops) { + $troopArrays[1][] = array_values(($this->natarsWWVillagesUnits)()); + } + $buildingArrays[1][] = array_values(self::NATARS_WW_VILLAGES_BUILDINGS); } - if($addTroops) $troopArrays[0] = array_keys(($this->natarsWWVillagesUnits)()); + if ($addTroops) { + $troopArrays[0] = array_keys(($this->natarsWWVillagesUnits)()); + } + $buildingArrays[0] = array_keys(self::NATARS_WW_VILLAGES_BUILDINGS); - - $wids = $database->generateVillages($villageArrays, $uid, null, $addTroops ? $troopArrays : null, $buildingArrays); + + $database->generateVillages( + $villageArrays, + $uid, + null, + $addTroops ? $troopArrays : null, + $buildingArrays + ); } - - /** - * Called when WW building plans need to be created - * - */ - - public function createWWBuildingPlans(){ - - //Add the artifacts and villages + + /* + |-------------------------------------------------------------------------- + | WW BUILDING PLANS + |-------------------------------------------------------------------------- + */ + + public function createWWBuildingPlans() + { $this->addArtifactVillages(self::NATARS_WW_BUILDING_PLANS); } - - /** - * Automatically activate all artifacts that need to be activated - * - */ - - public function activateArtifacts(){ + + /* + |-------------------------------------------------------------------------- + | ARTIFACT ACTIVATION SYSTEM + |-------------------------------------------------------------------------- + */ + + public function activateArtifacts() + { global $database; - - //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 + + $artifacts = $database->getInactiveArtifacts( + round($time - $this->getActivationTime()) + ); + + if (empty($artifacts)) return; + + $cache = []; + + foreach ($artifacts as $artifact) { + $cache[$artifact['owner']][] = $artifact; + } + + foreach ($cache as $owner => $inactiveArtifacts) { + + $ownArtifacts = $database->getOwnArtifactsSum($owner, true); + + foreach ($inactiveArtifacts as $artifact) { + + if ($ownArtifacts['totals'] < 3) { + + if ($artifact['size'] == 1) { + $database->activateArtifact($artifact['id']); - - $ownArtifacts['small']--; $ownArtifacts['totals']++; - if($artifact['size'] == 2) $ownArtifacts['great']++; - else $ownArtifacts['unique']++; + $ownArtifacts['small']++; + + } elseif ($artifact['size'] == 2 && !$ownArtifacts['unique'] && !$ownArtifacts['great']) { + + $database->activateArtifact($artifact['id']); + $ownArtifacts['totals']++; + $ownArtifacts['great']++; + + } elseif ($artifact['size'] == 3 && !$ownArtifacts['unique'] && !$ownArtifacts['great']) { + + $database->activateArtifact($artifact['id']); + $ownArtifacts['totals']++; + $ownArtifacts['unique']++; } + + } elseif ($ownArtifacts['small'] == 3 && $artifact['size'] > 1) { + + $database->activateArtifact( + $database->getNewestArtifactBySize($owner, 1)['id'], + 0 + ); + + $database->activateArtifact($artifact['id']); + + $ownArtifacts['small']--; + $ownArtifacts['totals']++; + + if ($artifact['size'] == 2) $ownArtifacts['great']++; + else $ownArtifacts['unique']++; } } } } - /** - * Return the selected artifact, to the Natars account, by creating a new village and - * by moving the artifact into it - * - * @param array $artifact The artifact array - */ - - public function returnArtifactToNatars($artifactArray){ + + /* + |-------------------------------------------------------------------------- + | RETURN ARTIFACT + |-------------------------------------------------------------------------- + */ + + public function returnArtifactToNatars($artifactArray) + { global $database; - - //Set the village arrays - $artifactArrays = array_merge(self::NATARS_ARTIFACTS, self::NATARS_WW_BUILDING_PLANS); - $villageArrays = [['wid' => 0, 'mode' => $artifactArray['size'] + 1, 'type' => 3, - 'kid' => rand(1, 4), 'capital' => 0, 'pop' => 163, + + $artifactArrays = array_merge( + self::NATARS_ARTIFACTS, + self::NATARS_WW_BUILDING_PLANS + ); + + $villageArrays = [[ + 'wid' => 0, + 'mode' => $artifactArray['size'] + 1, + 'type' => 3, + 'kid' => rand(1, 4), + 'capital' => 0, + 'pop' => 163, 'name' => $artifactArrays[$artifactArray['desc']][$artifactArray['size'] - 1]['vname'], - 'natar' => 0]]; - - //Set the unit arrays - $multiplier = $artifactArray['size'] == 3 ? 4 : $artifactArray['size']; + 'natar' => 0 + ]]; + + $multiplier = ($artifactArray['size'] == 3) ? 4 : $artifactArray['size']; $unitsArray = ($this->natarsArtifactsUnits)($multiplier); - - //Set the unit types + $artifactTroops[1][] = array_values($unitsArray); $artifactTroops[0] = array_keys($unitsArray); - - //Set the buildings array + $artifactBuildings[1][] = array_values(self::NATARS_ARTIFACTS_BUILDINGS); $artifactBuildings[0] = array_keys(self::NATARS_ARTIFACTS_BUILDINGS); - //Generate the village - $wid = $database->generateVillages($villageArrays, self::NATARS_UID, TRIBE5, $artifactTroops, $artifactBuildings); - - //Update the artifact with the new village id and owner - $database->updateArtifactDetails($artifactArray['id'], ['vref' => $wid, 'owner' => self::NATARS_UID, 'active' => 0, 'del' => 0]); + $wid = $database->generateVillages( + $villageArrays, + self::NATARS_UID, + TRIBE5, + $artifactTroops, + $artifactBuildings + ); + + $database->updateArtifactDetails( + $artifactArray['id'], + [ + 'vref' => $wid, + 'owner' => self::NATARS_UID, + 'active' => 0, + 'del' => 0 + ] + ); } - - /** - * Gets the artifact informations in plain text - * - * @param int $artifact The artifact - * @return array Returns the information of the artifacts - */ - - public static function getArtifactInfo($artifact){ - - $activationTime = 86400 / (SPEED == 2 ? 1.5 : (SPEED == 3 ? 2 : SPEED)); + + /* + |-------------------------------------------------------------------------- + | ARTIFACT INFO DISPLAY + |-------------------------------------------------------------------------- + */ + + public static function getArtifactInfo($artifact) + { + $instance = new self(); + $activationTime = $instance->getActivationTime(); + $time = time(); + $nextEffect = "-"; - if ( is_array($artifact) ) { - if($artifact['size'] == 1 && $artifact['type'] != 11){ - $requiredLevel = 10; - $effectInfluence = VILLAGE; - }else{ - $requiredLevel = $artifact['type'] != 11 ? 20 : 10; - $effectInfluence = ACCOUNT; - } + if (is_array($artifact)) { - if($artifact['owner'] == 3) $active = "-"; - elseif(!$artifact['active'] && $artifact['conquered'] < $time - $activationTime) $active = "Can't be activated"; - elseif (!$artifact['active']) $active = date("d.m.Y H:i:s", $artifact['conquered'] + $activationTime); - else - { - $active = "".ACTIVE.""; - $nextEffect = date("d.m.Y H:i:s", $artifact['lastupdate'] + (86400 / (SPEED == 2 ? 1.5 : (SPEED == 3 ? 2 : SPEED)))); - } + if ($artifact['size'] == 1 && $artifact['type'] != 11) { + $requiredLevel = 10; + $effectInfluence = VILLAGE; + } else { + $requiredLevel = ($artifact['type'] != 11) ? 20 : 10; + $effectInfluence = ACCOUNT; + } - //// Added by brainiac - thank you - if ($artifact['type'] == 8) - { - $kind = $artifact['kind']; - $effect = $artifact['effect2']; - }else{ - $kind = $artifact['type']; - $effect = $artifact['effect']; - } + if ($artifact['owner'] == 3) { + $active = "-"; + } elseif (!$artifact['active'] && $artifact['conquered'] < $time - $activationTime) { + $active = "Can't be activated"; + } elseif (!$artifact['active']) { + $active = date("d.m.Y H:i:s", $artifact['conquered'] + $activationTime); + } else { + $active = "" . ACTIVE . ""; + $nextEffect = date("d.m.Y H:i:s", $artifact['lastupdate'] + $activationTime); + } + + $kind = ($artifact['type'] == 8) ? $artifact['kind'] : $artifact['type']; + $effect = ($artifact['type'] == 8) ? $artifact['effect2'] : $artifact['effect']; + + $artifactBadEffect = ($artifact['type'] == 8 && $artifact['bad_effect'] == 1); + + switch ($kind) { + case 1: $betterorbadder = $artifactBadEffect ? BUILDING_WEAKER : BUILDING_STRONGER; break; + case 2: $betterorbadder = $artifactBadEffect ? TROOPS_SLOWEST : TROOPS_FASTER; break; + case 3: $betterorbadder = $artifactBadEffect ? SPIES_DECRESE : SPIES_INCREASE; break; + case 4: $betterorbadder = $artifactBadEffect ? CONSUME_HIGH : CONSUME_LESS; break; + case 5: $betterorbadder = $artifactBadEffect ? TROOPS_MAKE_SLOWEST : TROOPS_MAKE_FASTER; break; + case 6: $betterorbadder = YOU_CONSTRUCT; break; + case 7: $betterorbadder = $artifactBadEffect ? CRANNY_DECRESE : CRANNY_INCREASED; break; + case 8: $betterorbadder = $artifactBadEffect ? SPIES_INCREASE : SPIES_DECRESE; break; + } + + $bonus = isset($betterorbadder) + ? $betterorbadder . " (" . str_replace(["(", ")"], "", $effect) . ")" + : (($kind == 11 && $artifact['active']) ? "" . WW_BUILDING_PLAN . "" : "Not yet active"); - $artifactBadEffect = $artifact['type'] == 8 && $artifact['bad_effect'] == 1; - switch($kind){ - case 1: - $betterorbadder = $artifactBadEffect ? BUILDING_WEAKER : BUILDING_STRONGER; - break; - case 2: - $betterorbadder = $artifactBadEffect ? TROOPS_SLOWEST : TROOPS_FASTER; - break; - case 3: - $betterorbadder = $artifactBadEffect ? SPIES_DECRESE : SPIES_INCREASE; - break; - case 4: - $betterorbadder = $artifactBadEffect ? CONSUME_HIGH : CONSUME_LESS; - break; - case 5: - $betterorbadder = $artifactBadEffect ? TROOPS_MAKE_SLOWEST : TROOPS_MAKE_FASTER; - break; - case 6: - $betterorbadder = $artifactBadEffect ? YOU_CONSTRUCT : YOU_CONSTRUCT; - break; - case 7: - $betterorbadder = $artifactBadEffect ? CRANNY_DECRESE : CRANNY_INCREASED; - break; - case 8: - $betterorbadder = $artifactBadEffect ? SPIES_INCREASE : SPIES_DECRESE; - break; - } - $bonus = isset($betterorbadder) ? $betterorbadder." (".str_replace(["(", ")"], "" , $effect).")" : (($kind == 11 && $artifact['active']) ? "".WW_BUILDING_PLAN."" : "Not yet active"); } else { - $requiredLevel = 0; - $active = 0; - $bonus = 0; - $effectInfluence = 0; - $nextEffect = 0; + $requiredLevel = $active = $bonus = $effectInfluence = $nextEffect = 0; } - - return ["requiredLevel" => $requiredLevel, "active" => $active, - "bonus" => $bonus, "effectInfluence" => $effectInfluence, - "nextEffect" => $nextEffect]; + + return [ + "requiredLevel" => $requiredLevel, + "active" => $active, + "bonus" => $bonus, + "effectInfluence" => $effectInfluence, + "nextEffect" => $nextEffect + ]; } } - ?> \ No newline at end of file diff --git a/Templates/Notice/1.tpl b/Templates/Notice/1.tpl index 29e73d9d..3a895559 100644 --- a/Templates/Notice/1.tpl +++ b/Templates/Notice/1.tpl @@ -17,12 +17,16 @@ $colspan = $hasHero ? 11 : 10; $spy = !empty($dataarray[177]) && !empty($dataarray[176]) && empty($dataarray[195]); // ======================== URL SETUP ======================== -if (!isset($isAdmin)) { + +// detectare admin REAL (nu variabilă nesigură) +$isAdmin = (isset($session) && isset($session->access) && $session->access >= 8); + +if ($isAdmin) { + $mapUrl = "Admin/admin.php?p=village&did="; + $playerUrl = "Admin/admin.php?p=player&uid="; +} else { $mapUrl = "karte.php?d="; $playerUrl = "spieler.php?uid="; -} else { - $mapUrl = "admin.php?p=village&did="; - $playerUrl = "admin.php?p=player&uid="; } // ======================== ATTACKER DATA (CACHED) ======================== diff --git a/Templates/Notice/10.tpl b/Templates/Notice/10.tpl index f5040a79..d37f8162 100644 --- a/Templates/Notice/10.tpl +++ b/Templates/Notice/10.tpl @@ -9,13 +9,17 @@ $dataarray = explode(",", $message->readingNotice['data']); -// ======================== URL BASE ======================== -if (!isset($isAdmin)) { +// ======================== URL SETUP ======================== + +// detectare admin REAL (nu variabilă nesigură) +$isAdmin = (isset($session) && isset($session->access) && $session->access >= 8); + +if ($isAdmin) { + $mapUrl = "Admin/admin.php?p=village&did="; + $playerUrl = "Admin/admin.php?p=player&uid="; +} else { $mapUrl = "karte.php?d="; $playerUrl = "spieler.php?uid="; -} else { - $mapUrl = "admin.php?p=village&did="; - $playerUrl = "admin.php?p=player&uid="; } // ======================== ATTACKER / SENDER ======================== diff --git a/Templates/Notice/15.tpl b/Templates/Notice/15.tpl index 29f1a491..09de12a0 100644 --- a/Templates/Notice/15.tpl +++ b/Templates/Notice/15.tpl @@ -9,13 +9,17 @@ $dataarray = explode(",", $message->readingNotice['data']); -// ======================== URL BASE ======================== -if (!isset($isAdmin)) { +// ======================== URL SETUP ======================== + +// detectare admin REAL (nu variabilă nesigură) +$isAdmin = (isset($session) && isset($session->access) && $session->access >= 8); + +if ($isAdmin) { + $mapUrl = "Admin/admin.php?p=village&did="; + $playerUrl = "Admin/admin.php?p=player&uid="; +} else { $mapUrl = "karte.php?d="; $playerUrl = "spieler.php?uid="; -} else { - $mapUrl = "admin.php?p=village&did="; - $playerUrl = "admin.php?p=player&uid="; } // ======================== CONFIG ======================== diff --git a/Templates/Notice/3.tpl b/Templates/Notice/3.tpl index 9aff7626..26ee4bdc 100644 --- a/Templates/Notice/3.tpl +++ b/Templates/Notice/3.tpl @@ -14,13 +14,17 @@ $hasHero = (isset($dataarray[184]) && $dataarray[184] > 0); $colspan = $hasHero ? 11 : 10; $colspan2 = 10; -// ======================== URL BASE ======================== -if (!isset($isAdmin)) { +// ======================== URL SETUP ======================== + +// detectare admin REAL (nu variabilă nesigură) +$isAdmin = (isset($session) && isset($session->access) && $session->access >= 8); + +if ($isAdmin) { + $mapUrl = "Admin/admin.php?p=village&did="; + $playerUrl = "Admin/admin.php?p=player&uid="; +} else { $mapUrl = "karte.php?d="; $playerUrl = "spieler.php?uid="; -} else { - $mapUrl = "admin.php?p=village&did="; - $playerUrl = "admin.php?p=player&uid="; } // ======================== ATTACKER (CACHED DB CALLS) ======================== diff --git a/Templates/Notice/8.tpl b/Templates/Notice/8.tpl index 66f30ff2..c8993276 100644 --- a/Templates/Notice/8.tpl +++ b/Templates/Notice/8.tpl @@ -13,13 +13,17 @@ $dataarray = explode(",", $message->readingNotice['data']); $hasHero = (!empty($dataarray[13]) && $dataarray[13] > 0); $colspan = $hasHero ? 11 : 10; -// ======================== URL BASE ======================== -if (!isset($isAdmin)) { +// ======================== URL SETUP ======================== + +// detectare admin REAL (nu variabilă nesigură) +$isAdmin = (isset($session) && isset($session->access) && $session->access >= 8); + +if ($isAdmin) { + $mapUrl = "Admin/admin.php?p=village&did="; + $playerUrl = "Admin/admin.php?p=player&uid="; +} else { $mapUrl = "karte.php?d="; $playerUrl = "spieler.php?uid="; -} else { - $mapUrl = "admin.php?p=village&did="; - $playerUrl = "admin.php?p=player&uid="; } // ======================== SENDER (cached DB calls) ======================== diff --git a/Templates/Notice/index.php b/Templates/Notice/index.php index 9fcb4aed..98297c7a 100644 --- a/Templates/Notice/index.php +++ b/Templates/Notice/index.php @@ -2,36 +2,18 @@ ################################################################################# ## -= YOU MAY NOT REMOVE OR CHANGE THIS NOTICE =- ## ## --------------------------------------------------------------------------- ## -## Filename index.php ## +## Filename 404.tpl ## ## Developed by: aggenkeech ## -## License: TravianZ Project ## -## Copyright: TravianZ (c) 2010-2025. All rights reserved. ## +## License: TravianX Project ## +## Copyright: TravianX (c) 2010-2012. All rights reserved. ## +## ## ################################################################################# - -// prevent direct misuse in weird contexts (optional but safe) -if (!defined('IN_GAME')) { - // keep it harmless, just allow display -} - -$basePath = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/\\'); ?> -
-
- -

404 - File not found

- - Not Found
- -

We looked 404 times already but can't find anything, Not even an X marking the spot.

- -

This system is not complete yet. So the page probably does not exist.

- -
- -
+
+

404 - File not found

+ Not Found
+

We looked 404 times already but can't find anything, Not even an X marking the spot.

+

This system is not complete yet. So the page probably does not exist.


+
\ No newline at end of file