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