protected function CalculateNextBuildLevel(BuildItem $item, $alreadyBuiltLevels) { $scheduledLevelTotal = 0; // First, look through the database list. // If it's empty, it means the current BuildGroup IS the database list! We look through that list below. if ($item->BuildGroup()->ItemsInDatabase() != NULL) { foreach ($item->BuildGroup()->ItemsInDatabase() as $buildItem) { // We're only interested in items scheduled before us, not in the future! if ($buildItem->PositionInList() < $item->PositionInList()) { if ($buildItem->Name() === $this->Name()) { $scheduledLevelTotal += $buildItem->Amount(); } } } } // Next, look through the current BuildGroup, we may have requested units like these before (but they're not in the database yet) foreach ($item->BuildGroup()->Members() as $buildItem) { // We're only interested in items scheduled before us, not in the future! if ($buildItem->PositionInList() < $item->PositionInList()) { if ($buildItem->Name() === $this->Name()) { $scheduledLevelTotal += $buildItem->Amount(); } } } echo "<pre>the next buildLevel return of " . $item->Name() . " is " . ($alreadyBuiltLevels + $scheduledLevelTotal + 1) . ".</pre>"; return $alreadyBuiltLevels + $scheduledLevelTotal + 1; }
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 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; }