ScummVM API documentation
script_tim.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22#ifndef KYRA_SCRIPT_TIM_H
23#define KYRA_SCRIPT_TIM_H
24
25#include "kyra/kyra_v1.h"
26
27#include "common/array.h"
28#include "common/func.h"
29#include "common/str.h"
30
31namespace Kyra {
32
33class WSAMovie_v2;
34class Screen_v2;
35class Movie;
36class LoLEngine;
37
39public:
40 struct AnimPart {
41 uint16 firstFrame;
42 uint16 lastFrame;
43 uint16 cycles;
44 int16 nextPart;
45 int16 partDelay;
46 uint16 field_A;
47 int16 sfxIndex;
48 uint16 sfxFrame;
49 };
50
51 struct Animation {
52 Movie *wsa;
53 int16 x, y;
54 uint32 nextFrame;
55 uint8 enable;
56 uint8 field_D;
57 uint8 frameDelay;
58 int8 curPart;
59 uint8 curFrame;
60 uint8 cyclesCompleted;
61 uint16 wsaCopyParams;
62 int8 lastPart;
63 AnimPart *parts;
64 };
65
66#ifdef ENABLE_LOL
67 TimAnimator(LoLEngine *engine, Screen_v2 *screen_v2, OSystem *system, bool useParts);
68#else
69 TimAnimator(KyraEngine_v1 *engine, Screen_v2 *screen_v2, OSystem *system, bool useParts);
70#endif
72
73 void init(int animIndex, Movie *wsa, int x, int y, int wsaCopyParams, int frameDelay);
74 void reset(int animIndex, bool clearStruct);
75
76 void displayFrame(int animIndex, int page, int frame, int flags = -1);
77
78 const Movie *getWsaCPtr(int animIndex) { return (animIndex >= 0 && animIndex < 6) ? _animations[animIndex].wsa : 0; }
79 int getAnimX(int animIndex) { return (animIndex >= 0 && animIndex < 6) ? _animations[animIndex].x : 0; }
80 int getAnimY(int animIndex) { return (animIndex >= 0 && animIndex < 6) ? _animations[animIndex].y : 0; }
81
82#ifdef ENABLE_LOL
83 void setupPart(int animIndex, int part, int firstFrame, int lastFrame, int cycles, int nextPart, int partDelay, int f, int sfxIndex, int sfxFrame);
84 void start(int animIndex, int part);
85 void stop(int animIndex);
86 void update(int animIndex);
87 void playPart(int animIndex, int firstFrame, int lastFrame, int delay);
88 int resetLastPart(int animIndex);
89#endif
90
91private:
92#ifdef ENABLE_LOL
93 LoLEngine *_vm;
94#else
95 KyraEngine_v1 *_vm;
96#endif
97 Screen_v2 *_screen;
98 OSystem *_system;
99
100 Animation *_animations;
101
102 const bool _useParts;
103};
104
105struct TIM;
107
108struct TIM {
109 char filename[13];
110
111 uint16 clickedButton;
112 int16 dlgFunc;
113
114 int16 procFunc;
115 uint16 procParam;
116
117 enum {
118 kCountFuncs = 10
119 };
120
121 struct Function {
122 uint16 *ip;
123
124 uint32 lastTime;
125 uint32 nextTime;
126
127 uint16 *loopIp;
128
129 uint16 *avtl;
130 } func[kCountFuncs];
131
132 enum {
133 kWSASlots = 6,
134 kAnimParts = 10
135 };
136
137 struct WSASlot {
138 int anim;
139
140 int16 x, y;
141 uint16 wsaFlags;
142 uint16 offscreen;
143 } wsa[kWSASlots];
144
145 uint16 *avtl;
146 uint8 *text;
147
149
150 // TODO: Get rid of this ugly HACK to allow the
151 // Lands of Lore outro to be working properly.
152 bool isLoLOutro;
153 uint8 lolCharacter;
154};
155
157public:
158 TIMInterpreter(KyraEngine_v1 *engine, Screen_v2 *screen_v2, OSystem *system);
159 virtual ~TIMInterpreter();
160
161 TIM *load(const char *filename, const Common::Array<const TIMOpcode *> *opcodes);
162 void unload(TIM *&tim) const;
163
164 bool callback(Common::IFFChunk &chunk);
165
166 virtual int initAnimStruct(int index, const char *filename, int x, int y, int, int offscreenBuffer, uint16 wsaFlags);
167 virtual int freeAnimStruct(int index);
168 TimAnimator *animator() { return _animator; }
169
170 void setLangData(const char *filename);
171 void clearLangData() { delete[] _langData; _langData = 0; }
172
173 const char *getCTableEntry(uint idx) const;
174
175 void resetFinishedFlag() { _finished = false; }
176 bool finished() const { return _finished; }
177
178 int exec(TIM *tim, bool loop);
179 void stopCurFunc() { if (_currentTim) cmd_stopCurFunc(0); }
180 void stopAllFuncs(TIM *tim);
181
182 void refreshTimersAfterPause(uint32 elapsedTime);
183
184 void displayText(uint16 textId, int16 flags);
185 void displayText(uint16 textId, int16 flags, uint8 color);
186 void setupTextPalette(uint index, int fadePalette);
187
188 virtual void resetDialogueState(TIM *tim) {}
189
190 int _drawPage2;
191
192 int _palDelayInc, _palDiff, _palDelayAcc;
193 int _abortFlag;
194
195protected:
196 KyraEngine_v1 *_vm;
197 Screen_v2 *_screen;
198 OSystem *_system;
199
200 TIM *_currentTim;
201 int _currentFunc;
202
203 TimAnimator *_animator;
204
205 bool _finished;
206
207 // used when loading
208 int _avtlChunkSize;
209 const char *_filename;
210 TIM *_tim;
211
212 Common::String _vocFiles[120];
213
214 virtual void update() {}
215 virtual void checkSpeechProgress() {}
216
217 char _audioFilename[32];
218
219 uint8 *_langData;
220 char *getTableEntry(uint idx);
221 bool _textDisplayed;
222 uint8 *_textAreaBuffer;
223
224 virtual int execCommand(int cmd, const uint16 *param);
225
226 typedef int (TIMInterpreter::*CommandProc)(const uint16 *);
228 CommandProc proc;
229 const char *desc;
230 };
231
232 const CommandEntry *_commands;
233 int _commandsSize;
234
235 int cmd_initFunc0(const uint16 *param);
236 int cmd_stopCurFunc(const uint16 *param);
237 int cmd_initWSA(const uint16 *param);
238 int cmd_uninitWSA(const uint16 *param);
239 int cmd_initFunc(const uint16 *param);
240 int cmd_stopFunc(const uint16 *param);
241 int cmd_wsaDisplayFrame(const uint16 *param);
242 int cmd_displayText(const uint16 *param);
243 int cmd_loadVocFile(const uint16 *param);
244 int cmd_unloadVocFile(const uint16 *param);
245 int cmd_playVocFile(const uint16 *param);
246 int cmd_loadSoundFile(const uint16 *param);
247 int cmd_playMusicTrack(const uint16 *param);
248 virtual int cmd_setLoopIp(const uint16 *param);
249 virtual int cmd_continueLoop(const uint16 *param);
250 int cmd_resetLoopIp(const uint16 *param);
251 int cmd_resetAllRuntimes(const uint16 *param);
252 int cmd_execOpcode(const uint16 *param);
253 int cmd_initFuncNow(const uint16 *param);
254 int cmd_stopFuncNow(const uint16 *param);
255#define cmd_return(n, v) \
256 int cmd_return_##n(const uint16 *){ return v; }
257 cmd_return( 1, 1)
258 cmd_return(n1, -1)
259#undef cmd_return
260};
261
262#ifdef ENABLE_LOL
263class LoLEngine;
264class Screen_LoL;
265class TIMInterpreter_LoL : public TIMInterpreter {
266public:
267 TIMInterpreter_LoL(LoLEngine *engine, Screen_v2 *screen_v2, OSystem *system);
268
269 int initAnimStruct(int index, const char *filename, int x, int y, int frameDelay, int, uint16 wsaCopyParams) override;
270 int freeAnimStruct(int index) override;
271
272 void resetDialogueState(TIM *tim) override;
273
274private:
275 void update() override;
276 void checkSpeechProgress() override;
277
278 const char *getTableString(int id);
279 void advanceToOpcode(int opcode);
280
281 LoLEngine *_vm;
282 Screen_LoL *_screen;
283
284 int execCommand(int cmd, const uint16 *param) override;
285
286 typedef int (TIMInterpreter_LoL::*CommandProc)(const uint16 *);
287 struct CommandEntry {
288 CommandProc proc;
289 const char *desc;
290 };
291
292 const CommandEntry *_commands;
293 int _commandsSize;
294
295 int cmd_stopAllFuncs(const uint16 *param);
296 int cmd_setLoopIp(const uint16 *param) override;
297 int cmd_continueLoop(const uint16 *param) override;
298 int cmd_processDialogue(const uint16 *param);
299 int cmd_dialogueBox(const uint16 *param);
300};
301#endif // ENABLE_LOL
302
303} // End of namespace Kyra
304
305#endif
Definition: array.h:52
Definition: str.h:59
Definition: kyra_v1.h:126
Definition: wsamovie.h:31
Definition: screen_v2.h:30
Definition: script_tim.h:156
Definition: script_tim.h:38
Definition: system.h:166
Definition: detection.h:27
Definition: func.h:473
Definition: iff_container.h:160
Definition: script_tim.h:121
Definition: script_tim.h:137
Definition: script_tim.h:108
Definition: script_tim.h:227
Definition: script_tim.h:40
Definition: script_tim.h:51