1 #ifndef __INTERMISSION_H 2 #define __INTERMISSION_H 3 4 #include "doomdef.h" 5 #include "dobject.h" 6 #include "m_fixed.h" 7 #include "textures/textures.h" 8 #include "s_sound.h" 9 #include "v_font.h" 10 11 struct event_t; 12 13 #define DECLARE_SUPER_CLASS(cls,parent) \ 14 private: \ 15 typedef parent Super; \ 16 typedef cls ThisClass; 17 18 struct FIntermissionPatch 19 { 20 FName mCondition; 21 FString mName; 22 double x, y; 23 }; 24 25 struct FIIntermissionPatch 26 { 27 FName mCondition; 28 FTextureID mPic; 29 double x, y; 30 }; 31 32 struct FCastSound 33 { 34 BYTE mSequence; 35 BYTE mIndex; 36 FString mSound; 37 }; 38 39 struct FICastSound 40 { 41 BYTE mSequence; 42 BYTE mIndex; 43 FSoundID mSound; 44 }; 45 46 enum EFadeType 47 { 48 FADE_In, 49 FADE_Out, 50 }; 51 52 enum EScrollDir 53 { 54 SCROLL_Left, 55 SCROLL_Right, 56 SCROLL_Up, 57 SCROLL_Down, 58 }; 59 60 // actions that don't create objects 61 #define WIPER_ID ((const PClass*)intptr_t(-1)) 62 #define TITLE_ID ((const PClass*)intptr_t(-2)) 63 64 //========================================================================== 65 66 struct FIntermissionAction 67 { 68 int mSize; 69 const PClass *mClass; 70 FString mMusic; 71 int mMusicOrder; 72 int mCdTrack; 73 int mCdId; 74 int mDuration; 75 FString mBackground; 76 FString mPalette; 77 FString mSound; 78 bool mFlatfill; 79 bool mMusicLooping; 80 TArray<FIntermissionPatch> mOverlays; 81 82 FIntermissionAction(); ~FIntermissionActionFIntermissionAction83 virtual ~FIntermissionAction() {} 84 virtual bool ParseKey(FScanner &sc); 85 }; 86 87 struct FIntermissionActionFader : public FIntermissionAction 88 { 89 typedef FIntermissionAction Super; 90 91 EFadeType mFadeType; 92 93 FIntermissionActionFader(); 94 virtual bool ParseKey(FScanner &sc); 95 }; 96 97 struct FIntermissionActionWiper : public FIntermissionAction 98 { 99 typedef FIntermissionAction Super; 100 101 gamestate_t mWipeType; 102 103 FIntermissionActionWiper(); 104 virtual bool ParseKey(FScanner &sc); 105 }; 106 107 struct FIntermissionActionTextscreen : public FIntermissionAction 108 { 109 typedef FIntermissionAction Super; 110 111 FString mText; 112 int mTextDelay; 113 int mTextSpeed; 114 int mTextX, mTextY; 115 EColorRange mTextColor; 116 117 FIntermissionActionTextscreen(); 118 virtual bool ParseKey(FScanner &sc); 119 }; 120 121 struct FIntermissionActionCast : public FIntermissionAction 122 { 123 typedef FIntermissionAction Super; 124 125 FString mName; 126 FName mCastClass; 127 TArray<FCastSound> mCastSounds; 128 129 FIntermissionActionCast(); 130 virtual bool ParseKey(FScanner &sc); 131 }; 132 133 struct FIntermissionActionScroller : public FIntermissionAction 134 { 135 typedef FIntermissionAction Super; 136 137 FString mSecondPic; 138 int mScrollDelay; 139 int mScrollTime; 140 int mScrollDir; 141 142 FIntermissionActionScroller(); 143 virtual bool ParseKey(FScanner &sc); 144 }; 145 146 struct FIntermissionDescriptor 147 { 148 FName mLink; 149 TDeletingArray<FIntermissionAction *> mActions; 150 }; 151 152 typedef TMap<FName, FIntermissionDescriptor*> FIntermissionDescriptorList; 153 154 extern FIntermissionDescriptorList IntermissionDescriptors; 155 156 //========================================================================== 157 158 class DIntermissionScreen : public DObject 159 { 160 DECLARE_CLASS (DIntermissionScreen, DObject) 161 162 protected: 163 int mDuration; 164 FTextureID mBackground; 165 bool mFlatfill; 166 TArray<FIIntermissionPatch> mOverlays; 167 168 bool CheckOverlay(int i); 169 170 public: 171 int mTicker; 172 bool mPaletteChanged; 173 DIntermissionScreen()174 DIntermissionScreen() {} 175 virtual void Init(FIntermissionAction *desc, bool first); 176 virtual int Responder (event_t *ev); 177 virtual int Ticker (); 178 virtual void Drawer (); 179 void Destroy(); GetBackground(bool * fill)180 FTextureID GetBackground(bool *fill) 181 { 182 *fill = mFlatfill; 183 return mBackground; 184 } SetBackground(FTextureID tex,bool fill)185 void SetBackground(FTextureID tex, bool fill) 186 { 187 mBackground = tex; 188 mFlatfill = fill; 189 } 190 }; 191 192 class DIntermissionScreenFader : public DIntermissionScreen 193 { DECLARE_CLASS(DIntermissionScreenFader,DIntermissionScreen)194 DECLARE_CLASS (DIntermissionScreenFader, DIntermissionScreen) 195 196 EFadeType mType; 197 198 public: 199 200 DIntermissionScreenFader() {} 201 virtual void Init(FIntermissionAction *desc, bool first); 202 virtual int Responder (event_t *ev); 203 virtual int Ticker (); 204 virtual void Drawer (); 205 }; 206 207 class DIntermissionScreenText : public DIntermissionScreen 208 { 209 DECLARE_CLASS (DIntermissionScreenText, DIntermissionScreen) 210 211 const char *mText; 212 int mTextSpeed; 213 int mTextX, mTextY; 214 int mTextCounter; 215 int mTextDelay; 216 int mTextLen; 217 EColorRange mTextColor; 218 219 public: 220 DIntermissionScreenText()221 DIntermissionScreenText() {} 222 virtual void Init(FIntermissionAction *desc, bool first); 223 virtual int Responder (event_t *ev); 224 virtual void Drawer (); 225 }; 226 227 class DIntermissionScreenCast : public DIntermissionScreen 228 { 229 DECLARE_CLASS (DIntermissionScreenCast, DIntermissionScreen) 230 231 const char *mName; 232 const PClass *mClass; 233 AActor *mDefaults; 234 TArray<FICastSound> mCastSounds; 235 236 int casttics; 237 const FRemapTable *casttranslation; // [RH] Draw "our hero" with their chosen suit color 238 FState* caststate; 239 FState* basestate; 240 FState* advplayerstate; 241 bool castdeath; 242 bool castattacking; 243 int castframes; 244 int castonmelee; 245 246 void PlayAttackSound(); 247 248 public: 249 DIntermissionScreenCast()250 DIntermissionScreenCast() {} 251 virtual void Init(FIntermissionAction *desc, bool first); 252 virtual int Responder (event_t *ev); 253 virtual int Ticker (); 254 virtual void Drawer (); 255 }; 256 257 class DIntermissionScreenScroller : public DIntermissionScreen 258 { 259 DECLARE_CLASS (DIntermissionScreenScroller, DIntermissionScreen) 260 261 FTextureID mFirstPic; 262 FTextureID mSecondPic; 263 int mScrollDelay; 264 int mScrollTime; 265 int mScrollDir; 266 267 public: 268 DIntermissionScreenScroller()269 DIntermissionScreenScroller() {} 270 virtual void Init(FIntermissionAction *desc, bool first); 271 virtual int Responder (event_t *ev); 272 virtual void Drawer (); 273 }; 274 275 enum 276 { 277 FSTATE_EndingGame = 0, 278 FSTATE_ChangingLevel = 1, 279 FSTATE_InLevel = 2 280 }; 281 282 class DIntermissionController : public DObject 283 { 284 DECLARE_CLASS (DIntermissionController, DObject) 285 HAS_OBJECT_POINTERS 286 287 FIntermissionDescriptor *mDesc; 288 TObjPtr<DIntermissionScreen> mScreen; 289 bool mDeleteDesc; 290 bool mFirst; 291 bool mAdvance, mSentAdvance; 292 BYTE mGameState; 293 int mIndex; 294 295 bool NextPage(); 296 297 public: 298 static DIntermissionController *CurrentIntermission; 299 300 DIntermissionController(FIntermissionDescriptor *mDesc = NULL, bool mDeleteDesc = false, BYTE state = FSTATE_ChangingLevel); 301 bool Responder (event_t *ev); 302 void Ticker (); 303 void Drawer (); 304 void Destroy(); 305 306 friend void F_AdvanceIntermission(); 307 }; 308 309 310 // Interface for main loop 311 bool F_Responder (event_t* ev); 312 void F_Ticker (); 313 void F_Drawer (); 314 void F_StartIntermission(FIntermissionDescriptor *desc, bool deleteme, BYTE state); 315 void F_StartIntermission(FName desc, BYTE state); 316 void F_EndFinale (); 317 void F_AdvanceIntermission(); 318 319 // Create an intermission from old cluster data 320 void F_StartFinale (const char *music, int musicorder, int cdtrack, unsigned int cdid, const char *flat, 321 const char *text, INTBOOL textInLump, INTBOOL finalePic, INTBOOL lookupText, 322 bool ending, FName endsequence = NAME_None); 323 324 325 326 #endif 327