aboutsummaryrefslogtreecommitdiff
path: root/engines/m4/mads_logic.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/m4/mads_logic.h')
-rw-r--r--engines/m4/mads_logic.h52
1 files changed, 49 insertions, 3 deletions
diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h
index ec6eff368b..adafe6f93d 100644
--- a/engines/m4/mads_logic.h
+++ b/engines/m4/mads_logic.h
@@ -29,10 +29,38 @@
#ifndef M4_MADS_LOGIC_H
#define M4_MADS_LOGIC_H
+#include "common/hashmap.h"
+#include "common/hash-str.h"
+#include "common/stack.h"
#include "m4/mads_views.h"
namespace M4 {
+union ScriptVarValue {
+ const char *strValue;
+ uint32 intValue;
+};
+
+/**
+ * Specifies a script variable that either be a 32-bit unsigned integer or a string pointer
+ */
+class ScriptVar {
+private:
+ ScriptVarValue _value;
+ bool _isInt;
+public:
+ ScriptVar(uint32 v = 0) { _value.intValue = v; _isInt = true; }
+ ScriptVar(const char *s) { _value.strValue = s; _isInt = false; }
+
+ void set(uint32 v) { _value.intValue = v; _isInt = true; }
+ void set(const char *s) { _value.strValue = s; _isInt = false; }
+ const char *getStr() const { assert(!_isInt); return _value.strValue; }
+ uint32 get() const { assert(_isInt); return _value.intValue; }
+ bool isInt() const { return _isInt; }
+
+ operator int() { return get(); }
+};
+
class MadsSceneLogic {
private:
// Library interface methods
@@ -41,27 +69,45 @@ private:
uint16 startCycledSpriteSequence(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks);
uint16 startSpriteSequence3(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks);
void activateHotspot(int idx, bool active);
- void lowRoomsEntrySound();
void getPlayerSpritesPrefix();
void getPlayerSpritesPrefix2();
private:
int _sceneNumber;
int16 _spriteIndexes[50];
+ byte *_scriptsData;
+ int _scriptsSize;
+ Common::HashMap<Common::String, uint32> _subroutines;
+ Common::Array<uint32> _subroutineOffsets;
+
+ enum SubFormatIndex {SUBFORMAT_ENTER, SUBFORMAT_STEP, SUBFORMAT_PREACTIONS, SUBFORMAT_ACTIONS};
+ static const char *subFormatList[];
+ static const char *_opcodeStrings[];
// Support functions
const char *formAnimName(char sepChar, int16 suffixNum);
void getSceneSpriteSet();
void getAnimName();
- IntStorage &dataMap();
+ DataMap &dataMap();
+ void getCallParameters(int numParams, Common::Stack<ScriptVar> &stack, ScriptVar *callParams);
public:
+ MadsSceneLogic() { _scriptsData = NULL; }
+ ~MadsSceneLogic() { delete _scriptsData; }
+
+ void initialiseScripts();
+ void initialiseDataMap();
void selectScene(int sceneNum);
void setupScene();
- void enterScene();
+ void doEnterScene();
void doPreactions();
void doAction();
void doSceneStep();
+
+ void execute(const Common::String &scriptName);
+ void execute(uint32 scriptOffset);
+ uint32 getParam(uint32 &scriptOffset, int opcode);
+ void callSubroutine(int subIndex, Common::Stack<ScriptVar> &stack);
};
class MadsGameLogic {