public function CanBeConstructed()
 {
     if (!parent::CanBeConstructed()) {
         return false;
     }
     $fieldsLeft = true;
     // In case of a building, can't build if there aren't enough fields
     if ($this->IsBuilding()) {
         if ($colony->FieldsLeft($this) == 0) {
             return false;
         }
     }
     // Can't have more than 1 shield dome
     if ($this->Name() === "small_shield_dome" || $this->Name() === "large_shield_dome") {
         switch ($this->Name()) {
             case "small_shield_dome":
                 $amountOfAlreadyBuiltDomes = $this->BuildGroup()->Colony()->Buildings()->GetMemberByName("small_shield_dome")->Amount();
                 break;
             case "large_shield_dome":
                 $amountOfAlreadyBuiltDomes = $this->BuildGroup()->Colony()->Buildings()->GetMemberByName("large_shield_dome")->Amount();
                 break;
         }
         $thisAmount = $this->Amount();
         if ($amountOfAlreadyBuiltDomes > 0 || $thisAmount > 0) {
             return false;
         }
     }
     // TODO: check for more requirements
     return true;
 }
 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 DeleteItemFromDatabase(BuildItem $item)
 {
     $colonyID = $this->BuildList()->Colony()->ID();
     $type = $item->ID();
     $pos = $item->OldPositionInList();
     $query = "DELETE FROM production WHERE colonyID = {$colonyID} AND resource_type_being_built = {$type} AND build_list_position = {$pos};";
     $result = Database::Instance()->ExecuteQuery($query, "DElETE");
 }
 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;
 }
Beispiel #5
0
 public function AddUnit(BuildItem $unit)
 {
     $amount = 1;
     $name = $unit->Name();
     if ($unit->IsBuilding()) {
         $origAmount = $this->Buildings()->GetMemberByName($name)->Amount();
         $this->Buildings()->GetMemberByName($name)->Amount($origAmount + $amount);
     }
     if ($unit->IsShip()) {
         $origAmount = $this->Fleet()->GetMemberByName($name)->Amount();
         $this->Fleet()->GetMemberByName($name)->Amount($origAmount + $amount);
     }
     if ($unit->IsDefense()) {
         $origAmount = $this->Defenses()->GetMemberByName($name)->Amount();
         $this->Defenses()->GetMemberByName($name)->Amount($origAmount + $amount);
     }
     // TODO: add missiles here
 }
Beispiel #6
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;
 }
Beispiel #7
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));
 }