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