Пример #1
0
 /**
  * Checks for validation.
  *
  * @throws Recipe_Exception_Generic
  * @return Bengine_Game_Controller_MonitorPlanet
  */
 protected function validate()
 {
     if (!$this->planetData->getPlanetid() || $this->planetData->getIsmoon() || Core::getUser()->get("curplanet") == $this->planetData->getPlanetid()) {
         throw new Recipe_Exception_Generic("The selected planet is unavailable.");
     }
     // Check range
     if (Game::getPlanet()->getBuilding("STAR_SURVEILLANCE") <= 0) {
         throw new Recipe_Exception_Generic("Range exceeded.");
     }
     $range = pow(Game::getPlanet()->getBuilding("STAR_SURVEILLANCE"), 2) - 1;
     $diff = abs(Game::getPlanet()->getData("system") - $this->planetData->getSystem());
     if ($this->planetData->getGalaxy() != Game::getPlanet()->getData("galaxy") || $range < $diff) {
         throw new Recipe_Exception_Generic("Range exceeded.");
     }
     // Check consumption
     Core::getLanguage()->load(array("Galaxy", "Main", "info"));
     if (Game::getPlanet()->getData("hydrogen") < Core::getOptions()->get("STAR_SURVEILLANCE_CONSUMPTION")) {
         Logger::dieMessage("DEFICIENT_CONSUMPTION");
     }
     return $this;
 }
Пример #2
0
 /**
  * Index action.
  *
  * @return Bengine_Game_Controller_Shipyard
  */
 protected function indexAction()
 {
     Core::getLanguage()->load(array("info", "buildings"));
     $this->setTemplate("shipyard/index");
     /* @var Bengine_Game_Model_Collection_Construction $collection */
     $collection = Application::getCollection("game/construction", "game/unit");
     $collection->addTypeFilter($this->mode, Game::getPlanet()->getData("ismoon"))->addShipyardJoin(Core::getUser()->get("curplanet"))->addDisplayOrder();
     if (Game::getPlanet()->getBuilding("SHIPYARD") == 0) {
         Logger::dieMessage("SHIPYARD_REQUIRED");
     }
     if ($this->mode == self::FLEET_CONSTRUCTION_TYPE) {
         Core::getTPL()->assign("shipyard", Core::getLanguage()->getItem("SHIP_CONSTRUCTION"));
     } else {
         Core::getTPL()->assign("shipyard", Core::getLanguage()->getItem("DEFENSE"));
     }
     if (!$this->canBuildUnits) {
         Logger::addMessage("SHIPYARD_UPGRADING", "info");
     }
     $missions = Game::getEH()->getShipyardEvents();
     if (count($missions)) {
         Core::getTPL()->addHTMLHeaderFile("lib/jquery.countdown.js", "js");
         /* @var Bengine_Game_Model_Event $event */
         $event = $missions->getFirstItem();
         Core::getTPL()->assign("remainingTime", $event->getTimeLeft());
         Core::getTPL()->assign("currentWork", Core::getLanguage()->getItem($event->getData("mission")));
         Core::getTPL()->assign("currentMissionImage", BASE_URL . "img/buildings/" . $event->getData("mission") . ".gif");
         Core::getLang()->assign("unitName", Core::getLanguage()->getItem($event->getData("mission")));
     }
     Core::getTPL()->addLoop("events", $missions);
     Core::getTPL()->addLoop("units", $collection);
     Core::getTPL()->assign("canBuildUnits", $this->canBuildUnits);
     Core::getTPL()->assign("canBuildRockets", $this->canBuildRockets);
     $this->assign("orderAction", BASE_URL . "game/" . SID . "/" . $this->getParam("controller") . "/Order");
     $this->assign("cancelAction", BASE_URL . "game/" . SID . "/" . $this->getParam("controller") . "/Cancel");
     return $this;
 }
