int BrigadeClass::UpdateParentStatistics (void) { GridIndex nx,ny,x,y; int engaged=0,combat=0,loss=0,te=0; Unit e; // Update unit wide statistics. NOTE: some delay here- since elements are unmoved. nx = ny = te = 0; e = GetFirstUnitElement(); while (e) { if (e->Engaged()) engaged = 1; if (e->Combat()) combat = 1; if (e->Losses()) loss = 1; e->GetLocation(&x,&y); // nx += x; // ny += y; if (!nx && !ny) e->GetLocation(&nx,&ny); te++; e = GetNextUnitElement(); } if (!te) { KillUnit(); return 0; } if (!engaged) { SetEngaged(0); SetTarget(NULL); } SetEngaged(engaged); SetCombat(combat); SetLosses(loss); // Set our new averaged position // x = nx / te; // y = ny / te; // SetLocation(x,y); ShiAssert (nx && ny); // Set our position to our first element SetLocation(nx,ny); return te; }
int BrigadeClass::MoveUnit (CampaignTime time) { Unit e; int en,me,be,te,toorder,role; F4PFList nearlist = NULL; Objective o; // Check if we have a valid objective o = GetUnitObjective(); if (!o || !TeamInfo[GetTeam()]->gtm->IsValidObjective(GetOrders(),o)) { if (o && (GetOrders() == GORD_CAPTURE || GetOrders() == GORD_ASSAULT || GetOrders() == GORD_AIRBORNE)) SetUnitOrders(GORD_SECURE,o->Id()); else { o = FindRetreatPath(this,3,FIND_SECONDARYONLY); if (!o) { // We've been cut off - surrender? CheckForSurrender(); return -1; } SetUnitOrders(GORD_RESERVE,o->Id()); } } // Check if we have elements requesting orders role = GetUnitCurrentRole(); toorder = te = 0; e = GetFirstUnitElement(); while (e) { te++; if (!e->Assigned()) toorder++; e = GetNextUnitElement(); } if (!te) { KillUnit(); return 0; } // Support brigades just update their position and return if (FindUnitSupportRole(this)) { UpdateParentStatistics(); return 0; } // Check to make sure our orders are still valid. // if (!CheckTactic(GetUnitTactic())) ChooseTactic(); // Upon new orders, reset our element's ordered flags && collect list of possible positions if (Ordered() || toorder) { Objective o; o = GetUnitObjective(); if (role == GRO_ATTACK) nearlist = GetChildObjectives(o, MAXLINKS_FROM_SO_OFFENSIVE, FIND_STANDARDONLY); else nearlist = GetChildObjectives(o, MAXLINKS_FROM_SO_DEFENSIVE, FIND_STANDARDONLY); // Eliminate any objectives we've previously been unable to find a path to // Clear all but attack orders (once we attack, we only stop when we break) e = GetFirstUnitElement(); while (e) { if (!e->Broken() && !e->Engaged() && e->Assigned() && e->GetUnitCurrentRole() != GRO_ATTACK) { e->SetAssigned(0); toorder++; } else if (e->Assigned() && !OnValidObjective(e, e->GetUnitCurrentRole(), nearlist)) { e->SetAssigned(0); toorder++; } e = GetNextUnitElement(); } // Loop in here until all our elements are assigned while (toorder) { // Order elements e = GetFirstUnitElement(); while (e) { if (!e->Assigned()) OrderElement(e, nearlist); e = GetNextUnitElement(); } // Check for pre-empted elements for (en=toorder=0; en<te; en++) { e = GetUnitElement(en); if (e && !e->Assigned()) toorder++; } } if (nearlist) { nearlist->DeInit(); delete nearlist; nearlist = NULL; } } // Make sure at least somebody is doing our job for (me=be=en=0; en<te; en++) { e = GetUnitElement(en); if (e) { if (e->Broken()) { be++; } else if (e->GetUnitCurrentRole() == role) { me++; } } } // Check for broken status if (be > me) SetBroken(1); // Check if we're still valid to perform our orders if (!me) { if (role == GRO_ATTACK) SetOrders (GORD_DEFEND); // Switch to defense orders else if (GetOrders() != GORD_RESERVE) SetUnitObjective(FalconNullId); // We'll pick a reserve location next time through } UpdateParentStatistics(); return 0; }