47{
48 runBuildOrderOnFrame();
49
50 buildingPlacer.drawPoweredTiles();
51
52
53
54 for (ResourceRequest& request : resourceRequests)
55 {
56 if (request.state != ResourceRequest::State::Approved_InProgress)
57 {
58 continue;
59 }
60
61 switch (request.type)
62 {
63 case ResourceRequest::Type::Unit:
64 {
65 if (request.requestedBuilding->canTrain(request.unit) &&
66 !request.requestedBuilding->isTraining() &&
67 request.requestedBuilding->isCompleted() &&
68 request.requestedBuilding->isPowered())
69 {
70 if (request.requestedBuilding->train(request.unit))
71 {
72 request.state = ResourceRequest::State::Accepted_Completed;
73 request.frameRequestServiced = BWAPI::Broodwar->getFrameCount();
74 }
75 else
76 {
77 std::cout << "Failed to train unit for whatever reason\n";
78 }
79 }
80
81 break;
82 }
83 case ResourceRequest::Type::Building:
84 {
85
86 if (request.isCheese)
87 {
88 request.state = ResourceRequest::State::Approved_BeingBuilt;
89 }
90 else
91 {
92 if (request.placementPos == BWAPI::Positions::Invalid) request.placementInfo = buildingPlacer.getPositionToBuild(request.unit, request.base);
93
94 if (request.placementInfo.position == BWAPI::Positions::Invalid && request.gotPositionToBuild == false)
95 {
96 const PlacementInfo::PlacementFlag flag_info = request.placementInfo.flag;
97
98 switch (flag_info)
99 {
100 case PlacementInfo::NO_POWER:
101
102
103 break;
104 case PlacementInfo::NO_BLOCKS:
105
106
107 break;
108 case PlacementInfo::NO_GYSERS:
109
110
111 break;
112 case PlacementInfo::NO_PLACEMENTS:
113
114
115 break;
116 case PlacementInfo::NO_EXPANSIONS:
117
118
119 break;
120 }
121
122 request.attempts++;
123 }
124 else
125 {
126 request.placementPos = request.placementInfo.position;
127 request.tileToPlace = request.placementInfo.topLeft;
128
129 const BWAPI::Unit workerAvalible = getUnitToBuild(request.placementPos);
130
131 if (workerAvalible == nullptr) continue;
132
133 Path pathToLocation;
134 if (request.unit.isResourceDepot())
135 {
136
137 pathToLocation =
AStar::GeneratePath(workerAvalible->getPosition(), workerAvalible->getType(), request.placementPos);
138 }
139 else if (request.unit.isRefinery())
140 {
141
142 pathToLocation =
AStar::GeneratePath(workerAvalible->getPosition(), workerAvalible->getType(), request.placementPos,
true);
143 }
144 else
145 {
146
147 pathToLocation =
AStar::GeneratePath(workerAvalible->getPosition(), workerAvalible->getType(), request.placementPos);
148 }
149
150 Builder temp = Builder(workerAvalible, request.unit, request.placementPos, pathToLocation);
151 builders.push_back(temp);
152
153 request.state = ResourceRequest::State::Approved_BeingBuilt;
154 request.frameRequestServiced = BWAPI::Broodwar->getFrameCount();
155
156 BWEB::Map::addUsed(request.placementInfo.topLeft, request.unit);
157 }
158 }
159 break;
160 }
161 case ResourceRequest::Type::Upgrade:
162 {
163 if (request.requestedBuilding->canUpgrade(request.upgrade) &&
164 !request.requestedBuilding->isUpgrading() &&
165 request.requestedBuilding->isCompleted() &&
166 request.requestedBuilding->isPowered())
167 {
168 if (request.requestedBuilding->upgrade(request.upgrade))
169 {
170 request.state = ResourceRequest::State::Accepted_Completed;
171 request.frameRequestServiced = BWAPI::Broodwar->getFrameCount();
172 }
173 else
174 {
175 std::cout << "Failed to upgrade for whatever reason\n";
176 }
177 }
178 break;
179 }
180 case ResourceRequest::Type::Tech:
181 {
182 if (request.requestedBuilding->canResearch(request.upgrade) &&
183 !request.requestedBuilding->isResearching() &&
184 request.requestedBuilding->isCompleted() &&
185 request.requestedBuilding->isPowered())
186 {
187 if (request.requestedBuilding->upgrade(request.upgrade))
188 {
189 request.state = ResourceRequest::State::Accepted_Completed;
190 request.frameRequestServiced = BWAPI::Broodwar->getFrameCount();
191 }
192 else
193 {
194 std::cout << "Failed to research tech for whatever reason\n";
195 }
196 }
197 break;
198 }
199 }
200 }
201
202 for (Builder& builder : builders)
203 {
204 builder.onFrame();
205 }
206}
static Path GeneratePath(BWAPI::Position _start, BWAPI::UnitType unitType, BWAPI::Position _end, bool isInteractableEndpoint=false)
Generates path from start to end using A* pathfinding algorithm.