#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 AddEnemiesToJa25TunnelMaps();
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
