/** * @return Bengine_Game_Controller_Shipyard */ protected function cancelAction() { $events = Core::getRequest()->getPOST("shipyard_events"); foreach ($events as $eventId) { $event = Game::getModel("game/event")->load((int) $eventId); if ($event->get("userid") == Core::getUser()->get("userid")) { Game::getEH()->removeEvent($event); } } $this->redirect("game/" . SID . "/" . Core::getRequest()->getGET("controller")); return $this; }
/** * Shows all building information. * * @param integer $id * @throws Recipe_Exception_Generic * @return Bengine_Game_Controller_Constructions */ protected function infoAction($id) { $select = array("name", "demolish", "basic_metal", "basic_silicon", "basic_hydrogen", "basic_energy", "prod_metal", "prod_silicon", "prod_hydrogen", "prod_energy", "special", "cons_metal", "cons_silicon", "cons_hydrogen", "cons_energy", "charge_metal", "charge_silicon", "charge_hydrogen", "charge_energy"); $result = Core::getQuery()->select("construction", $select, "", Core::getDB()->quoteInto("buildingid = ? AND (mode = '1' OR mode = '2' OR mode = '5')", $id)); if ($row = $result->fetchRow()) { $result->closeCursor(); Core::getLanguage()->load("info,Resource"); Hook::event("BuildingInfoBefore", array(&$row)); // Assign general building data Core::getTPL()->assign("buildingName", Core::getLanguage()->getItem($row["name"])); Core::getTPL()->assign("buildingDesc", Core::getLanguage()->getItem($row["name"] . "_FULL_DESC")); Core::getTPL()->assign("buildingImage", Image::getImage("buildings/" . $row["name"] . ".gif", Core::getLanguage()->getItem($row["name"]), null, null, "leftImage")); Core::getTPL()->assign("edit", Link::get("game/" . SID . "/Construction_Edit/Index/" . $id, "[" . Core::getLanguage()->getItem("EDIT") . "]")); // Production and consumption of the building $prodFormula = false; if (!empty($row["prod_metal"])) { $prodFormula = $row["prod_metal"]; $baseCost = $row["basic_metal"]; } else { if (!empty($row["prod_silicon"])) { $prodFormula = $row["prod_silicon"]; $baseCost = $row["basic_metal"]; } else { if (!empty($row["prod_hydrogen"])) { $prodFormula = $row["prod_hydrogen"]; $baseCost = $row["basic_hydrogen"]; } else { if (!empty($row["prod_energy"])) { $prodFormula = $row["prod_energy"]; $baseCost = $row["basic_energy"]; } else { if (!empty($row["special"])) { $prodFormula = $row["special"]; $baseCost = 0; } } } } } $consFormula = false; if (!empty($row["cons_metal"])) { $consFormula = $row["cons_metal"]; } else { if (!empty($row["cons_silicon"])) { $consFormula = $row["cons_silicon"]; } else { if (!empty($row["cons_hydrogen"])) { $consFormula = $row["cons_hydrogen"]; } else { if (!empty($row["cons_energy"])) { $consFormula = $row["cons_energy"]; } } } } // Production and consumption chart $chartType = false; if ($prodFormula != false || $consFormula != false) { $chart = array(); $chartType = "cons_chart"; if ($prodFormula && $consFormula) { $chartType = "prod_and_cons_chart"; } else { if ($prodFormula) { $chartType = "prod_chart"; } } if (Game::getPlanet()->getBuilding($id) - 7 < 0) { $start = 7; } else { $start = Game::getPlanet()->getBuilding($id); } $productionFactor = (double) Core::getConfig()->get("PRODUCTION_FACTOR"); if (!empty($row["prod_energy"])) { $productionFactor = 1; } $currentProduction = 0; if ($prodFormula) { $currentProduction = parseFormula($prodFormula, $baseCost, Game::getPlanet()->getBuilding($id)) * $productionFactor; } $currentConsumption = 0; if ($consFormula) { $currentConsumption = parseFormula($consFormula, 0, Game::getPlanet()->getBuilding($id)); } for ($i = $start - 7; $i <= Game::getPlanet()->getBuilding($id) + 7; $i++) { $chart[$i]["level"] = $i; $chart[$i]["s_prod"] = $prodFormula ? parseFormula($prodFormula, $baseCost, $i) * $productionFactor : 0; $chart[$i]["s_diffProd"] = $prodFormula ? $chart[$i]["s_prod"] - $currentProduction : 0; $chart[$i]["s_cons"] = $consFormula ? parseFormula($consFormula, 0, $i) : 0; $chart[$i]["s_diffCons"] = $consFormula ? $currentConsumption - $chart[$i]["s_cons"] : 0; $chart[$i]["prod"] = fNumber($chart[$i]["s_prod"]); $chart[$i]["diffProd"] = fNumber($chart[$i]["s_diffProd"]); $chart[$i]["cons"] = fNumber($chart[$i]["s_cons"]); $chart[$i]["diffCons"] = fNumber($chart[$i]["s_diffCons"]); } Hook::event("BuildingInfoProduction", array(&$chart)); Core::getTPL()->addLoop("chart", $chart); } if ($chartType) { Core::getTPL()->assign("chartType", "game/constructions/" . $chartType); } // Show demolish function $factor = floatval($row["demolish"]); if (Game::getPlanet()->getBuilding($id) > 0 && $factor > 0.0) { Core::getTPL()->assign("buildingLevel", Game::getPlanet()->getBuilding($id)); Core::getTPL()->assign("demolish", true); $metal = ""; $_metal = 0; $silicon = ""; $_silicon = 0; $hydrogen = ""; $_hydrogen = 0; if ($row["basic_metal"] > 0) { $_metal = 1 / $factor * parseFormula($row["charge_metal"], $row["basic_metal"], Game::getPlanet()->getBuilding($id)); $metal = Core::getLanguage()->getItem("METAL") . ": " . fNumber($_metal); } Core::getTPL()->assign("metal", $metal); if ($row["basic_silicon"] > 0) { $_silicon = 1 / $factor * parseFormula($row["charge_silicon"], $row["basic_silicon"], Game::getPlanet()->getBuilding($id)); $silicon = Core::getLanguage()->getItem("SILICON") . ": " . fNumber($_silicon); } Core::getTPL()->assign("silicon", $silicon); if ($row["basic_hydrogen"] > 0) { $_hydrogen = 1 / $factor * parseFormula($row["charge_hydrogen"], $row["basic_hydrogen"], Game::getPlanet()->getBuilding($id)); $hydrogen = Core::getLanguage()->getItem("HYDROGEN") . ": " . fNumber($_hydrogen); } Core::getTPL()->assign("hydrogen", $hydrogen); $time = getBuildTime($_metal, $_silicon, self::BUILDING_CONSTRUCTION_TYPE); Core::getTPL()->assign("dimolishTime", getTimeTerm($time)); $showLink = Game::getPlanet()->getData("metal") >= $_metal && Game::getPlanet()->getData("silicon") >= $_silicon && Game::getPlanet()->getData("hydrogen") >= $_hydrogen; if ($id == 12 && Game::getEH()->getResearchEvent()) { $showLink = false; } $shipyardSize = Game::getEH()->getShipyardEvents()->getCalculatedSize(); if (($id == 8 || $id == 7) && $shipyardSize > 0) { $showLink = false; } Core::getTPL()->assign("showLink", $showLink && !$this->event && !Core::getUser()->get("umode")); Core::getTPL()->assign("demolishNow", Link::get("game/" . SID . "/Constructions/Demolish/{$id}", Core::getLanguage()->getItem("DEMOLISH_NOW"))); } else { Core::getTPL()->assign("demolish", false); } Hook::event("BuildingInfoAfter", array(&$row)); } else { $result->closeCursor(); throw new Recipe_Exception_Generic("Unkown building. You'd better don't manipulate the URL. We see everything ;)"); } return $this; }
/** * Parses an event. * * @param Bengine_Game_Model_Event $f * * @return array Parsed event data */ protected function parseEvent(Bengine_Game_Model_Event $f) { if ($f->getCode() == "game/alliedFleet" && $f->getUserid() != Core::getUser()->get("userid")) { return false; // Hide foreign formations } $event = array(); $event["time_r"] = $f->getTimeLeft(); $event["time"] = $f->getFormattedTimeLeft(); $event["eventid"] = $f->getEventid(); $event["time_finished"] = Date::timeToString(1, $f->getTime()); $event["raw_coordinates"] = $f->getDestinationCoords(false); Core::getLanguage()->assign("rockets", $f->getData("rockets", 0)); Core::getLanguage()->assign("planet", !$f->getData("oldmode") || $f->getData("oldmode") != 9 ? $f->getPlanetname() : Core::getLanguage()->getItem("DEBRIS")); // TODO: Old mode should be translated to code Core::getLanguage()->assign("coords", $f->getPlanetCoords()); Core::getLanguage()->assign("target", $f->getCode() != "game/recycling" ? $f->getDestinationPlanetname() : Core::getLanguage()->getItem("DEBRIS")); Core::getLanguage()->assign("targetcoords", $f->getDestinationCoords()); Core::getLanguage()->assign("metal", fNumber($f->getData("metal", 0))); Core::getLanguage()->assign("silicon", fNumber($f->getData("silicon", 0))); Core::getLanguage()->assign("hydrogen", fNumber($f->getData("hydrogen", 0))); Core::getLanguage()->assign("username", $f->getUsername()); Core::getLanguage()->assign("message", Link::get("game/" . SID . "/MSG/Write/" . rawurlencode($f->getUsername()), Image::getImage("pm.gif", Core::getLanguage()->getItem("WRITE_MESSAGE")))); Core::getLanguage()->assign("mission", $f->getCode() == "game/return" ? $f->getOrgModeName() : $f->getModeName()); Core::getLanguage()->assign("fleet", $f->getFleetString()); $event["class"] = $f->getCssClass(); if ($f->getCode() == "game/allianceAttack") { if ($f->getUserid() == Core::getUser()->get("userid")) { $event["message"] = Core::getLanguage()->getItem("FLEET_MESSAGE_OWN"); } else { $event["message"] = Core::getLanguage()->getItem("FLEET_MESSAGE_OTHER"); } $allyFleets = Game::getEH()->getFormationFleets($f->getEventid()); foreach ($allyFleets as $af) { $coords = $af->getPlanetCoords(); $msg = Core::getLanguage()->getItem("FLEET_MESSAGE_FORMATION"); $msg = sprintf($msg, $af->getUsername(), $af->getPlanetname(), $coords, $af->getFleetString()); $event["message"] .= $msg; } } else { if ($f->getCode() == "game/alliedFleet") { $mainFleet = Game::getModel("game/event")->load($f->getParentId()); if ($mainFleet->getUsierid() == Core::getUser()->get("userid")) { return false; } $event["message"] = Core::getLanguage()->getItem("FLEET_MESSAGE_OWN"); $allyFleets = Game::getEH()->getFormationFleets($mainFleet->getEventid()); $allyFleets->add($mainFleet); foreach ($allyFleets as $af) { if ($af->getUserid() == Core::getUser()->get("userid")) { continue; } $coords = $af->getPlanetCoords(); $msg = Core::getLanguage()->getItem("FLEET_MESSAGE_FORMATION"); $msg = sprintf($msg, $af->getUsername(), $af->getPlanetname(), $coords, $af->getFleetString()); $event["message"] .= $msg; } } else { if ($f->getCode() == "game/holding" && $f->getUserid() == Core::getUser()->get("userid")) { $event["message"] = Core::getLanguage()->getItem("FLEET_MESSAGE_HOLDING_1"); } else { if ($f->getCode() == "game/holding") { $event["message"] = Core::getLanguage()->getItem("FLEET_MESSAGE_HOLDING_2"); } else { if ($f->getCode() == "game/return" && $f->getUserid() == Core::getUser()->get("userid")) { $event["message"] = Core::getLanguage()->getItem("FLEET_MESSAGE_RETURN"); } else { if ($f->getUserid() == Core::getUser()->get("userid") && $f->getCode() == "game/missileAttack") { $event["message"] = Core::getLanguage()->getItem("FLEET_MESSAGE_ROCKET_ATTACK"); } else { if ($f->getCode() == "game/missileAttack") { $event["message"] = Core::getLanguage()->getItem("FLEET_MESSAGE_ROCKET_ATTACK_FOREIGN"); } else { if ($f->getUserid() == Core::getUser()->get("userid")) { $event["message"] = Core::getLanguage()->getItem("FLEET_MESSAGE_OWN"); } else { $event["message"] = Core::getLanguage()->getItem("FLEET_MESSAGE_OTHER"); } } } } } } } } return $event; }
/** * Retreats a fleet back to its origin planet. * * @param integer $id * * @return Bengine_Game_Controller_Mission */ protected function retreatFleet($id) { $this->noAction = true; Hook::event("RetreatFleet", array(&$id)); Game::getEH()->removeEvent($id); $this->redirect("game/" . SID . "/Mission"); return $this; }
/** * Sends espionage probes. * * @param int $target * @return Bengine_Game_Controller_Ajax_Fleet */ protected function espionageAction($target) { if (Game::attackingStoppageEnabled()) { $this->display($this->format(Core::getLang()->get("ATTACKING_STOPPAGE_ENABLED"))); } $select = array("p.planetid", "g.galaxy", "g.system", "g.position", "u2s.quantity", "sd.capicity", "sd.speed", "sd.consume", "b.name AS shipname"); $joins = "LEFT JOIN " . PREFIX . "galaxy g ON (g.planetid = p.planetid)"; $joins .= "LEFT JOIN " . PREFIX . "unit2shipyard u2s ON (u2s.planetid = p.planetid)"; $joins .= "LEFT JOIN " . PREFIX . "ship_datasheet sd ON (sd.unitid = u2s.unitid)"; $joins .= "LEFT JOIN " . PREFIX . "construction b ON (b.buildingid = u2s.unitid)"; $result = Core::getQuery()->select("planet p", $select, $joins, Core::getDB()->quoteInto("p.planetid = ? AND u2s.unitid = '38'", Core::getUser()->get("curplanet"))); if ($row = $result->fetchRow()) { $result->closeCursor(); $joins = "LEFT JOIN " . PREFIX . "planet p ON (g.planetid = p.planetid)"; $joins .= "LEFT JOIN " . PREFIX . "user u ON (u.userid = p.userid)"; $joins .= "LEFT JOIN " . PREFIX . "ban_u b ON (u.userid = b.userid)"; $where = Core::getDB()->quoteInto("g.planetid = ? OR g.moonid = ?", $target); $result = Core::getQuery()->select("galaxy g", array("g.galaxy", "g.system", "g.position", "u.points", "u.last", "u.umode", "b.to"), $joins, $where); if ($tar = $result->fetchRow()) { $result->closeCursor(); Hook::event("AjaxSendFleetEspionage", array($this, &$row, &$tar)); $ignoreNP = false; if ($tar["last"] <= TIME - 604800) { $ignoreNP = true; } else { if ($tar["to"] >= TIME) { $ignoreNP = true; } } $data = array(); // Check for newbie protection if ($ignoreNP === false) { $isProtected = isNewbieProtected(Core::getUser()->get("points"), $tar["points"]); if ($isProtected == 1) { $this->display($this->format(Core::getLanguage()->getItem("TARGET_TOO_WEAK"))); } else { if ($isProtected == 2) { $this->display($this->format(Core::getLanguage()->getItem("TARGET_TOO_STRONG"))); } } } // Check for vacation mode if ($tar["umode"] || Core::getUser()->get("umode")) { $this->display($this->format(Core::getLanguage()->getItem("TARGET_IN_UMODE"))); } // Get quantity if ($row["quantity"] >= Core::getUser()->get("esps")) { $data["ships"][38]["quantity"] = Core::getUser()->get("esps") > 0 ? Core::getUser()->get("esps") : 1; } else { $data["ships"][38]["quantity"] = $row["quantity"]; } $data["ships"][38]["id"] = 38; $data["ships"][38]["name"] = $row["shipname"]; $data["maxspeed"] = Game::getSpeed(38, $row["speed"]); $distance = Game::getDistance($tar["galaxy"], $tar["system"], $tar["position"]); $time = Game::getFlyTime($distance, $data["maxspeed"]); $data["consumption"] = Game::getFlyConsumption($data["ships"][38]["quantity"] * $row["consume"], $distance); if (Game::getPlanet()->getData("hydrogen") < $data["consumption"]) { $this->display($this->format(Core::getLanguage()->getItem("DEFICIENT_CONSUMPTION"))); } if ($row["capicity"] * $data["ships"][38]["quantity"] - $data["consumption"] < 0) { $this->display($this->format(Core::getLanguage()->getItem("DEFICIENT_CAPACITY"))); } Game::getPlanet()->setData("hydrogen", Game::getPlanet()->getData("hydrogen") - $data["consumption"]); $data["time"] = $time; $data["galaxy"] = $tar["galaxy"]; $data["system"] = $tar["system"]; $data["position"] = $tar["position"]; $data["sgalaxy"] = $row["galaxy"]; $data["ssystem"] = $row["system"]; $data["sposition"] = $row["position"]; $data["metal"] = 0; $data["silicon"] = 0; $data["hydrogen"] = 0; Hook::event("AjaxSendFleetEspionageStartEvent", array($row, $tar, &$data)); Game::getEH()->addEvent(11, $time + TIME, Core::getUser()->get("curplanet"), Core::getUser()->get("userid"), $target, $data); $this->display($this->format(sprintf(Core::getLanguage()->getItem("ESPS_SENT"), $data["ships"][38]["quantity"], $data["galaxy"], $data["system"], $data["position"]), 1)); } else { $result->closeCursor(); $this->display($this->format("Unkown destination")); } } else { $result->closeCursor(); $this->display($this->format(Core::getLanguage()->getItem("DEFICIENT_ESPS"))); } return $this; }
/** * Aborts the current research event. * * @param integer $id Building id * * @return Bengine_Game_Controller_Research */ protected function abortAction($id) { if (Core::getUser()->get("umode") || !$this->event) { $this->redirect("game/" . SID . "/Research"); } $result = Core::getQuery()->select("construction", array("buildingid"), "", Core::getDB()->quoteInto("buildingid = ? AND mode = '2'", $id)); if ($row = $result->fetchRow()) { $result->closeCursor(); Hook::event("AbortResearch", array($this)); Game::getEH()->removeEvent($this->event->get("eventid")); $this->redirect("game/" . SID . "/Research"); } $result->closeCursor(); return $this; }