/** ** Check what must be built / trained. */ static void AiCheckingWork() { // Supply has the highest priority if (AiPlayer->NeedSupply) { if (AiPlayer->UnitTypeBuilt.empty() || AiPlayer->UnitTypeBuilt[0].Type->Stats[AiPlayer->Player->Index].Variables[SUPPLY_INDEX].Value == 0) { AiPlayer->NeedSupply = false; AiRequestSupply(); } } // Look to the build requests, what can be done. const int sz = AiPlayer->UnitTypeBuilt.size(); for (int i = 0; i < sz; ++i) { AiBuildQueue &queue = AiPlayer->UnitTypeBuilt[AiPlayer->UnitTypeBuilt.size() - sz + i]; CUnitType &type = *queue.Type; bool new_supply = false; // FIXME: must check if requirements are fulfilled. // Buildings can be destroyed. // Check if we have enough food. if (type.Stats[AiPlayer->Player->Index].Variables[DEMAND_INDEX].Value && !AiCheckSupply(*AiPlayer, type)) { AiPlayer->NeedSupply = true; new_supply = true; } // Check limits, AI should be broken if reached. if (queue.Want > queue.Made && AiPlayer->Player->CheckLimits(type) < 0) { continue; } // Check if resources available. const int c = AiCheckUnitTypeCosts(type); if (c) { AiPlayer->NeededMask |= c; // NOTE: we can continue and build things with lesser // resource or other resource need! continue; } else if (queue.Want > queue.Made && queue.Wait <= GameCycle) { if (AiMakeUnit(type, queue.Pos)) { // AiRequestSupply can change UnitTypeBuilt so recalculate queue AiBuildQueue &queue2 = AiPlayer->UnitTypeBuilt[AiPlayer->UnitTypeBuilt.size() - sz + i]; ++queue2.Made; queue2.Wait = 0; } else if (queue.Type->Building) { // Finding a building place is costly, don't try again for a while if (queue.Wait == 0) { queue.Wait = GameCycle + 150; } else { queue.Wait = GameCycle + 450; } } } if (new_supply) { // trigger this last, because it may re-arrange the queue and invalidate our queue item AiRequestSupply(); } } }
/** ** Entry point of resource manager, periodically called. */ void AiResourceManager() { // // Check if something needs to be build / trained. // AiCheckingWork(); // // Look if we can build a farm in advance. // if (!AiPlayer->NeedSupply && AiPlayer->Player->Supply == AiPlayer->Player->Demand) { AiRequestSupply(); } // // Collect resources. // if ((GameCycle / CYCLES_PER_SECOND) % COLLECT_RESOURCES_INTERVAL == (unsigned long)AiPlayer->Player->Index % COLLECT_RESOURCES_INTERVAL) { AiCollectResources(); } // // Check repair. // AiCheckRepair(); AiPlayer->NeededMask = 0; }