Пример #3
0
 /**
  * Check for sufficient resources and start to upgrade building.
  *
  * @param integer $id    Building id to upgrade
  * @throws Recipe_Exception_Generic
  * @return Bengine_Game_Controller_Constructions
  */
 protected function upgradeAction($id)
 {
     // Check events
     if ($this->event != false || Core::getUser()->get("umode")) {
         $this->redirect("game/" . SID . "/Constructions");
     }
     if ($id == 12 && Game::getEH()->getResearchEvent()) {
         throw new Recipe_Exception_Generic("Do not mess with the url.");
     }
     $shipyardSize = Game::getEH()->getShipyardEvents()->getCalculatedSize();
     if (($id == 8 || $id == 7) && $shipyardSize > 0) {
         throw new Recipe_Exception_Generic("Do not mess with the url.");
     }
     // Check fields
     if (!Game::getPlanet()->planetFree()) {
         Logger::dieMessage("PLANET_FULLY_DEVELOPED");
     }
     // Check for requirements
     if (!Game::canBuild($id)) {
         throw new Recipe_Exception_Generic("You do not fulfil the requirements to build this.");
     }
     // Load building data
     Core::getLanguage()->load(array("info", "buildings"));
     $isMoon = Game::getPlanet()->getData("ismoon");
     /* @var Bengine_Game_Model_Construction $construction */
     $construction = Game::getModel("game/construction");
     $construction->load($id);
     if (!$construction->getId()) {
         throw new Recipe_Exception_Generic("Unkown building :(");
     }
     $mode = $construction->get("mode");
     if ($isMoon && $mode != self::MOON_CONSTRUCTION_TYPE) {
         if ($mode == self::BUILDING_CONSTRUCTION_TYPE && !$construction->get("allow_on_moon")) {
             throw new Recipe_Exception_Generic("Building not allowed.");
         }
     }
     if (!$isMoon && $mode != self::BUILDING_CONSTRUCTION_TYPE) {
         throw new Recipe_Exception_Generic("Building not allowed.");
     }
     Hook::event("UpgradeBuildingFirst", array($construction));
     // Get required resources
     $level = Game::getPlanet()->getBuilding($id);
     if ($level > 0) {
         $level = $level + 1;
     } else {
         $level = 1;
     }
     $this->setRequieredResources($level, $construction);
     // Check resources
     if ($this->checkResources()) {
         $data["metal"] = $this->requiredMetal;
         $data["silicon"] = $this->requiredSilicon;
         $data["hydrogen"] = $this->requiredHydrogen;
         $data["energy"] = $this->requiredEnergy;
         $time = getBuildTime($data["metal"], $data["silicon"], self::BUILDING_CONSTRUCTION_TYPE);
         $data["level"] = $level;
         $data["buildingid"] = $id;
         $data["buildingname"] = $construction->get("name");
         Hook::event("UpgradeBuildingLast", array($construction, &$data, &$time));
         Game::getEH()->addEvent(1, $time + TIME, Core::getUser()->get("curplanet"), Core::getUser()->get("userid"), null, $data);
         $this->redirect("game/" . SID . "/Constructions");
     } else {
         Logger::dieMessage("INSUFFICIENT_RESOURCES");
     }
     return $this;
 }
