diff --git a/src/ai/ai_force.cpp b/src/ai/ai_force.cpp index 835baf212..3b44df370 100644 --- a/src/ai/ai_force.cpp +++ b/src/ai/ai_force.cpp @@ -94,6 +94,7 @@ local void AiCleanForce(int force) memset(counter,0,sizeof(counter)); aiunit=AiPlayer->Force[force].Units; while( aiunit ) { + // FIXME: Should I use equivalent unit types? counter[aiunit->Unit->Type->Type]++; aiunit=aiunit->Next; } @@ -105,6 +106,7 @@ local void AiCleanForce(int force) aitype=AiPlayer->Force[force].UnitTypes; while( aitype ) { if( aitype->Want>counter[aitype->Type->Type] ) { + DebugLevel3Fn("%d: missing %s.\n",force,aitype->Type->Ident); AiPlayer->Force[force].Completed=0; } counter[aitype->Type->Type]-=aitype->Want; @@ -168,6 +170,7 @@ local int AiCheckBelongsToForce(int force,const UnitType* type) // aiunit=AiPlayer->Force[force].Units; while( aiunit ) { + // FIXME: Should I use equivalent unit types? counter[aiunit->Unit->Type->Type]++; aiunit=aiunit->Next; } @@ -203,12 +206,16 @@ global void AiAssignToForce(Unit* unit) { int force; - AiCleanForces(); - // // Check to which force it belongs // for( force=0; force<AI_MAX_FORCES; ++force ) { + // No troops for attacking force + if( !AiPlayer->Force[force].Defending + && AiPlayer->Force[force].Attacking ) { + continue; + } + if( AiCheckBelongsToForce(force,unit->Type) ) { AiUnit* aiunit; @@ -310,6 +317,7 @@ global void AiAttackWithForce(int force) AiCleanForce(force); + AiPlayer->Force[force].Attacking=0; if( (aiunit=AiPlayer->Force[force].Units) ) { AiPlayer->Force[force].Attacking=1; @@ -465,6 +473,31 @@ local void AiWaitLanded(AiForce* force) } } +/** +** Force on attack ride. +** +** @param force Force pointer. +*/ +local void AiForceAttacks(AiForce* force) +{ + const AiUnit* aiunit; + + if( (aiunit=force->Units) ) { + while( aiunit ) { + // Still some action + if( aiunit->Unit->Orders[0].Action!=UnitActionStill ) { + break; + } + aiunit=aiunit->Next; + } + if( !aiunit ) { + AiAttackWithForce(force-AiPlayer->Force); + } + } else { + force->Attacking=0; + } +} + /** ** Handle an attack force. ** @@ -491,6 +524,13 @@ local void AiGuideAttackForce(AiForce* force) force->State=0; AiAttackWithForce(force-AiPlayer->Force); break; + + // + // Attacking! + // + case 0: + AiForceAttacks(force); + break; } } @@ -531,8 +571,7 @@ global void AiForceManager(void) AiGuideAttackForce(&AiPlayer->Force[force]); } } - - // AiAssignFreeUnitsToForce(); + AiAssignFreeUnitsToForce(); } //@}