// Determine if this objective can accept the passed orders int GroundTaskingManagerClass::IsValidObjective (int orders, Objective o) { if (!o) return 0; switch (orders) { case GORD_CAPTURE: if (o->IsSecondary() && o->IsNearfront() && GetRoE(owner,o->GetTeam(),ROE_GROUND_CAPTURE) == ROE_ALLOWED) return 1; break; case GORD_SECURE: if (o->IsSecondary() && owner == o->GetTeam() && (o->IsFrontline() || o->IsSecondline())) return 1; break; case GORD_ASSAULT: if (o->IsSecondary() && !o->IsNearfront() && o->IsBeach() && GetRoE(owner,o->GetTeam(),ROE_GROUND_CAPTURE) == ROE_ALLOWED) return 1; break; case GORD_AIRBORNE: if (o->IsSecondary() && !o->IsNearfront() && GetRoE(owner,o->GetTeam(),ROE_GROUND_CAPTURE) == ROE_ALLOWED) // && !defended) return 1; break; case GORD_COMMANDO: if (o->CommandoSite() && GetRoE(owner,o->GetTeam(),ROE_GROUND_CAPTURE) == ROE_ALLOWED) return 1; break; case GORD_DEFEND: if (o->IsSecondary() && o->IsNearfront() && owner == o->GetTeam() && !o->Abandoned()) return 1; break; case GORD_SUPPORT: if (owner == o->GetTeam() && o->ArtillerySite()) return 1; break; case GORD_REPAIR: if (owner == o->GetTeam() && o->NeedRepair() && o->GetObjectiveStatus() < 51) return 1; break; case GORD_AIRDEFENSE: if (owner == o->GetTeam() && o->SamSite()) return 1; break; case GORD_RECON: return 0; break; case GORD_RADAR: if (owner == o->GetTeam() && o->RadarSite()) return 1; break; case GORD_RESERVE: default: if (o->IsSecondary() && owner == o->GetTeam() && !o->IsNearfront()) return 1; break; } return 0; }
int BrigadeClass::ChooseTactic (void) { int priority=0,tid; haveWeaps = -1; tid = GTACTIC_BRIG_SECURE; while (tid < FirstGroundTactic + GroundTactics && !priority) { priority = CheckTactic(tid); if (!priority) tid++; } // Make Adjustments due to tactic if (tid == GTACTIC_BRIG_WITHDRAW) { Objective o; o = GetUnitObjective(); if (!o || !o->IsSecondary()) { // Find a retreat path o = FindRetreatPath(this,3,FIND_SECONDARYONLY); if (o) SetUnitOrders(GORD_RESERVE,o->Id()); // KCK: This will cause the whole brigade to surrender if the first element get's // cutoff and we're withdrawing. So I'm axing it. Instead, we'll just wait until // the element surrenders. // else // CheckForSurrender(); SetOrdered(1); } } if (GetUnitTactic() != tid) SetOrdered(1); SetUnitTactic(tid); #ifdef ROBIN_GDEBUG if (TrackingOn[GetCampID()]) MonoPrint("Brigade %d (%s) chose tactic %s.\n",GetCampID(),OrderStr[GetUnitOrders()],TacticsTable[tid].name); #endif return tid; }
// This only needs to be called at the start of the campaign (after objs loaded) // or if any new objectives have been added int RebuildObjectiveLists(void){ Objective o; POList->Purge(); SOList->Purge(); { // destroy iterator here VuListIterator myit(AllObjList); o = GetFirstObjective(&myit); while (o != NULL){ if (o->IsPrimary()) POList->ForcedInsert(o); if (o->IsSecondary()) SOList->ForcedInsert(o); o = GetNextObjective(&myit); } } CleanupObjList(); return 1; }
// KCK: This is an admittidly hackish way of determining which lists to add the objective to, // but it's either this or call IsValidObjective() for each order type which would require many // more checks.. HOWEVER, we need to keep this and IsValidObjective() in sync (they must agree) int GroundTaskingManagerClass::GetAddBits (Objective o, int to_collect) { int add_now = to_collect; if (!o) return 0; if (!o->IsSecondary()) add_now &= ~(COLLECT_RESERVE | COLLECT_CAPTURE | COLLECT_SECURE | COLLECT_ASSAULT | COLLECT_AIRBORNE | COLLECT_DEFEND); if (o->IsNearfront()) add_now &= ~(COLLECT_RESERVE | COLLECT_ASSAULT | COLLECT_AIRBORNE); else add_now &= ~(COLLECT_CAPTURE | COLLECT_DEFEND); if (owner != o->GetTeam()) add_now &= ~(COLLECT_RESERVE | COLLECT_SECURE | COLLECT_DEFEND | COLLECT_SUPPORT | COLLECT_REPAIR | COLLECT_AIRDEFENSE | COLLECT_RADAR); if (GetRoE(owner,o->GetTeam(),ROE_GROUND_CAPTURE) != ROE_ALLOWED) add_now &= ~(COLLECT_CAPTURE | COLLECT_ASSAULT | COLLECT_AIRBORNE | COLLECT_COMMANDO); if (o->Abandoned()) add_now &= ~COLLECT_DEFEND; if (!o->IsFrontline() && !o->IsSecondline()) add_now &= ~(COLLECT_SECURE); if (!o->IsBeach()) add_now &= ~(COLLECT_ASSAULT); if (1) // defended add_now &= ~(COLLECT_AIRBORNE); if (!o->CommandoSite()) add_now &= ~(COLLECT_COMMANDO); if (!o->ArtillerySite()) add_now &= ~(COLLECT_SUPPORT); if (!o->NeedRepair() || o->GetObjectiveStatus() > 50) add_now &= ~(COLLECT_REPAIR); if (!o->SamSite()) add_now &= ~(COLLECT_AIRDEFENSE); if (!o->RadarSite()) add_now &= ~(COLLECT_RADAR); return add_now; }