Esempio n. 1
0
 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;
 }
Esempio n. 2
0
 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;
 }
Esempio n. 3
0
 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;
 }
Esempio n. 4
0
 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;
 }
Esempio n. 5
0
 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));
 }