[Scummvm-git-logs] scummvm master -> 7f5e9197c93d4290c7c53c089cacdf5b81e37f37
mgerhardy
noreply at scummvm.org
Fri May 12 07:55:48 UTC 2023
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
7f5e9197c9 TWINE: implemented a few lba2 life script opcodes
Commit: 7f5e9197c93d4290c7c53c089cacdf5b81e37f37
https://github.com/scummvm/scummvm/commit/7f5e9197c93d4290c7c53c089cacdf5b81e37f37
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2023-05-12T06:05:19+02:00
Commit Message:
TWINE: implemented a few lba2 life script opcodes
Changed paths:
engines/twine/renderer/screens.cpp
engines/twine/renderer/screens.h
engines/twine/resources/resources.h
engines/twine/scene/actor.h
engines/twine/scene/gamestate.h
engines/twine/scene/movements.h
engines/twine/script/script_life.cpp
engines/twine/script/script_life.h
engines/twine/script/script_life_v1.cpp
engines/twine/script/script_life_v1.h
engines/twine/script/script_life_v2.cpp
diff --git a/engines/twine/renderer/screens.cpp b/engines/twine/renderer/screens.cpp
index e9961a84806..c0a9e44a7b9 100644
--- a/engines/twine/renderer/screens.cpp
+++ b/engines/twine/renderer/screens.cpp
@@ -23,6 +23,7 @@
#include "common/file.h"
#include "common/str.h"
#include "common/system.h"
+#include "common/util.h"
#include "graphics/managed_surface.h"
#include "graphics/pixelformat.h"
#include "graphics/surface.h"
@@ -36,6 +37,19 @@
namespace TwinE {
+int32 Screens::mapLba2Palette(int32 palIndex) {
+ static const int32 palettes[] {
+ RESSHQR_MAINPAL,
+ -1, // TODO: current palette
+ RESSHQR_BLACKPAL,
+ RESSHQR_ECLAIRPAL
+ };
+ if (palIndex < 0 || palIndex >= ARRAYSIZE(palettes)) {
+ return -1;
+ }
+ return palettes[palIndex];
+}
+
bool Screens::adelineLogo() {
_engine->_music->playMidiMusic(31);
diff --git a/engines/twine/renderer/screens.h b/engines/twine/renderer/screens.h
index 464c583500e..1cfc81a1284 100644
--- a/engines/twine/renderer/screens.h
+++ b/engines/twine/renderer/screens.h
@@ -50,6 +50,8 @@ public:
/** In-game palette (should not be used, except in special case. otherwise use other images functions instead) */
uint8 _palette[NUMOFCOLORS * 3]{0};
+ int32 mapLba2Palette(int32 palIndex);
+
/** converted in-game palette */
uint32 _paletteRGBA[NUMOFCOLORS]{0};
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index 93e412fed5a..2cd3436b198 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -40,13 +40,16 @@ namespace TwinE {
#define RESSHQR_BLANK 2
#define RESSHQR_SPRITEBOXDATA 3
#define RESSHQR_SPRITESHADOW 4
-#define RESSHQR_HOLOPAL 5
-#define RESSHQR_HOLOSURFACE 6
-#define RESSHQR_HOLOIMG 7
-#define RESSHQR_HOLOARROWINFO 8
-#define RESSHQR_HOLOTWINMDL 9
-#define RESSHQR_HOLOARROWMDL 10
-#define RESSHQR_HOLOTWINARROWMDL 11
+#define RESSHQR_HOLOPAL 5 // lba1
+#define RESSHQR_HOLOSURFACE 6 // lba1
+#define RESSHQR_HOLOIMG 7 // lba1
+#define RESSHQR_HOLOARROWINFO 8 // lba1
+#define RESSHQR_HOLOTWINMDL 9 // lba1
+#define RESSHQR_HOLOARROWMDL 10 // lba1
+#define RESSHQR_HOLOTWINARROWMDL 11 // lba1
+
+#define RESSHQR_BLACKPAL 9 // lba2
+#define RESSHQR_ECLAIRPAL 10 // lba2
#define RESSHQR_GAMEOVERMDL 21
diff --git a/engines/twine/scene/actor.h b/engines/twine/scene/actor.h
index 25cf19af0f8..3bca345b7fc 100644
--- a/engines/twine/scene/actor.h
+++ b/engines/twine/scene/actor.h
@@ -164,6 +164,7 @@ public:
int32 _body = -1; // costumeIndex - index into bodyTable
BodyType _genBody = BodyType::btNormal;
+ BodyType _saveGenBody = BodyType::btNormal; // lba2
AnimationTypes _genAnim = AnimationTypes::kAnimNone;
AnimationTypes _nextGenAnim = AnimationTypes::kStanding;
AnimationTypes _ptrAnimAction = AnimationTypes::kAnimNone;
@@ -198,6 +199,7 @@ public:
int32 _moveScriptSize = 0;
int32 _offsetLife = 0;
+ int32 _saveOffsetLife = 0; // lba2
uint8 *_lifeScript = nullptr;
int32 _lifeScriptSize = 0;
@@ -261,8 +263,6 @@ private:
/** Hero 3D entity for protopack behaviour */
EntityData _heroEntityPROTOPACK;
- void initSpriteActor(int32 actorIdx);
-
/**
* Initialize 3D actor body
* @param bodyIdx 3D actor body index
@@ -276,6 +276,7 @@ public:
Actor(TwinEEngine *engine);
HeroBehaviourType _heroBehaviour = HeroBehaviourType::kNormal; // Comportement
+ HeroBehaviourType _saveHeroBehaviour = HeroBehaviourType::kNormal; // SaveComportementHero (lba2)
/** Hero auto aggressive mode */
bool _combatAuto = true;
/** Previous Hero behaviour */
@@ -299,6 +300,8 @@ public:
/** Hero anim for behaviour menu */
int16 _heroAnimIdx[4];
+ void initSpriteActor(int32 actorIdx);
+
/** Restart hero variables while opening new scenes */
void restartHeroScene();
diff --git a/engines/twine/scene/gamestate.h b/engines/twine/scene/gamestate.h
index c2126b060b7..edd0adf21e5 100644
--- a/engines/twine/scene/gamestate.h
+++ b/engines/twine/scene/gamestate.h
@@ -69,7 +69,7 @@ private:
* been closed down). Makes the Tavern open again and groboclone not appear any more.
*/
// TODO: why not NUM_GAME_FLAGS?
- uint8 _gameStateFlags[256];
+ uint8 _gameStateFlags[256]; // ListVarGame
// only lba1 - lba2 uses 253 gameflag
int16 _gameChapter = 0;
@@ -78,7 +78,7 @@ public:
/**
* LBA engine chapter
- * 0: Inprisoned
+ * 0: Imprisoned
* 1: Escape from the citadel
* 2: Zoe got captured
* 3: - looking for a young girl
diff --git a/engines/twine/scene/movements.h b/engines/twine/scene/movements.h
index d860e4a0689..8651b7960ed 100644
--- a/engines/twine/scene/movements.h
+++ b/engines/twine/scene/movements.h
@@ -122,6 +122,8 @@ private:
public:
Movements(TwinEEngine *engine);
+ void setActionNormal(bool actionNormal);
+
void update();
/**
@@ -188,6 +190,10 @@ public:
void doDir(int32 actorIdx);
};
+inline void Movements::setActionNormal(bool actionNormal) {
+ _actionNormal = actionNormal;
+}
+
inline bool Movements::shouldExecuteAction() const {
return _actionNormal;
}
diff --git a/engines/twine/script/script_life.cpp b/engines/twine/script/script_life.cpp
index 8a1f345020b..fbfb7d7765c 100644
--- a/engines/twine/script/script_life.cpp
+++ b/engines/twine/script/script_life.cpp
@@ -1026,7 +1026,7 @@ int32 ScriptLife::lSET_FLAG_CUBE(TwinEEngine *engine, LifeScriptContext &ctx) {
}
/**
- * Set a new behaviour for the current actor. (Paramter = Comportament number)
+ * Set a new behaviour for the current actor. (Parameter = Comportament number)
* @note Opcode @c 0x20
* @note Was only used in the lba editor
*/
@@ -1529,17 +1529,6 @@ int32 ScriptLife::lPLAY_FLA(TwinEEngine *engine, LifeScriptContext &ctx) {
return 0;
}
-/**
- * Play Midis (Parameter = Midis Index)
- * @note Opcode @c 0x41
- */
-int32 ScriptLife::lPLAY_MIDI(TwinEEngine *engine, LifeScriptContext &ctx) {
- const int32 midiIdx = ctx.stream.readByte();
- engine->_music->playMidiMusic(midiIdx); // TODO: improve this
- debugC(3, kDebugLevels::kDebugScripts, "LIFE::PLAY_MIDI(%i)", (int)midiIdx);
- return 0;
-}
-
/**
* To increment the clover box current value.
* @note Opcode @c 0x42
@@ -1856,26 +1845,6 @@ int32 ScriptLife::lEXPLODE_OBJ(TwinEEngine *engine, LifeScriptContext &ctx) {
return 0;
}
-/**
- * Turn on bubbles while actors talk.
- * @note Opcode @c 0x59
- */
-int32 ScriptLife::lBUBBLE_ON(TwinEEngine *engine, LifeScriptContext &ctx) {
- debugC(3, kDebugLevels::kDebugScripts, "LIFE::BUBBLE_ON()");
- engine->_text->_showDialogueBubble = true;
- return 0;
-}
-
-/**
- * Turn off bubbles while actors talk.
- * @note Opcode @c 0x5A
- */
-int32 ScriptLife::lBUBBLE_OFF(TwinEEngine *engine, LifeScriptContext &ctx) {
- debugC(3, kDebugLevels::kDebugScripts, "LIFE::BUBBLE_OFF()");
- engine->_text->_showDialogueBubble = false;
- return 0;
-}
-
/**
* The actor will ask something with choices to choose. (Parameter = Actor Index, Parameter = Text Index in the current Text Bank)
* @note Opcode @c 0x5B
@@ -1997,16 +1966,6 @@ int32 ScriptLife::lTHE_END(TwinEEngine *engine, LifeScriptContext &ctx) {
return 1; // break;
}
-/**
- * Stop the current played midi.
- * @note Opcode @c 0x63
- */
-int32 ScriptLife::lMIDI_OFF(TwinEEngine *engine, LifeScriptContext &ctx) {
- debugC(3, kDebugLevels::kDebugScripts, "LIFE::MIDI_OFF()");
- engine->_music->stopMidiMusic();
- return 0;
-}
-
/**
* Play a CD Track (Paramenter = CD Track).
* @note Opcode @c 0x64
diff --git a/engines/twine/script/script_life.h b/engines/twine/script/script_life.h
index 811bd3ac405..2aab2dec0cd 100644
--- a/engines/twine/script/script_life.h
+++ b/engines/twine/script/script_life.h
@@ -136,7 +136,6 @@ public:
static int32 lSUB_LIFE_POINT_OBJ(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lHIT_OBJ(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lPLAY_FLA(TwinEEngine *engine, LifeScriptContext &ctx);
- static int32 lPLAY_MIDI(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lINC_CLOVER_BOX(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lSET_USED_INVENTORY(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lADD_CHOICE(TwinEEngine *engine, LifeScriptContext &ctx);
@@ -160,8 +159,7 @@ public:
static int32 lFADE_RED_ALARM(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lFADE_PAL_ALARM(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lEXPLODE_OBJ(TwinEEngine *engine, LifeScriptContext &ctx);
- static int32 lBUBBLE_ON(TwinEEngine *engine, LifeScriptContext &ctx);
- static int32 lBUBBLE_OFF(TwinEEngine *engine, LifeScriptContext &ctx);
+
static int32 lASK_CHOICE_OBJ(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lSET_DARK_PAL(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lSET_NORMAL_PAL(TwinEEngine *engine, LifeScriptContext &ctx);
@@ -170,7 +168,6 @@ public:
static int32 lHOLOMAP_TRAJ(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lGAME_OVER(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lTHE_END(TwinEEngine *engine, LifeScriptContext &ctx);
- static int32 lMIDI_OFF(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lPLAY_CD_TRACK(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lPROJ_ISO(TwinEEngine *engine, LifeScriptContext &ctx);
static int32 lPROJ_3D(TwinEEngine *engine, LifeScriptContext &ctx);
diff --git a/engines/twine/script/script_life_v1.cpp b/engines/twine/script/script_life_v1.cpp
index 6a729947a8b..fe224bcce25 100644
--- a/engines/twine/script/script_life_v1.cpp
+++ b/engines/twine/script/script_life_v1.cpp
@@ -20,9 +20,54 @@
*/
#include "twine/script/script_life_v1.h"
+#include "common/debug.h"
+#include "twine/twine.h"
+#include "twine/text.h"
+#include "twine/audio/music.h"
namespace TwinE {
+/**
+ * Turn on bubbles while actors talk.
+ * @note Opcode @c 0x59
+ */
+int32 ScriptLifeV1::lBUBBLE_ON(TwinEEngine *engine, LifeScriptContext &ctx) {
+ debugC(3, kDebugLevels::kDebugScripts, "LIFE::BUBBLE_ON()");
+ engine->_text->_showDialogueBubble = true;
+ return 0;
+}
+
+/**
+ * Turn off bubbles while actors talk.
+ * @note Opcode @c 0x5A
+ */
+int32 ScriptLifeV1::lBUBBLE_OFF(TwinEEngine *engine, LifeScriptContext &ctx) {
+ debugC(3, kDebugLevels::kDebugScripts, "LIFE::BUBBLE_OFF()");
+ engine->_text->_showDialogueBubble = false;
+ return 0;
+}
+
+/**
+ * Play Midis (Parameter = Midis Index)
+ * @note Opcode @c 0x41
+ */
+int32 ScriptLifeV1::lPLAY_MIDI(TwinEEngine *engine, LifeScriptContext &ctx) {
+ const int32 midiIdx = ctx.stream.readByte();
+ engine->_music->playMidiMusic(midiIdx); // TODO: improve this
+ debugC(3, kDebugLevels::kDebugScripts, "LIFE::PLAY_MIDI(%i)", (int)midiIdx);
+ return 0;
+}
+
+/**
+ * Stop the current played midi.
+ * @note Opcode @c 0x63
+ */
+int32 ScriptLifeV1::lMIDI_OFF(TwinEEngine *engine, LifeScriptContext &ctx) {
+ debugC(3, kDebugLevels::kDebugScripts, "LIFE::MIDI_OFF()");
+ engine->_music->stopMidiMusic();
+ return 0;
+}
+
static const ScriptLifeFunction function_map[] = {
{"END", ScriptLifeV1::lEND},
{"NOP", ScriptLifeV1::lNOP},
diff --git a/engines/twine/script/script_life_v1.h b/engines/twine/script/script_life_v1.h
index e34a2820b61..36b9dce275b 100644
--- a/engines/twine/script/script_life_v1.h
+++ b/engines/twine/script/script_life_v1.h
@@ -30,6 +30,11 @@ class TwinEEngine;
class ScriptLifeV1 : public ScriptLife {
public:
+ static int32 lBUBBLE_ON(TwinEEngine *engine, LifeScriptContext &ctx);
+ static int32 lBUBBLE_OFF(TwinEEngine *engine, LifeScriptContext &ctx);
+ static int32 lPLAY_MIDI(TwinEEngine *engine, LifeScriptContext &ctx);
+ static int32 lMIDI_OFF(TwinEEngine *engine, LifeScriptContext &ctx);
+
ScriptLifeV1(TwinEEngine *engine);
};
diff --git a/engines/twine/script/script_life_v2.cpp b/engines/twine/script/script_life_v2.cpp
index 2a71edba002..7c618782cd2 100644
--- a/engines/twine/script/script_life_v2.cpp
+++ b/engines/twine/script/script_life_v2.cpp
@@ -20,96 +20,96 @@
*/
#include "twine/script/script_life_v2.h"
+#include "twine/renderer/screens.h"
#include "twine/resources/resources.h"
+#include "twine/scene/movements.h"
#include "twine/script/script_move_v2.h"
-#include "twine/renderer/screens.h"
#include "twine/twine.h"
namespace TwinE {
static const ScriptLifeFunction function_map[] = {
- {"END", ScriptLifeV2::lEND},
- {"NOP", ScriptLifeV2::lNOP},
- {"SNIF", ScriptLifeV2::lSNIF},
- {"OFFSET", ScriptLifeV2::lOFFSET},
- {"NEVERIF", ScriptLifeV2::lNEVERIF},
- {"", ScriptLifeV2::lEMPTY}, // unused
- {"NO_IF", ScriptLifeV2::lNO_IF},
- {"", ScriptLifeV2::lEMPTY}, // unused
- {"", ScriptLifeV2::lEMPTY}, // unused
- {"", ScriptLifeV2::lEMPTY}, // unused
+ {"END", ScriptLife::lEND},
+ {"NOP", ScriptLife::lNOP},
+ {"SNIF", ScriptLife::lSNIF},
+ {"OFFSET", ScriptLife::lOFFSET},
+ {"NEVERIF", ScriptLife::lNEVERIF},
+ {"", ScriptLife::lEMPTY}, // unused
+ {"NO_IF", ScriptLife::lNO_IF},
+ {"", ScriptLife::lEMPTY}, // unused
+ {"", ScriptLife::lEMPTY}, // unused
+ {"", ScriptLife::lEMPTY}, // unused
{"PALETTE", ScriptLifeV2::lPALETTE},
- {"RETURN", ScriptLifeV2::lRETURN},
- {"IF", ScriptLifeV2::lIF},
- {"SWIF", ScriptLifeV2::lSWIF},
- {"ONEIF", ScriptLifeV2::lONEIF},
- {"ELSE", ScriptLifeV2::lELSE},
- {"ENDIF", ScriptLifeV2::lEMPTY}, // End of a conditional statement (e.g. IF)
- {"BODY", ScriptLifeV2::lBODY},
- {"BODY_OBJ", ScriptLifeV2::lBODY_OBJ},
- {"ANIM", ScriptLifeV2::lANIM},
- {"ANIM_OBJ", ScriptLifeV2::lANIM_OBJ},
+ {"RETURN", ScriptLife::lRETURN},
+ {"IF", ScriptLife::lIF},
+ {"SWIF", ScriptLife::lSWIF},
+ {"ONEIF", ScriptLife::lONEIF},
+ {"ELSE", ScriptLife::lELSE},
+ {"ENDIF", ScriptLife::lEMPTY}, // End of a conditional statement (e.g. IF)
+ {"BODY", ScriptLife::lBODY},
+ {"BODY_OBJ", ScriptLife::lBODY_OBJ},
+ {"ANIM", ScriptLife::lANIM},
+ {"ANIM_OBJ", ScriptLife::lANIM_OBJ},
{"SET_CAMERA", ScriptLifeV2::lSET_CAMERA},
{"CAMERA_CENTER", ScriptLifeV2::lCAMERA_CENTER},
- {"SET_TRACK", ScriptLifeV2::lSET_TRACK},
- {"SET_TRACK_OBJ", ScriptLifeV2::lSET_TRACK_OBJ},
- {"MESSAGE", ScriptLifeV2::lMESSAGE},
- {"FALLABLE", ScriptLifeV2::lFALLABLE},
- {"SET_DIRMODE", ScriptLifeV2::lSET_DIRMODE},
- {"SET_DIRMODE_OBJ", ScriptLifeV2::lSET_DIRMODE_OBJ},
- {"CAM_FOLLOW", ScriptLifeV2::lCAM_FOLLOW},
- {"SET_BEHAVIOUR", ScriptLifeV2::lSET_BEHAVIOUR},
- {"SET_FLAG_CUBE", ScriptLifeV2::lSET_FLAG_CUBE},
- {"COMPORTEMENT", ScriptLifeV2::lCOMPORTEMENT},
- {"SET_COMPORTEMENT", ScriptLifeV2::lSET_COMPORTEMENT},
- {"SET_COMPORTEMENT_OBJ", ScriptLifeV2::lSET_COMPORTEMENT_OBJ},
- {"END_COMPORTEMENT", ScriptLifeV2::lEND_COMPORTEMENT},
- {"SET_FLAG_GAME", ScriptLifeV2::lSET_FLAG_GAME},
- {"KILL_OBJ", ScriptLifeV2::lKILL_OBJ},
- {"SUICIDE", ScriptLifeV2::lSUICIDE},
- {"USE_ONE_LITTLE_KEY", ScriptLifeV2::lUSE_ONE_LITTLE_KEY},
- {"GIVE_GOLD_PIECES", ScriptLifeV2::lGIVE_GOLD_PIECES},
- {"END_LIFE", ScriptLifeV2::lEND_LIFE},
- {"STOP_L_TRACK", ScriptLifeV2::lSTOP_L_TRACK},
- {"RESTORE_L_TRACK", ScriptLifeV2::lRESTORE_L_TRACK},
- {"MESSAGE_OBJ", ScriptLifeV2::lMESSAGE_OBJ},
- {"INC_CHAPTER", ScriptLifeV2::lINC_CHAPTER},
- {"FOUND_OBJECT", ScriptLifeV2::lFOUND_OBJECT},
- {"SET_DOOR_LEFT", ScriptLifeV2::lSET_DOOR_LEFT},
- {"SET_DOOR_RIGHT", ScriptLifeV2::lSET_DOOR_RIGHT},
- {"SET_DOOR_UP", ScriptLifeV2::lSET_DOOR_UP},
- {"SET_DOOR_DOWN", ScriptLifeV2::lSET_DOOR_DOWN},
- {"GIVE_BONUS", ScriptLifeV2::lGIVE_BONUS},
- {"CHANGE_CUBE", ScriptLifeV2::lCHANGE_CUBE},
- {"OBJ_COL", ScriptLifeV2::lOBJ_COL},
- {"BRICK_COL", ScriptLifeV2::lBRICK_COL},
- {"OR_IF", ScriptLifeV2::lOR_IF},
- {"INVISIBLE", ScriptLifeV2::lINVISIBLE},
+ {"SET_TRACK", ScriptLife::lSET_TRACK},
+ {"SET_TRACK_OBJ", ScriptLife::lSET_TRACK_OBJ},
+ {"MESSAGE", ScriptLife::lMESSAGE},
+ {"FALLABLE", ScriptLife::lFALLABLE},
+ {"SET_DIRMODE", ScriptLife::lSET_DIRMODE},
+ {"SET_DIRMODE_OBJ", ScriptLife::lSET_DIRMODE_OBJ},
+ {"CAM_FOLLOW", ScriptLife::lCAM_FOLLOW},
+ {"SET_BEHAVIOUR", ScriptLife::lSET_BEHAVIOUR},
+ {"SET_FLAG_CUBE", ScriptLife::lSET_FLAG_CUBE},
+ {"COMPORTEMENT", ScriptLife::lCOMPORTEMENT},
+ {"SET_COMPORTEMENT", ScriptLife::lSET_COMPORTEMENT},
+ {"SET_COMPORTEMENT_OBJ", ScriptLife::lSET_COMPORTEMENT_OBJ},
+ {"END_COMPORTEMENT", ScriptLife::lEND_COMPORTEMENT},
+ {"SET_FLAG_GAME", ScriptLife::lSET_FLAG_GAME},
+ {"KILL_OBJ", ScriptLife::lKILL_OBJ},
+ {"SUICIDE", ScriptLife::lSUICIDE},
+ {"USE_ONE_LITTLE_KEY", ScriptLife::lUSE_ONE_LITTLE_KEY},
+ {"GIVE_GOLD_PIECES", ScriptLife::lGIVE_GOLD_PIECES},
+ {"END_LIFE", ScriptLife::lEND_LIFE},
+ {"STOP_L_TRACK", ScriptLife::lSTOP_L_TRACK},
+ {"RESTORE_L_TRACK", ScriptLife::lRESTORE_L_TRACK},
+ {"MESSAGE_OBJ", ScriptLife::lMESSAGE_OBJ},
+ {"INC_CHAPTER", ScriptLife::lINC_CHAPTER},
+ {"FOUND_OBJECT", ScriptLife::lFOUND_OBJECT},
+ {"SET_DOOR_LEFT", ScriptLife::lSET_DOOR_LEFT},
+ {"SET_DOOR_RIGHT", ScriptLife::lSET_DOOR_RIGHT},
+ {"SET_DOOR_UP", ScriptLife::lSET_DOOR_UP},
+ {"SET_DOOR_DOWN", ScriptLife::lSET_DOOR_DOWN},
+ {"GIVE_BONUS", ScriptLife::lGIVE_BONUS},
+ {"CHANGE_CUBE", ScriptLife::lCHANGE_CUBE},
+ {"OBJ_COL", ScriptLife::lOBJ_COL},
+ {"BRICK_COL", ScriptLife::lBRICK_COL},
+ {"OR_IF", ScriptLife::lOR_IF},
+ {"INVISIBLE", ScriptLife::lINVISIBLE},
{"SHADOW_OBJ", ScriptLifeV2::lSHADOW_OBJ},
- {"POS_POINT", ScriptLifeV2::lPOS_POINT},
- {"SET_MAGIC_LEVEL", ScriptLifeV2::lSET_MAGIC_LEVEL},
- {"SUB_MAGIC_POINT", ScriptLifeV2::lSUB_MAGIC_POINT},
- {"SET_LIFE_POINT_OBJ", ScriptLifeV2::lSET_LIFE_POINT_OBJ},
- {"SUB_LIFE_POINT_OBJ", ScriptLifeV2::lSUB_LIFE_POINT_OBJ},
- {"HIT_OBJ", ScriptLifeV2::lHIT_OBJ},
+ {"POS_POINT", ScriptLife::lPOS_POINT},
+ {"SET_MAGIC_LEVEL", ScriptLife::lSET_MAGIC_LEVEL},
+ {"SUB_MAGIC_POINT", ScriptLife::lSUB_MAGIC_POINT},
+ {"SET_LIFE_POINT_OBJ", ScriptLife::lSET_LIFE_POINT_OBJ},
+ {"SUB_LIFE_POINT_OBJ", ScriptLife::lSUB_LIFE_POINT_OBJ},
+ {"HIT_OBJ", ScriptLife::lHIT_OBJ},
{"PLAY_ACF", ScriptLifeV2::lPLAY_ACF},
- {"PLAY_MIDI", ScriptLifeV2::lPLAY_MIDI},
{"ECLAIR", ScriptLifeV2::lECLAIR},
- {"INC_CLOVER_BOX", ScriptLifeV2::lINC_CLOVER_BOX},
- {"SET_USED_INVENTORY", ScriptLifeV2::lSET_USED_INVENTORY},
- {"ADD_CHOICE", ScriptLifeV2::lADD_CHOICE},
- {"ASK_CHOICE", ScriptLifeV2::lASK_CHOICE},
+ {"INC_CLOVER_BOX", ScriptLife::lINC_CLOVER_BOX},
+ {"SET_USED_INVENTORY", ScriptLife::lSET_USED_INVENTORY},
+ {"ADD_CHOICE", ScriptLife::lADD_CHOICE},
+ {"ASK_CHOICE", ScriptLife::lASK_CHOICE},
{"INIT_BUGGY", ScriptLifeV2::lINIT_BUGGY},
{"MEMO_ARDOISE", ScriptLifeV2::lMEMO_ARDOISE},
- {"SET_HOLO_POS", ScriptLifeV2::lSET_HOLO_POS},
- {"CLR_HOLO_POS", ScriptLifeV2::lCLR_HOLO_POS},
- {"ADD_FUEL", ScriptLifeV2::lADD_FUEL},
- {"SUB_FUEL", ScriptLifeV2::lSUB_FUEL},
- {"SET_GRM", ScriptLifeV2::lSET_GRM},
+ {"SET_HOLO_POS", ScriptLife::lSET_HOLO_POS},
+ {"CLR_HOLO_POS", ScriptLife::lCLR_HOLO_POS},
+ {"ADD_FUEL", ScriptLife::lADD_FUEL},
+ {"SUB_FUEL", ScriptLife::lSUB_FUEL},
+ {"SET_GRM", ScriptLife::lSET_GRM},
{"SET_CHANGE_CUBE", ScriptLifeV2::lSET_CHANGE_CUBE},
{"MESSAGE_ZOE", ScriptLifeV2::lMESSAGE_ZOE}, // lSAY_MESSAGE
- {"FULL_POINT", ScriptLifeV2::lFULL_POINT},
- {"BETA", ScriptLifeV2::lBETA},
+ {"FULL_POINT", ScriptLife::lFULL_POINT},
+ {"BETA", ScriptLife::lBETA},
{"FADE_TO_PAL", ScriptLifeV2::lFADE_TO_PAL},
{"ACTION", ScriptLifeV2::lACTION},
{"SET_FRAME", ScriptLifeV2::lSET_FRAME},
@@ -120,22 +120,22 @@ static const ScriptLifeFunction function_map[] = {
{"ADD_MESSAGE", ScriptLifeV2::lADD_MESSAGE},
{"BUBBLE", ScriptLifeV2::lBUBBLE},
{"NO_CHOC", ScriptLifeV2::lNO_CHOC},
- {"ASK_CHOICE_OBJ", ScriptLifeV2::lASK_CHOICE_OBJ},
+ {"ASK_CHOICE_OBJ", ScriptLife::lASK_CHOICE_OBJ},
{"CINEMA_MODE", ScriptLifeV2::lCINEMA_MODE},
{"SAVE_HERO", ScriptLifeV2::lSAVE_HERO},
{"RESTORE_HERO", ScriptLifeV2::lRESTORE_HERO},
- {"ANIM_SET", ScriptLifeV2::lANIM_SET},
+ {"ANIM_SET", ScriptLife::lANIM_SET},
{"RAIN", ScriptLifeV2::lRAIN}, // LM_PLUIE
- {"GAME_OVER", ScriptLifeV2::lGAME_OVER},
- {"THE_END", ScriptLifeV2::lTHE_END},
+ {"GAME_OVER", ScriptLife::lGAME_OVER},
+ {"THE_END", ScriptLife::lTHE_END},
{"ESCALATOR", ScriptLifeV2::lESCALATOR},
{"PLAY_MUSIC", ScriptLifeV2::lPLAY_MUSIC},
{"TRACK_TO_VAR_GAME", ScriptLifeV2::lTRACK_TO_VAR_GAME},
{"VAR_GAME_TO_TRACK", ScriptLifeV2::lVAR_GAME_TO_TRACK},
{"ANIM_TEXTURE", ScriptLifeV2::lANIM_TEXTURE},
{"ADD_MESSAGE_OBJ", ScriptLifeV2::lADD_MESSAGE_OBJ},
- {"BRUTAL_EXIT", ScriptLifeV2::lBRUTAL_EXIT},
- {"REM", ScriptLifeV2::lEMPTY}, // unused
+ {"BRUTAL_EXIT", ScriptLife::lBRUTAL_EXIT},
+ {"REM", ScriptLife::lEMPTY}, // unused
{"LADDER", ScriptLifeV2::lLADDER},
{"SET_ARMOR", ScriptLifeV2::lSET_ARMOR},
{"SET_ARMOR_OBJ", ScriptLifeV2::lSET_ARMOR_OBJ},
@@ -145,9 +145,9 @@ static const ScriptLifeFunction function_map[] = {
{"SWITCH", ScriptLifeV2::lSWITCH},
{"OR_CASE", ScriptLifeV2::lOR_CASE},
{"CASE", ScriptLifeV2::lCASE},
- {"DEFAULT", ScriptLifeV2::lEMPTY}, // unused
+ {"DEFAULT", ScriptLife::lEMPTY}, // unused
{"BREAK", ScriptLifeV2::lBREAK},
- {"END_SWITCH", ScriptLifeV2::lEMPTY}, // unused
+ {"END_SWITCH", ScriptLife::lEMPTY}, // unused
{"SET_HIT_ZONE", ScriptLifeV2::lSET_HIT_ZONE},
{"SAVE_COMPORTEMENT", ScriptLifeV2::lSAVE_COMPORTEMENT},
{"RESTORE_COMPORTEMENT", ScriptLifeV2::lRESTORE_COMPORTEMENT},
@@ -161,19 +161,19 @@ static const ScriptLifeFunction function_map[] = {
{"SUB_VAR_GAME", ScriptLifeV2::lSUB_VAR_GAME},
{"ADD_VAR_CUBE", ScriptLifeV2::lADD_VAR_CUBE},
{"SUB_VAR_CUBE", ScriptLifeV2::lSUB_VAR_CUBE},
- {"NOP", ScriptLifeV2::lEMPTY}, // unused
+ {"NOP", ScriptLife::lEMPTY}, // unused
{"SET_RAIL", ScriptLifeV2::lSET_RAIL},
{"INVERSE_BETA", ScriptLifeV2::lINVERSE_BETA},
{"NO_BODY", ScriptLifeV2::lNO_BODY},
- {"GIVE_GOLD_PIECES", ScriptLifeV2::lGIVE_GOLD_PIECES},
+ {"GIVE_GOLD_PIECES", ScriptLife::lGIVE_GOLD_PIECES},
{"STOP_L_TRACK_OBJ", ScriptLifeV2::lSTOP_L_TRACK_OBJ},
{"RESTORE_L_TRACK_OBJ", ScriptLifeV2::lRESTORE_L_TRACK_OBJ},
{"SAVE_COMPORTEMENT_OBJ", ScriptLifeV2::lSAVE_COMPORTEMENT_OBJ},
{"RESTORE_COMPORTEMENT_OBJ", ScriptLifeV2::lRESTORE_COMPORTEMENT_OBJ},
- {"SPY", ScriptLifeV2::lEMPTY}, // unused
- {"DEBUG", ScriptLifeV2::lEMPTY}, // unused
- {"DEBUG_OBJ", ScriptLifeV2::lEMPTY}, // unused
- {"POPCORN", ScriptLifeV2::lEMPTY}, // unused
+ {"SPY", ScriptLife::lEMPTY}, // unused
+ {"DEBUG", ScriptLife::lEMPTY}, // unused
+ {"DEBUG_OBJ", ScriptLife::lEMPTY}, // unused
+ {"POPCORN", ScriptLife::lEMPTY}, // unused
{"FLOW_POINT", ScriptLifeV2::lFLOW_POINT},
{"FLOW_OBJ", ScriptLifeV2::lFLOW_OBJ},
{"SET_ANIM_DIAL", ScriptLifeV2::lSET_ANIM_DIAL},
@@ -187,7 +187,7 @@ static const ScriptLifeFunction function_map[] = {
};
int32 ScriptLifeV2::lPALETTE(TwinEEngine *engine, LifeScriptContext &ctx) {
- const int32 palIndex = ctx.stream.readByte();
+ const int32 palIndex = engine->_screens->mapLba2Palette(ctx.stream.readByte());
debugC(3, kDebugLevels::kDebugScripts, "LIFE::PALETTE(%i)", palIndex);
ScopedEngineFreeze scoped(engine);
HQR::getEntry(engine->_screens->_palette, Resources::HQR_RESS_FILE, palIndex);
@@ -197,13 +197,22 @@ int32 ScriptLifeV2::lPALETTE(TwinEEngine *engine, LifeScriptContext &ctx) {
return 0;
}
+int32 ScriptLifeV2::lFADE_TO_PAL(TwinEEngine *engine, LifeScriptContext &ctx) {
+ const int32 palIndex = engine->_screens->mapLba2Palette(ctx.stream.readByte());
+ debugC(3, kDebugLevels::kDebugScripts, "LIFE::FADE_TO_PAL(%i)", palIndex);
+ // TODO: implement
+ return -1;
+}
+
int32 ScriptLifeV2::lPLAY_MUSIC(TwinEEngine *engine, LifeScriptContext &ctx) {
// TODO: game var 157 is checked here
return lPLAY_CD_TRACK(engine, ctx);
}
int32 ScriptLifeV2::lTRACK_TO_VAR_GAME(TwinEEngine *engine, LifeScriptContext &ctx) {
- return -1;
+ const int32 num = ctx.stream.readByte();
+ engine->_gameState->setGameFlag(num, MAX<int32>(0, ctx.actor->_labelIdx));
+ return 0;
}
int32 ScriptLifeV2::lVAR_GAME_TO_TRACK(TwinEEngine *engine, LifeScriptContext &ctx) {
@@ -227,7 +236,9 @@ int32 ScriptLifeV2::lCAMERA_CENTER(TwinEEngine *engine, LifeScriptContext &ctx)
}
int32 ScriptLifeV2::lBUBBLE(TwinEEngine *engine, LifeScriptContext &ctx) {
- return -1;
+ engine->_text->_showDialogueBubble = ctx.stream.readByte();
+ debugC(3, kDebugLevels::kDebugScripts, "LIFE::BUBBLE(%s)", engine->_text->_showDialogueBubble ? "true" : "false");
+ return 0;
}
int32 ScriptLifeV2::lNO_CHOC(TwinEEngine *engine, LifeScriptContext &ctx) {
@@ -239,11 +250,19 @@ int32 ScriptLifeV2::lCINEMA_MODE(TwinEEngine *engine, LifeScriptContext &ctx) {
}
int32 ScriptLifeV2::lSAVE_HERO(TwinEEngine *engine, LifeScriptContext &ctx) {
- return -1;
+ debugC(3, kDebugLevels::kDebugScripts, "LIFE::SAVE_HERO()");
+ engine->_actor->_saveHeroBehaviour = engine->_actor->_heroBehaviour;
+ ActorStruct *actor = engine->_scene->getActor(OWN_ACTOR_SCENE_INDEX);
+ actor->_saveGenBody = actor->_genBody;
+ return 0;
}
int32 ScriptLifeV2::lRESTORE_HERO(TwinEEngine *engine, LifeScriptContext &ctx) {
- return -1;
+ debugC(3, kDebugLevels::kDebugScripts, "LIFE::RESTORE_HERO()");
+ engine->_actor->setBehaviour(engine->_actor->_saveHeroBehaviour);
+ ActorStruct *actor = engine->_scene->getActor(OWN_ACTOR_SCENE_INDEX);
+ engine->_actor->initBody(actor->_saveGenBody, OWN_ACTOR_SCENE_INDEX);
+ return 0;
}
int32 ScriptLifeV2::lRAIN(TwinEEngine *engine, LifeScriptContext &ctx) {
@@ -263,7 +282,14 @@ int32 ScriptLifeV2::lPLAY_ACF(TwinEEngine *engine, LifeScriptContext &ctx) {
}
int32 ScriptLifeV2::lSHADOW_OBJ(TwinEEngine *engine, LifeScriptContext &ctx) {
- return -1;
+ const int actorIdx = ctx.stream.readByte();
+ const bool castShadow = ctx.stream.readByte();
+ debugC(3, kDebugLevels::kDebugScripts, "LIFE::SHADOW_OBJ(%i, %s)", actorIdx, castShadow ? "true" : "false");
+ ActorStruct *actor = engine->_scene->getActor(actorIdx);
+ if (actor->_lifePoint > 0) {
+ actor->_staticFlags.bDoesntCastShadow = !castShadow;
+ }
+ return 0;
}
int32 ScriptLifeV2::lECLAIR(TwinEEngine *engine, LifeScriptContext &ctx) {
@@ -286,12 +312,10 @@ int32 ScriptLifeV2::lMESSAGE_ZOE(TwinEEngine *engine, LifeScriptContext &ctx) {
return -1;
}
-int32 ScriptLifeV2::lFADE_TO_PAL(TwinEEngine *engine, LifeScriptContext &ctx) {
- return -1;
-}
-
int32 ScriptLifeV2::lACTION(TwinEEngine *engine, LifeScriptContext &ctx) {
- return -1;
+ debugC(3, kDebugLevels::kDebugScripts, "LIFE::ACTION()");
+ engine->_movements->setActionNormal(true);
+ return 0;
}
int32 ScriptLifeV2::lSET_FRAME(TwinEEngine *engine, LifeScriptContext &ctx) {
@@ -299,7 +323,13 @@ int32 ScriptLifeV2::lSET_FRAME(TwinEEngine *engine, LifeScriptContext &ctx) {
}
int32 ScriptLifeV2::lSET_SPRITE(TwinEEngine *engine, LifeScriptContext &ctx) {
- return -1;
+ int16 num = ctx.stream.readSint16LE();
+ if (ctx.actor->_staticFlags.bIsSpriteActor) {
+ ActorStruct *actor = engine->_scene->getActor(ctx.actorIdx);
+ actor->_sprite = num;
+ engine->_actor->initSpriteActor(ctx.actorIdx);
+ }
+ return 0;
}
int32 ScriptLifeV2::lSET_FRAME_3DS(TwinEEngine *engine, LifeScriptContext &ctx) {
@@ -342,7 +372,7 @@ int32 ScriptLifeV2::lSWITCH(TwinEEngine *engine, LifeScriptContext &ctx) {
return -1;
}
-int32 ScriptLifeV2::lOR_CASE (TwinEEngine *engine, LifeScriptContext &ctx) {
+int32 ScriptLifeV2::lOR_CASE(TwinEEngine *engine, LifeScriptContext &ctx) {
return -1;
}
@@ -367,11 +397,13 @@ int32 ScriptLifeV2::lSET_HIT_ZONE(TwinEEngine *engine, LifeScriptContext &ctx) {
}
int32 ScriptLifeV2::lSAVE_COMPORTEMENT(TwinEEngine *engine, LifeScriptContext &ctx) {
- return -1;
+ ctx.actor->_saveOffsetLife = ctx.actor->_offsetLife;
+ return 0;
}
int32 ScriptLifeV2::lRESTORE_COMPORTEMENT(TwinEEngine *engine, LifeScriptContext &ctx) {
- return -1;
+ ctx.actor->_offsetLife = ctx.actor->_saveOffsetLife;
+ return 0;
}
int32 ScriptLifeV2::lSAMPLE(TwinEEngine *engine, LifeScriptContext &ctx) {
@@ -462,7 +494,7 @@ int32 ScriptLifeV2::lFLOW_POINT(TwinEEngine *engine, LifeScriptContext &ctx) {
return -1;
}
-int32 ScriptLifeV2::lFLOW_OBJ (TwinEEngine *engine, LifeScriptContext &ctx) {
+int32 ScriptLifeV2::lFLOW_OBJ(TwinEEngine *engine, LifeScriptContext &ctx) {
return -1;
}
@@ -486,7 +518,7 @@ int32 ScriptLifeV2::lPARM_SAMPLE(TwinEEngine *engine, LifeScriptContext &ctx) {
return -1;
}
-int32 ScriptLifeV2::lNEW_SAMPLE (TwinEEngine *engine, LifeScriptContext &ctx) {
+int32 ScriptLifeV2::lNEW_SAMPLE(TwinEEngine *engine, LifeScriptContext &ctx) {
return -1;
}
More information about the Scummvm-git-logs
mailing list