124
125
const UnitDef* udef = ai->cb->GetUnitDef(unitID);
126
127
if (ucat != CAT_LAST) {
128
assert(ai->GetUnit(unitID)->isDead);
129
ai->GetUnit(unitID)->isDead = false;
127
131
AllUnitsByCat[ucat].push_back(unitID);
128
132
AllUnitsByType[udef->id].push_back(unitID);
164
168
if (udef->isCommander && udef->canDGun) {
165
169
ai->dgunConHandler->AddController(unitID);
167
ai->MyUnits[unitID]->SetFireState(2);
171
ai->GetUnit(unitID)->SetFireState(2);
171
void CUnitHandler::UnitDestroyed(int unit) {
172
UnitCategory category = ai->ut->GetCategory(unit);
173
const UnitDef* unitDef = ai->cb->GetUnitDef(unit);
175
void CUnitHandler::UnitDestroyed(int unitID) {
176
UnitCategory category = ai->ut->GetCategory(unitID);
177
const UnitDef* unitDef = ai->cb->GetUnitDef(unitID);
175
179
if (category != CAT_LAST) {
176
AllUnitsByType[unitDef->id].remove(unit);
177
AllUnitsByCat[category].remove(unit);
178
IdleUnitRemove(unit);
179
BuildTaskRemove(unit);
180
assert(!ai->GetUnit(unitID)->isDead);
181
ai->GetUnit(unitID)->isDead = true;
183
AllUnitsByType[unitDef->id].remove(unitID);
184
AllUnitsByCat[category].remove(unitID);
185
IdleUnitRemove(unitID);
186
BuildTaskRemove(unitID);
181
188
if (category == CAT_DEFENCE) {
182
ai->dm->RemoveDefense(ai->cb->GetUnitPos(unit), unitDef);
189
ai->dm->RemoveDefense(ai->cb->GetUnitPos(unitID), unitDef);
184
191
if (category == CAT_MMAKER) {
192
MMakerRemove(unitID);
187
194
if (category == CAT_FACTORY) {
195
FactoryRemove(unitID);
191
198
if (category == CAT_BUILDER) {
192
199
// remove the builder
193
200
for (std::list<BuilderTracker*>::iterator i = BuilderTrackers.begin(); i != BuilderTrackers.end(); i++) {
194
if ((*i)->builderID == unit) {
201
if ((*i)->builderID == unitID) {
195
202
if ((*i)->buildTaskId)
196
203
BuildTaskRemove(*i);
197
204
if ((*i)->taskPlanId)
386
393
// TODO: remove all builders from this plan
387
394
if (reportError) {
388
395
std::list<BuilderTracker*> builderTrackers = taskPlan->builderTrackers;
389
for (std::list<BuilderTracker*>::iterator i = builderTrackers.begin(); i != builderTrackers.end(); i++) {
396
std::list<BuilderTracker*>::iterator i;
398
for (i = builderTrackers.begin(); i != builderTrackers.end(); i++) {
390
399
TaskPlanRemove(*i);
391
ai->MyUnits[(*i)->builderID]->Stop();
400
ai->GetUnit((*i)->builderID)->Stop();
394
403
TaskPlanRemove(builderTracker);
748
BuilderTracker* CUnitHandler::GetBuilderTracker(int builder) {
757
BuilderTracker* CUnitHandler::GetBuilderTracker(int builderID) {
749
758
for (std::list<BuilderTracker*>::iterator i = BuilderTrackers.begin(); i != BuilderTrackers.end(); i++) {
750
if ((*i)->builderID == builder) {
759
if ((*i)->builderID == builderID) {
755
// this better not happen
760
767
void CUnitHandler::BuildTaskRemove(BuilderTracker* builderTracker) {
853
860
bool CUnitHandler::BuildTaskAddBuilder(int builderID, UnitCategory category) {
854
861
assert(category < CAT_LAST);
855
862
assert(builderID >= 0);
856
assert(ai->MyUnits[builderID] != NULL);
863
assert(ai->GetUnit(builderID) != NULL);
858
CUNIT* u = ai->MyUnits[builderID];
865
CUNIT* u = ai->GetUnit(builderID);
859
866
BuilderTracker* builderTracker = GetBuilderTracker(builderID);
860
868
const UnitDef* builderDef = ai->cb->GetUnitDef(builderID);
861
869
const int frame = ai->cb->GetCurrentFrame();
1190
1198
bool CUnitHandler::FactoryBuilderAdd(int builderID) {
1191
bool b = (ai->MyUnits[builderID]->def())->canAssist;
1199
CUNIT* unit = ai->GetUnit(builderID);
1192
1200
BuilderTracker* builderTracker = GetBuilderTracker(builderID);
1193
return (b && FactoryBuilderAdd(builderTracker));
1201
return ((unit->def()->canAssist) && FactoryBuilderAdd(builderTracker));
1196
1204
bool CUnitHandler::FactoryBuilderAdd(BuilderTracker* builderTracker) {
1199
1207
assert(builderTracker->factoryId == 0);
1201
1209
for (std::list<Factory>::iterator i = Factories.begin(); i != Factories.end(); i++) {
1202
CUNIT* u = ai->MyUnits[i->id];
1210
CUNIT* u = ai->GetUnit(i->id);
1204
1212
// don't assist hubs (or factories that cannot be assisted)
1205
1213
if ((u->def())->canBeAssisted && !u->isHub()) {
1208
1216
// HACK: get the sum of the heuristic costs of every
1209
1217
// builder that is already assisting this factory
1210
1218
for (std::list<int>::iterator j = i->supportbuilders.begin(); j != i->supportbuilders.end(); j++) {
1211
if ((ai->MyUnits[*j]->def())->isCommander) {
1219
if ((ai->GetUnit(*j)->def())->isCommander) {
1226
1234
builderTracker->factoryId = i->id;
1227
1235
i->supportbuilders.push_back(builderTracker->builderID);
1228
1236
i->supportBuilderTrackers.push_back(builderTracker);
1229
ai->MyUnits[builderTracker->builderID]->Guard(i->id);
1237
ai->GetUnit(builderTracker->builderID)->Guard(i->id);
1344
1352
msg << "\" to builder " << builderID << "\n";
1345
1353
L(ai, msg.str());
1347
ai->MyUnits[builderID]->Build_ClosestSite(task->newBuildingDef, task->oldBuildingPos);
1355
ai->GetUnit(builderID)->Build_ClosestSite(task->newBuildingDef, task->oldBuildingPos);
1350
1358
// give a reclaim order for the original structure