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);
	}
}
Exemple #2
0
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);
	}
}