1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
/* 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 RIVEN_SCRIPTS_H
#define RIVEN_SCRIPTS_H
#include "common/str-array.h"
#include "common/ptr.h"
#include "common/textconsole.h"
#define DECLARE_OPCODE(x) void x(uint16 op, uint16 argc, uint16 *argv)
namespace Mohawk {
// Script Types
enum {
kMouseDownScript = 0,
kMouseDownScriptAlt = 1,
kMouseUpScript = 2,
kMouseMovedPressedReleasedScript = 3,
kMouseInsideScript = 4,
kMouseLeaveScript = 5, // This is unconfirmed
kCardLoadScript = 6,
kCardLeaveScript = 7,
kCardOpenScript = 9,
kCardUpdateScript = 10,
kStoredOpcodeScript // This is ScummVM-only to denote the script from a storeMovieOpcode() call
};
class MohawkEngine_Riven;
class RivenScript;
class RivenScript {
public:
RivenScript(MohawkEngine_Riven *vm, Common::SeekableReadStream *stream, uint16 scriptType, uint16 parentStack, uint16 parentCard);
~RivenScript();
void runScript();
void dumpScript(const Common::StringArray &varNames, const Common::StringArray &xNames, byte tabs);
uint16 getScriptType() { return _scriptType; }
uint16 getParentStack() { return _parentStack; }
uint16 getParentCard() { return _parentCard; }
bool isRunning() { return _isRunning; }
void stopRunning() { _continueRunning = false; }
static uint32 calculateScriptSize(Common::SeekableReadStream *script);
private:
typedef void (RivenScript::*OpcodeProcRiven)(uint16 op, uint16 argc, uint16 *argv);
struct RivenOpcode {
OpcodeProcRiven proc;
const char *desc;
};
const RivenOpcode *_opcodes;
void setupOpcodes();
MohawkEngine_Riven *_vm;
Common::SeekableReadStream *_stream;
uint16 _scriptType, _parentStack, _parentCard;
bool _isRunning, _continueRunning;
void dumpCommands(const Common::StringArray &varNames, const Common::StringArray &xNames, byte tabs);
void processCommands(bool runCommands);
static uint32 calculateCommandSize(Common::SeekableReadStream *script);
DECLARE_OPCODE(empty) { warning ("Unknown Opcode %04x", op); }
//Opcodes
DECLARE_OPCODE(drawBitmap);
DECLARE_OPCODE(switchCard);
DECLARE_OPCODE(playScriptSLST);
DECLARE_OPCODE(playSound);
DECLARE_OPCODE(setVariable);
DECLARE_OPCODE(mohawkSwitch);
DECLARE_OPCODE(enableHotspot);
DECLARE_OPCODE(disableHotspot);
DECLARE_OPCODE(stopSound);
DECLARE_OPCODE(changeCursor);
DECLARE_OPCODE(delay);
DECLARE_OPCODE(runExternalCommand);
DECLARE_OPCODE(transition);
DECLARE_OPCODE(refreshCard);
DECLARE_OPCODE(disableScreenUpdate);
DECLARE_OPCODE(enableScreenUpdate);
DECLARE_OPCODE(incrementVariable);
DECLARE_OPCODE(changeStack);
DECLARE_OPCODE(disableMovie);
DECLARE_OPCODE(disableAllMovies);
DECLARE_OPCODE(enableMovie);
DECLARE_OPCODE(playMovieBlocking);
DECLARE_OPCODE(playMovie);
DECLARE_OPCODE(stopMovie);
DECLARE_OPCODE(unk_36);
DECLARE_OPCODE(fadeAmbientSounds);
DECLARE_OPCODE(storeMovieOpcode);
DECLARE_OPCODE(activatePLST);
DECLARE_OPCODE(activateSLST);
DECLARE_OPCODE(activateMLSTAndPlay);
DECLARE_OPCODE(activateBLST);
DECLARE_OPCODE(activateFLST);
DECLARE_OPCODE(zipMode);
DECLARE_OPCODE(activateMLST);
};
typedef Common::Array<RivenScript *> RivenScriptList;
class RivenScriptManager {
public:
RivenScriptManager(MohawkEngine_Riven *vm);
~RivenScriptManager();
RivenScriptList readScripts(Common::SeekableReadStream *stream, bool garbageCollect = true);
void stopAllScripts();
struct StoredMovieOpcode {
RivenScript *script;
uint32 time;
uint16 id;
};
uint16 getStoredMovieOpcodeID() { return _storedMovieOpcode.id; }
uint32 getStoredMovieOpcodeTime() { return _storedMovieOpcode.time; }
void setStoredMovieOpcode(const StoredMovieOpcode &op);
void runStoredMovieOpcode();
void clearStoredMovieOpcode();
private:
void unloadUnusedScripts();
RivenScriptList _currentScripts;
MohawkEngine_Riven *_vm;
StoredMovieOpcode _storedMovieOpcode;
};
} // End of namespace Mohawk
#undef DECLARE_OPCODE
#endif
|