Пример #4
0
 /**
  * Allows the user to write a global mail to all alliance member.
  *
  * @param string $reply
  * @return Bengine_Game_Controller_Alliance
  */
 protected function globalMailAction($reply)
 {
     $result = Core::getQuery()->select("user2ally u2a", array("a.founder", "ar.CAN_WRITE_GLOBAL_MAILS"), "LEFT JOIN " . PREFIX . "alliance a ON (a.aid = u2a.aid) LEFT JOIN " . PREFIX . "allyrank ar ON (ar.rankid = u2a.rank)", Core::getDB()->quoteInto("u2a.userid = ?", Core::getUser()->get("userid")));
     if ($row = $result->fetchRow()) {
         $result->closeCursor();
         if ($row["CAN_WRITE_GLOBAL_MAILS"] || $row["founder"] == Core::getUser()->get("userid")) {
             Core::getLanguage()->load("Message");
             if ($this->isPost()) {
                 $message = richtext($this->getParam("message"));
                 $length = Str::length(strip_tags($message));
                 $subject = Str::validateXHTML(trim($this->getParam("subject")));
                 $receiver = $this->getParam("receiver");
                 if ($length > 2 && $length <= Core::getOptions()->get("MAX_PM_LENGTH") && Str::length($subject) > 0 && Str::length($subject) < 101) {
                     Hook::event("SendGlobalMail", array($subject, &$message));
                     if ($receiver == "foo") {
                         $where = Core::getDB()->quoteInto("aid = ?", $this->aid);
                     } else {
                         $where = Core::getDB()->quoteInto("rank = ? AND aid = ?", array($receiver, $this->aid));
                     }
                     $_result = Core::getQuery()->select("user2ally", "userid", "", $where);
                     foreach ($_result->fetchAll() as $_row) {
                         Core::getQuery()->insert("message", array("mode" => 6, "time" => TIME, "sender" => Core::getUser()->get("userid"), "receiver" => $_row["userid"], "message" => $message, "subject" => $subject, "read" => $_row["userid"] == Core::getUser()->get("userid") ? 1 : 0));
                     }
                     $_result->closeCursor();
                     Logger::addMessage("SENT_SUCCESSFUL", "success");
                 } else {
                     if ($length < 3) {
                         Core::getTPL()->assign("messageError", Logger::getMessageField("MESSAGE_TOO_SHORT"));
                     }
                     if ($length > Core::getOptions()->get("MAX_PM_LENGTH")) {
                         Core::getTPL()->assign("messageError", Logger::getMessageField("MESSAGE_TOO_LONG"));
                     }
                     if (Str::length($subject) == 0) {
                         Core::getTPL()->assign("subjectError", Logger::getMessageField("SUBJECT_TOO_SHORT"));
                     }
                     if (Str::length($subject) > 100) {
                         Core::getTPL()->assign("subjectError", Logger::getMessageField("SUBJECT_TOO_LONG"));
                     }
                     Core::getTPL()->assign("subject", $this->getParam("subject"))->assign("message", $this->getParam("message"));
                 }
             } else {
                 if ($reply) {
                     $reply = preg_replace("#((RE|FW):\\s)+#is", "\\1", $reply);
                     Core::getTPL()->assign("subject", $reply);
                 }
             }
             $ranks = Core::getQuery()->select("allyrank", array("rankid", "name"), "", Core::getDB()->quoteInto("aid = ?", $this->aid));
             Core::getTPL()->assign("maxpmlength", fNumber(Core::getOptions()->get("MAX_PM_LENGTH")));
             Core::getTPL()->addLoop("ranks", $ranks);
         } else {
             Logger::dieMessage("MISSING_RIGHTS_FOR_GLOBAL_MAIL", "warning");
         }
     } else {
         Logger::dieMessage("MISSING_RIGHTS_FOR_GLOBAL_MAIL", "warning");
     }
     return $this;
 }
Пример #5
0
 /**
  * Substracts hydrogen for each galaxy view.
  *
  * @return Bengine_Game_Controller_Galaxy
  */
 protected function subtractHydrogen()
 {
     if ($this->galaxy != Game::getPlanet()->getData("galaxy") || $this->system != Game::getPlanet()->getData("system")) {
         if (Game::getPlanet()->getData("hydrogen") - $this->viewConsumption < 0) {
             Logger::dieMessage("DEFICIENT_CONSUMPTION");
         }
         Game::getPlanet()->setData("hydrogen", Game::getPlanet()->getData("hydrogen") - $this->viewConsumption);
         Core::getDB()->query("UPDATE " . PREFIX . "planet SET hydrogen = hydrogen - ? WHERE planetid = ?", array($this->viewConsumption, Core::getUser()->get("curplanet")));
     }
     return $this;
 }
Пример #6
0
 /**
  * Displays the message and shut program down.
  *
  * @return void
  */
 public function diePrintError()
 {
     Logger::dieMessage($this->message);
     return;
 }
