1 #ifndef NPC_H
2 #define NPC_H
3 
4 #include "Facts.h"
5 #include "Types.h"
6 struct OBJECTTYPE;
7 struct SOLDIERTYPE;
8 
9 
10 #define NPC_TALK_RADIUS 4
11 
12 
13 enum Approach
14 {
15 	APPROACH_NONE = 0,
16 
17 	APPROACH_FRIENDLY = 1,
18 	APPROACH_DIRECT,
19 	APPROACH_THREATEN,
20 	APPROACH_RECRUIT,
21 	APPROACH_REPEAT,
22 
23 	APPROACH_GIVINGITEM,
24 	NPC_INITIATING_CONV,
25 	NPC_INITIAL_QUOTE,
26 	NPC_WHOAREYOU,
27 	TRIGGER_NPC,
28 
29 	APPROACH_GIVEFIRSTAID,
30 	APPROACH_SPECIAL_INITIAL_QUOTE,
31 	APPROACH_ENEMY_NPC_QUOTE,
32 	APPROACH_DECLARATION_OF_HOSTILITY,
33 	APPROACH_EPC_IN_WRONG_SECTOR,
34 
35 	APPROACH_EPC_WHO_IS_RECRUITED,
36 	APPROACH_INITIAL_QUOTE,
37 	APPROACH_CLOSING_SHOP,
38 	APPROACH_SECTOR_NOT_SAFE,
39 	APPROACH_DONE_SLAPPED, // 20
40 
41 	APPROACH_DONE_PUNCH_0,
42 	APPROACH_DONE_PUNCH_1,
43 	APPROACH_DONE_PUNCH_2,
44 	APPROACH_DONE_OPEN_STRUCTURE,
45 	APPROACH_DONE_GET_ITEM, // 25
46 
47 	APPROACH_DONE_GIVING_ITEM,
48 	APPROACH_DONE_TRAVERSAL,
49 	APPROACH_BUYSELL,
50 	APPROACH_ONE_OF_FOUR_STANDARD,
51 	APPROACH_FRIENDLY_DIRECT_OR_RECRUIT, // 30
52 };
53 
54 extern INT8 const gbFirstApproachFlags[4];
55 
56 void ShutdownNPCQuotes();
57 
58 extern void SetQuoteRecordAsUsed( UINT8 ubNPC, UINT8 ubRecord );
59 
60 // uiApproachData is used for approach things like giving items, etc.
61 UINT8 CalcDesireToTalk(UINT8 ubNPC, UINT8 ubMerc, Approach);
62 void  ConverseFull(UINT8 ubNPC, UINT8 ubMerc, Approach, UINT8 approach_record, OBJECTTYPE* approach_object);
63 void  Converse(UINT8 ubNPC, UINT8 ubMerc, Approach);
64 
65 extern void NPCReachedDestination( SOLDIERTYPE * pNPC, BOOLEAN fAlreadyThere );
66 extern void PCsNearNPC( UINT8 ubNPC );
67 extern BOOLEAN PCDoesFirstAidOnNPC( UINT8 ubNPC );
68 extern void TriggerNPCRecord( UINT8 ubTriggerNPC, UINT8 ubTriggerNPCRec );
69 extern BOOLEAN TriggerNPCWithIHateYouQuote( UINT8 ubTriggerNPC );
70 
71 extern void TriggerNPCRecordImmediately( UINT8 ubTriggerNPC, UINT8 ubTriggerNPCRec );
72 
73 BOOLEAN TriggerNPCWithGivenApproach(UINT8 ubTriggerNPC, Approach);
74 
75 
76 bool ReloadQuoteFile(UINT8 ubNPC);
77 void ReloadAllQuoteFiles(void);
78 
79 // Save and loads the npc info to a saved game file
80 void SaveNPCInfoToSaveGameFile(HWFILE);
81 void LoadNPCInfoFromSavedGameFile(HWFILE, UINT32 uiSaveGameVersion);
82 
83 extern void TriggerFriendWithHostileQuote( UINT8 ubNPC );
84 
85 extern void ReplaceLocationInNPCDataFromProfileID( UINT8 ubNPC, INT16 sOldGridNo, INT16 sNewGridNo );
86 
87 extern UINT8 ActionIDForMovementRecord( UINT8 ubNPC, UINT8 ubRecord );
88 
89 // given a victory in this sector, handle specific facts
90 void HandleVictoryInNPCSector( INT16 sSectorX, INT16 sSectorY, INT16 sSectorZ );
91 
92 // check if this shopkeep has been shutdown, if so do soething and return the fact
93 BOOLEAN HandleShopKeepHasBeenShutDown( UINT8 ubCharNum );
94 
95 BOOLEAN NPCHasUnusedRecordWithGivenApproach(UINT8 ubNPC, Approach);
96 BOOLEAN NPCWillingToAcceptItem( UINT8 ubNPC, UINT8 ubMerc, OBJECTTYPE * pObj );
97 
98 void SaveBackupNPCInfoToSaveGameFile(HWFILE);
99 void LoadBackupNPCInfoFromSavedGameFile(HWFILE);
100 void UpdateDarrelScriptToGoTo( SOLDIERTYPE * pSoldier );
101 
102 #define WALTER_BRIBE_AMOUNT 20000
103 
104 BOOLEAN GetInfoForAbandoningEPC(UINT8 ubNPC, UINT16* pusQuoteNum, Fact* fact_to_set_true);
105 
106 BOOLEAN RecordHasDialogue( UINT8 ubNPC, UINT8 ubRecord );
107 
108 INT8 ConsiderCivilianQuotes( INT16 sSectorX, INT16 sSectorY, INT16 sSectorZ,  BOOLEAN fSetAsUsed );
109 
110 void ResetOncePerConvoRecordsForNPC( UINT8 ubNPC );
111 
112 void HandleNPCChangesForTacticalTraversal(const SOLDIERTYPE* s);
113 
114 BOOLEAN NPCHasUnusedHostileRecord(UINT8 ubNPC, Approach);
115 
116 void ResetOncePerConvoRecordsForAllNPCsInLoadedSector( void );
117 
118 INT16 NPCConsiderInitiatingConv(const SOLDIERTYPE* pNPC);
119 
120 #endif
121