1 #ifndef _DIALOG_CONTROL_H
2 #define _DIALOG_CONTROL_H
3 
4 #include "GameScreen.h"
5 #include "JA2Types.h"
6 #include "Types.h"
7 #include <string_theory/string>
8 struct FACETYPE;
9 struct MERCPROFILESTRUCT;
10 struct MercPopUpBox;
11 struct SOLDIERTYPE;
12 
13 
14 // An enumeration for dialog quotes
15 enum DialogQuoteIDs
16 {
17 	QUOTE_NONE = 0xFFFF,
18 
19 	// 0
20 	QUOTE_SEE_ENEMY = 0,
21 	QUOTE_SEE_ENEMY_VARIATION,
22 	QUOTE_IN_TROUBLE_SLASH_IN_BATTLE,
23 	QUOTE_SEE_CREATURE,
24 	QUOTE_FIRSTTIME_GAME_SEE_CREATURE,
25 	QUOTE_TRACES_OF_CREATURE_ATTACK,
26 	QUOTE_HEARD_SOMETHING,
27 	QUOTE_SMELLED_CREATURE,
28 	QUOTE_WEARY_SLASH_SUSPUCIOUS,
29 	QUOTE_WORRIED_ABOUT_CREATURE_PRESENCE,
30 
31 	//10
32 	QUOTE_ATTACKED_BY_MULTIPLE_CREATURES,
33 	QUOTE_SPOTTED_SOMETHING_ONE,
34 	QUOTE_SPOTTED_SOMETHING_TWO,
35 	QUOTE_OUT_OF_AMMO,
36 	QUOTE_SERIOUSLY_WOUNDED,
37 	QUOTE_BUDDY_ONE_KILLED,
38 	QUOTE_BUDDY_TWO_KILLED,
39 	QUOTE_LEARNED_TO_LIKE_MERC_KILLED,
40 	QUOTE_FORGETFULL_SLASH_CONFUSED,
41 	QUOTE_JAMMED_GUN,
42 
43 	//20
44 	QUOTE_UNDER_HEAVY_FIRE,
45 	QUOTE_TAKEN_A_BREATING,
46 	QUOTE_CLOSE_CALL,
47 	QUOTE_NO_LINE_OF_FIRE,
48 	QUOTE_STARTING_TO_BLEED,
49 	QUOTE_NEED_SLEEP,
50 	QUOTE_OUT_OF_BREATH,
51 	QUOTE_KILLED_AN_ENEMY,
52 	QUOTE_KILLED_A_CREATURE,
53 	QUOTE_HATED_MERC_ONE,
54 
55 	//30
56 	QUOTE_HATED_MERC_TWO,
57 	QUOTE_LEARNED_TO_HATE_MERC,
58 	QUOTE_AIM_KILLED_MIKE,
59 	QUOTE_MERC_QUIT_LEARN_TO_HATE = QUOTE_AIM_KILLED_MIKE,
60 	QUOTE_HEADSHOT,
61 	QUOTE_PERSONALITY_TRAIT,
62 	QUOTE_ASSIGNMENT_COMPLETE,
63 	QUOTE_REFUSING_ORDER,
64 	QUOTE_KILLING_DEIDRANNA,
65 	QUOTE_KILLING_QUEEN,
66 	QUOTE_ANNOYING_PC,
67 
68 	//40
69 	QUOTE_STARTING_TO_WHINE,
70 	QUOTE_NEGATIVE_COMPANY,
71 	QUOTE_AIR_RAID,
72 	QUOTE_WHINE_EQUIPMENT,
73 	QUOTE_SOCIAL_TRAIT,
74 	QUOTE_PASSING_DISLIKE,
75 	QUOTE_EXPERIENCE_GAIN,
76 	QUOTE_PRE_NOT_SMART,
77 	QUOTE_POST_NOT_SMART,
78 	QUOTE_HATED_1_ARRIVES,
79 	QUOTE_MERC_QUIT_HATED1 = QUOTE_HATED_1_ARRIVES,
80 
81 	//50
82 	QUOTE_HATED_2_ARRIVES,
83 	QUOTE_MERC_QUIT_HATED2 = QUOTE_HATED_2_ARRIVES,
84 	QUOTE_BUDDY_1_GOOD,
85 	QUOTE_BUDDY_2_GOOD,
86 	QUOTE_LEARNED_TO_LIKE_WITNESSED,
87 	QUOTE_DELAY_CONTRACT_RENEWAL,
88 	QUOTE_NOT_GETTING_PAID = QUOTE_DELAY_CONTRACT_RENEWAL,
89 	QUOTE_AIM_SEEN_MIKE,
90 	QUOTE_PC_DROPPED_OMERTA = QUOTE_AIM_SEEN_MIKE,
91 	QUOTE_BLINDED,
92 	QUOTE_DEFINITE_CANT_DO,
93 	QUOTE_LISTEN_LIKABLE_PERSON,
94 	QUOTE_ENEMY_PRESENCE,
95 
96 	//60
97 	QUOTE_WARNING_OUTSTANDING_ENEMY_AFTER_RT,
98 	QUOTE_FOUND_SOMETHING_SPECIAL,
99 	QUOTE_SATISFACTION_WITH_GUN_AFTER_KILL,
100 	QUOTE_SPOTTED_JOEY,
101 	QUOTE_RESPONSE_TO_MIGUEL_SLASH_QUOTE_MERC_OR_RPC_LETGO,
102 	QUOTE_SECTOR_SAFE,
103 	QUOTE_STUFF_MISSING_DRASSEN,
104 	QUOTE_KILLED_FACTORY_MANAGER,
105 	QUOTE_SPOTTED_BLOODCAT,
106 	QUOTE_END_GAME_COMMENT,
107 
108 	//70
109 	QUOTE_ENEMY_RETREATED,
110 	QUOTE_GOING_TO_AUTO_SLEEP,
111 	QUOTE_WORK_UP_AND_RETURNING_TO_ASSIGNMENT, // woke up from auto sleep, going back to wo
112 	QUOTE_ME_TOO, // me too quote, in agreement with whatever the merc previous said
113 	QUOTE_USELESS_ITEM,
114 	QUOTE_BOOBYTRAP_ITEM,
115 	QUOTE_SUSPICIOUS_GROUND,
116 	QUOTE_DROWNING,
117 	QUOTE_MERC_REACHED_DESTINATION,
118 	QUOTE_SPARE2,
119 
120 	//80
121 	QUOTE_REPUTATION_REFUSAL,
122 	QUOTE_DEATH_RATE_REFUSAL, //= 99,
123 	QUOTE_LAME_REFUSAL, //= 82,
124 	QUOTE_WONT_RENEW_CONTRACT_LAME_REFUSAL, // ARM: now unused
125 	QUOTE_ANSWERING_MACHINE_MSG,
126 	QUOTE_DEPARTING_COMMENT_CONTRACT_NOT_RENEWED_OR_48_OR_MORE,
127 	QUOTE_HATE_MERC_1_ON_TEAM,// = 100,
128 	QUOTE_HATE_MERC_2_ON_TEAM,// = 101,
129 	QUOTE_LEARNED_TO_HATE_MERC_ON_TEAM,// = 102,
130 	QUOTE_CONTRACTS_OVER,// = 89,
131 
132 	//90
133 	QUOTE_ACCEPT_CONTRACT_RENEWAL,
134 	QUOTE_CONTRACT_ACCEPTANCE,
135 	QUOTE_JOINING_CAUSE_BUDDY_1_ON_TEAM,// = 103,
136 	QUOTE_JOINING_CAUSE_BUDDY_2_ON_TEAM,// = 104,
137 	QUOTE_JOINING_CAUSE_LEARNED_TO_LIKE_BUDDY_ON_TEAM,// = 105,
138 	QUOTE_REFUSAL_RENEW_DUE_TO_MORALE,// = 95,
139 	QUOTE_PRECEDENT_TO_REPEATING_ONESELF,// = 106,
140 	QUOTE_REFUSAL_TO_JOIN_LACK_OF_FUNDS,// = 107,
141 	QUOTE_DEPART_COMMET_CONTRACT_NOT_RENEWED_OR_TERMINATED_UNDER_48,// = 98,
142 	QUOTE_DEATH_RATE_RENEWAL,
143 
144 	//100
145 	QUOTE_HATE_MERC_1_ON_TEAM_WONT_RENEW,
146 	QUOTE_HATE_MERC_2_ON_TEAM_WONT_RENEW,
147 	QUOTE_LEARNED_TO_HATE_MERC_1_ON_TEAM_WONT_RENEW,
148 	QUOTE_RENEWING_CAUSE_BUDDY_1_ON_TEAM,
149 	QUOTE_RENEWING_CAUSE_BUDDY_2_ON_TEAM,
150 	QUOTE_RENEWING_CAUSE_LEARNED_TO_LIKE_BUDDY_ON_TEAM,
151 	QUOTE_PRECEDENT_TO_REPEATING_ONESELF_RENEW,
152 	QUOTE_RENEW_REFUSAL_DUE_TO_LACK_OF_FUNDS,
153 	QUOTE_GREETING,
154 	QUOTE_SMALL_TALK,
155 
156 	//110
157 	QUOTE_IMPATIENT_QUOTE,
158 	QUOTE_LENGTH_OF_CONTRACT,
159 	QUOTE_COMMENT_BEFORE_HANG_UP,
160 	QUOTE_PERSONALITY_BIAS_WITH_MERC_1,
161 	QUOTE_PERSONALITY_BIAS_WITH_MERC_2,
162 	QUOTE_MERC_LEAVING_ALSUCO_SOON,
163 	QUOTE_MERC_GONE_UP_IN_PRICE
164 };
165 
166 
167 enum DialogueHandler
168 {
169 	DIALOGUE_NO_UI                 = 0,
170 	DIALOGUE_TACTICAL_UI           = 1,
171 	DIALOGUE_CONTACTPAGE_UI        = 2,
172 	DIALOGUE_NPC_UI                = 3,
173 	DIALOGUE_SPECK_CONTACT_PAGE_UI = 4,
174 	DIALOGUE_EXTERNAL_NPC_UI       = 5,
175 	DIALOGUE_SHOPKEEPER_UI         = 6
176 };
177 
178 
179 // Gets a external NPC dialogue face by merc profile ID.
180 // "External" because the NPC is not on our team and might not even exist as a soldier
181 FACETYPE* GetExternalNPCFace(ProfileID);
182 
183 // Functions for handling dialogue Q
184 void InitalizeDialogueControl(void);
185 void ShutdownDialogueControl(void);
186 void EmptyDialogueQueue(void);
187 void HandleDialogue(void);
188 void HandleImportantMercQuote( SOLDIERTYPE * pSoldier, UINT16 usQuoteNumber );
189 void HandleImportantMercQuoteLocked(SOLDIERTYPE*, UINT16 quote);
190 
191 // A higher level function used for tactical quotes
192 BOOLEAN TacticalCharacterDialogue(const SOLDIERTYPE* pSoldier, UINT16 usQuoteNum);
193 
194 // A higher level function used for tactical quotes
195 BOOLEAN DelayedTacticalCharacterDialogue( SOLDIERTYPE *pSoldier, UINT16 usQuoteNum );
196 
197 // A more general purpose function for processing quotes
198 void CharacterDialogue(UINT8 ubCharacterNum, UINT16 usQuoteNum, FACETYPE* face, DialogueHandler, BOOLEAN fFromSoldier, bool delayed = false);
199 
200 void CharacterDialogueUsingAlternateFile(SOLDIERTYPE&, UINT16 quote, DialogueHandler);
201 
202 BOOLEAN ExecuteCharacterDialogue(UINT8 ubCharacterNum, UINT16 usQuoteNum, FACETYPE* face, DialogueHandler, BOOLEAN fFromSoldier, bool useAlternateDialogueFile);
203 
204 // Called when a face stops talking...
205 void HandleDialogueEnd(FACETYPE&);
206 
207 // Called to advance speech
208 // Used for option when no speech sound file
209 void DialogueAdvanceSpeech(void);
210 
211 BOOLEAN DialogueQueueIsEmpty(void);
212 BOOLEAN DialogueQueueIsEmptyAndNobodyIsTalking(void);
213 
214 
215 // set up and shutdown static external NPC faces
216 void PreloadExternalNPCFaces();
217 void LoadExternalNPCFace(ProfileID);
218 void UnloadExternalNPCFaces();
219 
220 void SayQuoteFromAnyBodyInSector(UINT16 quote_id);
221 void SayQuoteFromAnyBodyInThisSector(INT16 x, INT16 y, INT8 z, UINT16 quote_id);
222 void SayQuoteFromNearbyMercInSector(GridNo, INT8 distance, UINT16 quote_id);
223 void SayQuote58FromNearbyMercInSector(GridNo, INT8 distance, UINT16 quote_id, INT8 sex);
224 UINT32 FindDelayForString(const ST::string& str);
225 void BeginLoggingForBleedMeToos( BOOLEAN fStart );
226 
227 void UnSetEngagedInConvFromPCAction( SOLDIERTYPE *pSoldier );
228 void SetEngagedInConvFromPCAction( SOLDIERTYPE *pSoldier );
229 
230 
231 void SetStopTimeQuoteCallback( MODAL_HOOK pCallBack );
232 
233 BOOLEAN DialogueActive(void);
234 
235 extern INT32 giNPCReferenceCount;
236 
237 
238 BOOLEAN GetMercPrecedentQuoteBitStatus(const MERCPROFILESTRUCT*, UINT8 ubQuoteBit);
239 void    SetMercPrecedentQuoteBitStatus(MERCPROFILESTRUCT*, UINT8 ubBitToSet);
240 UINT8	GetQuoteBitNumberFromQuoteID( UINT32 uiQuoteID );
241 void HandleShutDownOfMapScreenWhileExternfaceIsTalking( void );
242 
243 void StopAnyCurrentlyTalkingSpeech(void);
244 
245 // handle pausing of the dialogue queue
246 void PauseDialogueQueue( void );
247 
248 // unpause the dialogue queue
249 void UnPauseDialogueQueue( void );
250 
251 void SetExternMapscreenSpeechPanelXY( INT16 sXPos, INT16 sYPos );
252 
253 bool IsMercSayingDialogue(ProfileID);
254 
255 extern FACETYPE* gpCurrentTalkingFace;
256 
257 extern MercPopUpBox* g_dialogue_box;
258 
259 extern BOOLEAN gfFacePanelActive;
260 
261 
262 class DialogueEvent
263 {
264 	public:
~DialogueEvent()265 		virtual ~DialogueEvent() {}
266 
267 		virtual bool Execute() = 0;
268 
269 		static void Add(DialogueEvent*);
270 };
271 
272 template<void (&callback)()> class DialogueEventCallback : public DialogueEvent
273 {
274 	public:
Execute()275 		bool Execute()
276 		{
277 			callback();
278 			return false;
279 		}
280 };
281 
282 class CharacterDialogueEvent : public DialogueEvent
283 {
284 	public:
CharacterDialogueEvent(SOLDIERTYPE & soldier)285 		CharacterDialogueEvent(SOLDIERTYPE& soldier) : soldier_(soldier) {}
286 
287 		bool MayExecute() const;
288 
289 	protected:
290 		SOLDIERTYPE& soldier_;
291 };
292 
293 void MakeCharacterDialogueEventSleep(SOLDIERTYPE&, bool sleep);
294 
295 void LoadDialogueControlGraphics();
296 void DeleteDialogueControlGraphics();
297 
298 #endif
299