mirror of
https://github.com/1dot13/source.git
synced 2026-09-09 14:46:05 +02:00
Add robots to enemy groups (by rftr).
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8956 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -1278,7 +1278,7 @@ void TestIncoming4SidesCallback( GUI_BUTTON *btn, INT32 reason )
|
||||
gfRenderViewer = TRUE;
|
||||
if( gsSelSectorY > 1 )
|
||||
{
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( ubSector-16, 0, 11, 5, 0, 0 );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( ubSector-16, 0, 11, 5, 0, 0, 0 );
|
||||
pGroup->ubNextX = (UINT8)gsSelSectorX;
|
||||
pGroup->ubNextY = (UINT8)gsSelSectorY;
|
||||
pGroup->uiTraverseTime = 10;
|
||||
@@ -1290,7 +1290,7 @@ void TestIncoming4SidesCallback( GUI_BUTTON *btn, INT32 reason )
|
||||
}
|
||||
if( gsSelSectorY < 16 )
|
||||
{
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( ubSector+16, 0, 8, 8, 0, 0 );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( ubSector+16, 0, 8, 8, 0, 0, 0 );
|
||||
pGroup->ubNextX = (UINT8)gsSelSectorX;
|
||||
pGroup->ubNextY = (UINT8)gsSelSectorY;
|
||||
pGroup->uiTraverseTime = 12;
|
||||
@@ -1302,7 +1302,7 @@ void TestIncoming4SidesCallback( GUI_BUTTON *btn, INT32 reason )
|
||||
}
|
||||
if( gsSelSectorX > 1 )
|
||||
{
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( ubSector-1, 0, 11, 5, 0, 0 );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( ubSector-1, 0, 11, 5, 0, 0, 0 );
|
||||
pGroup->ubNextX = (UINT8)gsSelSectorX;
|
||||
pGroup->ubNextY = (UINT8)gsSelSectorY;
|
||||
pGroup->uiTraverseTime = 11;
|
||||
@@ -1314,7 +1314,7 @@ void TestIncoming4SidesCallback( GUI_BUTTON *btn, INT32 reason )
|
||||
}
|
||||
if( gsSelSectorX < 16 )
|
||||
{
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( ubSector+1, 0, 14, 0, 0, 0 );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( ubSector+1, 0, 14, 0, 0, 0, 0 );
|
||||
pGroup->ubNextX = (UINT8)gsSelSectorX;
|
||||
pGroup->ubNextY = (UINT8)gsSelSectorY;
|
||||
pGroup->uiTraverseTime = 13;
|
||||
|
||||
+52
-2
@@ -99,12 +99,14 @@ void InitASD( )
|
||||
gASDResource[ASD_HELI] = 0;
|
||||
gASDResource[ASD_JEEP] = 2;
|
||||
gASDResource[ASD_TANK] = 2;
|
||||
gASDResource[ASD_ROBOT] = 8;
|
||||
|
||||
gASDResource_Ordered[ASD_MONEY] = 0;
|
||||
gASDResource_Ordered[ASD_FUEL] = 0;
|
||||
gASDResource_Ordered[ASD_HELI] = 0;
|
||||
gASDResource_Ordered[ASD_JEEP] = 0;
|
||||
gASDResource_Ordered[ASD_TANK] = 0;
|
||||
gASDResource_Ordered[ASD_ROBOT] = 0;
|
||||
|
||||
gASD_Flags = 0;
|
||||
|
||||
@@ -196,6 +198,8 @@ void UpdateASD( )
|
||||
if ( !(gASD_Flags & ASDFACT_TANK_UNLOCKED) && HighestPlayerProgressPercentage( ) >= gGameExternalOptions.usTankMinimumProgress )
|
||||
SetASDFlag( ASDFACT_TANK_UNLOCKED );
|
||||
|
||||
if ( !(gASD_Flags & ASDFACT_ROBOT_UNLOCKED) && HighestPlayerProgressPercentage( ) >= gGameExternalOptions.usRobotMinimumProgress )
|
||||
SetASDFlag( ASDFACT_ROBOT_UNLOCKED );
|
||||
|
||||
// determine whether we need to buy new toys
|
||||
ASDDecideOnPurchases();
|
||||
@@ -210,6 +214,7 @@ void ASDDecideOnPurchases()
|
||||
INT32 needed_heli = 0;
|
||||
INT32 needed_tank = 0;
|
||||
INT32 needed_jeep = 0;
|
||||
INT32 needed_robot = 0;
|
||||
|
||||
UINT16 highestplayerprogress = HighestPlayerProgressPercentage( );
|
||||
|
||||
@@ -275,24 +280,39 @@ void ASDDecideOnPurchases()
|
||||
needed_fuel += needed_tank * ASDResourceCostFuel( ASD_TANK );
|
||||
}
|
||||
|
||||
// do we need new robots?
|
||||
if ( gASD_Flags & ASDFACT_ROBOT_UNLOCKED )
|
||||
{
|
||||
// how many would we like to have? Note that this refers to the ones in our pool, the vehicles awarded to enemy groups are no longer accounted for
|
||||
needed_robot = min( 10, 2 + highestplayerprogress / 10 );
|
||||
|
||||
// how many are needed?
|
||||
needed_robot = max( 0, needed_robot - gASDResource[ASD_ROBOT] );
|
||||
|
||||
needed_fuel += needed_robot * ASDResourceCostFuel( ASD_ROBOT );
|
||||
}
|
||||
|
||||
// how much new fuel do we need?
|
||||
needed_fuel = max( 0, needed_fuel - gASDResource[ASD_FUEL] );
|
||||
|
||||
// reduce order by what we'e alreay ordered
|
||||
// reduce order by what we'e already ordered
|
||||
needed_fuel = max( 0, needed_fuel - gASDResource_Ordered[ASD_FUEL] );
|
||||
needed_jeep = max( 0, needed_jeep - gASDResource_Ordered[ASD_JEEP] );
|
||||
needed_tank = max( 0, needed_tank - gASDResource_Ordered[ASD_TANK] );
|
||||
needed_heli = max( 0, needed_heli - gASDResource_Ordered[ASD_HELI] );
|
||||
needed_robot = max( 0, needed_robot - gASDResource_Ordered[ASD_ROBOT] );
|
||||
|
||||
// check whether we can afford all new purchases. If we can't, lower your expectations
|
||||
while ( needed_fuel * ASDResourceCostMoney( ASD_FUEL ) +
|
||||
needed_jeep * ASDResourceCostMoney( ASD_JEEP ) +
|
||||
needed_tank * ASDResourceCostMoney( ASD_TANK ) +
|
||||
needed_heli * ASDResourceCostMoney( ASD_HELI ) > gASDResource[ASD_MONEY] )
|
||||
needed_heli * ASDResourceCostMoney( ASD_HELI ) +
|
||||
needed_robot * ASDResourceCostMoney( ASD_ROBOT ) > gASDResource[ASD_MONEY] )
|
||||
{
|
||||
if ( needed_tank ) --needed_tank;
|
||||
else if ( needed_heli ) --needed_heli;
|
||||
else if ( needed_jeep ) --needed_jeep;
|
||||
else if ( needed_robot ) --needed_robot;
|
||||
else needed_fuel = max( 0, needed_fuel - 10 );
|
||||
}
|
||||
|
||||
@@ -334,6 +354,15 @@ void ASDDecideOnPurchases()
|
||||
|
||||
AddStrategicEvent( EVENT_ASD_PURCHASE_HELI, GetWorldTotalMin( ) + ASDResourceDeliveryTime( ASD_HELI ), needed_heli );
|
||||
}
|
||||
|
||||
if ( needed_robot )
|
||||
{
|
||||
AddStrategicAIResources( ASD_MONEY, -needed_robot * ASDResourceCostMoney( ASD_ROBOT ) );
|
||||
|
||||
gASDResource_Ordered[ASD_ROBOT] += needed_robot;
|
||||
|
||||
AddStrategicEvent( EVENT_ASD_PURCHASE_ROBOT, GetWorldTotalMin( ) + ASDResourceDeliveryTime( ASD_ROBOT ), needed_robot );
|
||||
}
|
||||
}
|
||||
|
||||
void ASDDecideHeliOperations()
|
||||
@@ -1470,6 +1499,10 @@ UINT32 ASDResourceCostFuel( UINT8 aType )
|
||||
case ASD_JEEP:
|
||||
return gGameExternalOptions.gASDResource_Fuel_Jeep;
|
||||
break;
|
||||
|
||||
case ASD_ROBOT:
|
||||
return gGameExternalOptions.gASDResource_Fuel_Robot;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1509,3 +1542,20 @@ BOOLEAN ASDSoldierUpgradeToJeep( )
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOLEAN ASDSoldierUpgradeToRobot( )
|
||||
{
|
||||
if ( gGameExternalOptions.fASDActive && gGameExternalOptions.fASDAssignsRobots )
|
||||
{
|
||||
if ( gASD_Flags & ASDFACT_ROBOT_UNLOCKED )
|
||||
{
|
||||
if ( gASDResource[ASD_ROBOT] )
|
||||
{
|
||||
gASDResource[ASD_ROBOT] = max( 0, gASDResource[ASD_ROBOT] - 1 );
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ void ASDDecideHeliOperations();
|
||||
#define ASDFACT_HELI_UNLOCKED 0x00000001 // AI is allowed to purchase helicopters
|
||||
#define ASDFACT_JEEP_UNLOCKED 0x00000002 // AI is allowed to purchase jeeps
|
||||
#define ASDFACT_TANK_UNLOCKED 0x00000004 // AI is allowed to purchase tanks
|
||||
#define ASDFACT_ROBOT_UNLOCKED 0x00000008 // AI is allowed to purchase robots
|
||||
|
||||
void SetASDFlag( UINT32 aFlag );
|
||||
|
||||
@@ -121,5 +122,6 @@ UINT32 ASDResourceCostFuel( UINT8 aType );
|
||||
// if ASD is used, any tanks the queen uses in mobile attacks come from its pool, and we have to account for that
|
||||
BOOLEAN ASDSoldierUpgradeToTank( );
|
||||
BOOLEAN ASDSoldierUpgradeToJeep( );
|
||||
BOOLEAN ASDSoldierUpgradeToRobot( );
|
||||
|
||||
#endif //__ASD_H
|
||||
|
||||
+85
-24
@@ -74,6 +74,8 @@
|
||||
#include "MilitiaIndividual.h" // added by Flugente
|
||||
#endif
|
||||
|
||||
#pragma optimize("",off)
|
||||
|
||||
#include "Reinforcement.h"
|
||||
|
||||
//#define INVULNERABILITY
|
||||
@@ -141,7 +143,7 @@ typedef struct AUTORESOLVE_STRUCT
|
||||
INT32 iButtonImage[ NUM_AR_BUTTONS ];
|
||||
INT32 iFaces; //for generic civs and enemies
|
||||
// WDS - make number of mercenaries, etc. be configurable
|
||||
INT32 iMercFaces[CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS]; //for each merc face
|
||||
//INT32 iMercFaces[CODE_MAXIMUM_NUMBER_OF_PLAYER_SLOTS]; //for each merc face
|
||||
INT32 iIndent;
|
||||
INT32 iInterfaceBuffer;
|
||||
INT32 iNumMercFaces;
|
||||
@@ -168,7 +170,7 @@ typedef struct AUTORESOLVE_STRUCT
|
||||
UINT8 ubEnemyLeadership;
|
||||
UINT8 ubPlayerLeadership;
|
||||
UINT8 ubMercs, ubCivs, ubEnemies;
|
||||
UINT8 ubAdmins, ubTroops, ubElites, ubTanks, ubJeeps;
|
||||
UINT8 ubAdmins, ubTroops, ubElites, ubTanks, ubJeeps, ubRobots;
|
||||
UINT8 ubYMCreatures, ubYFCreatures, ubAMCreatures, ubAFCreatures;
|
||||
UINT8 ubBloodcats;
|
||||
UINT8 ubZombies;
|
||||
@@ -236,10 +238,11 @@ typedef struct AUTORESOLVE_STRUCT
|
||||
#define CELL_BLOODCAT 0x01000000
|
||||
#define CELL_ZOMBIE 0x02000000
|
||||
#define CELL_BANDIT 0x04000000
|
||||
#define CELL_ENEMYROBOT 0x08000000
|
||||
|
||||
//Combined flags
|
||||
#define CELL_PLAYER ( CELL_MERC | CELL_MILITIA )
|
||||
#define CELL_ENEMY ( CELL_ELITE | CELL_TROOP | CELL_ADMIN | CELL_TANK | CELL_JEEP | CELL_BANDIT )
|
||||
#define CELL_ENEMY ( CELL_ELITE | CELL_TROOP | CELL_ADMIN | CELL_TANK | CELL_JEEP | CELL_BANDIT | CELL_ENEMYROBOT )
|
||||
#define CELL_FEMALECREATURE ( CELL_AF_CREATURE | CELL_YF_CREATURE )
|
||||
#define CELL_MALECREATURE ( CELL_AM_CREATURE | CELL_YM_CREATURE )
|
||||
#define CELL_BUG ( CELL_FEMALECREATURE | CELL_MALECREATURE )
|
||||
@@ -415,6 +418,7 @@ void EliminateAllEnemies( UINT8 ubSectorX, UINT8 ubSectorY )
|
||||
UINT8 ubNumEnemies[ NUM_ENEMY_RANKS ];
|
||||
UINT8 ubNumTanks = 0;
|
||||
UINT8 ubNumJeeps = 0;
|
||||
UINT8 ubNumRobots = 0;
|
||||
UINT8 ubRankIndex;
|
||||
|
||||
//Clear any possible battle locator
|
||||
@@ -427,7 +431,7 @@ void EliminateAllEnemies( UINT8 ubSectorX, UINT8 ubSectorY )
|
||||
// we must process the enemies killed right here & give out loyalty bonuses as if the battle had been fought & won
|
||||
if( !gpAR )
|
||||
{
|
||||
GetNumberOfEnemiesInSector( ubSectorX, ubSectorY, &ubNumEnemies[0], &ubNumEnemies[1], &ubNumEnemies[2], &ubNumTanks, &ubNumJeeps );
|
||||
GetNumberOfEnemiesInSector( ubSectorX, ubSectorY, &ubNumEnemies[0], &ubNumEnemies[1], &ubNumEnemies[2], &ubNumRobots, &ubNumTanks, &ubNumJeeps );
|
||||
|
||||
for ( ubRankIndex = 0; ubRankIndex < NUM_ENEMY_RANKS; ++ubRankIndex )
|
||||
{
|
||||
@@ -459,6 +463,7 @@ void EliminateAllEnemies( UINT8 ubSectorX, UINT8 ubSectorY )
|
||||
pSector->ubNumAdmins = 0;
|
||||
pSector->ubNumTanks = 0;
|
||||
pSector->ubNumJeeps = 0;
|
||||
pSector->ubNumRobots = 0;
|
||||
pSector->ubNumCreatures = 0;
|
||||
pSector->bLastKnownEnemies = 0;
|
||||
//Remove the mobile forces here, but only if battle is over.
|
||||
@@ -747,9 +752,9 @@ void AssociateEnemiesWithStrategicGroups()
|
||||
{
|
||||
SECTORINFO *pSector;
|
||||
GROUP *pGroup;
|
||||
UINT8 ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps; //how many soldiers of the type do we still have to assign to a group?
|
||||
UINT8 ubISNumAdmins, ubISNumTroops, ubISNumElites, ubISNumTanks, ubISNumJeeps;
|
||||
UINT8 ubNumElitesInGroup, ubNumTroopsInGroup, ubNumAdminsInGroup, ubNumTanksInGroup, ubNumJeepsInGroup;
|
||||
UINT8 ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots; //how many soldiers of the type do we still have to assign to a group?
|
||||
UINT8 ubISNumAdmins, ubISNumTroops, ubISNumElites, ubISNumTanks, ubISNumJeeps, ubISNumRobots;
|
||||
UINT8 ubNumElitesInGroup, ubNumTroopsInGroup, ubNumAdminsInGroup, ubNumTanksInGroup, ubNumJeepsInGroup, ubNumRobotsInGroup;
|
||||
INT32 i;
|
||||
UINT8 pSectors[4];
|
||||
UINT8 ubDirAmount;
|
||||
@@ -769,6 +774,7 @@ void AssociateEnemiesWithStrategicGroups()
|
||||
ubNumElites = pSector->ubNumElites;
|
||||
ubNumTanks = pSector->ubNumTanks;
|
||||
ubNumJeeps = pSector->ubNumJeeps;
|
||||
ubNumRobots = pSector->ubNumRobots;
|
||||
|
||||
//Now go through our enemies in the autoresolve array, and assign the ubGroupID to the soldier
|
||||
//Stationary groups have a group ID of 0 - first assign enemies from those stationary groups
|
||||
@@ -786,6 +792,12 @@ void AssociateEnemiesWithStrategicGroups()
|
||||
gpEnemies[i].uiFlags |= CELL_ASSIGNED;
|
||||
ubNumJeeps--;
|
||||
}
|
||||
else if ( gpEnemies[i].uiFlags & CELL_ENEMYROBOT && ubNumRobots )
|
||||
{
|
||||
gpEnemies[i].pSoldier->ubGroupID = 0;
|
||||
gpEnemies[i].uiFlags |= CELL_ASSIGNED;
|
||||
ubNumRobots--;
|
||||
}
|
||||
else if ( gpEnemies[i].uiFlags & CELL_ELITE && ubNumElites )
|
||||
{
|
||||
gpEnemies[ i ].pSoldier->ubGroupID = 0;
|
||||
@@ -804,15 +816,16 @@ void AssociateEnemiesWithStrategicGroups()
|
||||
gpEnemies[ i ].uiFlags |= CELL_ASSIGNED;
|
||||
ubNumAdmins--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ubNumAdmins = gpAR->ubAdmins - pSector->ubNumAdmins;
|
||||
ubNumTroops = gpAR->ubTroops - pSector->ubNumTroops;
|
||||
ubNumElites = gpAR->ubElites - pSector->ubNumElites;
|
||||
ubNumTanks = gpAR->ubTanks - pSector->ubNumTanks;
|
||||
ubNumJeeps = gpAR->ubJeeps - pSector->ubNumJeeps;
|
||||
ubNumRobots = gpAR->ubRobots - pSector->ubNumRobots;
|
||||
|
||||
if ( !ubNumElites && !ubNumTroops && !ubNumAdmins && !ubNumTanks && !ubNumJeeps )
|
||||
if ( !ubNumElites && !ubNumTroops && !ubNumAdmins && !ubNumTanks && !ubNumJeeps && !ubNumRobots )
|
||||
{ //All troops accounted for.
|
||||
return;
|
||||
}
|
||||
@@ -828,6 +841,7 @@ void AssociateEnemiesWithStrategicGroups()
|
||||
ubNumAdminsInGroup = pGroup->pEnemyGroup->ubNumAdmins;
|
||||
ubNumTanksInGroup = pGroup->pEnemyGroup->ubNumTanks;
|
||||
ubNumJeepsInGroup = pGroup->pEnemyGroup->ubNumJeeps;
|
||||
ubNumRobotsInGroup = pGroup->pEnemyGroup->ubNumRobots;
|
||||
for( i = 0; i < gpAR->ubEnemies; i++ )
|
||||
{
|
||||
if( !(gpEnemies[ i ].uiFlags & CELL_ASSIGNED) ) //has this soldier already been assigned to a cell and therefore a group (while processing the static enemies above) ?
|
||||
@@ -846,6 +860,13 @@ void AssociateEnemiesWithStrategicGroups()
|
||||
ubNumJeeps--;
|
||||
ubNumJeepsInGroup--;
|
||||
}
|
||||
else if ( ubNumRobots && ubNumRobotsInGroup && gpEnemies[i].uiFlags & CELL_ENEMYROBOT )
|
||||
{
|
||||
gpEnemies[i].pSoldier->ubGroupID = pGroup->ubGroupID;
|
||||
gpEnemies[i].uiFlags |= CELL_ASSIGNED;
|
||||
ubNumRobots--;
|
||||
ubNumRobotsInGroup--;
|
||||
}
|
||||
else if (ubNumElites && ubNumElitesInGroup && gpEnemies[i].uiFlags & CELL_ELITE)
|
||||
{
|
||||
gpEnemies[ i ].pSoldier->ubGroupID = pGroup->ubGroupID;
|
||||
@@ -886,6 +907,7 @@ void AssociateEnemiesWithStrategicGroups()
|
||||
ubNumAdminsInGroup = pGroup->pEnemyGroup->ubNumAdmins;
|
||||
ubNumTanksInGroup = pGroup->pEnemyGroup->ubNumTanks;
|
||||
ubNumJeepsInGroup = pGroup->pEnemyGroup->ubNumJeeps;
|
||||
ubNumRobotsInGroup = pGroup->pEnemyGroup->ubNumRobots;
|
||||
for( i = 0; i < gpAR->ubEnemies; i++ )
|
||||
{
|
||||
if( !(gpEnemies[ i ].uiFlags & CELL_ASSIGNED) )
|
||||
@@ -904,6 +926,13 @@ void AssociateEnemiesWithStrategicGroups()
|
||||
ubNumJeeps--;
|
||||
ubNumJeepsInGroup--;
|
||||
}
|
||||
else if ( ubNumRobots && ubNumRobotsInGroup && gpEnemies[i].uiFlags & CELL_ENEMYROBOT )
|
||||
{
|
||||
gpEnemies[i].pSoldier->ubGroupID = pGroup->ubGroupID;
|
||||
gpEnemies[i].uiFlags |= CELL_ASSIGNED;
|
||||
ubNumRobots--;
|
||||
ubNumRobotsInGroup--;
|
||||
}
|
||||
else if (ubNumElites && ubNumElitesInGroup && gpEnemies[i].uiFlags & CELL_ELITE)
|
||||
{
|
||||
gpEnemies[ i ].pSoldier->ubGroupID = pGroup->ubGroupID;
|
||||
@@ -943,10 +972,11 @@ void AssociateEnemiesWithStrategicGroups()
|
||||
ubISNumElites = pSector->ubNumElites;
|
||||
ubISNumTanks = pSector->ubNumTanks;
|
||||
ubISNumJeeps = pSector->ubNumJeeps;
|
||||
ubISNumRobots = pSector->ubNumRobots;
|
||||
|
||||
for( i = 0; i < gpAR->ubEnemies; ++i )
|
||||
{
|
||||
if ( ubISNumAdmins + ubISNumTroops + ubISNumElites + ubISNumTanks + ubISNumJeeps <= gubReinforcementMinEnemyStaticGroupSize ) break; //if group would be left understaffed, it wont reinforce - go chceck another sector (what if are there more groups here?)
|
||||
if ( ubISNumAdmins + ubISNumTroops + ubISNumElites + ubISNumTanks + ubISNumJeeps + ubISNumRobots <= gubReinforcementMinEnemyStaticGroupSize ) break; //if group would be left understaffed, it wont reinforce - go chceck another sector (what if are there more groups here?)
|
||||
|
||||
if( !(gpEnemies[ i ].uiFlags & CELL_ASSIGNED) )
|
||||
{
|
||||
@@ -968,6 +998,15 @@ void AssociateEnemiesWithStrategicGroups()
|
||||
ubISNumJeeps--;
|
||||
ubNumJeeps--;
|
||||
}
|
||||
else if ( gpEnemies[i].uiFlags & CELL_ENEMYROBOT && ubISNumRobots && ubNumRobots )
|
||||
{
|
||||
gpEnemies[i].pSoldier->ubGroupID = 0;
|
||||
gpEnemies[i].uiFlags |= CELL_ASSIGNED;
|
||||
gpEnemies[i].pSoldier->sSectorX = SECTORX( pSectors[ubCurrSI] );
|
||||
gpEnemies[i].pSoldier->sSectorY = SECTORY( pSectors[ubCurrSI] );
|
||||
ubISNumRobots--;
|
||||
ubNumRobots--;
|
||||
}
|
||||
else if ( gpEnemies[i].uiFlags & CELL_ELITE && ubISNumElites && ubNumElites )
|
||||
{
|
||||
gpEnemies[ i ].pSoldier->ubGroupID = 0;
|
||||
@@ -1000,7 +1039,7 @@ void AssociateEnemiesWithStrategicGroups()
|
||||
}
|
||||
/*at this point, all enemies should have been assigned to their cell and group. If not, there is a bug around
|
||||
Because number and type of cells should be computed for the same composition of enemies as the one we see in this function, it should not happen though*/
|
||||
AssertMsg( !(ubISNumAdmins & ubISNumTroops & ubISNumElites & ubISNumTanks & ubISNumJeeps), "Mapping between actual enemies and autoresolve cells is wrong." );
|
||||
AssertMsg( !(ubISNumAdmins & ubISNumTroops & ubISNumElites & ubISNumTanks & ubISNumJeeps & ubISNumRobots), "Mapping between actual enemies and autoresolve cells is wrong." );
|
||||
|
||||
}
|
||||
|
||||
@@ -1142,8 +1181,10 @@ void CalculateSoldierCells( BOOLEAN fReset )
|
||||
gpEnemies[index].uiFlags = CELL_ADMIN;
|
||||
else if ( index < gpAR->ubElites + gpAR->ubTroops + gpAR->ubAdmins + gpAR->ubTanks )
|
||||
gpEnemies[index].uiFlags = CELL_TANK;
|
||||
else
|
||||
else if ( index < gpAR->ubElites + gpAR->ubTroops + gpAR->ubAdmins + gpAR->ubTanks + gpAR->ubJeeps )
|
||||
gpEnemies[index].uiFlags = CELL_JEEP;
|
||||
else
|
||||
gpEnemies[index].uiFlags = CELL_ENEMYROBOT;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2270,6 +2311,19 @@ void CreateAutoResolveInterface()
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < gpAR->ubRobots; ++i, ++index)
|
||||
{
|
||||
gpEnemies[index].pSoldier = TacticalCreateEnemyRobot();
|
||||
gpEnemies[index].pSoldier->sSectorX = gpAR->ubSectorX;
|
||||
gpEnemies[index].pSoldier->sSectorY = gpAR->ubSectorY;
|
||||
swprintf( gpEnemies[index].pSoldier->name, gpStrategicString[STR_AR_ROBOT_NAME] );
|
||||
|
||||
// reuse madlab's robot's face
|
||||
VOBJECT_DESC VObjectDesc;
|
||||
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
|
||||
sprintf( VObjectDesc.ImageFile, "Faces\\65Face\\%02d.sti", gMercProfiles[ ROBOT ].ubFaceIndex );
|
||||
AddVideoObject(&VObjectDesc, &gpEnemies[index].uiVObjectID);
|
||||
}
|
||||
for ( i = 0; i < gpAR->ubElites; ++i, ++index )
|
||||
{
|
||||
gpEnemies[index].pSoldier = TacticalCreateEliteEnemy();
|
||||
@@ -3052,9 +3106,9 @@ void CalculateAutoResolveInfo()
|
||||
else
|
||||
{
|
||||
GetNumberOfEnemiesInFiveSectors( gpAR->ubSectorX, gpAR->ubSectorY,
|
||||
&gpAR->ubAdmins, &gpAR->ubTroops, &gpAR->ubElites, &gpAR->ubTanks, &gpAR->ubJeeps );
|
||||
&gpAR->ubAdmins, &gpAR->ubTroops, &gpAR->ubElites, &gpAR->ubRobots, &gpAR->ubTanks, &gpAR->ubJeeps );
|
||||
|
||||
gpAR->ubEnemies = (UINT8)min( gpAR->ubAdmins + gpAR->ubTroops + gpAR->ubElites + gpAR->ubTanks + gpAR->ubJeeps, MAX_AR_TEAM_SIZE );
|
||||
gpAR->ubEnemies = (UINT8)min( gpAR->ubAdmins + gpAR->ubTroops + gpAR->ubElites + gpAR->ubTanks + gpAR->ubJeeps + gpAR->ubRobots, MAX_AR_TEAM_SIZE );
|
||||
}
|
||||
|
||||
gfTransferTacticalOppositionToAutoResolve = FALSE;
|
||||
@@ -3114,22 +3168,23 @@ void ResetAutoResolveInterface()
|
||||
|
||||
//Make sure the number of enemy portraits is the same as needed.
|
||||
//The debug keypresses may add or remove more than one at a time.
|
||||
while ( gpAR->ubElites + gpAR->ubAdmins + gpAR->ubTroops + gpAR->ubTanks + gpAR->ubJeeps > gpAR->ubEnemies )
|
||||
while ( gpAR->ubElites + gpAR->ubAdmins + gpAR->ubTroops + gpAR->ubTanks + gpAR->ubJeeps + gpAR->ubRobots > gpAR->ubEnemies )
|
||||
{
|
||||
switch( PreRandom( 5 ) )
|
||||
switch( PreRandom( 6 ) )
|
||||
{
|
||||
case 0: if( gpAR->ubElites ) { gpAR->ubElites--; break; }
|
||||
case 0: if ( gpAR->ubElites ) { gpAR->ubElites--; break; }
|
||||
case 1: if ( gpAR->ubAdmins ) { gpAR->ubAdmins--; break; }
|
||||
case 2: if ( gpAR->ubTroops ) { gpAR->ubTroops--; break; }
|
||||
case 3: if ( gpAR->ubTanks ) { gpAR->ubTanks--; break; }
|
||||
case 4: if ( gpAR->ubJeeps ) { gpAR->ubJeeps--; break; }
|
||||
case 5: if ( gpAR->ubRobots ) { gpAR->ubRobots--; break; }
|
||||
}
|
||||
}
|
||||
while ( gpAR->ubElites + gpAR->ubAdmins + gpAR->ubTroops + gpAR->ubTanks + gpAR->ubJeeps< gpAR->ubEnemies )
|
||||
while ( gpAR->ubElites + gpAR->ubAdmins + gpAR->ubTroops + gpAR->ubTanks + gpAR->ubJeeps + gpAR->ubRobots < gpAR->ubEnemies )
|
||||
{
|
||||
switch( PreRandom( 5 ) )
|
||||
{
|
||||
case 0: gpAR->ubElites++; break;
|
||||
case 0: gpAR->ubElites++; break;
|
||||
case 1: case 2: gpAR->ubAdmins++; break;
|
||||
case 3: case 4: gpAR->ubTroops++; break;
|
||||
}
|
||||
@@ -4433,7 +4488,7 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
|
||||
usAttack *= 1.5;
|
||||
}
|
||||
// if our target is a tank, we use heavy weapons if we have any
|
||||
else if ( ARMED_VEHICLE( pTarget->pSoldier ) && FireAntiTankWeapon( pAttacker ) )
|
||||
else if ( (ARMED_VEHICLE( pTarget->pSoldier ) || ENEMYROBOT( pTarget->pSoldier )) && FireAntiTankWeapon( pAttacker ) )
|
||||
{
|
||||
fAntiTank = TRUE;
|
||||
|
||||
@@ -4801,6 +4856,9 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
|
||||
// SANDRO - experimental - more specific statistics of mercs
|
||||
switch(pTarget->pSoldier->ubSoldierClass)
|
||||
{
|
||||
case SOLDIER_CLASS_ROBOT :
|
||||
gMercProfiles[ pAttacker->pSoldier->ubProfile ].records.usKillsOthers++;
|
||||
break;
|
||||
case SOLDIER_CLASS_ELITE :
|
||||
gMercProfiles[ pAttacker->pSoldier->ubProfile ].records.usKillsElites++;
|
||||
break;
|
||||
@@ -4970,10 +5028,10 @@ void TargetHitCallback( SOLDIERCELL *pTarget, INT32 index )
|
||||
}
|
||||
|
||||
//bullet hit -- play an impact sound and a merc hit sound
|
||||
if ( ARMED_VEHICLE( pTarget->pSoldier ) )
|
||||
if ( ARMED_VEHICLE( pTarget->pSoldier ) || ENEMYROBOT( pTarget->pSoldier ) )
|
||||
PlayAutoResolveSample( (UINT8)(S_METAL_IMPACT1 + PreRandom( 3 )), RATE_11025, 50, 1, MIDDLEPAN );
|
||||
else
|
||||
PlayAutoResolveSample( (UINT8)(BULLET_IMPACT_1+PreRandom(3)), RATE_11025, 50, 1, MIDDLEPAN );
|
||||
PlayAutoResolveSample( (UINT8)(BULLET_IMPACT_1+PreRandom(3)), RATE_11025, 50, 1, MIDDLEPAN );
|
||||
|
||||
if( pTarget->pSoldier->stats.bLife >= CONSCIOUSNESS )
|
||||
{
|
||||
@@ -5043,6 +5101,9 @@ void TargetHitCallback( SOLDIERCELL *pTarget, INT32 index )
|
||||
// SANDRO - new mercs' records
|
||||
switch(pTarget->pSoldier->ubSoldierClass)
|
||||
{
|
||||
case SOLDIER_CLASS_ROBOT :
|
||||
gMercProfiles[ pKiller->pSoldier->ubProfile ].records.usKillsOthers++;
|
||||
break;
|
||||
case SOLDIER_CLASS_ELITE :
|
||||
gMercProfiles[ pKiller->pSoldier->ubProfile ].records.usKillsElites++;
|
||||
break;
|
||||
@@ -5154,10 +5215,10 @@ void TargetHitCallback( SOLDIERCELL *pTarget, INT32 index )
|
||||
{ //Normal death
|
||||
if( gpAR->fSound )
|
||||
{
|
||||
if ( ARMED_VEHICLE( pTarget->pSoldier ) )
|
||||
if ( ARMED_VEHICLE( pTarget->pSoldier ) || ENEMYROBOT( pTarget->pSoldier ) )
|
||||
PlayAutoResolveSample( (UINT8)(S_RAID_TB_BOMB), RATE_11025, 50, 1, MIDDLEPAN );
|
||||
else
|
||||
pTarget->pSoldier->DoMercBattleSound( BATTLE_SOUND_DIE1 );
|
||||
pTarget->pSoldier->DoMercBattleSound( BATTLE_SOUND_DIE1 );
|
||||
}
|
||||
}
|
||||
#ifdef INVULNERABILITY
|
||||
|
||||
@@ -339,25 +339,25 @@ void GeneratePatrolGroups()
|
||||
GROUP *pGroup;
|
||||
UINT8 ubNumTroops;
|
||||
ubNumTroops = (UINT8)(3 + gGameOptions.ubDifficultyLevel + Random( 3 ));
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_C7, 0, ubNumTroops, 0, 0, 0 );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_C7, 0, ubNumTroops, 0, 0, 0, 0 );
|
||||
pGroup->ubTransportationMask = CAR;
|
||||
AddWaypointToPGroup( pGroup, 8, 3 ); //C8
|
||||
AddWaypointToPGroup( pGroup, 7, 3 ); //C7
|
||||
|
||||
ubNumTroops = (UINT8)(3 + gGameOptions.ubDifficultyLevel + Random( 3 ));
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_D9, 0, ubNumTroops, 0, 0, 0 );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_D9, 0, ubNumTroops, 0, 0, 0, 0 );
|
||||
AddWaypointToPGroup( pGroup, 9, 5 ); //E9
|
||||
AddWaypointToPGroup( pGroup, 9, 4 ); //D9
|
||||
pGroup->ubTransportationMask = TRUCK;
|
||||
|
||||
ubNumTroops = (UINT8)(3 + gGameOptions.ubDifficultyLevel + Random( 3 ));
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_B9, 0, ubNumTroops, 0, 0, 0 );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_B9, 0, ubNumTroops, 0, 0, 0, 0 );
|
||||
AddWaypointToPGroup( pGroup, 12, 2 ); //B12
|
||||
AddWaypointToPGroup( pGroup, 9, 2 ); //B9
|
||||
pGroup->ubTransportationMask = FOOT;
|
||||
|
||||
ubNumTroops = (UINT8)(3 + gGameOptions.ubDifficultyLevel + Random( 3 ));
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_A14, 0, ubNumTroops, 0, 0, 0 );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_A14, 0, ubNumTroops, 0, 0, 0, 0 );
|
||||
pGroup->ubMoveType = ENDTOEND_FORWARDS;
|
||||
AddWaypointToPGroup( pGroup, 13, 1 ); //A13
|
||||
AddWaypointToPGroup( pGroup, 15, 1 ); //A15
|
||||
@@ -368,13 +368,13 @@ void GeneratePatrolGroups()
|
||||
pGroup->ubTransportationMask = TRACKED;
|
||||
|
||||
ubNumTroops = (UINT8)(5 + gGameOptions.ubDifficultyLevel * 2 + Random( 4 ));
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_N6, 0, ubNumTroops, 0, 0, 0 );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_N6, 0, ubNumTroops, 0, 0, 0, 0 );
|
||||
AddWaypointToPGroup( pGroup, 9, 14 ); //N9
|
||||
AddWaypointToPGroup( pGroup, 6, 14 ); //N6
|
||||
pGroup->ubTransportationMask = CAR;
|
||||
|
||||
ubNumTroops = (UINT8)(5 + gGameOptions.ubDifficultyLevel * 2 + Random( 4 ));
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_N10, 0, ubNumTroops, 0, 0, 0 );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_N10, 0, ubNumTroops, 0, 0, 0, 0 );
|
||||
AddWaypointToPGroup( pGroup, 10, 11 ); //K10
|
||||
AddWaypointToPGroup( pGroup, 10, 14 ); //N10
|
||||
pGroup->ubTransportationMask = CAR;
|
||||
|
||||
@@ -490,8 +490,9 @@ typedef struct SECTORINFO
|
||||
UINT8 ubNumTroops; //the actual number of troops here.
|
||||
UINT8 ubNumElites; //the actual number of elites here.
|
||||
UINT8 ubNumAdmins; //the actual number of admins here.
|
||||
UINT8 ubNumRobots; //the actual number of robots here.
|
||||
UINT8 ubNumCreatures; //only set when immediately before ground attack made!
|
||||
UINT8 ubTroopsInBattle, ubElitesInBattle, ubAdminsInBattle, ubCreaturesInBattle;
|
||||
UINT8 ubTroopsInBattle, ubElitesInBattle, ubAdminsInBattle, ubRobotsInBattle, ubCreaturesInBattle;
|
||||
|
||||
INT8 bLastKnownEnemies; // -1 means never been there, no idea, otherwise it's what we'd observed most recently
|
||||
// while this is being maintained (partially, surely buggy), nothing uses it anymore. ARM
|
||||
@@ -591,7 +592,7 @@ typedef struct UNDERGROUND_SECTORINFO
|
||||
{
|
||||
UINT32 uiFlags;
|
||||
UINT8 ubSectorX, ubSectorY, ubSectorZ;
|
||||
UINT8 ubNumElites, ubNumTroops, ubNumAdmins, ubNumCreatures;
|
||||
UINT8 ubNumRobots, ubNumElites, ubNumTroops, ubNumAdmins, ubNumCreatures;
|
||||
UINT8 fVisited;
|
||||
INT8 ubTravelRating; //Represents how travelled a sector is. Typically, the higher the travel rating,
|
||||
//the more people go near it. A travel rating of 0 means there are never people
|
||||
@@ -602,7 +603,7 @@ typedef struct UNDERGROUND_SECTORINFO
|
||||
|
||||
UINT8 ubNumBloodcats; // Bloodcat population
|
||||
UINT8 ubCreatureHabitat; //determines how creatures live in this sector (see creature spreading.c)
|
||||
UINT8 ubElitesInBattle, ubTroopsInBattle, ubAdminsInBattle, ubCreaturesInBattle;
|
||||
UINT8 ubRobotsInBattle, ubElitesInBattle, ubTroopsInBattle, ubAdminsInBattle, ubCreaturesInBattle;
|
||||
|
||||
// adding these (should not change struct layout due to padding)
|
||||
UINT8 ubMusicMode, ubUnsed;
|
||||
|
||||
@@ -592,6 +592,13 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent )
|
||||
AddStrategicAIResources( ASD_HELI, pEvent->uiParam );
|
||||
break;
|
||||
|
||||
case EVENT_ASD_PURCHASE_ROBOT:
|
||||
ASDReduceOrderedStrategicResources( ASD_ROBOT, pEvent->uiParam );
|
||||
|
||||
if ( IsSectorEnemyControlled( gModSettings.usASDSupplyArrivalSectorX, gModSettings.usASDSupplyArrivalSectorY, 0 ) )
|
||||
AddStrategicAIResources( ASD_ROBOT, pEvent->uiParam );
|
||||
break;
|
||||
|
||||
case EVENT_ENEMY_HELI_UPDATE:
|
||||
UpdateEnemyHeli( pEvent->uiParam );
|
||||
break;
|
||||
|
||||
@@ -125,6 +125,7 @@ enum
|
||||
EVENT_ASD_PURCHASE_JEEP,
|
||||
EVENT_ASD_PURCHASE_TANK,
|
||||
EVENT_ASD_PURCHASE_HELI,
|
||||
EVENT_ASD_PURCHASE_ROBOT,
|
||||
|
||||
EVENT_ENEMY_HELI_UPDATE, // Flugente: move enemy helicopter to another sector
|
||||
EVENT_ENEMY_HELI_REPAIR,
|
||||
|
||||
@@ -123,15 +123,15 @@ JA25_SECTOR_AI_MANAGER gJa25StrategicAi;
|
||||
|
||||
|
||||
BOOLEAN AddEnemiesToInitialSectorH7();
|
||||
UINT32 GetNumberOfJA25EnemiesInSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 *pNumAdmins, UINT8 *pNumTroops, UINT8 *pNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps );
|
||||
void SetNumberJa25EnemiesInSurfaceSector( INT32 iSectorID, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps );
|
||||
UINT32 GetNumberOfJA25EnemiesInSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 *pNumAdmins, UINT8 *pNumTroops, UINT8 *pNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps, UINT8 *pubNumRobots );
|
||||
void SetNumberJa25EnemiesInSurfaceSector( INT32 iSectorID, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps, UINT8 ubNumRobots );
|
||||
|
||||
void InitJa25InitialEnemiesInSector();
|
||||
void InitJa25UnderGroundSectors();
|
||||
void InitNumberOfEnemiesInAboveGroundSectors( );
|
||||
void InitNumberOfEnemiesInUnderGroundSectors( );
|
||||
void SetNumberOfJa25BloodCatsInSector( INT32 iSectorID, INT8 bNumBloodCats, INT8 bBloodCatPlacements );
|
||||
void SetNumberJa25EnemiesInUnderGroundSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps );
|
||||
void SetNumberJa25EnemiesInUnderGroundSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps, UINT8 ubNumRobots );
|
||||
|
||||
void ResetJa25SectorProbabilities();
|
||||
BOOLEAN InitJa25StrategicSectorAI( BOOLEAN fReset );
|
||||
@@ -151,8 +151,8 @@ void FixEnemyCounterInSectorBug();
|
||||
|
||||
void AddEnemiesToFirstTunnelSector();
|
||||
void AddEnemiesToSecondTunnelSector();
|
||||
UINT8 NumEnemiesToAttackFirstTunnelSector( UINT8 *pAdmins, UINT8 *pTroops, UINT8 *pElites, UINT8 *pTanks, UINT8 *pJeeps );
|
||||
UINT8 NumEnemiesToAttackSecondTunnelSector( UINT8 *pAdmins, UINT8 *pTroops, UINT8 *pElites, UINT8 *pTanks, UINT8 *pJeeps );
|
||||
UINT8 NumEnemiesToAttackFirstTunnelSector( UINT8 *pAdmins, UINT8 *pTroops, UINT8 *pElites, UINT8 *pTanks, UINT8 *pJeeps, UINT8 *pRobots );
|
||||
UINT8 NumEnemiesToAttackSecondTunnelSector( UINT8 *pAdmins, UINT8 *pTroops, UINT8 *pElites, UINT8 *pTanks, UINT8 *pJeeps, UINT8 *pRobots );
|
||||
void RemoveAllEnemySoldierInitListLinks();
|
||||
INT16 GetGridNoEnemyWillSeekWhenAttacking( INT8 bSaiSector );
|
||||
void SetH11NumEnemiesInSector();
|
||||
@@ -174,7 +174,7 @@ BOOLEAN Ja25BetaDateToInvalidateExe();
|
||||
|
||||
|
||||
|
||||
UINT32 GetNumberOfJA25EnemiesInSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 *pNumAdmins, UINT8 *pNumTroops, UINT8 *pNumElites, UINT8 *pNumTanks, UINT8 *pubNumJeeps )
|
||||
UINT32 GetNumberOfJA25EnemiesInSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 *pNumAdmins, UINT8 *pNumTroops, UINT8 *pNumElites, UINT8 *pNumTanks, UINT8 *pubNumJeeps, UINT8 *pubNumRobots )
|
||||
{
|
||||
SECTORINFO *pSector;
|
||||
|
||||
@@ -188,6 +188,7 @@ BOOLEAN Ja25BetaDateToInvalidateExe();
|
||||
*pNumElites = pSector->ubNumElites;
|
||||
*pNumTanks = pSector->ubNumTanks;
|
||||
*pubNumJeeps = pSector->ubNumJeeps;
|
||||
*pubNumRobots = pSector->ubNumRobots;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -201,6 +202,7 @@ BOOLEAN Ja25BetaDateToInvalidateExe();
|
||||
*pNumElites = pSector->ubNumElites;
|
||||
*pNumTanks = pSector->ubNumTanks;
|
||||
*pubNumJeeps = pSector->ubNumJeeps;
|
||||
*pubNumRobots = pSector->ubNumRobots;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -283,17 +285,19 @@ BOOLEAN AddEnemiesToInitialSectorH7()
|
||||
UINT8 ubNumElites;
|
||||
UINT8 ubNumTanks;
|
||||
UINT8 ubNumJeeps;
|
||||
UINT8 ubNumRobots;
|
||||
|
||||
UINT8 ubNumRemovedAdmins=0;
|
||||
UINT8 ubNumRemovedTroops=0;
|
||||
UINT8 ubNumRemovedElites=0;
|
||||
UINT8 ubNumRemovedTanks=0;
|
||||
UINT8 ubNumRemovedJeeps=0;
|
||||
UINT8 ubNumRemovedRobots=0;
|
||||
|
||||
ubSector = SECTOR( JA2_5_START_SECTOR_X, JA2_5_START_SECTOR_Y );
|
||||
|
||||
//Get the number of enemies in the guard post sector
|
||||
GetNumberOfJA25EnemiesInSector( 8, MAP_ROW_H, 0, &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumTanks, &ubNumJeeps );
|
||||
GetNumberOfJA25EnemiesInSector( 8, MAP_ROW_H, 0, &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumTanks, &ubNumJeeps, &ubNumRobots );
|
||||
|
||||
//determine the #of enemies to travel to the initial heli sector
|
||||
if( ubNumAdmins > 1 )
|
||||
@@ -311,14 +315,17 @@ BOOLEAN AddEnemiesToInitialSectorH7()
|
||||
if( ubNumJeeps > 1 )
|
||||
ubNumRemovedJeeps = ubNumJeeps / 3 + + Random( 3 );
|
||||
|
||||
if( ubNumRobots > 1 )
|
||||
ubNumRemovedRobots = ubNumRobots / 3 + + Random( 3 );
|
||||
|
||||
//deduct the # that are moving from the # in the guard post sector
|
||||
// SetNumberJa25EnemiesInSurfaceSector( SEC_H8, (UINT8)(ubNumAdmins-ubNumRemovedAdmins), (UINT8)(ubNumTroops-ubNumRemovedTroops), (UINT8)(ubNumElites-ubNumRemovedElites) );
|
||||
SetNumberJa25EnemiesInSector( 8, MAP_ROW_H, 0, (UINT8)(ubNumAdmins-ubNumRemovedAdmins), (UINT8)(ubNumTroops-ubNumRemovedTroops), (UINT8)(ubNumElites-ubNumRemovedElites),
|
||||
(UINT8)(ubNumTanks-ubNumRemovedTanks), (UINT8)(ubNumJeeps-ubNumRemovedJeeps) );
|
||||
(UINT8)(ubNumTanks-ubNumRemovedTanks), (UINT8)(ubNumJeeps-ubNumRemovedJeeps), (UINT8)(ubNumRobots-ubNumRemovedRobots) );
|
||||
|
||||
uiWorldMin = GetWorldTotalMin();
|
||||
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( ubSector+1, ubNumRemovedAdmins, ubNumRemovedTroops, ubNumRemovedElites, ubNumRemovedTanks, ubNumRemovedJeeps );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( ubSector+1, ubNumRemovedAdmins, ubNumRemovedTroops, ubNumRemovedElites, ubNumRemovedTanks, ubNumRemovedJeeps, ubNumRemovedRobots );
|
||||
|
||||
if( pGroup == NULL )
|
||||
{
|
||||
@@ -409,24 +416,24 @@ void InitJa25UnderGroundSectors()
|
||||
*/
|
||||
}
|
||||
|
||||
void SetNumberJa25EnemiesInSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps )
|
||||
void SetNumberJa25EnemiesInSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps, UINT8 ubNumRobots )
|
||||
{
|
||||
//if its a ground level
|
||||
|
||||
if( bSectorZ == 0 )
|
||||
{
|
||||
SetNumberJa25EnemiesInSurfaceSector( SECTOR( sSectorX, sSectorY ), ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SECTOR( sSectorX, sSectorY ), ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
//its an underground level
|
||||
else
|
||||
{
|
||||
SetNumberJa25EnemiesInUnderGroundSector( sSectorX, sSectorY, bSectorZ, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInUnderGroundSector( sSectorX, sSectorY, bSectorZ, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetNumberJa25EnemiesInSurfaceSector( INT32 iSectorID, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps )
|
||||
void SetNumberJa25EnemiesInSurfaceSector( INT32 iSectorID, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps, UINT8 ubNumRobots )
|
||||
{
|
||||
SECTORINFO* pSector = &SectorInfo[iSectorID];
|
||||
pSector->ubNumAdmins = ubNumAdmins;
|
||||
@@ -434,6 +441,7 @@ void SetNumberJa25EnemiesInSurfaceSector( INT32 iSectorID, UINT8 ubNumAdmins, UI
|
||||
pSector->ubNumElites = ubNumElites;
|
||||
pSector->ubNumTanks = ubNumTanks;
|
||||
pSector->ubNumJeeps = ubNumJeeps;
|
||||
pSector->ubNumRobots = ubNumRobots;
|
||||
}
|
||||
|
||||
void SetNumberOfJa25BloodCatsInSector( INT32 iSectorID, INT8 bNumBloodCats, INT8 bBloodCatPlacements )
|
||||
@@ -446,7 +454,7 @@ void SetNumberOfJa25BloodCatsInSector( INT32 iSectorID, INT8 bNumBloodCats, INT8
|
||||
pSector->bBloodCatPlacements = bBloodCatPlacements;
|
||||
}
|
||||
|
||||
void SetNumberJa25EnemiesInUnderGroundSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps )
|
||||
void SetNumberJa25EnemiesInUnderGroundSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps, UINT8 ubNumRobots )
|
||||
{
|
||||
UNDERGROUND_SECTORINFO *pSector=NULL;
|
||||
|
||||
@@ -459,6 +467,7 @@ void SetNumberJa25EnemiesInUnderGroundSector( INT16 sSectorX, INT16 sSectorY, IN
|
||||
pSector->ubNumElites = ubNumElites;
|
||||
pSector->ubNumTanks = ubNumTanks;
|
||||
pSector->ubNumJeeps = ubNumJeeps;
|
||||
pSector->ubNumRobots = ubNumRobots;
|
||||
}
|
||||
|
||||
void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
@@ -468,6 +477,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
UINT8 ubNumElites=0;
|
||||
UINT8 ubNumTanks=0;
|
||||
UINT8 ubNumJeeps=0;
|
||||
UINT8 ubNumRobots=0;
|
||||
|
||||
//H7
|
||||
{
|
||||
@@ -494,7 +504,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
ubNumElites = 0 + Random( 0 );
|
||||
break;
|
||||
}
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_H7, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_H7, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
|
||||
@@ -525,7 +535,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_H8, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_H8, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
//Guard Post
|
||||
@@ -555,7 +565,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_H9, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_H9, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
// SEC_H10:
|
||||
@@ -584,7 +594,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_H10, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_H10, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
//SEC_H11
|
||||
@@ -617,7 +627,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_I9, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_I9, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
//First part of town
|
||||
@@ -647,7 +657,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_I10, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_I10, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
//Second part of town
|
||||
@@ -677,7 +687,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_I11, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_I11, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
//SEC_I12:
|
||||
@@ -706,7 +716,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_I12, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_I12, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
//Abandoned mine
|
||||
@@ -736,7 +746,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_I13, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_I13, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
// SEC_J11:
|
||||
@@ -765,7 +775,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_J11, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_J11, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
// SEC_J12:
|
||||
@@ -794,7 +804,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_J12, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_J12, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
//Power Generator, Ground Level
|
||||
@@ -824,7 +834,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_J13, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_J13, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
//Complex, Ground Level
|
||||
@@ -854,7 +864,7 @@ void InitNumberOfEnemiesInAboveGroundSectors( )
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_K15, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_K15, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -865,6 +875,7 @@ void InitNumberOfEnemiesInUnderGroundSectors( )
|
||||
UINT8 ubNumElites=0;
|
||||
UINT8 ubNumTanks=0;
|
||||
UINT8 ubNumJeeps=0;
|
||||
UINT8 ubNumRobots=0;
|
||||
|
||||
//Mine Sector Level 1
|
||||
switch( gGameOptions.ubDifficultyLevel )
|
||||
@@ -885,7 +896,7 @@ void InitNumberOfEnemiesInUnderGroundSectors( )
|
||||
ubNumElites = 0 + Random( 0 );
|
||||
break;
|
||||
}
|
||||
SetNumberJa25EnemiesInSector( 13, 9, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSector( 13, 9, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
|
||||
|
||||
//Power Generator Level 1
|
||||
@@ -907,7 +918,7 @@ void InitNumberOfEnemiesInUnderGroundSectors( )
|
||||
ubNumElites = 0 + Random( 0 );
|
||||
break;
|
||||
}
|
||||
SetNumberJa25EnemiesInSector( 13, 10, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSector( 13, 10, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
|
||||
|
||||
//Tunnel First Part, Level 1
|
||||
@@ -929,7 +940,7 @@ void InitNumberOfEnemiesInUnderGroundSectors( )
|
||||
ubNumElites = 0 + Random( 0 );
|
||||
break;
|
||||
}
|
||||
SetNumberJa25EnemiesInSector( 14, 10, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSector( 14, 10, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
|
||||
|
||||
//Tunnel Second Part, Level 1
|
||||
@@ -951,7 +962,7 @@ void InitNumberOfEnemiesInUnderGroundSectors( )
|
||||
ubNumElites = 0 + Random( 0 );
|
||||
break;
|
||||
}
|
||||
SetNumberJa25EnemiesInSector( 14, 11, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSector( 14, 11, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
|
||||
|
||||
|
||||
@@ -974,7 +985,7 @@ void InitNumberOfEnemiesInUnderGroundSectors( )
|
||||
ubNumElites = 6 + Random( 4 );
|
||||
break;
|
||||
}
|
||||
SetNumberJa25EnemiesInSector( 15, 11, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSector( 15, 11, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
|
||||
|
||||
//Complex, Level 2, K15
|
||||
@@ -996,7 +1007,7 @@ void InitNumberOfEnemiesInUnderGroundSectors( )
|
||||
ubNumElites = 10 + Random( 2 );
|
||||
break;
|
||||
}
|
||||
SetNumberJa25EnemiesInSector( 15, 11, 2, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSector( 15, 11, 2, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
|
||||
|
||||
//Complex, Level 2, L15
|
||||
@@ -1018,7 +1029,7 @@ void InitNumberOfEnemiesInUnderGroundSectors( )
|
||||
ubNumElites = 14 + Random( 2 );
|
||||
break;
|
||||
}
|
||||
SetNumberJa25EnemiesInSector( 15, 12, 2, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSector( 15, 12, 2, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
|
||||
|
||||
//Complex, Level 3, L15
|
||||
@@ -1040,7 +1051,7 @@ void InitNumberOfEnemiesInUnderGroundSectors( )
|
||||
ubNumElites = 15 + Random( 0 );
|
||||
break;
|
||||
}
|
||||
SetNumberJa25EnemiesInSector( 15, 12, 3, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSector( 15, 12, 3, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
void InitJa25SaveStruct()
|
||||
@@ -1289,7 +1300,7 @@ void HandleAddingEnemiesToTunnelMaps()
|
||||
else if( AreAnyPlayerMercsStillInSector( 14, 10, 1 ) &&
|
||||
!AreAnyPlayerMercsStillInSector( 14, 11, 1 ) )
|
||||
{
|
||||
ubNumEnemies = NumEnemiesToAttackFirstTunnelSector( NULL, NULL, NULL, NULL, NULL );
|
||||
ubNumEnemies = NumEnemiesToAttackFirstTunnelSector( NULL, NULL, NULL, NULL, NULL, NULL );
|
||||
|
||||
//Add enemies to the first sector
|
||||
HandleAddEnemiesToSectorPlayerIsntIn( JA25_J14_1, ubNumEnemies );
|
||||
@@ -1303,7 +1314,7 @@ void HandleAddingEnemiesToTunnelMaps()
|
||||
//else if the player is in the second sector
|
||||
else if( AreAnyPlayerMercsStillInSector( 14, 11, 1 ) )
|
||||
{
|
||||
ubNumEnemies = NumEnemiesToAttackSecondTunnelSector( NULL, NULL, NULL, NULL, NULL );
|
||||
ubNumEnemies = NumEnemiesToAttackSecondTunnelSector( NULL, NULL, NULL, NULL, NULL, NULL );
|
||||
|
||||
//Add enemies to the first sector
|
||||
HandleAddEnemiesToSectorPlayerIsntIn( JA25_K14_1, ubNumEnemies );
|
||||
@@ -1334,10 +1345,11 @@ void AddEnemiesToFirstTunnelSector()
|
||||
UINT8 ubNumElites=0;
|
||||
UINT8 ubNumTanks=0;
|
||||
UINT8 ubNumJeeps=0;
|
||||
UINT8 ubNumRobots=0;
|
||||
|
||||
NumEnemiesToAttackFirstTunnelSector( &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumTanks, &ubNumJeeps );
|
||||
NumEnemiesToAttackFirstTunnelSector( &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumTanks, &ubNumJeeps, &ubNumRobots );
|
||||
|
||||
SetNumberJa25EnemiesInSector( 14, 10, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSector( 14, 10, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
void AddEnemiesToSecondTunnelSector()
|
||||
@@ -1347,18 +1359,20 @@ void AddEnemiesToSecondTunnelSector()
|
||||
UINT8 ubNumElites=0;
|
||||
UINT8 ubNumTanks=0;
|
||||
UINT8 ubNumJeeps=0;
|
||||
UINT8 ubNumRobots=0;
|
||||
|
||||
NumEnemiesToAttackSecondTunnelSector( &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumTanks, &ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSector( 14, 11, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
NumEnemiesToAttackSecondTunnelSector( &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumTanks, &ubNumJeeps, &ubNumRobots );
|
||||
SetNumberJa25EnemiesInSector( 14, 11, 1, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
|
||||
UINT8 NumEnemiesToAttackFirstTunnelSector( UINT8 *pAdmins, UINT8 *pTroops, UINT8 *pElites, UINT8 *pTanks, UINT8 *pJeeps )
|
||||
UINT8 NumEnemiesToAttackFirstTunnelSector( UINT8 *pAdmins, UINT8 *pTroops, UINT8 *pElites, UINT8 *pTanks, UINT8 *pJeeps, UINT8 *pRobots )
|
||||
{
|
||||
UINT8 ubNumAdmins=0;
|
||||
UINT8 ubNumTroops=0;
|
||||
UINT8 ubNumElites=0;
|
||||
UINT8 ubNumTanks=0;
|
||||
UINT8 ubNumJeeps=0;
|
||||
UINT8 ubNumRobots=0;
|
||||
|
||||
//if the player blew up the fan, add a ton of enemies to the sector
|
||||
//1st Tunnel Sector
|
||||
@@ -1396,16 +1410,20 @@ UINT8 NumEnemiesToAttackFirstTunnelSector( UINT8 *pAdmins, UINT8 *pTroops, UINT8
|
||||
if( pJeeps )
|
||||
*pJeeps = ubNumJeeps;
|
||||
|
||||
return( ubNumAdmins + ubNumTroops + ubNumElites + ubNumTanks + ubNumJeeps );
|
||||
if( pRobots )
|
||||
*pRobots = ubNumRobots;
|
||||
|
||||
return( ubNumAdmins + ubNumTroops + ubNumElites + ubNumTanks + ubNumJeeps + ubNumRobots );
|
||||
}
|
||||
|
||||
UINT8 NumEnemiesToAttackSecondTunnelSector( UINT8 *pAdmins, UINT8 *pTroops, UINT8 *pElites, UINT8 *pTanks, UINT8 *pJeeps )
|
||||
UINT8 NumEnemiesToAttackSecondTunnelSector( UINT8 *pAdmins, UINT8 *pTroops, UINT8 *pElites, UINT8 *pTanks, UINT8 *pJeeps, UINT8 *pRobots )
|
||||
{
|
||||
UINT8 ubNumAdmins=0;
|
||||
UINT8 ubNumTroops=0;
|
||||
UINT8 ubNumElites=0;
|
||||
UINT8 ubNumTanks=0;
|
||||
UINT8 ubNumJeeps=0;
|
||||
UINT8 ubNumRobots=0;
|
||||
|
||||
//if the player blew up the fan, add a ton of enemies to the sector
|
||||
//1st Tunnel Sector
|
||||
@@ -1439,8 +1457,10 @@ UINT8 NumEnemiesToAttackSecondTunnelSector( UINT8 *pAdmins, UINT8 *pTroops, UINT
|
||||
*pTanks = ubNumTanks;
|
||||
if( pJeeps )
|
||||
*pJeeps = ubNumJeeps;
|
||||
if( pRobots )
|
||||
*pRobots = ubNumRobots;
|
||||
|
||||
return( ubNumAdmins + ubNumTroops + ubNumElites + ubNumTanks + ubNumJeeps );
|
||||
return( ubNumAdmins + ubNumTroops + ubNumElites + ubNumTanks + ubNumJeeps + ubNumRobots );
|
||||
}
|
||||
|
||||
|
||||
@@ -2202,7 +2222,7 @@ BOOLEAN HandleAddEnemiesToSectorPlayerIsntIn( INT16 sSaiSector, UINT8 ubNumEnemi
|
||||
SetEnemyEncounterCode( ENEMY_INVASION_CODE );
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSector( sSectorX, sSectorY, bSectorZ, 0, ubNumEnemies, 0, 0, 0 );
|
||||
SetNumberJa25EnemiesInSector( sSectorX, sSectorY, bSectorZ, 0, ubNumEnemies, 0, 0, 0, 0 );
|
||||
|
||||
SetThisSectorAsEnemyControlled( sSectorX, sSectorY, bSectorZ, FALSE );
|
||||
|
||||
@@ -2248,7 +2268,7 @@ if ( gGameUBOptions.pJA2UB == TRUE )
|
||||
|
||||
if( gJa25AiSectorStruct[ sSaiSector ].bSectorZ == 0 )
|
||||
{
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( sSector, 0, ubNumEnemies, 0, 0, 0 );
|
||||
pGroup = CreateNewEnemyGroupDepartingFromSector( sSector, 0, ubNumEnemies, 0, 0, 0, 0 );
|
||||
|
||||
if( sGridNo != -1 )
|
||||
{
|
||||
@@ -2841,6 +2861,7 @@ void SetH11NumEnemiesInSector()
|
||||
UINT8 ubNumElites=0;
|
||||
UINT8 ubNumTanks=0;
|
||||
UINT8 ubNumJeeps = 0;
|
||||
UINT8 ubNumRobots = 0;
|
||||
|
||||
// SEC_H11:
|
||||
{
|
||||
@@ -2868,7 +2889,7 @@ void SetH11NumEnemiesInSector()
|
||||
break;
|
||||
}
|
||||
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_H11, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SEC_H11, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -188,12 +188,12 @@ BOOLEAN ShouldEnemiesBeAddedToInitialSector();
|
||||
|
||||
void InitJa25StrategicAi();
|
||||
|
||||
void SetNumberJa25EnemiesInSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubJeeps );
|
||||
void SetNumberJa25EnemiesInSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubJeeps, UINT8 ubRobots );
|
||||
|
||||
void InitJa25SaveStruct();
|
||||
|
||||
void InitJa25StrategicAiBloodcats( );
|
||||
void SetNumberJa25EnemiesInSurfaceSector( INT32 iSectorID, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps );
|
||||
void SetNumberJa25EnemiesInSurfaceSector( INT32 iSectorID, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps, UINT8 ubNumRobots );
|
||||
|
||||
BOOLEAN SaveJa25SaveInfoToSaveGame( HWFILE hFile );
|
||||
BOOLEAN LoadJa25SaveInfoFromSavedGame( HWFILE hFile );
|
||||
|
||||
@@ -2266,6 +2266,7 @@ int i;
|
||||
UINT8 ubNumElites=0;
|
||||
UINT8 ubNumTanks=0;
|
||||
UINT8 ubNumJeeps=0;
|
||||
UINT8 ubNumRobots=0;
|
||||
|
||||
INT16 sSectorX;
|
||||
INT16 sSectorY;
|
||||
@@ -2279,7 +2280,7 @@ INT16 sSectorY;
|
||||
if (i == 5 ) ubNumElites = lua_tointeger(L,i);
|
||||
if (i == 6 ) ubNumTanks = lua_tointeger(L,i);
|
||||
}
|
||||
SetNumberJa25EnemiesInSurfaceSector( SECTOR( sSectorX, sSectorY ), ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps );
|
||||
SetNumberJa25EnemiesInSurfaceSector( SECTOR( sSectorX, sSectorY ), ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, ubNumRobots );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -233,7 +233,7 @@ void ValidateAndCorrectInBattleCounters( GROUP *pLocGroup )
|
||||
{
|
||||
if( pGroup->ubSectorX == pLocGroup->ubSectorX && pGroup->ubSectorY == pLocGroup->ubSectorY )
|
||||
{
|
||||
if ( pGroup->pEnemyGroup->ubAdminsInBattle || pGroup->pEnemyGroup->ubTroopsInBattle || pGroup->pEnemyGroup->ubElitesInBattle || pGroup->pEnemyGroup->ubTanksInBattle || pGroup->pEnemyGroup->ubJeepsInBattle )
|
||||
if ( pGroup->pEnemyGroup->ubAdminsInBattle || pGroup->pEnemyGroup->ubTroopsInBattle || pGroup->pEnemyGroup->ubElitesInBattle || pGroup->pEnemyGroup->ubTanksInBattle || pGroup->pEnemyGroup->ubJeepsInBattle || pGroup->pEnemyGroup->ubRobotsInBattle )
|
||||
{
|
||||
++ubInvalidGroups;
|
||||
pGroup->pEnemyGroup->ubAdminsInBattle = 0;
|
||||
@@ -241,6 +241,7 @@ void ValidateAndCorrectInBattleCounters( GROUP *pLocGroup )
|
||||
pGroup->pEnemyGroup->ubElitesInBattle = 0;
|
||||
pGroup->pEnemyGroup->ubTanksInBattle = 0;
|
||||
pGroup->pEnemyGroup->ubJeepsInBattle = 0;
|
||||
pGroup->pEnemyGroup->ubRobotsInBattle = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -258,14 +259,15 @@ void ValidateAndCorrectInBattleCounters( GROUP *pLocGroup )
|
||||
L"If you can provide information on how a previous battle was resolved here or nearby patrol "
|
||||
L"(auto resolve, tactical battle, cheat keys, or retreat),"
|
||||
L"please forward that info (no data files necessary) as well as the following code (very important): "
|
||||
L"G(%02d:%c%d_b%d) A(%02d:%02d) T(%02d:%02d) E(%02d:%02d) C(%02d:%02d) Ta(%02d:%02d) J(%02d:%02d)",
|
||||
L"G(%02d:%c%d_b%d) A(%02d:%02d) T(%02d:%02d) E(%02d:%02d) C(%02d:%02d) Ta(%02d:%02d) J(%02d:%02d) R(%02d:%02d)",
|
||||
ubInvalidGroups, pLocGroup->ubSectorY + 'A' - 1, pLocGroup->ubSectorX, pLocGroup->ubSectorZ,
|
||||
pSector->ubNumAdmins, pSector->ubAdminsInBattle,
|
||||
pSector->ubNumTroops, pSector->ubTroopsInBattle,
|
||||
pSector->ubNumElites, pSector->ubElitesInBattle,
|
||||
pSector->ubNumCreatures, pSector->ubCreaturesInBattle,
|
||||
pSector->ubNumTanks, pSector->ubTanksInBattle,
|
||||
pSector->ubNumJeeps, pSector->ubJeepsInBattle );
|
||||
pSector->ubNumJeeps, pSector->ubJeepsInBattle,
|
||||
pSector->ubNumRobots, pSector->ubRobotsInBattle );
|
||||
DoScreenIndependantMessageBox( str, MSG_BOX_FLAG_OK, NULL );
|
||||
pSector->ubAdminsInBattle = 0;
|
||||
pSector->ubTroopsInBattle = 0;
|
||||
@@ -273,6 +275,7 @@ void ValidateAndCorrectInBattleCounters( GROUP *pLocGroup )
|
||||
pSector->ubCreaturesInBattle = 0;
|
||||
pSector->ubTanksInBattle = 0;
|
||||
pSector->ubJeepsInBattle = 0;
|
||||
pSector->ubRobotsInBattle = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -2007,7 +2010,7 @@ void CalculateNonPersistantPBIInfo()
|
||||
{
|
||||
SetExplicitEnemyEncounterCode( FIGHTING_CREATURES_CODE );
|
||||
}
|
||||
else if( pSector->ubAdminsInBattle || pSector->ubTroopsInBattle || pSector->ubElitesInBattle || pSector->ubTanksInBattle || pSector->ubJeepsInBattle )
|
||||
else if( pSector->ubAdminsInBattle || pSector->ubTroopsInBattle || pSector->ubElitesInBattle || pSector->ubTanksInBattle || pSector->ubJeepsInBattle || pSector->ubRobotsInBattle )
|
||||
{
|
||||
SetExplicitEnemyEncounterCode( ENTERING_ENEMY_SECTOR_CODE );
|
||||
SetEnemyEncounterCode( ENTERING_ENEMY_SECTOR_CODE );
|
||||
@@ -2022,7 +2025,7 @@ void CalculateNonPersistantPBIInfo()
|
||||
{
|
||||
SetExplicitEnemyEncounterCode( FIGHTING_CREATURES_CODE );
|
||||
}
|
||||
else if( pSector->ubAdminsInBattle || pSector->ubTroopsInBattle || pSector->ubElitesInBattle || pSector->ubTanksInBattle || pSector->ubJeepsInBattle )
|
||||
else if( pSector->ubAdminsInBattle || pSector->ubTroopsInBattle || pSector->ubElitesInBattle || pSector->ubTanksInBattle || pSector->ubJeepsInBattle || pSector->ubRobotsInBattle )
|
||||
{
|
||||
SetExplicitEnemyEncounterCode( ENTERING_ENEMY_SECTOR_CODE );
|
||||
SetEnemyEncounterCode( ENTERING_ENEMY_SECTOR_CODE );
|
||||
|
||||
+179
-64
@@ -162,7 +162,7 @@ UINT8 NumHostilesInSector( INT16 sSectorX, INT16 sSectorY, INT16 sSectorZ )
|
||||
pSector = FindUnderGroundSector( sSectorX, sSectorY, (UINT8)sSectorZ );
|
||||
if( pSector )
|
||||
{
|
||||
ubNumHostiles = (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumCreatures + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
ubNumHostiles = (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumCreatures + pSector->ubNumRobots + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -172,7 +172,7 @@ UINT8 NumHostilesInSector( INT16 sSectorX, INT16 sSectorY, INT16 sSectorZ )
|
||||
|
||||
//Count stationary hostiles
|
||||
pSector = &SectorInfo[ SECTOR( sSectorX, sSectorY ) ];
|
||||
ubNumHostiles = (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumCreatures + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
ubNumHostiles = (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumCreatures + pSector->ubNumRobots + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
|
||||
//Count mobile enemies
|
||||
pGroup = gpGroupList;
|
||||
@@ -206,7 +206,7 @@ UINT8 NumEnemiesInAnySector( INT16 sSectorX, INT16 sSectorY, INT16 sSectorZ )
|
||||
pSector = FindUnderGroundSector( sSectorX, sSectorY, (UINT8)sSectorZ );
|
||||
if( pSector )
|
||||
{
|
||||
ubNumEnemies = (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
ubNumEnemies = (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumRobots + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -216,7 +216,7 @@ UINT8 NumEnemiesInAnySector( INT16 sSectorX, INT16 sSectorY, INT16 sSectorZ )
|
||||
|
||||
//Count stationary enemies
|
||||
pSector = &SectorInfo[ SECTOR( sSectorX, sSectorY ) ];
|
||||
ubNumEnemies = (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
ubNumEnemies = (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumRobots + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
|
||||
//Count mobile enemies
|
||||
pGroup = gpGroupList;
|
||||
@@ -259,7 +259,7 @@ UINT8 NumNonPlayerTeamMembersInSector( INT16 sSectorX, INT16 sSectorY, UINT8 ubT
|
||||
|
||||
if ( ubTeam == ENEMY_TEAM )
|
||||
{
|
||||
ubNumTroops = (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
ubNumTroops = (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumRobots + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
|
||||
if ( is_networked )
|
||||
ubNumTroops += numenemyLAN((UINT8)sSectorX,(UINT8)sSectorY ); //hayden
|
||||
@@ -372,7 +372,7 @@ UINT8 NumStationaryEnemiesInSector( INT16 sSectorX, INT16 sSectorY )
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
return (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumTanks);
|
||||
return (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumTanks + pSector->ubNumJeeps + pSector->ubNumRobots);
|
||||
}
|
||||
|
||||
UINT8 NumMobileEnemiesInSector( INT16 sSectorX, INT16 sSectorY )
|
||||
@@ -400,13 +400,13 @@ UINT8 NumMobileEnemiesInSector( INT16 sSectorX, INT16 sSectorY )
|
||||
if( pSector->ubGarrisonID == ROADBLOCK )
|
||||
{
|
||||
//consider these troops as mobile troops even though they are in a garrison
|
||||
ubNumTroops += (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
ubNumTroops += (UINT8)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumRobots + pSector->ubNumJeeps + pSector->ubNumTanks);
|
||||
}
|
||||
|
||||
return ubNumTroops;
|
||||
}
|
||||
|
||||
void GetNumberOfMobileEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps )
|
||||
void GetNumberOfMobileEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumRobots, UINT8 *pubNumTanks, UINT8 *pubNumJeeps )
|
||||
{
|
||||
GROUP *pGroup;
|
||||
SECTORINFO *pSector;
|
||||
@@ -416,7 +416,7 @@ void GetNumberOfMobileEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pu
|
||||
AssertLE( sSectorY, MAXIMUM_VALID_Y_COORDINATE );
|
||||
|
||||
//Now count the number of mobile groups in the sector.
|
||||
*pubNumTroops = *pubNumElites = *pubNumAdmins = *pubNumTanks = *pubNumJeeps =0;
|
||||
*pubNumTroops = *pubNumElites = *pubNumAdmins = *pubNumRobots = *pubNumTanks = *pubNumJeeps = 0;
|
||||
pGroup = gpGroupList;
|
||||
while( pGroup )
|
||||
{
|
||||
@@ -425,6 +425,7 @@ void GetNumberOfMobileEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pu
|
||||
*pubNumTroops += pGroup->pEnemyGroup->ubNumTroops;
|
||||
*pubNumElites += pGroup->pEnemyGroup->ubNumElites;
|
||||
*pubNumAdmins += pGroup->pEnemyGroup->ubNumAdmins;
|
||||
*pubNumRobots += pGroup->pEnemyGroup->ubNumRobots;
|
||||
*pubNumTanks += pGroup->pEnemyGroup->ubNumTanks;
|
||||
*pubNumJeeps += pGroup->pEnemyGroup->ubNumJeeps;
|
||||
}
|
||||
@@ -438,12 +439,13 @@ void GetNumberOfMobileEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pu
|
||||
*pubNumAdmins += pSector->ubNumAdmins;
|
||||
*pubNumTroops += pSector->ubNumTroops;
|
||||
*pubNumElites += pSector->ubNumElites;
|
||||
*pubNumRobots += pSector->ubNumRobots;
|
||||
*pubNumTanks += pSector->ubNumTanks;
|
||||
*pubNumJeeps += pSector->ubNumJeeps;
|
||||
}
|
||||
}
|
||||
|
||||
void GetNumberOfMobileEnemiesInSectorWithoutRoadBlock( INT16 sSectorX, INT16 sSectorY, UINT8 usTeam, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps )
|
||||
void GetNumberOfMobileEnemiesInSectorWithoutRoadBlock( INT16 sSectorX, INT16 sSectorY, UINT8 usTeam, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumRobots, UINT8 *pubNumTanks, UINT8 *pubNumJeeps )
|
||||
{
|
||||
GROUP *pGroup;
|
||||
AssertGE( sSectorX, MINIMUM_VALID_X_COORDINATE);
|
||||
@@ -452,7 +454,7 @@ void GetNumberOfMobileEnemiesInSectorWithoutRoadBlock( INT16 sSectorX, INT16 sSe
|
||||
AssertLE( sSectorY, MAXIMUM_VALID_Y_COORDINATE );
|
||||
|
||||
//Now count the number of mobile groups in the sector.
|
||||
*pubNumTroops = *pubNumElites = *pubNumAdmins = *pubNumTanks = *pubNumJeeps = 0;
|
||||
*pubNumTroops = *pubNumElites = *pubNumAdmins = *pubNumRobots = *pubNumTanks = *pubNumJeeps = 0;
|
||||
pGroup = gpGroupList;
|
||||
while( pGroup )
|
||||
{
|
||||
@@ -461,6 +463,7 @@ void GetNumberOfMobileEnemiesInSectorWithoutRoadBlock( INT16 sSectorX, INT16 sSe
|
||||
*pubNumTroops += pGroup->pEnemyGroup->ubNumTroops;
|
||||
*pubNumElites += pGroup->pEnemyGroup->ubNumElites;
|
||||
*pubNumAdmins += pGroup->pEnemyGroup->ubNumAdmins;
|
||||
*pubNumRobots += pGroup->pEnemyGroup->ubNumRobots;
|
||||
*pubNumTanks += pGroup->pEnemyGroup->ubNumTanks;
|
||||
*pubNumJeeps += pGroup->pEnemyGroup->ubNumJeeps;
|
||||
}
|
||||
@@ -469,7 +472,7 @@ void GetNumberOfMobileEnemiesInSectorWithoutRoadBlock( INT16 sSectorX, INT16 sSe
|
||||
}
|
||||
|
||||
|
||||
void GetNumberOfStationaryEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps )
|
||||
void GetNumberOfStationaryEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumRobots, UINT8 *pubNumTanks, UINT8 *pubNumJeeps )
|
||||
{
|
||||
SECTORINFO *pSector;
|
||||
AssertGE( sSectorX, MINIMUM_VALID_X_COORDINATE);
|
||||
@@ -482,21 +485,23 @@ void GetNumberOfStationaryEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8
|
||||
*pubNumAdmins = pSector->ubNumAdmins;
|
||||
*pubNumTroops = pSector->ubNumTroops;
|
||||
*pubNumElites = pSector->ubNumElites;
|
||||
*pubNumRobots = pSector->ubNumRobots;
|
||||
*pubNumTanks = pSector->ubNumTanks;
|
||||
*pubNumJeeps = pSector->ubNumJeeps;
|
||||
}
|
||||
|
||||
void GetNumberOfEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps )
|
||||
void GetNumberOfEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumRobots, UINT8 *pubNumTanks, UINT8 *pubNumJeeps )
|
||||
{
|
||||
UINT8 ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps;
|
||||
UINT8 ubNumAdmins, ubNumTroops, ubNumElites, ubNumRobots, ubNumTanks, ubNumJeeps;
|
||||
|
||||
GetNumberOfStationaryEnemiesInSector( sSectorX, sSectorY, pubNumAdmins, pubNumTroops, pubNumElites, pubNumTanks, pubNumJeeps );
|
||||
GetNumberOfStationaryEnemiesInSector( sSectorX, sSectorY, pubNumAdmins, pubNumTroops, pubNumElites, pubNumRobots, pubNumTanks, pubNumJeeps );
|
||||
|
||||
GetNumberOfMobileEnemiesInSector( sSectorX, sSectorY, &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumTanks, &ubNumJeeps );
|
||||
GetNumberOfMobileEnemiesInSector( sSectorX, sSectorY, &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumRobots, &ubNumTanks, &ubNumJeeps );
|
||||
|
||||
*pubNumAdmins += ubNumAdmins;
|
||||
*pubNumTroops += ubNumTroops;
|
||||
*pubNumElites += ubNumElites;
|
||||
*pubNumRobots += ubNumRobots;
|
||||
*pubNumTanks += ubNumTanks;
|
||||
*pubNumJeeps += ubNumJeeps;
|
||||
}
|
||||
@@ -514,6 +519,7 @@ void EndTacticalBattleForEnemy()
|
||||
pSector->ubAdminsInBattle = 0;
|
||||
pSector->ubTroopsInBattle = 0;
|
||||
pSector->ubElitesInBattle = 0;
|
||||
pSector->ubRobotsInBattle = 0;
|
||||
pSector->ubTanksInBattle = 0;
|
||||
pSector->ubJeepsInBattle = 0;
|
||||
}
|
||||
@@ -525,6 +531,7 @@ void EndTacticalBattleForEnemy()
|
||||
pSector->ubAdminsInBattle = 0;
|
||||
pSector->ubTroopsInBattle = 0;
|
||||
pSector->ubElitesInBattle = 0;
|
||||
pSector->ubRobotsInBattle = 0;
|
||||
pSector->ubTanksInBattle = 0;
|
||||
pSector->ubJeepsInBattle = 0;
|
||||
pSector->ubNumCreatures = 0;
|
||||
@@ -544,6 +551,7 @@ void EndTacticalBattleForEnemy()
|
||||
{
|
||||
pGroup->pEnemyGroup->ubTroopsInBattle = 0;
|
||||
pGroup->pEnemyGroup->ubElitesInBattle = 0;
|
||||
pGroup->pEnemyGroup->ubRobotsInBattle = 0;
|
||||
pGroup->pEnemyGroup->ubAdminsInBattle = 0;
|
||||
pGroup->pEnemyGroup->ubTanksInBattle = 0;
|
||||
pGroup->pEnemyGroup->ubJeepsInBattle = 0;
|
||||
@@ -601,8 +609,8 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
SECTORINFO *pSector;
|
||||
GROUP *pGroup;
|
||||
SOLDIERTYPE *pSoldier;
|
||||
unsigned ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps;
|
||||
unsigned ubTotalAdmins, ubTotalElites, ubTotalTroops, ubTotalTanks, ubTotalJeeps = 0;
|
||||
unsigned ubNumAdmins, ubNumTroops, ubNumElites, ubNumRobots, ubNumTanks, ubNumJeeps;
|
||||
unsigned ubTotalAdmins, ubTotalElites, ubTotalRobots, ubTotalTroops, ubTotalTanks, ubTotalJeeps = 0;
|
||||
unsigned totalCountOfStationaryEnemies = 0;
|
||||
unsigned totalCountOfMobileEnemies = 0;
|
||||
int sNumSlots;
|
||||
@@ -658,6 +666,7 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
!pGroup->pEnemyGroup->ubAdminsInBattle &&
|
||||
!pGroup->pEnemyGroup->ubTroopsInBattle &&
|
||||
!pGroup->pEnemyGroup->ubElitesInBattle &&
|
||||
!pGroup->pEnemyGroup->ubRobotsInBattle &&
|
||||
!pGroup->pEnemyGroup->ubTanksInBattle &&
|
||||
!pGroup->pEnemyGroup->ubJeepsInBattle )
|
||||
{
|
||||
@@ -698,13 +707,14 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
// OJW - 20090403 - override max ai in co-op
|
||||
if (is_networked && is_server && gMaxEnemiesEnabled == 1)
|
||||
{
|
||||
float totalEnemies = (float)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumTanks + pSector->ubNumJeeps);
|
||||
float totalEnemies = (float)(pSector->ubNumAdmins + pSector->ubNumTroops + pSector->ubNumElites + pSector->ubNumRobots + pSector->ubNumTanks + pSector->ubNumJeeps);
|
||||
ubTotalAdmins = (unsigned int)(((float)pSector->ubNumAdmins / totalEnemies) * mapMaximumNumberOfEnemies);
|
||||
ubTotalTroops = (unsigned int)(((float)pSector->ubNumTroops / totalEnemies) * mapMaximumNumberOfEnemies);
|
||||
ubTotalElites = (unsigned int)(((float)pSector->ubNumElites / totalEnemies) * mapMaximumNumberOfEnemies);
|
||||
ubTotalRobots = (unsigned int)(((float)pSector->ubNumRobots / totalEnemies) * mapMaximumNumberOfEnemies);
|
||||
ubTotalTanks = (unsigned int)(((float)pSector->ubNumTanks / totalEnemies) * mapMaximumNumberOfEnemies);
|
||||
ubTotalJeeps = (unsigned int)(((float)pSector->ubNumJeeps / totalEnemies) * mapMaximumNumberOfEnemies);
|
||||
totalEnemies = (float)(ubTotalAdmins + ubTotalTroops + ubTotalElites + ubTotalTanks + ubTotalJeeps);
|
||||
totalEnemies = (float)(ubTotalAdmins + ubTotalTroops + ubTotalElites + ubTotalRobots + ubTotalTanks + ubTotalJeeps);
|
||||
|
||||
// take care of any rounding losses
|
||||
while (totalEnemies < mapMaximumNumberOfEnemies)
|
||||
@@ -717,11 +727,13 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
pSector->ubNumAdmins = ubTotalAdmins;
|
||||
pSector->ubNumTroops = ubTotalTroops;
|
||||
pSector->ubNumElites = ubTotalElites;
|
||||
pSector->ubNumRobots = ubTotalRobots;
|
||||
pSector->ubNumTanks = ubTotalTanks;
|
||||
pSector->ubNumJeeps = ubTotalJeeps;
|
||||
pSector->ubAdminsInBattle = 0;
|
||||
pSector->ubTroopsInBattle = 0;
|
||||
pSector->ubElitesInBattle = 0;
|
||||
pSector->ubRobotsInBattle = 0;
|
||||
pSector->ubTanksInBattle = 0;
|
||||
pSector->ubJeepsInBattle = 0;
|
||||
}
|
||||
@@ -742,6 +754,7 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
case SOLDIER_CLASS_BANDIT: ubTotalAdmins++; break;
|
||||
case SOLDIER_CLASS_ARMY: ubTotalTroops++; break;
|
||||
case SOLDIER_CLASS_ELITE: ubTotalElites++; break;
|
||||
case SOLDIER_CLASS_ROBOT: ubTotalRobots++; break;
|
||||
case SOLDIER_CLASS_TANK: ubTotalTanks++; break;
|
||||
case SOLDIER_CLASS_JEEP: ubTotalJeeps++; break;
|
||||
}
|
||||
@@ -751,11 +764,13 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
pSector->ubNumAdmins = ubTotalAdmins;
|
||||
pSector->ubNumTroops = ubTotalTroops;
|
||||
pSector->ubNumElites = ubTotalElites;
|
||||
pSector->ubNumRobots = ubTotalRobots;
|
||||
pSector->ubNumTanks = ubTotalTanks;
|
||||
pSector->ubNumJeeps = ubTotalJeeps;
|
||||
pSector->ubAdminsInBattle = 0;
|
||||
pSector->ubTroopsInBattle = 0;
|
||||
pSector->ubElitesInBattle = 0;
|
||||
pSector->ubRobotsInBattle = 0;
|
||||
pSector->ubTanksInBattle = 0;
|
||||
pSector->ubJeepsInBattle = 0;
|
||||
}
|
||||
@@ -764,12 +779,13 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
ubTotalAdmins = pSector->ubNumAdmins - pSector->ubAdminsInBattle;
|
||||
ubTotalTroops = pSector->ubNumTroops - pSector->ubTroopsInBattle;
|
||||
ubTotalElites = pSector->ubNumElites - pSector->ubElitesInBattle;
|
||||
ubTotalRobots = pSector->ubNumRobots - pSector->ubRobotsInBattle;
|
||||
ubTotalTanks = pSector->ubNumTanks - pSector->ubTanksInBattle;
|
||||
ubTotalJeeps = pSector->ubNumJeeps - pSector->ubJeepsInBattle;
|
||||
}
|
||||
}
|
||||
|
||||
totalCountOfStationaryEnemies = ubTotalAdmins + ubTotalTroops + ubTotalElites + ubTotalTanks + ubTotalJeeps;
|
||||
totalCountOfStationaryEnemies = ubTotalAdmins + ubTotalTroops + ubTotalElites + ubTotalRobots + ubTotalTanks + ubTotalJeeps;
|
||||
|
||||
if( totalCountOfStationaryEnemies > mapMaximumNumberOfEnemies )
|
||||
{
|
||||
@@ -783,13 +799,15 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
ubTotalAdmins = min( mapMaximumNumberOfEnemies, ubTotalAdmins );
|
||||
ubTotalTroops = min( mapMaximumNumberOfEnemies-ubTotalAdmins, ubTotalTroops );
|
||||
ubTotalElites = min( mapMaximumNumberOfEnemies-ubTotalAdmins-ubTotalTroops, ubTotalElites );
|
||||
ubTotalTanks = min( mapMaximumNumberOfEnemies-ubTotalAdmins-ubTotalTroops-ubTotalElites, ubTotalTanks );
|
||||
ubTotalJeeps = min( mapMaximumNumberOfEnemies - ubTotalAdmins - ubTotalTroops - ubTotalElites - ubTotalTanks, ubTotalJeeps );
|
||||
ubTotalRobots = min( mapMaximumNumberOfEnemies-ubTotalAdmins-ubTotalTroops-ubTotalElites, ubTotalRobots );
|
||||
ubTotalTanks = min( mapMaximumNumberOfEnemies-ubTotalAdmins-ubTotalTroops-ubTotalElites-ubTotalRobots, ubTotalTanks );
|
||||
ubTotalJeeps = min( mapMaximumNumberOfEnemies-ubTotalAdmins-ubTotalTroops-ubTotalElites-ubTotalRobots-ubTotalTanks, ubTotalJeeps );
|
||||
}
|
||||
|
||||
pSector->ubAdminsInBattle += ubTotalAdmins;
|
||||
pSector->ubTroopsInBattle += ubTotalTroops;
|
||||
pSector->ubElitesInBattle += ubTotalElites;
|
||||
pSector->ubRobotsInBattle += ubTotalRobots;
|
||||
pSector->ubTanksInBattle += ubTotalTanks;
|
||||
pSector->ubJeepsInBattle += ubTotalJeeps;
|
||||
|
||||
@@ -797,9 +815,9 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
if( gfOverrideSector )
|
||||
{
|
||||
//if there are no troops in the current groups, then we're done.
|
||||
if ( !ubTotalAdmins && !ubTotalTroops && !ubTotalElites && !ubTotalTanks && !ubTotalJeeps )
|
||||
if ( !ubTotalAdmins && !ubTotalTroops && !ubTotalElites && !ubTotalTanks && !ubTotalJeeps && !ubTotalRobots)
|
||||
return FALSE;
|
||||
AddSoldierInitListEnemyDefenceSoldiers( ubTotalAdmins, ubTotalTroops, ubTotalElites, ubTotalTanks, ubTotalJeeps );
|
||||
AddSoldierInitListEnemyDefenceSoldiers( ubTotalAdmins, ubTotalTroops, ubTotalElites, ubTotalTanks, ubTotalJeeps, ubTotalRobots );
|
||||
ValidateEnemiesHaveWeapons();
|
||||
UnPauseGame();
|
||||
return TRUE;
|
||||
@@ -827,7 +845,7 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
//Subtract the total number of stationary enemies from the available slots, as stationary forces take
|
||||
//precendence in combat. The mobile forces that could also be in the same sector are considered later if
|
||||
//all the slots fill up.
|
||||
sNumSlots -= ubTotalAdmins + ubTotalTroops + ubTotalElites + ubTotalTanks + ubTotalJeeps;
|
||||
sNumSlots -= ubTotalAdmins + ubTotalTroops + ubTotalElites + ubTotalRobots + ubTotalTanks + ubTotalJeeps;
|
||||
|
||||
//Now, process all of the groups and search for both enemy and player groups in the sector.
|
||||
//For enemy groups, we fill up the slots until we have none left or all of the groups have been
|
||||
@@ -881,6 +899,20 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
ubTotalElites += ubNumElites;
|
||||
}
|
||||
if( sNumSlots > 0 )
|
||||
{ //Add robots
|
||||
AssertGE(pGroup->pEnemyGroup->ubNumRobots, pGroup->pEnemyGroup->ubRobotsInBattle);
|
||||
ubNumRobots = pGroup->pEnemyGroup->ubNumRobots - pGroup->pEnemyGroup->ubRobotsInBattle;
|
||||
sNumSlots -= ubNumRobots;
|
||||
if( sNumSlots < 0 )
|
||||
{ //adjust the value to zero
|
||||
ubNumRobots += sNumSlots;
|
||||
sNumSlots = 0;
|
||||
gfPendingNonPlayerTeam[ENEMY_TEAM] = TRUE;
|
||||
}
|
||||
pGroup->pEnemyGroup->ubRobotsInBattle += ubNumRobots;
|
||||
ubTotalRobots += ubNumRobots;
|
||||
}
|
||||
if( sNumSlots > 0 )
|
||||
{ //Add tanks
|
||||
AssertGE(pGroup->pEnemyGroup->ubNumTanks, pGroup->pEnemyGroup->ubTanksInBattle);
|
||||
ubNumTanks = pGroup->pEnemyGroup->ubNumTanks - pGroup->pEnemyGroup->ubTanksInBattle;
|
||||
@@ -930,12 +962,12 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
}
|
||||
|
||||
//if there are no troops in the current groups, then we're done.
|
||||
if ( !ubTotalAdmins && !ubTotalTroops && !ubTotalElites && !ubTotalTanks && !ubTotalJeeps )
|
||||
if ( !ubTotalAdmins && !ubTotalTroops && !ubTotalElites && !ubTotalRobots && !ubTotalTanks && !ubTotalJeeps )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
AddSoldierInitListEnemyDefenceSoldiers( ubTotalAdmins, ubTotalTroops, ubTotalElites, ubTotalTanks, ubTotalJeeps );
|
||||
AddSoldierInitListEnemyDefenceSoldiers( ubTotalAdmins, ubTotalTroops, ubTotalElites, ubTotalRobots, ubTotalTanks, ubTotalJeeps );
|
||||
|
||||
//Now, we have to go through all of the enemies in the new map, and assign their respective groups if
|
||||
//in a mobile group, but only for the ones that were assigned from the
|
||||
@@ -956,9 +988,10 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
ubNumAdmins = pGroup->pEnemyGroup->ubAdminsInBattle;
|
||||
ubNumTroops = pGroup->pEnemyGroup->ubTroopsInBattle;
|
||||
ubNumElites = pGroup->pEnemyGroup->ubElitesInBattle;
|
||||
ubNumRobots = pGroup->pEnemyGroup->ubRobotsInBattle;
|
||||
ubNumTanks = pGroup->pEnemyGroup->ubTanksInBattle;
|
||||
ubNumJeeps = pGroup->pEnemyGroup->ubJeepsInBattle;
|
||||
unsigned num = ubNumAdmins + ubNumTroops + ubNumElites + ubNumTanks + ubNumJeeps;
|
||||
unsigned num = ubNumAdmins + ubNumTroops + ubNumElites + ubNumRobots + ubNumTanks + ubNumJeeps;
|
||||
|
||||
AssertGE((int)slotsAvailable, sNumSlots);
|
||||
|
||||
@@ -1028,6 +1061,16 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SOLDIER_CLASS_ROBOT:
|
||||
if( ubNumRobots )
|
||||
{
|
||||
num--;
|
||||
sNumSlots--;
|
||||
ubNumRobots--;
|
||||
pSoldier->ubGroupID = pGroup->ubGroupID;
|
||||
firstSlot = slot + 1;
|
||||
}
|
||||
break;
|
||||
case SOLDIER_CLASS_TANK:
|
||||
if( ubNumTanks )
|
||||
{
|
||||
@@ -1058,6 +1101,7 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
AssertEQ( ubNumAdmins , 0);
|
||||
AssertEQ( ubNumTanks , 0);
|
||||
AssertEQ( ubNumJeeps , 0);
|
||||
AssertEQ( ubNumRobots , 0);
|
||||
AssertEQ( num , 0);*/
|
||||
}
|
||||
pGroup = pGroup->next;
|
||||
@@ -1072,7 +1116,7 @@ BOOLEAN PrepareEnemyForSectorBattle()
|
||||
BOOLEAN PrepareEnemyForUndergroundBattle()
|
||||
{
|
||||
UNDERGROUND_SECTORINFO *pUnderground;
|
||||
unsigned ubTotalAdmins, ubTotalTroops, ubTotalElites, ubTotalTanks, ubTotalJeeps;
|
||||
unsigned ubTotalAdmins, ubTotalTroops, ubTotalElites, ubTotalRobots, ubTotalTanks, ubTotalJeeps;
|
||||
|
||||
pUnderground = gpUndergroundSectorInfoHead;
|
||||
while( pUnderground )
|
||||
@@ -1086,18 +1130,20 @@ BOOLEAN PrepareEnemyForUndergroundBattle()
|
||||
ubTotalAdmins = (UINT8)(pUnderground->ubNumAdmins - pUnderground->ubAdminsInBattle);
|
||||
ubTotalTroops = (UINT8)(pUnderground->ubNumTroops - pUnderground->ubTroopsInBattle);
|
||||
ubTotalElites = (UINT8)(pUnderground->ubNumElites - pUnderground->ubElitesInBattle);
|
||||
ubTotalRobots = (UINT8)(pUnderground->ubNumRobots - pUnderground->ubRobotsInBattle);
|
||||
ubTotalTanks = (UINT8)(pUnderground->ubNumTanks - pUnderground->ubTanksInBattle);
|
||||
ubTotalJeeps = (UINT8)(pUnderground->ubNumJeeps - pUnderground->ubJeepsInBattle);
|
||||
pUnderground->ubAdminsInBattle += ubTotalAdmins;
|
||||
pUnderground->ubTroopsInBattle += ubTotalTroops;
|
||||
pUnderground->ubElitesInBattle += ubTotalElites;
|
||||
pUnderground->ubRobotsInBattle += ubTotalRobots;
|
||||
pUnderground->ubTanksInBattle += ubTotalTanks;
|
||||
pUnderground->ubJeepsInBattle += ubTotalJeeps;
|
||||
AddSoldierInitListEnemyDefenceSoldiers( pUnderground->ubNumAdmins, pUnderground->ubNumTroops, pUnderground->ubNumElites, pUnderground->ubNumTanks, pUnderground->ubNumJeeps );
|
||||
AddSoldierInitListEnemyDefenceSoldiers( pUnderground->ubNumAdmins, pUnderground->ubNumTroops, pUnderground->ubNumElites, pUnderground->ubNumRobots, pUnderground->ubNumTanks, pUnderground->ubNumJeeps );
|
||||
ValidateEnemiesHaveWeapons();
|
||||
UnPauseGame();
|
||||
}
|
||||
return ((BOOLEAN)(pUnderground->ubNumAdmins + pUnderground->ubNumTroops + pUnderground->ubNumElites + pUnderground->ubNumTanks + pUnderground->ubNumJeeps > 0));
|
||||
return ((BOOLEAN)(pUnderground->ubNumAdmins + pUnderground->ubNumTroops + pUnderground->ubNumElites + pUnderground->ubNumRobots + pUnderground->ubNumTanks + pUnderground->ubNumJeeps > 0));
|
||||
}
|
||||
pUnderground = pUnderground->next;
|
||||
}
|
||||
@@ -1284,6 +1330,16 @@ void ProcessQueenCmdImplicationsOfDeath( SOLDIERTYPE *pSoldier )
|
||||
|
||||
switch( pSoldier->ubSoldierClass )
|
||||
{
|
||||
case SOLDIER_CLASS_ROBOT:
|
||||
if( pGroup->pEnemyGroup->ubNumRobots )
|
||||
{
|
||||
pGroup->pEnemyGroup->ubNumRobots--;
|
||||
}
|
||||
if( pGroup->pEnemyGroup->ubRobotsInBattle )
|
||||
{
|
||||
pGroup->pEnemyGroup->ubRobotsInBattle--;
|
||||
}
|
||||
break;
|
||||
case SOLDIER_CLASS_ELITE:
|
||||
#ifdef JA2BETAVERSION
|
||||
if( !pGroup->pEnemyGroup->ubNumElites )
|
||||
@@ -1464,6 +1520,16 @@ void ProcessQueenCmdImplicationsOfDeath( SOLDIERTYPE *pSoldier )
|
||||
pSector->ubElitesInBattle--;
|
||||
}
|
||||
break;
|
||||
case SOLDIER_CLASS_ROBOT:
|
||||
if( pSector->ubNumRobots )
|
||||
{
|
||||
pSector->ubNumRobots--;
|
||||
}
|
||||
if( pSector->ubRobotsInBattle )
|
||||
{
|
||||
pSector->ubRobotsInBattle--;
|
||||
}
|
||||
break;
|
||||
case SOLDIER_CLASS_CREATURE:
|
||||
case SOLDIER_CLASS_BANDIT:
|
||||
case SOLDIER_CLASS_ZOMBIE:
|
||||
@@ -1570,6 +1636,16 @@ void ProcessQueenCmdImplicationsOfDeath( SOLDIERTYPE *pSoldier )
|
||||
pSector->ubElitesInBattle--;
|
||||
}
|
||||
break;
|
||||
case SOLDIER_CLASS_ROBOT:
|
||||
if( pSector->ubNumRobots )
|
||||
{
|
||||
pSector->ubNumRobots--;
|
||||
}
|
||||
if( pSector->ubRobotsInBattle )
|
||||
{
|
||||
pSector->ubRobotsInBattle--;
|
||||
}
|
||||
break;
|
||||
case SOLDIER_CLASS_CREATURE:
|
||||
case SOLDIER_CLASS_BANDIT:
|
||||
case SOLDIER_CLASS_ZOMBIE:
|
||||
@@ -1662,7 +1738,7 @@ void AddPossiblePendingEnemiesToBattle()
|
||||
#endif
|
||||
|
||||
UINT8 ubSlots, ubNumAvailable;
|
||||
UINT8 ubNumElites, ubNumTroops, ubNumAdmins, ubNumTanks, ubNumJeeps;
|
||||
UINT8 ubNumRobots, ubNumElites, ubNumTroops, ubNumAdmins, ubNumTanks, ubNumJeeps;
|
||||
UINT8 ubNumGroupsInSector;
|
||||
UINT8 ubGroupIndex;
|
||||
GROUP *pGroup;
|
||||
@@ -1758,18 +1834,25 @@ void AddPossiblePendingEnemiesToBattle()
|
||||
//return;
|
||||
}
|
||||
|
||||
if ( pSector->ubNumElites + pSector->ubNumTroops + pSector->ubNumAdmins + pSector->ubNumTanks + pSector->ubNumJeeps )
|
||||
if ( pSector->ubNumRobots + pSector->ubNumElites + pSector->ubNumTroops + pSector->ubNumAdmins + pSector->ubNumTanks + pSector->ubNumJeeps )
|
||||
{
|
||||
ubNumElites = ubNumTroops = ubNumAdmins = ubNumTanks = ubNumJeeps = 0;
|
||||
ubNumRobots = ubNumElites = ubNumTroops = ubNumAdmins = ubNumTanks = ubNumJeeps = 0;
|
||||
|
||||
ubNumAvailable = pSector->ubNumElites + pSector->ubNumTroops + pSector->ubNumAdmins + pSector->ubNumTanks + pSector->ubNumJeeps
|
||||
- pSector->ubElitesInBattle - pSector->ubTroopsInBattle - pSector->ubAdminsInBattle - pSector->ubTanksInBattle - pSector->ubJeepsInBattle;
|
||||
ubNumAvailable = pSector->ubNumRobots + pSector->ubNumElites + pSector->ubNumTroops + pSector->ubNumAdmins + pSector->ubNumTanks + pSector->ubNumJeeps
|
||||
- pSector->ubRobotsInBattle - pSector->ubElitesInBattle - pSector->ubTroopsInBattle - pSector->ubAdminsInBattle - pSector->ubTanksInBattle - pSector->ubJeepsInBattle;
|
||||
while( ubNumAvailable && ubSlots )
|
||||
{
|
||||
// So they just magically appear out of nowhere from the edge?
|
||||
|
||||
//This group has enemies waiting for a chance to enter the battle.
|
||||
if( pSector->ubElitesInBattle < pSector->ubNumElites )
|
||||
if( pSector->ubRobotsInBattle < pSector->ubNumRobots )
|
||||
{ //Add a robot
|
||||
pSector->ubRobotsInBattle++;
|
||||
ubNumAvailable--;
|
||||
ubSlots--;
|
||||
ubNumRobots++;
|
||||
}
|
||||
else if( pSector->ubElitesInBattle < pSector->ubNumElites )
|
||||
{ //Add an elite troop
|
||||
pSector->ubElitesInBattle++;
|
||||
ubNumAvailable--;
|
||||
@@ -1812,7 +1895,7 @@ void AddPossiblePendingEnemiesToBattle()
|
||||
}
|
||||
|
||||
|
||||
if ( ubNumAdmins || ubNumTroops || ubNumElites || ubNumTanks || ubNumJeeps )
|
||||
if ( ubNumAdmins || ubNumTroops || ubNumElites || ubNumRobots || ubNumTanks || ubNumJeeps )
|
||||
{ //This group has contributed forces, then add them now, because different
|
||||
//groups appear on different sides of the map.
|
||||
UINT8 ubStrategicInsertionCode = ubPredefinedInsertionCode;
|
||||
@@ -1853,7 +1936,7 @@ void AddPossiblePendingEnemiesToBattle()
|
||||
if( ubStrategicInsertionCode < INSERTION_CODE_NORTH ||ubStrategicInsertionCode > INSERTION_CODE_WEST )
|
||||
ubStrategicInsertionCode = INSERTION_CODE_NORTH + Random( 4 );
|
||||
|
||||
AddEnemiesToBattle( 0, ubStrategicInsertionCode, ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps, FALSE );
|
||||
AddEnemiesToBattle( 0, ubStrategicInsertionCode, ubNumAdmins, ubNumTroops, ubNumElites, ubNumRobots, ubNumTanks, ubNumJeeps, FALSE );
|
||||
gfPendingNonPlayerTeam[ENEMY_TEAM] = TRUE;
|
||||
}
|
||||
}
|
||||
@@ -1884,7 +1967,7 @@ void AddPossiblePendingEnemiesToBattle()
|
||||
|
||||
// Flugente fix: check for underflow...
|
||||
UINT8 currentgroupsize = pGroup->pEnemyGroup->ubElitesInBattle + pGroup->pEnemyGroup->ubTroopsInBattle + pGroup->pEnemyGroup->ubAdminsInBattle
|
||||
+ pGroup->pEnemyGroup->ubTanksInBattle + pGroup->pEnemyGroup->ubJeepsInBattle;
|
||||
+ pGroup->pEnemyGroup->ubRobotsInBattle + pGroup->pEnemyGroup->ubTanksInBattle + pGroup->pEnemyGroup->ubJeepsInBattle;
|
||||
if ( currentgroupsize > pGroup->ubGroupSize )
|
||||
ubNumAvailable = 0;
|
||||
else
|
||||
@@ -1949,32 +2032,37 @@ void AddPossiblePendingEnemiesToBattle()
|
||||
{ //Add an elite troop
|
||||
pGroup->pEnemyGroup->ubElitesInBattle++;
|
||||
ubSlots--;
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 0, 0, 1, 0, 0, FALSE );
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 0, 0, 1, 0, 0, 0, FALSE );
|
||||
}
|
||||
else if( pGroup->pEnemyGroup->ubTroopsInBattle < pGroup->pEnemyGroup->ubNumTroops )
|
||||
{ //Add a regular troop.
|
||||
pGroup->pEnemyGroup->ubTroopsInBattle++;
|
||||
ubSlots--;
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 0, 1, 0, 0, 0, FALSE );
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 0, 1, 0, 0, 0, 0, FALSE );
|
||||
}
|
||||
else if( pGroup->pEnemyGroup->ubAdminsInBattle < pGroup->pEnemyGroup->ubNumAdmins )
|
||||
{ //Add an admin troop
|
||||
pGroup->pEnemyGroup->ubAdminsInBattle++;
|
||||
ubSlots--;
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 1, 0, 0, 0, 0, FALSE );
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 1, 0, 0, 0, 0, 0, FALSE );
|
||||
}
|
||||
else if( pGroup->pEnemyGroup->ubRobotsInBattle < pGroup->pEnemyGroup->ubNumRobots)
|
||||
{ //Add a robot
|
||||
pGroup->pEnemyGroup->ubRobotsInBattle++;
|
||||
ubSlots--;
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 0, 0, 0, 1, 0, 0, FALSE );
|
||||
}
|
||||
else if( pGroup->pEnemyGroup->ubTanksInBattle < pGroup->pEnemyGroup->ubNumTanks )
|
||||
{ //Add a tank
|
||||
pGroup->pEnemyGroup->ubTanksInBattle++;
|
||||
ubSlots--;
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 0, 0, 0, 1, 0, FALSE );
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 0, 0, 0, 0, 1, 0, FALSE );
|
||||
}
|
||||
else if ( pGroup->pEnemyGroup->ubJeepsInBattle < pGroup->pEnemyGroup->ubNumJeeps )
|
||||
{
|
||||
//Add a jeep
|
||||
{ //Add a jeep
|
||||
pGroup->pEnemyGroup->ubJeepsInBattle++;
|
||||
ubSlots--;
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 0, 0, 0, 0, 1, FALSE );
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 0, 0, 0, 0, 0, 1, FALSE );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1983,7 +2071,7 @@ void AddPossiblePendingEnemiesToBattle()
|
||||
|
||||
pGroup->pEnemyGroup->ubTroopsInBattle++;
|
||||
ubSlots--;
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 0, 1, 0, 0, 0, FALSE );
|
||||
AddEnemiesToBattle( pGroup, ubInsertionCode, 0, 1, 0, 0, 0, 0, FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2053,7 +2141,7 @@ void NotifyPlayersOfNewEnemies()
|
||||
}
|
||||
}
|
||||
|
||||
void AddEnemiesToBattle( GROUP *pGroup, UINT8 ubStrategicInsertionCode, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps, BOOLEAN fMagicallyAppeared )
|
||||
void AddEnemiesToBattle( GROUP *pGroup, UINT8 ubStrategicInsertionCode, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumRobots, UINT8 ubNumTanks, UINT8 ubNumJeeps, BOOLEAN fMagicallyAppeared )
|
||||
{
|
||||
SOLDIERTYPE *pSoldier;
|
||||
MAPEDGEPOINTINFO MapEdgepointInfo;
|
||||
@@ -2078,13 +2166,15 @@ void AddEnemiesToBattle( GROUP *pGroup, UINT8 ubStrategicInsertionCode, UINT8 ub
|
||||
if( !gbWorldSectorZ )
|
||||
{
|
||||
SECTORINFO *pSector = &SectorInfo[ SECTOR( gWorldSectorX, gWorldSectorY ) ];
|
||||
pSector->ubNumAdmins += ubNumAdmins;
|
||||
pSector->ubNumAdmins += ubNumAdmins;
|
||||
pSector->ubAdminsInBattle += ubNumAdmins;
|
||||
pSector->ubNumTroops += ubNumTroops;
|
||||
pSector->ubNumTroops += ubNumTroops;
|
||||
pSector->ubTroopsInBattle += ubNumTroops;
|
||||
pSector->ubNumElites += ubNumElites;
|
||||
pSector->ubNumElites += ubNumElites;
|
||||
pSector->ubElitesInBattle += ubNumElites;
|
||||
pSector->ubNumTanks += ubNumTanks;
|
||||
pSector->ubNumRobots += ubNumRobots;
|
||||
pSector->ubRobotsInBattle += ubNumRobots;
|
||||
pSector->ubNumTanks += ubNumTanks;
|
||||
pSector->ubTanksInBattle += ubNumTanks;
|
||||
pSector->ubNumJeeps += ubNumJeeps;
|
||||
pSector->ubJeepsInBattle += ubNumJeeps;
|
||||
@@ -2094,13 +2184,15 @@ void AddEnemiesToBattle( GROUP *pGroup, UINT8 ubStrategicInsertionCode, UINT8 ub
|
||||
UNDERGROUND_SECTORINFO *pSector = FindUnderGroundSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ );
|
||||
if( pSector )
|
||||
{
|
||||
pSector->ubNumAdmins += ubNumAdmins;
|
||||
pSector->ubNumAdmins += ubNumAdmins;
|
||||
pSector->ubAdminsInBattle += ubNumAdmins;
|
||||
pSector->ubNumTroops += ubNumTroops;
|
||||
pSector->ubNumTroops += ubNumTroops;
|
||||
pSector->ubTroopsInBattle += ubNumTroops;
|
||||
pSector->ubNumElites += ubNumElites;
|
||||
pSector->ubNumElites += ubNumElites;
|
||||
pSector->ubElitesInBattle += ubNumElites;
|
||||
pSector->ubNumTanks += ubNumTanks;
|
||||
pSector->ubNumRobots += ubNumRobots;
|
||||
pSector->ubRobotsInBattle += ubNumRobots;
|
||||
pSector->ubNumTanks += ubNumTanks;
|
||||
pSector->ubTanksInBattle += ubNumTanks;
|
||||
pSector->ubNumJeeps += ubNumJeeps;
|
||||
pSector->ubJeepsInBattle += ubNumJeeps;
|
||||
@@ -2110,7 +2202,7 @@ void AddEnemiesToBattle( GROUP *pGroup, UINT8 ubStrategicInsertionCode, UINT8 ub
|
||||
NotifyPlayersOfNewEnemies();
|
||||
}
|
||||
|
||||
ubTotalSoldiers = ubNumAdmins + ubNumTroops + ubNumElites + ubNumTanks + ubNumJeeps;
|
||||
ubTotalSoldiers = ubNumAdmins + ubNumTroops + ubNumElites + ubNumRobots + ubNumTanks + ubNumJeeps;
|
||||
|
||||
#ifdef JA2UB
|
||||
if( gsGridNoForMapEdgePointInfo != -1 )
|
||||
@@ -2232,7 +2324,30 @@ void AddEnemiesToBattle( GROUP *pGroup, UINT8 ubStrategicInsertionCode, UINT8 ub
|
||||
}
|
||||
UpdateMercInSector( pSoldier, gWorldSectorX, gWorldSectorY, 0 );
|
||||
}
|
||||
else if( ubNumTanks && (UINT8)Random( ubTotalSoldiers ) < (UINT8)(ubNumElites + ubNumTroops + ubNumAdmins + ubNumTanks) && ubNumberOfVehicles < 9 )
|
||||
else if( ubNumRobots && (UINT8)Random( ubTotalSoldiers ) < (UINT8)(ubNumElites + ubNumTroops + ubNumAdmins + ubNumRobots) )
|
||||
{
|
||||
ubNumRobots--;
|
||||
ubTotalSoldiers--;
|
||||
Assert(pSoldier = TacticalCreateEnemyRobot());
|
||||
if( pGroup )
|
||||
{
|
||||
pSoldier->ubGroupID = pGroup->ubGroupID;
|
||||
}
|
||||
|
||||
pSoldier->ubInsertionDirection = bDesiredDirection;
|
||||
//Setup the position
|
||||
if( ubCurrSlot < MapEdgepointInfo.ubNumPoints )
|
||||
{ //using an edgepoint
|
||||
pSoldier->ubStrategicInsertionCode = INSERTION_CODE_GRIDNO;
|
||||
pSoldier->usStrategicInsertionData = MapEdgepointInfo.sGridNo[ ubCurrSlot++ ];
|
||||
}
|
||||
else
|
||||
{ //no edgepoints left, so put him at the entrypoint.
|
||||
pSoldier->ubStrategicInsertionCode = ubStrategicInsertionCode;
|
||||
}
|
||||
UpdateMercInSector( pSoldier, gWorldSectorX, gWorldSectorY, 0 );
|
||||
}
|
||||
else if( ubNumTanks && (UINT8)Random( ubTotalSoldiers ) < (UINT8)(ubNumElites + ubNumTroops + ubNumAdmins + ubNumRobots + ubNumTanks) && ubNumberOfVehicles < 9 )
|
||||
{
|
||||
ubNumTanks--;
|
||||
ubTotalSoldiers--;
|
||||
@@ -2255,7 +2370,7 @@ void AddEnemiesToBattle( GROUP *pGroup, UINT8 ubStrategicInsertionCode, UINT8 ub
|
||||
}
|
||||
UpdateMercInSector( pSoldier, gWorldSectorX, gWorldSectorY, 0 );
|
||||
}
|
||||
else if ( ubNumJeeps && (UINT8)Random( ubTotalSoldiers ) < (UINT8)(ubNumElites + ubNumTroops + ubNumAdmins + ubNumTanks + ubNumJeeps) && ubNumberOfVehicles < 9 )
|
||||
else if ( ubNumJeeps && (UINT8)Random( ubTotalSoldiers ) < (UINT8)(ubNumElites + ubNumTroops + ubNumAdmins + ubNumRobots + ubNumTanks + ubNumJeeps) && ubNumberOfVehicles < 9 )
|
||||
{
|
||||
ubNumJeeps--;
|
||||
ubTotalSoldiers--;
|
||||
@@ -2972,8 +3087,8 @@ BOOLEAN CheckPendingNonPlayerTeam( UINT8 usTeam )
|
||||
|
||||
if ( usTeam == ENEMY_TEAM )
|
||||
{
|
||||
if ( (pSector->ubNumElites + pSector->ubNumTroops + pSector->ubNumAdmins + pSector->ubNumTanks + pSector->ubNumJeeps) >
|
||||
(pSector->ubElitesInBattle + pSector->ubTroopsInBattle + pSector->ubAdminsInBattle + pSector->ubTanksInBattle + pSector->ubJeepsInBattle) )
|
||||
if ( (pSector->ubNumElites + pSector->ubNumTroops + pSector->ubNumAdmins + pSector->ubNumTanks + pSector->ubNumJeeps + pSector->ubNumRobots) >
|
||||
(pSector->ubElitesInBattle + pSector->ubTroopsInBattle + pSector->ubAdminsInBattle + pSector->ubTanksInBattle + pSector->ubJeepsInBattle + pSector->ubRobotsInBattle) )
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -2987,7 +3102,7 @@ BOOLEAN CheckPendingNonPlayerTeam( UINT8 usTeam )
|
||||
if ( usTeam == ENEMY_TEAM )
|
||||
{
|
||||
if ( pGroup->ubGroupSize > pGroup->pEnemyGroup->ubElitesInBattle + pGroup->pEnemyGroup->ubTroopsInBattle + pGroup->pEnemyGroup->ubAdminsInBattle
|
||||
+ pGroup->pEnemyGroup->ubTanksInBattle + pGroup->pEnemyGroup->ubJeepsInBattle )
|
||||
+ pGroup->pEnemyGroup->ubTanksInBattle + pGroup->pEnemyGroup->ubJeepsInBattle + pGroup->pEnemyGroup->ubRobotsInBattle )
|
||||
return TRUE;
|
||||
}
|
||||
else if ( usTeam == MILITIA_TEAM )
|
||||
|
||||
@@ -28,10 +28,10 @@ UINT16 NumPlayerTeamMembersInSector( INT16 sSectorX, INT16 sSectorY, INT8 sSecto
|
||||
UINT16 NumEnemyArmedVehiclesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 usTeam );
|
||||
UINT8 NumStationaryEnemiesInSector( INT16 sSectorX, INT16 sSectorY );
|
||||
UINT8 NumMobileEnemiesInSector( INT16 sSectorX, INT16 sSectorY );
|
||||
void GetNumberOfMobileEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps );
|
||||
void GetNumberOfMobileEnemiesInSectorWithoutRoadBlock( INT16 sSectorX, INT16 sSectorY, UINT8 usTeam, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps );
|
||||
void GetNumberOfStationaryEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps );
|
||||
void GetNumberOfEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps );
|
||||
void GetNumberOfMobileEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumRobots, UINT8 *pubNumTanks, UINT8 *pubNumJeeps );
|
||||
void GetNumberOfMobileEnemiesInSectorWithoutRoadBlock( INT16 sSectorX, INT16 sSectorY, UINT8 usTeam, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumRobots, UINT8 *pubNumTanks, UINT8 *pubNumJeeps );
|
||||
void GetNumberOfStationaryEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumRobots, UINT8 *pubNumTanks, UINT8 *pubNumJeeps );
|
||||
void GetNumberOfEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumRobots, UINT8 *pubNumTanks, UINT8 *pubNumJeeps );
|
||||
|
||||
//Called when entering a sector so the campaign AI can automatically insert the
|
||||
//correct number of troops of each type based on the current number in the sector
|
||||
@@ -39,7 +39,7 @@ void GetNumberOfEnemiesInSector( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAd
|
||||
BOOLEAN PrepareEnemyForSectorBattle();
|
||||
BOOLEAN PrepareEnemyForUndergroundBattle();
|
||||
|
||||
void AddEnemiesToBattle( GROUP *pGroup, UINT8 ubStrategicInsertionCode, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 abNumJeeps, BOOLEAN fMagicallyAppeared );
|
||||
void AddEnemiesToBattle( GROUP *pGroup, UINT8 ubStrategicInsertionCode, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumRobots, UINT8 ubNumTanks, UINT8 abNumJeeps, BOOLEAN fMagicallyAppeared );
|
||||
void AddMilitiaToBattle( GROUP *pGroup, UINT8 ubStrategicInsertionCode, UINT8 ubNumGreens, UINT8 ubNumRegulars, UINT8 ubNumElites, BOOLEAN fMagicallyAppeared );
|
||||
void AddPossiblePendingEnemiesToBattle();
|
||||
void EndTacticalBattleForEnemy();
|
||||
|
||||
+31
-17
@@ -33,19 +33,20 @@
|
||||
UINT8 gubReinforcementMinEnemyStaticGroupSize = 12;
|
||||
UINT32 guiMilitiaReinforceTurn = 0, guiMilitiaArrived = 0;//dnl ch68 090913
|
||||
|
||||
void GetNumberOfEnemiesInFiveSectors( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps )
|
||||
void GetNumberOfEnemiesInFiveSectors( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumRobots, UINT8 *pubNumTanks, UINT8 *pubNumJeeps )
|
||||
{
|
||||
UINT8 ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps;
|
||||
UINT8 ubNumAdmins, ubNumTroops, ubNumElites, ubNumRobots, ubNumTanks, ubNumJeeps;
|
||||
UINT16 pusMoveDir[4][3]; //first column in this matrix is number of sector, except for 4th row
|
||||
UINT8 ubDirNumber, ubIndex;
|
||||
|
||||
GetNumberOfStationaryEnemiesInSector( sSectorX, sSectorY, pubNumAdmins, pubNumTroops, pubNumElites, pubNumTanks, pubNumJeeps );
|
||||
GetNumberOfStationaryEnemiesInSector( sSectorX, sSectorY, pubNumAdmins, pubNumTroops, pubNumElites, pubNumRobots, pubNumTanks, pubNumJeeps );
|
||||
|
||||
GetNumberOfMobileEnemiesInSectorWithoutRoadBlock( sSectorX, sSectorY, ENEMY_TEAM, &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumTanks, &ubNumJeeps );
|
||||
GetNumberOfMobileEnemiesInSectorWithoutRoadBlock( sSectorX, sSectorY, ENEMY_TEAM, &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumRobots, &ubNumTanks, &ubNumJeeps );
|
||||
|
||||
*pubNumAdmins += ubNumAdmins;
|
||||
*pubNumTroops += ubNumTroops;
|
||||
*pubNumElites += ubNumElites;
|
||||
*pubNumRobots += ubNumRobots;
|
||||
*pubNumTanks += ubNumTanks;
|
||||
*pubNumJeeps += ubNumJeeps;
|
||||
|
||||
@@ -59,11 +60,16 @@ void GetNumberOfEnemiesInFiveSectors( INT16 sSectorX, INT16 sSectorY, UINT8 *pub
|
||||
|
||||
for( ubIndex = 0; ubIndex < ubDirNumber; ++ubIndex )
|
||||
{ //take number of the involved sector, find its X and Y coordintes and then ask for number of troops there
|
||||
GetNumberOfStationaryEnemiesInSector( SECTORX( pusMoveDir[ubIndex][0] ), SECTORY( pusMoveDir[ubIndex][0] ), &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumTanks, &ubNumJeeps );
|
||||
GetNumberOfStationaryEnemiesInSector( SECTORX( pusMoveDir[ubIndex][0] ), SECTORY( pusMoveDir[ubIndex][0] ), &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumRobots, &ubNumTanks, &ubNumJeeps );
|
||||
|
||||
while ( ubNumElites + ubNumTroops + ubNumAdmins + ubNumTanks + ubNumJeeps > gubReinforcementMinEnemyStaticGroupSize ) //count how many of static group will reinforce the battle, but leave minimal group size to guard
|
||||
while ( ubNumRobots + ubNumElites + ubNumTroops + ubNumAdmins + ubNumTanks + ubNumJeeps > gubReinforcementMinEnemyStaticGroupSize ) //count how many of static group will reinforce the battle, but leave minimal group size to guard
|
||||
{
|
||||
if( ubNumElites )
|
||||
if ( ubNumRobots )
|
||||
{
|
||||
*pubNumRobots += 1;
|
||||
ubNumRobots--;
|
||||
}
|
||||
else if( ubNumElites )
|
||||
{
|
||||
*pubNumElites += 1;
|
||||
ubNumElites--;
|
||||
@@ -90,11 +96,12 @@ void GetNumberOfEnemiesInFiveSectors( INT16 sSectorX, INT16 sSectorY, UINT8 *pub
|
||||
}
|
||||
}
|
||||
|
||||
GetNumberOfMobileEnemiesInSectorWithoutRoadBlock( SECTORX( pusMoveDir[ubIndex][0] ), SECTORY( pusMoveDir[ubIndex][0] ), ENEMY_TEAM, &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumTanks, &ubNumJeeps );
|
||||
GetNumberOfMobileEnemiesInSectorWithoutRoadBlock( SECTORX( pusMoveDir[ubIndex][0] ), SECTORY( pusMoveDir[ubIndex][0] ), ENEMY_TEAM, &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumRobots, &ubNumTanks, &ubNumJeeps );
|
||||
|
||||
*pubNumAdmins += ubNumAdmins;
|
||||
*pubNumTroops += ubNumTroops;
|
||||
*pubNumElites += ubNumElites;
|
||||
*pubNumRobots += ubNumRobots;
|
||||
*pubNumTanks += ubNumTanks;
|
||||
*pubNumJeeps += ubNumJeeps;
|
||||
}
|
||||
@@ -102,11 +109,11 @@ void GetNumberOfEnemiesInFiveSectors( INT16 sSectorX, INT16 sSectorY, UINT8 *pub
|
||||
|
||||
UINT8 NumEnemiesInFiveSectors( INT16 sMapX, INT16 sMapY )
|
||||
{
|
||||
UINT8 ubNumAdmins, ubNumTroops, ubNumElites, ubNumTanks, ubNumJeeps;
|
||||
UINT8 ubNumAdmins, ubNumTroops, ubNumElites, ubNumRobots, ubNumTanks, ubNumJeeps;
|
||||
|
||||
GetNumberOfEnemiesInFiveSectors( sMapX, sMapY, &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumTanks, &ubNumJeeps );
|
||||
GetNumberOfEnemiesInFiveSectors( sMapX, sMapY, &ubNumAdmins, &ubNumTroops, &ubNumElites, &ubNumRobots, &ubNumTanks, &ubNumJeeps );
|
||||
|
||||
return ubNumAdmins + ubNumTroops + ubNumElites + ubNumTanks + ubNumJeeps;
|
||||
return ubNumAdmins + ubNumTroops + ubNumElites + ubNumRobots + ubNumTanks + ubNumJeeps;
|
||||
}
|
||||
|
||||
BOOLEAN IsGroupInARightSectorToReinforce( GROUP *pGroup, INT16 sSectorX, INT16 sSectorY )
|
||||
@@ -256,40 +263,47 @@ UINT8 DoReinforcementAsPendingNonPlayer( INT16 sMapX, INT16 sMapY, UINT8 usTeam
|
||||
{
|
||||
pSector = &SectorInfo[ pusMoveDir[ ubIndex ][ 0 ] ];
|
||||
|
||||
if( pSector->ubNumElites )
|
||||
if( pSector->ubNumRobots )
|
||||
{
|
||||
(pThisSector->ubNumRobots)++;
|
||||
(pSector->ubNumRobots)--;
|
||||
(pThisSector->ubRobotsInBattle)++;
|
||||
AddEnemiesToBattle( NULL, (UINT8)pusMoveDir[ ubIndex ][ 2 ], 0, 0, 0, 1, 0, 0, FALSE );
|
||||
}
|
||||
else if( pSector->ubNumElites )
|
||||
{
|
||||
(pThisSector->ubNumElites)++;
|
||||
(pSector->ubNumElites)--;
|
||||
(pThisSector->ubElitesInBattle)++;
|
||||
AddEnemiesToBattle( NULL, (UINT8)pusMoveDir[ ubIndex ][ 2 ], 0, 0, 1, 0, 0, FALSE );
|
||||
AddEnemiesToBattle( NULL, (UINT8)pusMoveDir[ ubIndex ][ 2 ], 0, 0, 1, 0, 0, 0, FALSE );
|
||||
}
|
||||
else if( pSector->ubNumTroops )
|
||||
{
|
||||
(pThisSector->ubNumTroops)++;
|
||||
(pSector->ubNumTroops)--;
|
||||
(pThisSector->ubTroopsInBattle)++;
|
||||
AddEnemiesToBattle( NULL, (UINT8)pusMoveDir[ ubIndex ][ 2 ], 0, 1, 0, 0, 0, FALSE );
|
||||
AddEnemiesToBattle( NULL, (UINT8)pusMoveDir[ ubIndex ][ 2 ], 0, 1, 0, 0, 0, 0, FALSE );
|
||||
}
|
||||
else if( pSector->ubNumAdmins )
|
||||
{
|
||||
(pThisSector->ubNumAdmins)++;
|
||||
(pSector->ubNumAdmins)--;
|
||||
(pThisSector->ubAdminsInBattle)++;
|
||||
AddEnemiesToBattle( NULL, (UINT8)pusMoveDir[ ubIndex ][ 2 ], 1, 0, 0, 0, 0, FALSE );
|
||||
AddEnemiesToBattle( NULL, (UINT8)pusMoveDir[ ubIndex ][ 2 ], 1, 0, 0, 0, 0, 0, FALSE );
|
||||
}
|
||||
else if( pSector->ubNumTanks )
|
||||
{
|
||||
(pThisSector->ubNumTanks)++;
|
||||
(pSector->ubNumTanks)--;
|
||||
(pThisSector->ubTanksInBattle)++;
|
||||
AddEnemiesToBattle( NULL, (UINT8)pusMoveDir[ ubIndex ][ 2 ], 0, 0, 0, 1, 0, FALSE );
|
||||
AddEnemiesToBattle( NULL, (UINT8)pusMoveDir[ ubIndex ][ 2 ], 0, 0, 0, 0, 1, 0, FALSE );
|
||||
}
|
||||
else if ( pSector->ubNumJeeps )
|
||||
{
|
||||
(pThisSector->ubNumJeeps)++;
|
||||
(pSector->ubNumJeeps)--;
|
||||
(pThisSector->ubJeepsInBattle)++;
|
||||
AddEnemiesToBattle( NULL, (UINT8)pusMoveDir[ubIndex][2], 0, 0, 0, 0, 1, FALSE );
|
||||
AddEnemiesToBattle( NULL, (UINT8)pusMoveDir[ ubIndex ][ 2 ], 0, 0, 0, 0, 0, 1, FALSE );
|
||||
}
|
||||
|
||||
return (UINT8)pusMoveDir[ ubIndex ][ 2 ];
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define __REINFORCEMENT_H__
|
||||
|
||||
//For Autoresolve (mostly)
|
||||
void GetNumberOfEnemiesInFiveSectors( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumTanks, UINT8 *pubNumJeeps );
|
||||
void GetNumberOfEnemiesInFiveSectors( INT16 sSectorX, INT16 sSectorY, UINT8 *pubNumAdmins, UINT8 *pubNumTroops, UINT8 *pubNumElites, UINT8 *pubNumRobots, UINT8 *pubNumTanks, UINT8 *pubNumJeeps );
|
||||
BOOLEAN IsGroupInARightSectorToReinforce( GROUP *pGroup, INT16 sSectorX, INT16 sSectorY );
|
||||
UINT8 GetAdjacentSectors( UINT8 pSectors[4], INT16 sSectorX, INT16 sSectorY );
|
||||
UINT8 CountAllMilitiaInFiveSectors(INT16 sMapX, INT16 sMapY);
|
||||
|
||||
+239
-446
File diff suppressed because it is too large
Load Diff
@@ -75,7 +75,13 @@ void TagSAIGroupWithGracePeriod( GROUP *pGroup );
|
||||
|
||||
BOOLEAN PermittedToFillPatrolGroup( INT32 iPatrolID );
|
||||
|
||||
enum GROUP_TYPE
|
||||
{
|
||||
GROUP_TYPE_ATTACK,
|
||||
GROUP_TYPE_PATROL
|
||||
};
|
||||
|
||||
void InitializeGroup(const GROUP_TYPE groupType, const UINT8 groupSize, UINT8 &troopCount, UINT8 &eliteCount, UINT8 &robotCount, UINT8 &jeepCount, UINT8 &tankCount, const BOOLEAN asdUpgrade);
|
||||
|
||||
extern BOOLEAN gfDisplayStrategicAILogs;
|
||||
extern BOOLEAN gfFirstBattleMeanwhileScenePending;
|
||||
|
||||
@@ -706,7 +706,7 @@ BOOLEAN AddWaypointStrategicIDToPGroup( GROUP *pGroup, UINT32 uiSectorID )
|
||||
|
||||
//Enemy grouping functions -- private use by the strategic AI.
|
||||
//............................................................
|
||||
GROUP* CreateNewEnemyGroupDepartingFromSector( UINT32 uiSector, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanks, UINT8 ubNumJeeps )
|
||||
GROUP* CreateNewEnemyGroupDepartingFromSector( UINT32 uiSector, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumRobots, UINT8 ubNumTanks, UINT8 ubNumJeeps )
|
||||
{
|
||||
GROUP *pNew;
|
||||
AssertMsg( uiSector >= 0 && uiSector <= 255, String( "CreateNewEnemyGroup with out of range value of %d", uiSector ) );
|
||||
@@ -717,7 +717,7 @@ GROUP* CreateNewEnemyGroupDepartingFromSector( UINT32 uiSector, UINT8 ubNumAdmin
|
||||
AssertMsg( pNew->pEnemyGroup, "MemAlloc failure during enemy group creation." );
|
||||
memset( pNew->pEnemyGroup, 0, sizeof( ENEMYGROUP ) );
|
||||
// Make sure group is not bigger than allowed!
|
||||
while ( ubNumAdmins + ubNumTroops + ubNumElites + ubNumTanks + ubNumJeeps > gGameExternalOptions.iMaxEnemyGroupSize )
|
||||
while ( ubNumAdmins + ubNumTroops + ubNumElites + ubNumRobots + ubNumTanks + ubNumJeeps > gGameExternalOptions.iMaxEnemyGroupSize )
|
||||
{
|
||||
if (ubNumTroops)
|
||||
{
|
||||
@@ -731,6 +731,10 @@ GROUP* CreateNewEnemyGroupDepartingFromSector( UINT32 uiSector, UINT8 ubNumAdmin
|
||||
{
|
||||
ubNumElites--;
|
||||
}
|
||||
else if (ubNumRobots)
|
||||
{
|
||||
ubNumRobots--;
|
||||
}
|
||||
else if (ubNumTanks)
|
||||
{
|
||||
ubNumTanks--;
|
||||
@@ -752,9 +756,10 @@ GROUP* CreateNewEnemyGroupDepartingFromSector( UINT32 uiSector, UINT8 ubNumAdmin
|
||||
pNew->pEnemyGroup->ubNumAdmins = ubNumAdmins;
|
||||
pNew->pEnemyGroup->ubNumTroops = ubNumTroops;
|
||||
pNew->pEnemyGroup->ubNumElites = ubNumElites;
|
||||
pNew->pEnemyGroup->ubNumRobots = ubNumRobots;
|
||||
pNew->pEnemyGroup->ubNumTanks = ubNumTanks;
|
||||
pNew->pEnemyGroup->ubNumJeeps = ubNumJeeps;
|
||||
pNew->ubGroupSize = (UINT8)(ubNumAdmins + ubNumTroops + ubNumElites + ubNumTanks + ubNumJeeps);
|
||||
pNew->ubGroupSize = (UINT8)(ubNumAdmins + ubNumTroops + ubNumElites + ubNumRobots + ubNumTanks + ubNumJeeps);
|
||||
pNew->ubTransportationMask = FOOT;
|
||||
pNew->fVehicle = FALSE;
|
||||
pNew->ubCreatedSectorID = pNew->ubOriginalSector;
|
||||
|
||||
@@ -64,12 +64,14 @@ typedef struct ENEMYGROUP
|
||||
UINT8 ubNumTroops; //number of regular troops in the group
|
||||
UINT8 ubNumElites; //number of elite troops in the group
|
||||
UINT8 ubNumAdmins; //number of administrators in the group
|
||||
UINT8 ubNumRobots; //number of enemy robots in the group
|
||||
UINT8 ubLeaderProfileID; //could be Mike, maybe the warden... someone new, but likely nobody.
|
||||
UINT8 ubPendingReinforcements;//This group is waiting for reinforcements before attacking or attempting to fortify newly aquired sector.
|
||||
UINT8 ubAdminsInBattle; //number of administrators in currently in battle.
|
||||
UINT8 ubIntention; //the type of group this is: patrol, assault, spies, etc.
|
||||
UINT8 ubTroopsInBattle; //number of soldiers currently in battle.
|
||||
UINT8 ubElitesInBattle; //number of elite soldiers currently in battle.
|
||||
UINT8 ubRobotsInBattle; //number of enemy robots currently in battle.
|
||||
// WDS - New AI
|
||||
UINT8 ubNumTanks;
|
||||
UINT8 ubTanksInBattle;
|
||||
@@ -196,7 +198,7 @@ BOOLEAN SetGroupPatrolParameters( UINT8 ubGroupID, UINT8 ubRestAtFL, UINT8 ubRes
|
||||
|
||||
//Enemy grouping functions -- private use by the strategic AI.
|
||||
//............................................................
|
||||
GROUP* CreateNewEnemyGroupDepartingFromSector( UINT32 uiSector, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumTanksm, UINT8 ubNumJeeps );
|
||||
GROUP* CreateNewEnemyGroupDepartingFromSector( UINT32 uiSector, UINT8 ubNumAdmins, UINT8 ubNumTroops, UINT8 ubNumElites, UINT8 ubNumRobots, UINT8 ubNumTanks, UINT8 ubNumJeeps );
|
||||
|
||||
GROUP* CreateNewMilitiaGroupDepartingFromSector( UINT32 uiSector, UINT8& arusNumAdmins, UINT8& arusNumTroops, UINT8& arusNumElites );
|
||||
|
||||
|
||||
@@ -428,6 +428,7 @@ INT8 SoldierClassToRankIndex( UINT8 ubSoldierClass )
|
||||
case SOLDIER_CLASS_BANDIT: bRankIndex = 0; break;
|
||||
case SOLDIER_CLASS_ELITE: bRankIndex = 2; break;
|
||||
case SOLDIER_CLASS_ARMY: bRankIndex = 1; break;
|
||||
case SOLDIER_CLASS_ROBOT: bRankIndex = 2; break;
|
||||
|
||||
default:
|
||||
// this happens when an NPC joins the enemy team (e.g. Conrad, Iggy, Mike)
|
||||
|
||||
@@ -90,6 +90,7 @@ BOOLEAN LuaUnderground::InitializeSectorList()
|
||||
sectorData.getValue("numElites", s->ubNumElites);
|
||||
sectorData.getValue("numTanks", s->ubNumTanks);
|
||||
sectorData.getValue("numJeeps", s->ubNumJeeps );
|
||||
sectorData.getValue("numRobots", s->ubNumRobots);
|
||||
|
||||
sectorData.getValue("numBloodcats", s->ubNumBloodcats);
|
||||
sectorData.getValue("numCreatures", s->ubNumCreatures);
|
||||
@@ -108,6 +109,7 @@ BOOLEAN LuaUnderground::InitializeSectorList()
|
||||
m_log << "\t\tElites: " << static_cast<int>(s->ubNumElites) << LF;
|
||||
m_log << "\t\tTanks: " << static_cast<int>(s->ubNumTanks) << LF;
|
||||
m_log << "\t\tJeeps: " << static_cast<int>(s->ubNumJeeps) << LF;
|
||||
m_log << "\t\tRobots: " << static_cast<int>(s->ubNumRobots) << LF;
|
||||
m_log << "\t- Creature population" << LF;
|
||||
m_log << "\t\tBloodcats: " << static_cast<int>(s->ubNumBloodcats) << LF;
|
||||
m_log << "\t\tCrepitus: " << static_cast<int>(s->ubNumCreatures) << LF;
|
||||
|
||||
Reference in New Issue
Block a user