void cUnitManager::Assign(int unit,UnitInfo *U) { set<int> Grs; for( int i=0; i<GroupSize; i++ ) { if( U->mapBody == Group[i]->Units.begin()->second->mapBody && U->ud->canLoopbackAttack == Group[i]->Units.begin()->second->udr->ud->canLoopbackAttack && int(Group[i]->Units.size()) < MaxGroupMSize ) { Grs.insert(i); for(map<int,UnitInfo*>::iterator GM=Group[i]->Units.begin(); GM!=Group[i]->Units.end(); GM++) { sRAIUnitDef* udr = GM->second->udr; if( U->ud->speed > 1.5*udr->ud->speed || 1.5*U->ud->speed < udr->ud->speed ) { Grs.erase(i); break; } } } } if( GroupSize == 25 && int(Grs.size()) == 0 ) { *l<<"\nWARNING: Maximum number of groups reached"; Grs.insert(24); } if( int(Grs.size()) > 0 ) { GroupAddUnit(unit,U,Group[*Grs.begin()]); } else { Group[GroupSize] = new sRAIGroup(GroupSize); sRAIGroup* Gr = Group[GroupSize]; GroupSize++; GroupAddUnit(unit,U,Gr); Gr->ScoutPoint = G->GetRandomPosition(U->mapBody); GroupResetRallyPoint(Gr); } }
void cUnitManager::GroupRemoveEnemy(int enemy, EnemyInfo *E, sRAIGroup* group) { if( !G->ValidateUnitList(&group->Units) ) return; group->Enemies.erase(enemy); E->attackGroups.erase(group); for( map<int,UnitInfo*>::iterator iU = group->Units.begin(); iU != group->Units.end(); ++iU ) { if( iU->second->enemyID == enemy ) { iU->second->enemyID = -1; if( !G->IsHumanControled(iU->first,iU->second) ) G->UpdateEventAdd(1,0,iU->first,iU->second); } } if( int(group->Enemies.size()) == 0 && int(G->EThreat.size()) == 0 && !ActiveAttackOrders() ) { GroupResetRallyPoint(group); group->M->ScoutPoint = G->GetRandomPosition(group->Units.begin()->second->area); } }
void cUnitManager::GroupRemoveEnemy(int enemy, EnemyInfo *E, sRAIGroup* Gr) { if( !G->ValidateUnitList(&Gr->Units) ) return; Gr->Enemies.erase(enemy); E->AttackGroups.erase(Gr); for( map<int,UnitInfo*>::iterator iU = Gr->Units.begin(); iU != Gr->Units.end(); iU++ ) { if( iU->second->enemyID == enemy ) { iU->second->enemyID = -1; if( !G->IsHumanControled(iU->first,iU->second) ) { iU->second->commandTimeOut=1; } } } if( int(Gr->Enemies.size()) == 0 && int(G->EThreat.size()) == 0 && !ActiveAttackOrders() ) { GroupResetRallyPoint(Gr); Gr->ScoutPoint = G->GetRandomPosition(Gr->Units.begin()->second->mapBody); } }