Пример #7
0
 /**
  * This starts the missions and shows a quick overview of the flight.
  *
  * @param integer $mode
  * @param integer $metal
  * @param integer $silicon
  * @param integer $hydrogen
  * @param integer $holdingTime
  * @throws Recipe_Exception_Generic
  * @return Bengine_Game_Controller_Mission
  */
 protected function sendFleet($mode, $metal, $silicon, $hydrogen, $holdingTime)
 {
     $this->noAction = true;
     $fleetEvents = Game::getEH()->getOwnFleetEvents();
     if ($fleetEvents && Game::getResearch(14) + 1 <= count(Game::getEH()->getOwnFleetEvents())) {
         throw new Recipe_Exception_Generic("Too many fleets on missions.");
     }
     $result = Core::getQuery()->select("temp_fleet", "data", "", Core::getDB()->quoteInto("planetid = ?", Core::getUser()->get("curplanet")));
     if ($row = $result->fetchRow()) {
         $result->closeCursor();
         $temp = unserialize($row["data"]);
         if (!in_array($mode, $temp["amissions"])) {
             Logger::dieMessage("UNKNOWN_MISSION");
         }
         $data["ships"] = $temp["ships"];
         $data["galaxy"] = $temp["galaxy"];
         $data["system"] = $temp["system"];
         $data["position"] = $temp["position"];
         $data["sgalaxy"] = Game::getPlanet()->getData("galaxy");
         $data["ssystem"] = Game::getPlanet()->getData("system");
         $data["sposition"] = Game::getPlanet()->getData("position");
         $data["maxspeed"] = $temp["maxspeed"];
         $distance = Game::getDistance($data["galaxy"], $data["system"], $data["position"]);
         $data["consumption"] = Game::getFlyConsumption($temp["consumption"], $distance, $temp["speed"]);
         if (Game::getPlanet()->getData("hydrogen") - $data["consumption"] < 0) {
             Logger::dieMessage("NOT_ENOUGH_FUEL");
         }
         if ($temp["capacity"] < $data["consumption"]) {
             Logger::dieMessage("NOT_ENOUGH_CAPACITY");
         }
         $data["metal"] = (int) abs($metal);
         $data["silicon"] = (int) abs($silicon);
         $data["hydrogen"] = (int) abs($hydrogen);
         if ($data["metal"] > Game::getPlanet()->getData("metal")) {
             $data["metal"] = _pos(Game::getPlanet()->getData("metal"));
         }
         if ($data["silicon"] > Game::getPlanet()->getData("silicon")) {
             $data["silicon"] = _pos(Game::getPlanet()->getData("silicon"));
         }
         if ($data["hydrogen"] > Game::getPlanet()->getData("hydrogen") - $data["consumption"]) {
             $data["hydrogen"] = _pos(Game::getPlanet()->getData("hydrogen") - $data["consumption"]);
         }
         if ($mode == 13) {
             $data["duration"] = _pos($holdingTime);
             if ($data["duration"] > 24) {
                 $data["duration"] = 24;
             }
             $data["duration"] *= 3600;
         }
         $capa = $temp["capacity"] - $data["consumption"] - $data["metal"] - $data["silicon"] - $data["hydrogen"];
         // Reduce used capacity automatically
         if ($capa < 0) {
             if ($capa + $data["hydrogen"] > 0) {
                 $data["hydrogen"] -= abs($capa);
             } else {
                 $capa += $data["hydrogen"];
                 $data["hydrogen"] = 0;
                 if ($capa + $data["silicon"] > 0 && $capa < 0) {
                     $data["silicon"] -= abs($capa);
                 } else {
                     if ($capa < 0) {
                         $capa += $data["silicon"];
                         $data["silicon"] = 0;
                         if ($capa + $data["metal"] && $capa < 0) {
                             $data["metal"] -= abs($capa);
                         } else {
                             if ($capa < 0) {
                                 $data["metal"] = 0;
                             }
                         }
                     }
                 }
             }
         }
         $data["capacity"] = $temp["capacity"] - $data["consumption"] - $data["metal"] - $data["silicon"] - $data["hydrogen"];
         if ($data["capacity"] < 0) {
             Logger::dieMessage("NOT_ENOUGH_CAPACITY");
         }
         // If mission is recycling, get just the capacity of the recyclers.
         if ($mode == 9 && $data["capacity"] > 0) {
             $_result = Core::getQuery()->select("ship_datasheet", "capicity", "", "unitid = '37'");
             // It is __capacity__ and not capicity
             $_row = $_result->fetchRow();
             $_result->closeCursor();
             $recCapa = $_row["capicity"] * $temp["ships"][37]["quantity"];
             if ($data["capacity"] >= $recCapa) {
                 $data["capacity"] = $recCapa;
             }
         }
         $time = Game::getFlyTime($distance, $data["maxspeed"], $temp["speed"]);
         $data["time"] = $time;
         if ($mode == 18) {
             $data["alliance_attack"] = $temp["alliance_attack"];
             $mainFleet = Game::getEH()->getMainFormationFleet($data["alliance_attack"]["eventid"]);
             $allFleets = Game::getEH()->getFormationFleets($data["alliance_attack"]["eventid"]);
             $numFleets = 1;
             $formationUser[$mainFleet->get("user")] = true;
             /* @var Bengine_Game_Model_Fleet $oneFleet */
             foreach ($allFleets as $oneFleet) {
                 $numFleets++;
                 $formationUser[$oneFleet->get("user")] = true;
             }
             unset($formationUser[Core::getUser()->get("userid")]);
             if ($numFleets >= Core::getOptions()->get("MAX_FORMATION_FLEETS")) {
                 Logger::dieMessage("MAX_FORMATION_FLEETS_EXCEEDED");
             }
             if (count($formationUser) >= Core::getOptions()->get("MAX_FORMATION_USER")) {
                 Logger::dieMessage("MAX_FORMATION_USER_EXCEEDED");
             }
             if ($data["time"] + TIME > ($mainFleet["time"] - TIME) * (1 + Core::getOptions()->get("MAX_FORMATION_DELAY")) + TIME) {
                 Logger::dieMessage("MAX_FORMATION_DELAY_EXCEEDED");
             }
         }
         Hook::event("SendFleet", array(&$data, &$time, &$temp, $distance));
         Core::getQuery()->delete("temp_fleet", "planetid = ?", null, null, array(Core::getUser()->get("curplanet")));
         $handler = Game::getEH()->addEvent($mode, $time + TIME, Core::getUser()->get("curplanet"), Core::getUser()->get("userid"), isset($temp["destination"]) ? $temp["destination"] : null, $data);
         Core::getTPL()->assign("mission", Game::getMissionName($mode));
         Core::getTPL()->assign("mode", $mode);
         Core::getTPL()->assign("distance", fNumber($distance));
         Core::getTPL()->assign("speed", fNumber($temp["maxspeed"]));
         Core::getTPL()->assign("consume", fNumber($data["consumption"]));
         Core::getTPL()->assign("start", Game::getPlanet()->getCoords(false));
         Core::getTPL()->assign("target", $data["galaxy"] . ":" . $data["system"] . ":" . $data["position"]);
         Core::getTPL()->assign("arrival", Date::timeToString(1, $handler->getFinishTime()));
         if ($returnTime = $handler->getReturnTime()) {
             Core::getTPL()->assign("return", Date::timeToString(1, $returnTime));
         }
         $fleet = array();
         foreach ($data["ships"] as $key => $value) {
             $fleet[$key]["name"] = Core::getLanguage()->getItem($value["name"]);
             $fleet[$key]["quantity"] = fNumber($value["quantity"]);
         }
         Core::getTPL()->addLoop("fleet", $fleet);
         $this->setTemplate("mission/step4");
     }
     return $this;
 }
