public static function FromIDResource(IDResource $resource, $position, $oldPosition, $scheduledTime, BuildGroup $bg = NULL) { $buildItem = new BuildItem(); $buildItem->Name($resource->Name()); $buildItem->Cost($resource->Cost()); $buildItem->NextCostModifier($resource->NextCostModifier()); $buildItem->Prerequisite($resource->Prerequisite()); $buildItem->ID($resource->ID()); $buildItem->Amount($resource->Amount(), false); $buildItem->PositionInList($position, false); $buildItem->OldPositionInList($oldPosition, false); $buildItem->FirstBuildTime($scheduledTime); $buildItem->HasChanged(false); $buildItem->BuildGroup($bg); return $buildItem; }
public function BuildTime(BuildItem $item) { // Calculate next build level $nextBuildLevel = $this->GetNextBuildLevel($group); // Calculate costs $buildCosts = $this->BuildCost($group, $nextBuildLevel); // Calculate time required $colony =& $item->BuildGroup()->Colony(); $interGalacticLabLevel = $colony->Technologies()->GetMemberByName("intergalactic_research_network_technology")->Amount(); $researchLabs = 0; if ($interGalacticLabLevel > 0) { // Get all the research labs from this user $userID = $colony->Owner()->ID(); $query = "SELECT cs.research_lab FROM colony_structures AS cs, colony AS c WHERE cs.colonyID = c.ID AND c.userID = {$userID};"; $results = Database::Instance()->ExecuteQuery($query, "SELECT"); $numberOfLabs = 0; $labList = array(); if (isset($results['research_lab'])) { // Single result $labList[$numberOfLabs] = $results['research_lab']; } else { // List of results foreach ($results as $result) { $labList[$numberOfLabs] = $result['research_lab']; $numberOfLabs++; } } asort($labList); // Sort from lowest to highest for ($i = 0; $i <= $interGalacticLabLevel; $i++) { $researchLabs += $labList[$lab]; } } else { $researchLabs = $colony->Buildings()->GetMemberByName("research_lab")->Amount(); } global $NN_config; $metalCost =& $buildCosts->Metal(); $crystalCost =& $buildCosts->Crystal(); $gameSpeed =& $NN_config["game_speed"]; $scientists = $colony->Owner()->Officers()->GetMemberByName("scientist")->Amount(); $timeRequired = ($metalCost + $crystalCost) / $gameSpeed * (1 / ($researchLabs + 1)) * 2; $timeRequired = floor($timeRequired * 3600 * (1 - $scientists * 0.1)); return $timeRequired; }
public function ContainsBuildItem(BuildItem $needle) { foreach ($this->Members() as $item) { if ($item->ID() === $needle->ID() && $item->PositionInList() === $needle->PositionInList() && $item->BuildGroup()->Colony()->Equals($needle->BuildGroup()->Colony())) { return true; } } return false; }
public function FieldsLeft(BuildItem $item) { if (!$item->IsBuilding()) { throw new Exception("You can't call Colony::FieldsLeft on a non-building BuildItem!"); } // First, calculate how many fields are used up by the items before this item in the build list $fieldsLeft = $this->MaxFields() - $this->UsedFields(); $list = $item->BuildGroup()->Members(); $myPosition = $item->PositionInList(); for ($i = 0; $i < $myPosition; $i++) { if ($list[$i]->IsBuilding()) { $fieldsLeft -= $list[$i]->Amount(); } } return $fieldsLeft; }
public function DeconstructionCost(BuildItem $item, $buildLevel = -1) { $colony =& $item->BuildGroup()->Colony(); $c = $this->BuildCost($item, $buildLevel); return new Cost(floor($c->Metal() / 4), floor($c->Crystal() / 4), floor($c->Deuterium() / 4), floor($c->Energy() / 4)); }