Files
source/Strategic/Ja25 Strategic Ai.h

336 lines
9.2 KiB
C

#ifndef JA25__STRATEGIC_AI
#define JA25__STRATEGIC_AI
#ifdef JA2UB
typedef struct
{
UINT32 uiJerryMiloQuotesFlags; //used to keep track of the quotes Jerry says.
BOOLEAN fImportCharactersFromOldJa2Save; // True if we have loaded in merc profiles from JA2
BOOLEAN fInCustomMap;
BOOLEAN fJohnKulbaIsInGame; // If true Kulba is in the game, otherwise tex is
BOOLEAN fMorrisToSayHurtPlayerQuoteNextTurn;
UINT8 ubPlayerMorrisHurt;
BOOLEAN fBiggensUsedDetonator;
BOOLEAN fSendEmail_10_NextSector; // True if we are to send email #10 next time the player loads up a sector
UINT8 ubEmailFromSectorFlag;
BOOLEAN fNpcHasBeenAdded; // True if manuel has been added to sector H10 or i9
BOOLEAN fShowMercDestinationDialogWhenHiringMerc; //
BOOLEAN fHaveAimandMercOffferItems; // TRUE when MERC and AIM are giving away 'gifts' to the mercs that get hired
BOOLEAN fBiffWasKilledWhenImportingSave; //TRUE is biff was killed when we imported the save
UINT8 ubImportantSpeckQuotesSaidBefore;
BOOLEAN fShouldMsgBoxComeUpSayingSomeoneImportantIsInSector;
UINT8 ubStateOfFanInPowerGenSector;
UINT8 ubHowPlayerGotThroughFan;
UINT32 uiJa25TacticalFlags;
INT32 iPowerGenFanPositionSndID;
UINT32 uiTacticalTurnCounter;
UINT32 uiTurnPowerGenFanWentDown;
UINT32 uiJa25GeneralFlags;
UINT8 ubStatusOfFortifiedDoor;
UINT32 uiDisplayCoverCounter;
UINT32 uiDisplayLosCounter;
UINT32 uiDisplayGunRangeCounter;
UINT8 ubLoadScreenStairTraversal;
UINT8 ubMorrisNoteState;
UINT8 ubJohnKulbaInitialSectorX;
UINT8 ubJohnKulbaInitialSectorY;
UINT8 ubDisplayPlayerLostMsgBox;
BOOLEAN fJerryBreakingLaptopOccuring;
BOOLEAN fEnemyShouldImmediatelySeekThePlayer;
INT8 bSectorTheEnemyWillSeekEnemy;
UINT8 usFiller1;
UINT8 ubDisplayCommanderMorrisNote;
INT16 bNewMercProfileIDForSayingMorrisNote;
UINT32 uiTurnLastSaidSeeEnemyQuote;
UINT8 ubFiller[928]; //Struct is originally 1000 bytes in size
} JA25_SAVE_INFO;
extern JA25_SAVE_INFO gJa25SaveStruct;
//following flags use uiEmailFromSectorFlag
#define SECTOR_EMAIL__ANOTHER_SECTOR 0x01
#define SECTOR_EMAIL__J11_J12 0x02
#define SECTOR_EMAIL__POWER_GEN 0x04
#define SECTOR_EMAIL__TUNNEL 0x08
#define SECTOR_EMAIL__POWER_GEN_LVL_1 0x10
//following flags use fNpcHasBeenAdded
#define SECTOR_ADDED_NPC__MANUEL 0x01
#define SECTOR_ADDED_NPC__TEX 0x02
#define SECTOR_ADDED_NPC__JOHN_K 0x04
//Following flags use ubImportantSpeckQuotesSaidBefore
#define SPECK__ENCOURAGE_POAYER_TO_KEEP_SHOPPING 1<<0
#define SPECK__SECOND_INTRO_BEEN_SAID 1<<1
#define SPECK__BETTER_EQUIPMENT 1<<2
//following flags are used with ubStateOfFanInPowerGenSector
enum
{
PGF__RUNNING_NORMALLY,
PGF__STOPPED,
PGF__BLOWN_UP,
};
//following flags are used with uiJa25TacticalFlags
//following flags are used with ubHowPlayerGotThroughFan
enum
{
PG__PLAYER_NOT_GONE_THROUGH_YET,
PG__PLAYER_BLEW_UP_FAN_TO_GET_THROUGH,
PG__PLAYER_STOPPED_FAN_TO_GET_THROUGH,
};
//The following flags are used with uiJa25GeneralFlags.
#define JA_GF__POWER_GEN_FAN_HAS_BEEN_STOPPED 0x00000001
#define JA_GF__BIGGENS_SAID_QUOTE_117 0x00000002
#define JA_GF__DID_PLAYER_MAKE_SOUND_GOING_THROUGH_TUNNEL_GATE 0x00000004
#define JA_GF__PLAYER_HAS_SEEN_FORTIFIED_DOOR 0x00000008
#define JA_GF__ALL_DEAD_TOP_LEVEL_OF_COMPLEX 0x00000010
#define JA_GF__ALREADY_MOVED_ENEMIES_IN_COMPLEX 0x00000020
#define JA_GF__PICKED_UP_MONEY_IN_GUARD_POST 0x00000040
#define JA_GF__PICKED_UP_MONEY_IN_FIRST_TOWN 0x00000080
#define JA_GF__PLAYER_SAID_LAPTOP_FIXED_QUOTE 0x00000100
#define JA_GF__RAUL_BLOW_HIMSELF_UP 0x00000200
#define JA_GF__QUOTE_105_HAS_BEEN_SAID 0x00000400
#define JA_GF__BARRETT_IS_HALF_PRICE 0x00000800
#define JA_GF__MOVE_ENEMIES_TO_EDGE_IN_TUNNEL_1 0x00001000
#define JA_GF__MOVE_ENEMIES_TO_EDGE_IN_TUNNEL_2 0x00002000
#define JA_GF__PLAYER_SEEN_FAN_BEFORE 0x00004000
#define JA_GF__PLAYER_SAID_GATE_LOCKED_QUOTE 0x00008000
//The following is used with ubStatusOfFortifiedDoor
enum
{
FD__CLOSED,
FD__OPEN,
};
//the following is used with ubLoadScreenStairTraversal
enum
{
LS__NOT_GOING_UP_STAIRS,
LS__GOING_UP_STAIRS,
LS__GOING_DOWN_STAIRS,
};
//the following is used with ubMorrisNoteState
enum
{
MN__NOT_PICKED_UP_YET,
MN__PICKED_UP_BY_OLD_MERC_NEVER_SAID_QUOTE,
MN__PICKED_UP_BY_OLD_MERC_SAID_QUOTE_ALREADY,
MN__PICKED_UP_BY_NEW_MERC,
MN__FINISHED = MN__PICKED_UP_BY_NEW_MERC,
};
//used with ubDisplayCommanderMorrisNote
enum
{
DMN__NOT_TO_DISPLAY_IT,
DMN__DISPLAY_PART_1,
DMN__DISPLAY_PART_2,
DMN__FINISHED,
};
BOOLEAN AreAnyPlayerMercsStillInSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ );
BOOLEAN ShouldEnemiesBeAddedToInitialSector();
void InitJa25StrategicAi();
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, UINT8 ubNumRobots );
BOOLEAN SaveJa25SaveInfoToSaveGame( HWFILE hFile );
BOOLEAN LoadJa25SaveInfoFromSavedGame( HWFILE hFile );
void HandleAddingEnemiesToTunnelMaps();
void SetJa25GeneralFlag( UINT32 uiFlagToSet );
void ClearJa25GeneralFlag( UINT32 uiFlagToClear );
BOOLEAN IsJa25GeneralFlagSet( UINT32 uiFlagToCheck );
typedef struct
{
UINT32 uiTimeOfLastBattleInMinutes;
UINT32 uiTimeOfLastUpdate;
INT16 iLastBattleSectorID;
INT8 bLastBattleSectorZ;
INT8 bFiller1;
UINT32 uiAttackedSameSectorCounter;
INT8 bFiller[16];
} JA25_SECTOR_AI_MANAGER;
typedef struct
{
INT16 iSectorID;
INT8 bSectorZ;
INT8 bBaseNumEnemies; // The base number of enemies that can present in the sector
INT8 bRandomNumEnemies; // The random amount of enemies that can be present
INT8 bProbabilityOfAttacking; // The probability Increase of attacking every hour of time compressing
INT8 bMaxProbabilityForAttackingSector; // The max amount of probabilty the enemy will attack enemy
INT8 bCurrentProbability; // Gets updated every hour when there can be an attack, reset when attack occurs
BOOLEAN fPlayerControlled; // Set when the player controls the sector
UINT8 ubMinimumProbabiltyBeforeAttack;
BOOLEAN fPlayerHasLiberatedSectorBefore; //Set when the player has a victory in the sector, never gets cleared after that
BOOLEAN fAutoDirection; //Calculate direction enemy are coming in from
UINT8 ubInsertionDirection; // For custom maps, used to describe which direction enemies are from
UINT32 sInsertionGridNo; // For custom maps, the insertion gridno
BOOLEAN fCustomSector; // Ah, a flag so the AI doesn't need to lookup sector info
UINT8 ubLoadingScreenID; // For a custom map, which loading screen to use
BOOLEAN fEnemyEnrouteToAttack; // To help things so that the enemy wioll not continually send dudes
INT8 bFiller[21];
} JA25_SECTOR_AI;
#define CUSTOMSECTOR 1020
extern JA25_SECTOR_AI gJa25AiSectorStruct[CUSTOMSECTOR];
enum
{
JA25_H7,
JA25_H8,
JA25_H9,
JA25_I9,
JA25_H10,
JA25_I10, //5
JA25_I11,
JA25_J11,
JA25_I12,
JA25_J12,
JA25_I13, //10
JA25_J13,
JA25_I13_1,
JA25_J13_1,
JA25_J14_1,
JA25_K14_1, //15
JA25_K15,
JA25_K15_1,
JA25_K15_2,
JA25_L15_2,
JA25_L15_3,
NUM_CAMPAIGN_JA25_SECTORS
};
extern BOOLEAN gfEnemyShouldImmediatelySeekThePlayer;
//extern INT32 giNumJA25Sectors;
void SetJa25SectorOwnedStatus( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, BOOLEAN fPlayerOwned );
INT8 GetTheFurthestSectorPlayerOwns();
void Ja25_UpdateTimeOfEndOfLastBattle( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ );
BOOLEAN Ja25_AreEnemiesAbleToAttackSector( INT16 iSectorID, INT8 bSectorZ );
BOOLEAN InitJa25SectorAi();
INT16 GetJA25SectorID( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ );
void JA25_HandleUpdateOfStrategicAi();
void SetEnemiesToFindThePlayerMercs();
void HandleSayingDontStayToLongWarningInSectorH8();
#ifdef JA2BETAVERSION
BOOLEAN InitJa25StrategicAiDecisions( BOOLEAN fLoadedGame );
#endif
void HandleEnricosUnderstandingEmail();
void HandleRemovingEnemySoldierInitLinksIfPlayerEverWonInSector();
// -1 if enemy isnt supposed to seek player, otherwise SAI sectgor ID get returned
INT8 GetSectorEnemyIsToImmediatelySeekEnemyIn();
void AddJA25AIDataToSector( JA25_SECTOR_AI *pSectorAIInfo );
extern void SetNumberOfJa25BloodCatsInSector( INT32 iSectorID, INT8 bNumBloodCats, INT8 bBloodCatPlacements );
#endif
#endif