Пример #8
0
 /**
  * Adds an user to buddylist.
  *
  * @param integer $userid
  *
  * @return Bengine_Game_Controller_Friends
  */
 protected function addAction($userid)
 {
     Core::getLanguage()->load(array("Buddylist"));
     if ($userid == Core::getUser()->get("userid")) {
         Logger::dieMessage("SELF_REQUEST");
     }
     $where = Core::getDB()->quoteInto("friend1 = ? AND friend2 = ? OR friend1 = ? AND friend2 = ?", array($userid, Core::getUser()->get("userid"), Core::getUser()->get("userid"), $userid));
     $result = Core::getQuery()->select("buddylist", array("friend1", "friend2"), "", $where);
     if ($result->rowCount() == 0) {
         Hook::event("AddToBuddyList", array($userid));
         Core::getQuery()->insert("buddylist", array("friend1" => Core::getUser()->get("userid"), "friend2" => $userid));
         /* @var Bengine_Game_Model_Message $pm */
         $pm = Game::getModel("game/message");
         $pm->set("receiver", $userid)->set("mode", Bengine_Game_Model_Message::USER_FOLDER_ID)->set("subject", Core::getLang()->get("FRIEND_REQUEST_RECEIVED"))->set("message", Core::getLang()->get("FRIEND_REQUEST_RECEIVED_MESSAGE"));
         $pm->send();
     }
     return $this->redirect("game/" . SID . "/Friends");
 }
