aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/script/script_tim.h
diff options
context:
space:
mode:
authorathrxx2019-01-26 01:31:34 +0100
committerathrxx2019-03-06 20:48:15 +0100
commit1dfdcc7252ac83643cae7a7447c025da2af63843 (patch)
treeb6736d006bf67d5264dd171c336f0915695d1f88 /engines/kyra/script/script_tim.h
parent8b53d20b51771680c3d31aa02c0285b7a8be4e85 (diff)
downloadscummvm-rg350-1dfdcc7252ac83643cae7a7447c025da2af63843.tar.gz
scummvm-rg350-1dfdcc7252ac83643cae7a7447c025da2af63843.tar.bz2
scummvm-rg350-1dfdcc7252ac83643cae7a7447c025da2af63843.zip
KYRA: cleanup dir
Reorganize all files in sub directories. The file placement isn't as intuitive as it might be for other engines, which is probably the reason why this hasn't been done before.
Diffstat (limited to 'engines/kyra/script/script_tim.h')
-rw-r--r--engines/kyra/script/script_tim.h306
1 files changed, 306 insertions, 0 deletions
diff --git a/engines/kyra/script/script_tim.h b/engines/kyra/script/script_tim.h
new file mode 100644
index 0000000000..bd9c2645e5
--- /dev/null
+++ b/engines/kyra/script/script_tim.h
@@ -0,0 +1,306 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef KYRA_SCRIPT_TIM_H
+#define KYRA_SCRIPT_TIM_H
+
+#include "kyra/kyra_v1.h"
+
+#include "common/array.h"
+#include "common/func.h"
+#include "common/str.h"
+
+namespace Kyra {
+
+class WSAMovie_v2;
+class Screen_v2;
+class Movie;
+class LoLEngine;
+
+class TimAnimator {
+public:
+ struct AnimPart {
+ uint16 firstFrame;
+ uint16 lastFrame;
+ uint16 cycles;
+ int16 nextPart;
+ int16 partDelay;
+ uint16 field_A;
+ int16 sfxIndex;
+ uint16 sfxFrame;
+ };
+
+ struct Animation {
+ Movie *wsa;
+ int16 x, y;
+ uint32 nextFrame;
+ uint8 enable;
+ uint8 field_D;
+ uint8 frameDelay;
+ int8 curPart;
+ uint8 curFrame;
+ uint8 cyclesCompleted;
+ uint16 wsaCopyParams;
+ int8 lastPart;
+ AnimPart *parts;
+ };
+
+#ifdef ENABLE_LOL
+ TimAnimator(LoLEngine *engine, Screen_v2 *screen_v2, OSystem *system, bool useParts);
+#else
+ TimAnimator(KyraEngine_v1 *engine, Screen_v2 *screen_v2, OSystem *system, bool useParts);
+#endif
+ ~TimAnimator();
+
+ void init(int animIndex, Movie *wsa, int x, int y, int wsaCopyParams, int frameDelay);
+ void reset(int animIndex, bool clearStruct);
+
+ void displayFrame(int animIndex, int page, int frame, int flags = -1);
+
+ const Movie *getWsaCPtr(int animIndex) { return (animIndex >= 0 && animIndex < 6) ? _animations[animIndex].wsa : 0; }
+ int getAnimX(int animIndex) { return (animIndex >= 0 && animIndex < 6) ? _animations[animIndex].x : 0; }
+ int getAnimY(int animIndex) { return (animIndex >= 0 && animIndex < 6) ? _animations[animIndex].y : 0; }
+
+#ifdef ENABLE_LOL
+ void setupPart(int animIndex, int part, int firstFrame, int lastFrame, int cycles, int nextPart, int partDelay, int f, int sfxIndex, int sfxFrame);
+ void start(int animIndex, int part);
+ void stop(int animIndex);
+ void update(int animIndex);
+ void playPart(int animIndex, int firstFrame, int lastFrame, int delay);
+ int resetLastPart(int animIndex);
+#endif
+
+private:
+#ifdef ENABLE_LOL
+ LoLEngine *_vm;
+#else
+ KyraEngine_v1 *_vm;
+#endif
+ Screen_v2 *_screen;
+ OSystem *_system;
+
+ Animation *_animations;
+
+ const bool _useParts;
+};
+
+struct TIM;
+typedef Common::Functor2<const TIM *, const uint16 *, int> TIMOpcode;
+
+struct TIM {
+ char filename[13];
+
+ uint16 clickedButton;
+ int16 dlgFunc;
+
+ int16 procFunc;
+ uint16 procParam;
+
+ enum {
+ kCountFuncs = 10
+ };
+
+ struct Function {
+ uint16 *ip;
+
+ uint32 lastTime;
+ uint32 nextTime;
+
+ uint16 *loopIp;
+
+ uint16 *avtl;
+ } func[kCountFuncs];
+
+ enum {
+ kWSASlots = 6,
+ kAnimParts = 10
+ };
+
+ struct WSASlot {
+ int anim;
+
+ int16 x, y;
+ uint16 wsaFlags;
+ uint16 offscreen;
+ } wsa[kWSASlots];
+
+ uint16 *avtl;
+ uint8 *text;
+
+ const Common::Array<const TIMOpcode *> *opcodes;
+
+ // TODO: Get rid of this ugly HACK to allow the
+ // Lands of Lore outro to be working properly.
+ bool isLoLOutro;
+ uint8 lolCharacter;
+};
+
+class TIMInterpreter {
+public:
+ TIMInterpreter(KyraEngine_v1 *engine, Screen_v2 *screen_v2, OSystem *system);
+ virtual ~TIMInterpreter();
+
+ TIM *load(const char *filename, const Common::Array<const TIMOpcode *> *opcodes);
+ void unload(TIM *&tim) const;
+
+ bool callback(Common::IFFChunk &chunk);
+
+ virtual int initAnimStruct(int index, const char *filename, int x, int y, int, int offscreenBuffer, uint16 wsaFlags);
+ virtual int freeAnimStruct(int index);
+ TimAnimator *animator() { return _animator; }
+
+ void setLangData(const char *filename);
+ void clearLangData() { delete[] _langData; _langData = 0; }
+
+ const char *getCTableEntry(uint idx) const;
+
+ void resetFinishedFlag() { _finished = false; }
+ bool finished() const { return _finished; }
+
+ int exec(TIM *tim, bool loop);
+ void stopCurFunc() { if (_currentTim) cmd_stopCurFunc(0); }
+ void stopAllFuncs(TIM *tim);
+
+ void refreshTimersAfterPause(uint32 elapsedTime);
+
+ void displayText(uint16 textId, int16 flags);
+ void displayText(uint16 textId, int16 flags, uint8 color);
+ void setupTextPalette(uint index, int fadePalette);
+
+ virtual void resetDialogueState(TIM *tim) {}
+
+ int _drawPage2;
+
+ int _palDelayInc, _palDiff, _palDelayAcc;
+ int _abortFlag;
+
+protected:
+ KyraEngine_v1 *_vm;
+ Screen_v2 *_screen;
+ OSystem *_system;
+
+ TIM *_currentTim;
+ int _currentFunc;
+
+ TimAnimator *_animator;
+
+ bool _finished;
+
+ // used when loading
+ int _avtlChunkSize;
+ const char *_filename;
+ TIM *_tim;
+
+ Common::String _vocFiles[120];
+
+ virtual void update() {}
+ virtual void checkSpeechProgress() {}
+
+ char _audioFilename[32];
+
+ uint8 *_langData;
+ char *getTableEntry(uint idx);
+ bool _textDisplayed;
+ uint8 *_textAreaBuffer;
+
+ virtual int execCommand(int cmd, const uint16 *param);
+
+ typedef int (TIMInterpreter::*CommandProc)(const uint16 *);
+ struct CommandEntry {
+ CommandProc proc;
+ const char *desc;
+ };
+
+ const CommandEntry *_commands;
+ int _commandsSize;
+
+ int cmd_initFunc0(const uint16 *param);
+ int cmd_stopCurFunc(const uint16 *param);
+ int cmd_initWSA(const uint16 *param);
+ int cmd_uninitWSA(const uint16 *param);
+ int cmd_initFunc(const uint16 *param);
+ int cmd_stopFunc(const uint16 *param);
+ int cmd_wsaDisplayFrame(const uint16 *param);
+ int cmd_displayText(const uint16 *param);
+ int cmd_loadVocFile(const uint16 *param);
+ int cmd_unloadVocFile(const uint16 *param);
+ int cmd_playVocFile(const uint16 *param);
+ int cmd_loadSoundFile(const uint16 *param);
+ int cmd_playMusicTrack(const uint16 *param);
+ virtual int cmd_setLoopIp(const uint16 *param);
+ virtual int cmd_continueLoop(const uint16 *param);
+ int cmd_resetLoopIp(const uint16 *param);
+ int cmd_resetAllRuntimes(const uint16 *param);
+ int cmd_execOpcode(const uint16 *param);
+ int cmd_initFuncNow(const uint16 *param);
+ int cmd_stopFuncNow(const uint16 *param);
+#define cmd_return(n, v) \
+ int cmd_return_##n(const uint16 *){ return v; }
+ cmd_return( 1, 1)
+ cmd_return(n1, -1)
+#undef cmd_return
+};
+
+#ifdef ENABLE_LOL
+class LoLEngine;
+class Screen_LoL;
+class TIMInterpreter_LoL : public TIMInterpreter {
+public:
+ TIMInterpreter_LoL(LoLEngine *engine, Screen_v2 *screen_v2, OSystem *system);
+
+ int initAnimStruct(int index, const char *filename, int x, int y, int frameDelay, int, uint16 wsaCopyParams);
+ int freeAnimStruct(int index);
+
+ void resetDialogueState(TIM *tim);
+
+private:
+ void update();
+ void checkSpeechProgress();
+
+ char *getTableString(int id);
+ void advanceToOpcode(int opcode);
+
+ LoLEngine *_vm;
+ Screen_LoL *_screen;
+
+ virtual int execCommand(int cmd, const uint16 *param);
+
+ typedef int (TIMInterpreter_LoL::*CommandProc)(const uint16 *);
+ struct CommandEntry {
+ CommandProc proc;
+ const char *desc;
+ };
+
+ const CommandEntry *_commands;
+ int _commandsSize;
+
+ int cmd_stopAllFuncs(const uint16 *param);
+ int cmd_setLoopIp(const uint16 *param);
+ int cmd_continueLoop(const uint16 *param);
+ int cmd_processDialogue(const uint16 *param);
+ int cmd_dialogueBox(const uint16 *param);
+};
+#endif // ENABLE_LOL
+
+} // End of namespace Kyra
+
+#endif