Пример #9
0
 /**
  * Checks if the user send to many message (spam protection).
  *
  * @return Bengine_Game_Controller_MSG
  */
 protected function checkForSpam()
 {
     if ($max = Core::getConfig()->get("MESSAGE_FLOOD_MAX")) {
         $bind = array(Core::getUser()->get("userid"), TIME - Core::getConfig()->get("MESSAGE_FLOOD_SPAN"), Bengine_Game_Model_Message::USER_FOLDER_ID);
         $result = Core::getQuery()->select("message", array("COUNT(msgid)"), "", "sender = ? AND time >= ? AND mode = ?", "", 1, "", "", $bind);
         if ($result->fetchColumn() >= $max) {
             Logger::dieMessage("MESSAGE_FLOOD_INFO", "warning");
         }
     }
     return $this;
 }
Пример #10
0
 /**
  * Check for sufficient resources and start research upgrade.
  *
  * @param integer $id    Building id to upgrade
  * @throws Recipe_Exception_Generic
  * @return Bengine_Game_Controller_Research
  */
 protected function upgradeAction($id)
 {
     // Check events
     if ($this->event != false || Core::getUser()->get("umode")) {
         $this->redirect("game/" . SID . "/Research");
     }
     // Check for requirements
     if (!Game::canBuild($id) || !Game::getPlanet()->getBuilding("RESEARCH_LAB")) {
         throw new Recipe_Exception_Generic("You do not fulfil the requirements to research this.");
     }
     // Check if research labor is not in progress
     if (!Game::getEH()->canReasearch()) {
         throw new Recipe_Exception_Generic("Research labor in progress.");
     }
     /* @var Bengine_Game_Model_Construction $construction */
     $construction = Game::getModel("game/construction");
     $construction->load($id);
     if (!$construction->getId()) {
         throw new Recipe_Exception_Generic("Unkown research :(");
     }
     if ($construction->get("mode") != self::RESEARCH_CONSTRUCTION_TYPE) {
         throw new Recipe_Exception_Generic("Research not allowed.");
     }
     if (Game::getPlanet()->getData("ismoon") && !$construction->get("allow_on_moon")) {
         throw new Recipe_Exception_Generic("Research not allowed.");
     }
     Hook::event("UpgradeResearchFirst", array($construction));
     // Get required resources
     $level = Game::getResearch($id);
     if ($level > 0) {
         $level = $level + 1;
     } else {
         $level = 1;
     }
     $this->setRequieredResources($level, $construction);
     // Check resources
     if ($this->checkResources()) {
         $data["metal"] = $this->requiredMetal;
         $data["silicon"] = $this->requiredSilicon;
         $data["hydrogen"] = $this->requiredHydrogen;
         $data["energy"] = $this->requiredEnergy;
         $time = getBuildTime($data["metal"], $data["silicon"], self::RESEARCH_CONSTRUCTION_TYPE);
         $data["level"] = $level;
         $data["buildingid"] = $id;
         $data["buildingname"] = $construction->get("name");
         Hook::event("UpgradeResearchLast", array($construction, &$data, &$time));
         Game::getEH()->addEvent(3, $time + TIME, Core::getUser()->get("curplanet"), Core::getUser()->get("userid"), null, $data);
         $this->redirect("game/" . SID . "/Research");
     } else {
         Logger::dieMessage("INSUFFICIENT_RESOURCES");
     }
     return $this;
 }
Пример #11
0
 /**
  * Disables the vacation mode and starts the resource production.
  *
  * @return Bengine_Game_Controller_Preferences
  */
 protected function disableUmode()
 {
     setProdOfUser(Core::getUser()->get("userid"), 100);
     Core::getQuery()->update("user", array("umode" => 0), "userid = ?", array(Core::getUser()->get("userid")));
     Core::getQuery()->update("planet", array("last" => TIME), "userid = ? AND planetid != ?", array(Core::getUser()->get("userid"), Core::getUser()->get("curplanet")));
     Core::getUser()->rebuild();
     Hook::event("DisableVacationMode");
     Logger::dieMessage("UMODE_DISABLED", "info");
     return $this;
 }