[Scummvm-git-logs] scummvm master -> a9aa2dba5d8122d2ca6be97b75c5648c9f71ad63
mgerhardy
martin.gerhardy at gmail.com
Fri Oct 30 16:23:20 UTC 2020
This automated email contains information about 18 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
07d9af7259 TWINE: HQRDepack doesn't need the engine pointer
ef9fc9f64a TWINE: hide data structures
d583ad076a TWINE: one abort action to cancel the whole intro loop
7646fcc7b3 TWINE: reduced debug level
d5d4118470 TWINE: allow to abort fullscreen text intro
9a850283ba TWINE: fixed assert in copyBlockPhys
09721f2aac TWINE: removed TWINE_PLAY_INTROS define
e98df188f1 TWINE: converted to boolean
8340c196e5 TWINE: added ScriptContext
bd4fa2e708 TWINE: cleanup in move script
01dc17647a TWINE: replaced magic number
02409852aa TWINE: replaced magic number
526a63610c TWINE: added give_key debug command
e181baf0e6 TWINE: activate some of the scummvm features
f9fa523c62 TWINE: changed engine init message
dba162cae0 TWINE: reduced scope
d72a0ed1f3 TWINE: removed unused method
a9aa2dba5d TWINE: stop all running samples for a new game
Commit: 07d9af7259e5f75635d094210f24272d80b9c01a
https://github.com/scummvm/scummvm/commit/07d9af7259e5f75635d094210f24272d80b9c01a
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: HQRDepack doesn't need the engine pointer
Changed paths:
engines/twine/hqrdepack.cpp
engines/twine/hqrdepack.h
engines/twine/twine.cpp
diff --git a/engines/twine/hqrdepack.cpp b/engines/twine/hqrdepack.cpp
index c9c3369c63..f6b99c6349 100644
--- a/engines/twine/hqrdepack.cpp
+++ b/engines/twine/hqrdepack.cpp
@@ -28,8 +28,6 @@
namespace TwinE {
-HQRDepack::HQRDepack(TwinEEngine *engine) : _engine(engine) {}
-
#define wrap(cmd) if ((cmd) == 0) { warning("Failed to execute " #cmd ); return 0; }
void HQRDepack::hqrDecompressEntry(uint8 *dst, uint8 *src, int32 decompsize, int32 mode) {
diff --git a/engines/twine/hqrdepack.h b/engines/twine/hqrdepack.h
index 0ee512b097..9eb837c917 100644
--- a/engines/twine/hqrdepack.h
+++ b/engines/twine/hqrdepack.h
@@ -36,8 +36,6 @@ class TwinEEngine;
*/
class HQRDepack {
private:
- TwinEEngine *_engine;
-
/**
* Get a HQR entry pointer
* @param filename HQR file name
@@ -63,8 +61,6 @@ private:
void hqrDecompressEntry(uint8 *dst, uint8 *src, int32 decompsize, int32 mode);
public:
- HQRDepack(TwinEEngine *engine);
-
/**
* Get a HQR entry pointer
* @param ptr pointer to save the entry
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 88036a3a6c..7e9033059a 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -85,7 +85,7 @@ TwinEEngine::TwinEEngine(OSystem *system, Common::Language language, uint32 flag
_gameState = new GameState(this);
_grid = new Grid(this);
_movements = new Movements(this);
- _hqrdepack = new HQRDepack(this);
+ _hqrdepack = new HQRDepack();
_interface = new Interface(this);
_menu = new Menu(this);
_flaMovies = new FlaMovies(this);
Commit: ef9fc9f64a6c1a084c5718bac29ab32d3fe7a877
https://github.com/scummvm/scummvm/commit/ef9fc9f64a6c1a084c5718bac29ab32d3fe7a877
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: hide data structures
Changed paths:
engines/twine/flamovies.cpp
engines/twine/flamovies.h
diff --git a/engines/twine/flamovies.cpp b/engines/twine/flamovies.cpp
index 703c0067dc..e95177d496 100644
--- a/engines/twine/flamovies.cpp
+++ b/engines/twine/flamovies.cpp
@@ -32,6 +32,32 @@
namespace TwinE {
+/** FLA Frame Opcode types */
+enum FlaFrameOpcode {
+ kLoadPalette = 0,
+ kFade = 1,
+ kPlaySample = 2,
+ kStopSample = 4,
+ kDeltaFrame = 5,
+ kKeyFrame = 7
+};
+
+/** FLA movie sample structure */
+struct FLASampleStruct {
+ /** Number os samples */
+ int16 sampleNum = 0;
+ /** Sample frequency */
+ int16 freq = 0;
+ /** Numbers of time to repeat */
+ int16 repeat = 0;
+ /** Dummy variable */
+ int8 dummy = 0;
+ /** Unknown x */
+ uint8 x = 0;
+ /** Unknown y */
+ uint8 y = 0;
+};
+
/** FLA movie extension */
#define FLA_EXT ".fla"
@@ -264,10 +290,7 @@ void FlaMovies::playFlaMovie(const char *flaName) {
samplesInFla = file.readUint16LE();
file.skip(2);
- for (int32 i = 0; i < samplesInFla; i++) {
- flaSampleTable[i] = file.readSint16LE();
- file.skip(2);
- }
+ file.skip(4 * samplesInFla);
if (!strcmp((const char *)flaHeaderData.version, "V1.3")) {
int32 currentFrame = 0;
diff --git a/engines/twine/flamovies.h b/engines/twine/flamovies.h
index 3cc00b30ab..c2d3e692d2 100644
--- a/engines/twine/flamovies.h
+++ b/engines/twine/flamovies.h
@@ -59,32 +59,6 @@ struct FLAFrameDataStruct {
int32 frameVar0 = 0;
};
-/** FLA movie sample structure */
-struct FLASampleStruct {
- /** Number os samples */
- int16 sampleNum = 0;
- /** Sample frequency */
- int16 freq = 0;
- /** Numbers of time to repeat */
- int16 repeat = 0;
- /** Dummy variable */
- int8 dummy = 0;
- /** Unknown x */
- uint8 x = 0;
- /** Unknown y */
- uint8 y = 0;
-};
-
-/** FLA Frame Opcode types */
-enum FlaFrameOpcode {
- kLoadPalette = 0,
- kFade = 1,
- kPlaySample = 2,
- kStopSample = 4,
- kDeltaFrame = 5,
- kKeyFrame = 7
-};
-
class TwinEEngine;
class FlaMovies {
@@ -98,8 +72,9 @@ private:
/** Auxiliar FLA fade out variable to count frames between the fade */
int32 fadeOutFrames = 0;
- /** FLA movie sample auxiliar table */
- int32 flaSampleTable[100] {0};
+ /** FLA movie file buffer */
+ uint8 flaBuffer[FLASCREEN_WIDTH * FLASCREEN_HEIGHT] {0};
+
/** Number of samples in FLA movie */
int32 samplesInFla = 0;
/** FLA movie header data */
@@ -120,9 +95,6 @@ private:
public:
FlaMovies(TwinEEngine *engine);
- /** FLA movie file buffer */
- uint8 flaBuffer[FLASCREEN_WIDTH * FLASCREEN_HEIGHT] {0};
-
/**
* Play FLA movies
* @param flaName FLA movie name
Commit: d583ad076a4480f0d30129e2fd8563209ae54b39
https://github.com/scummvm/scummvm/commit/d583ad076a4480f0d30129e2fd8563209ae54b39
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: one abort action to cancel the whole intro loop
Changed paths:
engines/twine/screens.cpp
engines/twine/screens.h
engines/twine/twine.cpp
engines/twine/twine.h
diff --git a/engines/twine/screens.cpp b/engines/twine/screens.cpp
index 83d211fed0..cf54cffa4a 100644
--- a/engines/twine/screens.cpp
+++ b/engines/twine/screens.cpp
@@ -30,11 +30,14 @@
namespace TwinE {
-void Screens::adelineLogo() {
+bool Screens::adelineLogo() {
_engine->_music->playMidiMusic(31);
- loadImageDelay(RESSHQR_ADELINEIMG, 7);
+ if (loadImageDelay(RESSHQR_ADELINEIMG, 7)) {
+ return true;
+ }
palCustom = true;
+ return false;
}
void Screens::loadMenuImage(bool fade_in) {
@@ -88,10 +91,14 @@ void Screens::loadImage(int32 index, bool fade_in) {
palCustom = true;
}
-void Screens::loadImageDelay(int32 index, int32 time) {
+bool Screens::loadImageDelay(int32 index, int32 seconds) {
loadImage(index);
- _engine->delaySkip(1000 * time);
+ if (_engine->delaySkip(1000 * seconds)) {
+ adjustPalette(0, 0, 0, paletteRGBACustom, 100);
+ return true;
+ }
fadeOut(paletteRGBACustom);
+ return false;
}
void Screens::fadeIn(uint32 *pal) {
diff --git a/engines/twine/screens.h b/engines/twine/screens.h
index 7707a0de31..b73bce29e9 100644
--- a/engines/twine/screens.h
+++ b/engines/twine/screens.h
@@ -66,7 +66,7 @@ public:
uint32 mainPaletteRGBA[NUMOFCOLORS]{0};
/** Load and display Adeline Logo */
- void adelineLogo();
+ bool adelineLogo();
void convertPalToRGBA(const uint8 *in, uint32 *out);
@@ -89,9 +89,9 @@ public:
/**
* Load and display a particulary image on \a RESS.HQR file with cross fade effect and delay
* @param index \a RESS.HQR entry index (starting from 0)
- * @param time number of seconds to delay
+ * @param seconds number of seconds to delay
*/
- void loadImageDelay(int32 index, int32 time);
+ bool loadImageDelay(int32 index, int32 seconds);
/**
* Fade image in
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 7e9033059a..8fca8ab0ee 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -299,28 +299,34 @@ void TwinEEngine::initEngine() {
#if TWINE_PLAY_INTROS
_input->enableKeyMap(cutsceneKeyMapId);
// Display company logo
- _screens->adelineLogo();
+ bool abort = false;
+ abort |= _screens->adelineLogo();
// verify game version screens
- if (cfgfile.Version == EUROPE_VERSION) {
+ if (!abort && cfgfile.Version == EUROPE_VERSION) {
// Little Big Adventure screen
- _screens->loadImageDelay(RESSHQR_LBAIMG, 3);
- // Electronic Arts Logo
- _screens->loadImageDelay(RESSHQR_EAIMG, 2);
- } else if (cfgfile.Version == USA_VERSION) {
+ abort |= _screens->loadImageDelay(RESSHQR_LBAIMG, 3);
+ if (!abort) {
+ // Electronic Arts Logo
+ abort |= _screens->loadImageDelay(RESSHQR_EAIMG, 2);
+ }
+ } else if (!abort && cfgfile.Version == USA_VERSION) {
// Relentless screen
- _screens->loadImageDelay(RESSHQR_RELLENTIMG, 3);
- // Electronic Arts Logo
- _screens->loadImageDelay(RESSHQR_EAIMG, 2);
- } else if (cfgfile.Version == MODIFICATION_VERSION) {
+ abort |= _screens->loadImageDelay(RESSHQR_RELLENTIMG, 3);
+ if (!abort) {
+ // Electronic Arts Logo
+ abort |= _screens->loadImageDelay(RESSHQR_EAIMG, 2);
+ }
+ } else if (!abort && cfgfile.Version == MODIFICATION_VERSION) {
// Modification screen
- _screens->loadImageDelay(RESSHQR_RELLENTIMG, 2);
+ abort |= _screens->loadImageDelay(RESSHQR_RELLENTIMG, 2);
}
- _flaMovies->playFlaMovie(FLA_DRAGON3);
-#else
- _input->enableKeyMap(uiKeyMapId);
+ if (!abort) {
+ _flaMovies->playFlaMovie(FLA_DRAGON3);
+ }
#endif
+ _input->enableKeyMap(uiKeyMapId);
_screens->loadMenuImage();
}
@@ -830,21 +836,22 @@ bool TwinEEngine::gameEngineLoop() { // mainLoop
return false;
}
-void TwinEEngine::delaySkip(uint32 time) {
+bool TwinEEngine::delaySkip(uint32 time) {
uint32 startTicks = _system->getMillis();
uint32 stopTicks = 0;
do {
readKeys();
if (_input->toggleAbortAction()) {
- break;
+ return true;
}
if (shouldQuit()) {
- break;
+ return true;
}
stopTicks = _system->getMillis() - startTicks;
_system->delayMillis(1);
//lbaTime++;
} while (stopTicks <= time);
+ return false;
}
void TwinEEngine::setPalette(const uint32 *palette) {
diff --git a/engines/twine/twine.h b/engines/twine/twine.h
index ec1f35ee8b..986b556d17 100644
--- a/engines/twine/twine.h
+++ b/engines/twine/twine.h
@@ -269,7 +269,7 @@ public:
* Deplay certain seconds till proceed - Can also Skip this delay
* @param time time in seconds to delay
*/
- void delaySkip(uint32 time);
+ bool delaySkip(uint32 time);
/**
* Set a new palette in the SDL screen buffer
Commit: 7646fcc7b39e12b7b84482402f155ec02f71440c
https://github.com/scummvm/scummvm/commit/7646fcc7b39e12b7b84482402f155ec02f71440c
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: reduced debug level
Changed paths:
engines/twine/screens.cpp
diff --git a/engines/twine/screens.cpp b/engines/twine/screens.cpp
index cf54cffa4a..b1da7253bf 100644
--- a/engines/twine/screens.cpp
+++ b/engines/twine/screens.cpp
@@ -79,7 +79,7 @@ void Screens::loadImage(int32 index, bool fade_in) {
warning("Failed to load image with index %i", index);
return;
}
- debug("Load image: %i", index);
+ debug(0, "Load image: %i", index);
copyScreen(_engine->workVideoBuffer, _engine->frontVideoBuffer);
loadCustomPalette(index + 1);
if (fade_in) {
Commit: d5d41184708c09ad53ac60fd407cd5931a4e661b
https://github.com/scummvm/scummvm/commit/d5d41184708c09ad53ac60fd407cd5931a4e661b
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: allow to abort fullscreen text intro
Changed paths:
engines/twine/menuoptions.cpp
engines/twine/text.cpp
engines/twine/text.h
diff --git a/engines/twine/menuoptions.cpp b/engines/twine/menuoptions.cpp
index 220f9f9ced..5010b9893f 100644
--- a/engines/twine/menuoptions.cpp
+++ b/engines/twine/menuoptions.cpp
@@ -60,23 +60,28 @@ void MenuOptions::newGame() {
_engine->_text->textClipFull();
_engine->_text->setFontCrossColor(15);
- _engine->_text->drawTextFullscreen(150);
+ bool aborted = _engine->_text->drawTextFullscreen(150);
// intro screen 2
- _engine->_screens->loadImage(RESSHQR_INTROSCREEN2IMG);
- _engine->_text->drawTextFullscreen(151);
-
- _engine->_screens->loadImage(RESSHQR_INTROSCREEN3IMG);
- _engine->_text->drawTextFullscreen(152);
+ if (!aborted) {
+ _engine->_screens->loadImage(RESSHQR_INTROSCREEN2IMG);
+ aborted |= _engine->_text->drawTextFullscreen(151);
+ if (!aborted) {
+ _engine->_screens->loadImage(RESSHQR_INTROSCREEN3IMG);
+ aborted |= _engine->_text->drawTextFullscreen(152);
+ }
+ }
_engine->cfgfile.FlagDisplayText = tmpFlagDisplayText;
_engine->_screens->fadeToBlack(_engine->_screens->paletteRGBACustom);
_engine->_screens->clearScreen();
_engine->flip();
- // _engine->_music->playMidiMusic(1);
- _engine->_flaMovies->playFlaMovie(FLA_INTROD);
+ if (!aborted) {
+ // _engine->_music->playMidiMusic(1);
+ _engine->_flaMovies->playFlaMovie(FLA_INTROD);
+ }
#endif
_engine->_text->textClipSmall();
diff --git a/engines/twine/text.cpp b/engines/twine/text.cpp
index 8771c28455..417b46602c 100644
--- a/engines/twine/text.cpp
+++ b/engines/twine/text.cpp
@@ -577,7 +577,7 @@ int Text::printText10() {
}
// TODO: refactor this code
-void Text::drawTextFullscreen(int32 index) {
+bool Text::drawTextFullscreen(int32 index) {
ScopedKeyMap scopedKeyMap(_engine, cutsceneKeyMapId);
_engine->_interface->saveClip();
@@ -587,13 +587,15 @@ void Text::drawTextFullscreen(int32 index) {
// get right VOX entry index
initVoxToPlay(index);
+ bool aborted = false;
+
// if we don't display text, than still plays vox file
if (_engine->cfgfile.FlagDisplayText) {
initText(index);
initDialogueBox();
int32 printedText;
- do {
+ for (;;) {
_engine->readKeys();
printedText = printText10();
playVox(currDialTextEntry);
@@ -602,11 +604,12 @@ void Text::drawTextFullscreen(int32 index) {
break;
}
- if (_engine->shouldQuit()) {
+ if (_engine->shouldQuit() || _engine->_input->toggleAbortAction()) {
+ aborted = true;
break;
}
_engine->_system->delayMillis(1);
- } while (!_engine->_input->toggleAbortAction());
+ }
hasHiddenVox = false;
stopVox(currDialTextEntry);
@@ -615,24 +618,23 @@ void Text::drawTextFullscreen(int32 index) {
if (printedText != 0) {
_engine->_interface->loadClip();
- return;
+ return aborted;
}
// wait displaying text
- do {
+ for (;;) {
_engine->readKeys();
- if (_engine->shouldQuit()) {
+ if (_engine->shouldQuit() || _engine->_input->toggleAbortAction()) {
+ aborted = true;
break;
}
_engine->_system->delayMillis(1);
- } while (!_engine->_input->toggleAbortAction());
+ }
} else { // RECHECK THIS
while (playVox(currDialTextEntry)) {
_engine->readKeys();
- if (_engine->shouldQuit()) {
- break;
- }
- if (_engine->_input->toggleAbortAction()) {
+ if (_engine->shouldQuit() || _engine->_input->toggleAbortAction()) {
+ aborted = true;
break;
}
_engine->_system->delayMillis(1);
@@ -644,6 +646,7 @@ void Text::drawTextFullscreen(int32 index) {
stopVox(currDialTextEntry);
_engine->_interface->loadClip();
+ return aborted;
}
void Text::setFontParameters(int32 spaceBetween, int32 charSpace) {
diff --git a/engines/twine/text.h b/engines/twine/text.h
index c29963ee60..e66760bd3e 100644
--- a/engines/twine/text.h
+++ b/engines/twine/text.h
@@ -165,7 +165,7 @@ public:
*/
void drawText(int32 x, int32 y, const char *dialogue);
- void drawTextFullscreen(int32 index);
+ bool drawTextFullscreen(int32 index);
/**
* Gets dialogue text width size
Commit: 9a850283ba459c7589a9af0995ca487c110fb2e5
https://github.com/scummvm/scummvm/commit/9a850283ba459c7589a9af0995ca487c110fb2e5
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: fixed assert in copyBlockPhys
Changed paths:
engines/twine/twine.cpp
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 8fca8ab0ee..c63a94d9a5 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -877,11 +877,17 @@ void TwinEEngine::flip() {
void TwinEEngine::copyBlockPhys(int32 left, int32 top, int32 right, int32 bottom) {
assert(left <= right);
assert(top <= bottom);
- const int32 width = right - left + 1;
- const int32 height = bottom - top + 1;
+ int32 width = right - left + 1;
+ int32 height = bottom - top + 1;
if (width <= 0 || height <= 0) {
return;
}
+ if (width > SCREEN_WIDTH) {
+ width = SCREEN_WIDTH;
+ }
+ if (height > SCREEN_HEIGHT) {
+ height = SCREEN_HEIGHT;
+ }
g_system->copyRectToScreen(frontVideoBuffer.getBasePtr(left, top), frontVideoBuffer.pitch, left, top, width, height);
g_system->updateScreen();
}
Commit: 09721f2aac612e59873f01de63e1fff3f439931c
https://github.com/scummvm/scummvm/commit/09721f2aac612e59873f01de63e1fff3f439931c
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: removed TWINE_PLAY_INTROS define
Changed paths:
engines/twine/menuoptions.cpp
engines/twine/twine.cpp
engines/twine/twine.h
diff --git a/engines/twine/menuoptions.cpp b/engines/twine/menuoptions.cpp
index 5010b9893f..8b23ed3432 100644
--- a/engines/twine/menuoptions.cpp
+++ b/engines/twine/menuoptions.cpp
@@ -46,7 +46,6 @@ static const char allowedCharIndex[] = " ABCDEFGHIJKLM.NOPQRSTUVWXYZ-abcdefghijk
void MenuOptions::newGame() {
_engine->_music->stopMusic();
-#if TWINE_PLAY_INTROS
int32 tmpFlagDisplayText = _engine->cfgfile.FlagDisplayText;
_engine->cfgfile.FlagDisplayText = true;
@@ -82,7 +81,6 @@ void MenuOptions::newGame() {
// _engine->_music->playMidiMusic(1);
_engine->_flaMovies->playFlaMovie(FLA_INTROD);
}
-#endif
_engine->_text->textClipSmall();
_engine->_screens->clearScreen();
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index c63a94d9a5..f076f9d346 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -296,7 +296,6 @@ void TwinEEngine::initEngine() {
// Check if LBA CD-Rom is on drive
_music->initCdrom();
-#if TWINE_PLAY_INTROS
_input->enableKeyMap(cutsceneKeyMapId);
// Display company logo
bool abort = false;
@@ -325,7 +324,6 @@ void TwinEEngine::initEngine() {
if (!abort) {
_flaMovies->playFlaMovie(FLA_DRAGON3);
}
-#endif
_input->enableKeyMap(uiKeyMapId);
_screens->loadMenuImage();
diff --git a/engines/twine/twine.h b/engines/twine/twine.h
index 986b556d17..35f2288bb1 100644
--- a/engines/twine/twine.h
+++ b/engines/twine/twine.h
@@ -60,8 +60,6 @@ namespace TwinE {
/** Number of colors used in the game */
#define NUMOFCOLORS 256
-#define TWINE_PLAY_INTROS 1
-
static const struct TwinELanguage {
const char *name;
const char *id;
Commit: e98df188f156d9f5e1204874faa37ff985b0fe61
https://github.com/scummvm/scummvm/commit/e98df188f156d9f5e1204874faa37ff985b0fe61
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: converted to boolean
Changed paths:
engines/twine/scene.cpp
engines/twine/twine.cpp
engines/twine/twine.h
diff --git a/engines/twine/scene.cpp b/engines/twine/scene.cpp
index 2074181a2d..7c25ba8fe9 100644
--- a/engines/twine/scene.cpp
+++ b/engines/twine/scene.cpp
@@ -314,7 +314,7 @@ void Scene::changeScene() {
}
_engine->_gameState->inventoryNumKeys = 0;
- _engine->disableScreenRecenter = 0;
+ _engine->disableScreenRecenter = false;
heroPositionType = ScenePositionType::kNoPosition;
sampleAmbienceTime = 0;
@@ -445,7 +445,7 @@ void Scene::processActorZones(int32 actorIdx) {
break;
case kCamera:
if (currentlyFollowedActor == actorIdx) {
- _engine->disableScreenRecenter = 1;
+ _engine->disableScreenRecenter = true;
if (_engine->_grid->newCameraX != zone->infoData.CameraView.x || _engine->_grid->newCameraY != zone->infoData.CameraView.y || _engine->_grid->newCameraZ != zone->infoData.CameraView.z) {
_engine->_grid->newCameraX = zone->infoData.CameraView.x;
_engine->_grid->newCameraY = zone->infoData.CameraView.y;
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index f076f9d346..0dbaadffbe 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -625,7 +625,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration
}
_movements->setActorAngle(0, -256, 5, &loopMovePtr);
- disableScreenRecenter = 0;
+ disableScreenRecenter = false;
_scene->processEnvironmentSound();
@@ -812,7 +812,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration
return 0;
}
-bool TwinEEngine::gameEngineLoop() { // mainLoop
+bool TwinEEngine::gameEngineLoop() {
_redraw->reqBgRedraw = true;
_screens->lockPalette = true;
_movements->setActorAngle(0, -256, 5, &loopMovePtr);
diff --git a/engines/twine/twine.h b/engines/twine/twine.h
index 35f2288bb1..2abf1e1725 100644
--- a/engines/twine/twine.h
+++ b/engines/twine/twine.h
@@ -246,7 +246,7 @@ public:
int32 loopActorStep = 0;
/** Disable screen recenter */
- int16 disableScreenRecenter = 0;
+ bool disableScreenRecenter = false;
int32 zoomScreen = 0;
Commit: 8340c196e52bc0b429179bdbd2010721a2210a0e
https://github.com/scummvm/scummvm/commit/8340c196e52bc0b429179bdbd2010721a2210a0e
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: added ScriptContext
Changed paths:
engines/twine/script_life_v1.cpp
engines/twine/script_move_v1.cpp
diff --git a/engines/twine/script_life_v1.cpp b/engines/twine/script_life_v1.cpp
index 3c637e87c0..492c17fa50 100644
--- a/engines/twine/script_life_v1.cpp
+++ b/engines/twine/script_life_v1.cpp
@@ -50,11 +50,16 @@ static uint8 *opcodePtr; // local opcode script pointer
static int32 drawVar1;
static char textStr[256]; // string
+struct ScriptContext {
+ int32 actorIdx;
+ ActorStruct *actor;
+};
+
/** Returns:
-1 - Need implementation
0 - Completed
1 - Break script */
-typedef int32 ScriptLifeFunc(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor);
+typedef int32 ScriptLifeFunc(TwinEEngine *engine, ScriptContext& ctx);
struct ScriptLifeFunction {
const char *name;
@@ -112,16 +117,16 @@ enum LifeScriptConditions {
-1 - Need implementation
1 - Condition value size (1 byte)
2 - Condition value size (2 byes) */
-static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
+static int32 processLifeConditions(TwinEEngine *engine, ScriptContext& ctx) {
int32 conditionValueSize = 1;
int32 conditionOpcode = *(scriptPtr++);
switch (conditionOpcode) {
case kcCOL:
- if (actor->life <= 0) {
+ if (ctx.actor->life <= 0) {
engine->_scene->currentScriptValue = -1;
} else {
- engine->_scene->currentScriptValue = actor->collision;
+ engine->_scene->currentScriptValue = ctx.actor->collision;
}
break;
case kcCOL_OBJ: {
@@ -138,11 +143,11 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
conditionValueSize = 2;
ActorStruct *otherActor = engine->_scene->getActor(actorIdx);
if (!otherActor->dynamicFlags.bIsDead) {
- if (ABS(actor->y - otherActor->y) >= 1500) {
+ if (ABS(ctx.actor->y - otherActor->y) >= 1500) {
engine->_scene->currentScriptValue = MAX_TARGET_ACTOR_DISTANCE;
} else {
// Returns int32, so we check for integer overflow
- int32 distance = engine->_movements->getDistance2D(actor->x, actor->z, otherActor->x, otherActor->z);
+ int32 distance = engine->_movements->getDistance2D(ctx.actor->x, ctx.actor->z, otherActor->x, otherActor->z);
if (ABS(distance) > MAX_TARGET_ACTOR_DISTANCE) {
engine->_scene->currentScriptValue = MAX_TARGET_ACTOR_DISTANCE;
} else {
@@ -155,7 +160,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
break;
}
case kcZONE:
- engine->_scene->currentScriptValue = actor->zone;
+ engine->_scene->currentScriptValue = ctx.actor->zone;
break;
case kcZONE_OBJ: {
int32 actorIdx = *(scriptPtr++);
@@ -163,7 +168,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
break;
}
case kcBODY:
- engine->_scene->currentScriptValue = actor->body;
+ engine->_scene->currentScriptValue = ctx.actor->body;
break;
case kcBODY_OBJ: {
int32 actorIdx = *(scriptPtr++);
@@ -171,7 +176,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
break;
}
case kcANIM:
- engine->_scene->currentScriptValue = actor->anim;
+ engine->_scene->currentScriptValue = ctx.actor->anim;
break;
case kcANIM_OBJ: {
int32 actorIdx = *(scriptPtr++);
@@ -179,7 +184,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
break;
}
case kcL_TRACK:
- engine->_scene->currentScriptValue = actor->labelIdx;
+ engine->_scene->currentScriptValue = ctx.actor->labelIdx;
break;
case kcL_TRACK_OBJ: {
int32 actorIdx = *(scriptPtr++);
@@ -199,8 +204,8 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
conditionValueSize = 2;
if (!targetActor->dynamicFlags.bIsDead) {
- if (ABS(targetActor->y - actor->y) < 1500) {
- newAngle = engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, targetActor->x, targetActor->z);
+ if (ABS(targetActor->y - ctx.actor->y) < 1500) {
+ newAngle = engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->x, ctx.actor->z, targetActor->x, targetActor->z);
if (ABS(engine->_movements->targetActorDistance) > MAX_TARGET_ACTOR_DISTANCE) {
engine->_movements->targetActorDistance = MAX_TARGET_ACTOR_DISTANCE;
}
@@ -211,7 +216,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
if (!targetActorIdx) {
int32 heroAngle;
- heroAngle = actor->angle + 0x480 - newAngle + 0x400;
+ heroAngle = ctx.actor->angle + 0x480 - newAngle + 0x400;
heroAngle &= 0x3FF;
if (ABS(heroAngle) > 0x100) {
@@ -223,7 +228,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
if (engine->_actor->heroBehaviour == kDiscrete) {
int32 heroAngle;
- heroAngle = actor->angle + 0x480 - newAngle + 0x400;
+ heroAngle = ctx.actor->angle + 0x480 - newAngle + 0x400;
heroAngle &= 0x3FF;
if (ABS(heroAngle) > 0x100) {
@@ -240,7 +245,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
}
} break;
case kcHIT_BY:
- engine->_scene->currentScriptValue = actor->hitBy;
+ engine->_scene->currentScriptValue = ctx.actor->hitBy;
break;
case kcACTION:
engine->_scene->currentScriptValue = engine->_movements->heroAction ? 1 : 0;
@@ -260,7 +265,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
break;
}
case kcLIFE_POINT:
- engine->_scene->currentScriptValue = actor->life;
+ engine->_scene->currentScriptValue = ctx.actor->life;
break;
case kcLIFE_POINT_OBJ: {
int32 actorIdx = *(scriptPtr++);
@@ -291,7 +296,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
if (!targetActor->dynamicFlags.bIsDead) {
// Returns int32, so we check for integer overflow
- int32 distance = engine->_movements->getDistance3D(actor->x, actor->y, actor->z, targetActor->x, targetActor->y, targetActor->z);
+ int32 distance = engine->_movements->getDistance3D(ctx.actor->x, ctx.actor->y, ctx.actor->z, targetActor->x, targetActor->y, targetActor->z);
if (ABS(distance) > MAX_TARGET_ACTOR_DISTANCE) {
engine->_scene->currentScriptValue = MAX_TARGET_ACTOR_DISTANCE;
} else {
@@ -335,7 +340,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
engine->_scene->currentScriptValue = engine->_gameState->inventoryNumGas;
break;
case kcCARRIED_BY:
- engine->_scene->currentScriptValue = actor->standOn;
+ engine->_scene->currentScriptValue = ctx.actor->standOn;
break;
case kcCDROM:
engine->_scene->currentScriptValue = 1;
@@ -408,67 +413,67 @@ static int32 processLifeOperators(TwinEEngine *engine, int32 valueSize) {
/** Life script command definitions */
/* For unused opcodes */
-static int32 lEMPTY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lEMPTY(TwinEEngine *engine, ScriptContext& ctx) {
return 0;
}
/*0x00*/
-static int32 lEND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInLifeScript = -1;
+static int32 lEND(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInLifeScript = -1;
return 1; // break script
}
/*0x01*/
-static int32 lNOP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lNOP(TwinEEngine *engine, ScriptContext& ctx) {
scriptPtr++;
return 0;
}
/*0x02*/
-static int32 lSNIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- const int32 valueSize = processLifeConditions(engine, actor);
+static int32 lSNIF(TwinEEngine *engine, ScriptContext& ctx) {
+ const int32 valueSize = processLifeConditions(engine, ctx);
if (!processLifeOperators(engine, valueSize)) {
*opcodePtr = 0x0D; // SWIF
}
- scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+ scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
return 0;
}
/*0x03*/
-static int32 lOFFSET(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // offset
+static int32 lOFFSET(TwinEEngine *engine, ScriptContext& ctx) {
+ scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // offset
return 0;
}
/*0x04*/
-static int32 lNEVERIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- int32 valueSize = processLifeConditions(engine, actor);
+static int32 lNEVERIF(TwinEEngine *engine, ScriptContext& ctx) {
+ int32 valueSize = processLifeConditions(engine, ctx);
processLifeOperators(engine, valueSize);
- scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+ scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
return 0;
}
/*0x06*/
-static int32 lNO_IF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lNO_IF(TwinEEngine *engine, ScriptContext& ctx) {
return 0;
}
/*0x0A*/
-static int32 lLABEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lLABEL(TwinEEngine *engine, ScriptContext& ctx) {
scriptPtr++;
return 0;
}
/*0x0B*/
-static int32 lRETURN(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lRETURN(TwinEEngine *engine, ScriptContext& ctx) {
return 1; // break script
}
/*0x0C*/
-static int32 lIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- int32 valueSize = processLifeConditions(engine, actor);
+static int32 lIF(TwinEEngine *engine, ScriptContext& ctx) {
+ int32 valueSize = processLifeConditions(engine, ctx);
if (!processLifeOperators(engine, valueSize)) {
- scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+ scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
} else {
scriptPtr += 2;
}
@@ -477,10 +482,10 @@ static int32 lIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
}
/*0x0D*/
-static int32 lSWIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- int32 valueSize = processLifeConditions(engine, actor);
+static int32 lSWIF(TwinEEngine *engine, ScriptContext& ctx) {
+ int32 valueSize = processLifeConditions(engine, ctx);
if (!processLifeOperators(engine, valueSize)) {
- scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+ scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
} else {
scriptPtr += 2;
*opcodePtr = 0x02; // SNIF
@@ -490,10 +495,10 @@ static int32 lSWIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
}
/*0x0E*/
-static int32 lONEIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- int32 valueSize = processLifeConditions(engine, actor);
+static int32 lONEIF(TwinEEngine *engine, ScriptContext& ctx) {
+ int32 valueSize = processLifeConditions(engine, ctx);
if (!processLifeOperators(engine, valueSize)) {
- scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+ scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
} else {
scriptPtr += 2;
*opcodePtr = 0x04; // NEVERIF
@@ -503,21 +508,21 @@ static int32 lONEIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
}
/*0x0F*/
-static int32 lELSE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // offset
+static int32 lELSE(TwinEEngine *engine, ScriptContext& ctx) {
+ scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // offset
return 0;
}
/*0x11*/
-static int32 lBODY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBODY(TwinEEngine *engine, ScriptContext& ctx) {
int32 bodyIdx = *(scriptPtr);
- engine->_actor->initModelActor(bodyIdx, actorIdx);
+ engine->_actor->initModelActor(bodyIdx, ctx.actorIdx);
scriptPtr++;
return 0;
}
/*0x12*/
-static int32 lBODY_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBODY_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
int32 otherActorIdx = *(scriptPtr++);
int32 otherBodyIdx = *(scriptPtr++);
engine->_actor->initModelActor(otherBodyIdx, otherActorIdx);
@@ -525,14 +530,14 @@ static int32 lBODY_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
}
/*0x13*/
-static int32 lANIM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lANIM(TwinEEngine *engine, ScriptContext& ctx) {
AnimationTypes animIdx = (AnimationTypes)*(scriptPtr++);
- engine->_animations->initAnim(animIdx, 0, 0, actorIdx);
+ engine->_animations->initAnim(animIdx, 0, 0, ctx.actorIdx);
return 0;
}
/*0x14*/
-static int32 lANIM_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lANIM_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
int32 otherActorIdx = *(scriptPtr++);
AnimationTypes otherAnimIdx = (AnimationTypes)*(scriptPtr++);
engine->_animations->initAnim(otherAnimIdx, 0, 0, otherActorIdx);
@@ -540,14 +545,14 @@ static int32 lANIM_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
}
/*0x15*/
-static int32 lSET_LIFE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInLifeScript = *((int16 *)scriptPtr); // offset
+static int32 lSET_LIFE(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInLifeScript = *((int16 *)scriptPtr); // offset
scriptPtr += 2;
return 0;
}
/*0x16*/
-static int32 lSET_LIFE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_LIFE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
int32 otherActorIdx = *(scriptPtr++);
engine->_scene->getActor(otherActorIdx)->positionInLifeScript = *((int16 *)scriptPtr); // offset
scriptPtr += 2;
@@ -555,14 +560,14 @@ static int32 lSET_LIFE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
}
/*0x17*/
-static int32 lSET_TRACK(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript = *((int16 *)scriptPtr); // offset
+static int32 lSET_TRACK(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript = *((int16 *)scriptPtr); // offset
scriptPtr += 2;
return 0;
}
/*0x18*/
-static int32 lSET_TRACK_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_TRACK_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
int32 otherActorIdx = *(scriptPtr++);
engine->_scene->getActor(otherActorIdx)->positionInMoveScript = *((int16 *)scriptPtr); // offset
scriptPtr += 2;
@@ -570,16 +575,16 @@ static int32 lSET_TRACK_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
}
/*0x19*/
-static int32 lMESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lMESSAGE(TwinEEngine *engine, ScriptContext& ctx) {
const int32 textIdx = *((int16 *)scriptPtr);
scriptPtr += 2;
engine->freezeTime();
if (engine->_text->showDialogueBubble) {
- engine->_redraw->drawBubble(actorIdx);
+ engine->_redraw->drawBubble(ctx.actorIdx);
}
- engine->_text->setFontCrossColor(actor->talkColor);
- engine->_scene->talkingActor = actorIdx;
+ engine->_text->setFontCrossColor(ctx.actor->talkColor);
+ engine->_scene->talkingActor = ctx.actorIdx;
engine->_text->drawTextFullscreen(textIdx);
engine->unfreezeTime();
engine->_redraw->redrawEngineActions(1);
@@ -588,26 +593,26 @@ static int32 lMESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
}
/*0x1A*/
-static int32 lFALLABLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFALLABLE(TwinEEngine *engine, ScriptContext& ctx) {
const int32 flag = *(scriptPtr++);
- actor->staticFlags.bCanFall = flag & 1;
+ ctx.actor->staticFlags.bCanFall = flag & 1;
return 0;
}
/*0x1B*/
-static int32 lSET_DIRMODE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DIRMODE(TwinEEngine *engine, ScriptContext& ctx) {
const int32 controlMode = *(scriptPtr++);
- actor->controlMode = (ControlMode)controlMode;
- if (actor->controlMode == ControlMode::kFollow) {
- actor->followedActor = *(scriptPtr++);
+ ctx.actor->controlMode = (ControlMode)controlMode;
+ if (ctx.actor->controlMode == ControlMode::kFollow) {
+ ctx.actor->followedActor = *(scriptPtr++);
}
return 0;
}
/*0x1C*/
-static int32 lSET_DIRMODE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DIRMODE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
const int32 otherActorIdx = *(scriptPtr++);
const int32 controlMode = *(scriptPtr++);
@@ -621,7 +626,7 @@ static int32 lSET_DIRMODE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *
}
/*0x1D*/
-static int32 lCAM_FOLLOW(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lCAM_FOLLOW(TwinEEngine *engine, ScriptContext& ctx) {
const int32 followedActorIdx = *(scriptPtr++);
if (engine->_scene->currentlyFollowedActor != followedActorIdx) {
@@ -638,7 +643,7 @@ static int32 lCAM_FOLLOW(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
}
/*0x1E*/
-static int32 lSET_BEHAVIOUR(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_BEHAVIOUR(TwinEEngine *engine, ScriptContext& ctx) {
const int32 behavior = *(scriptPtr++);
engine->_animations->initAnim(kStanding, 0, 255, 0);
@@ -648,7 +653,7 @@ static int32 lSET_BEHAVIOUR(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
}
/*0x1F*/
-static int32 lSET_FLAG_CUBE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_FLAG_CUBE(TwinEEngine *engine, ScriptContext& ctx) {
const int32 flagIdx = *(scriptPtr++);
const int32 flagValue = *(scriptPtr++);
@@ -658,20 +663,20 @@ static int32 lSET_FLAG_CUBE(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
}
/*0x20*/
-static int32 lCOMPORTEMENT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lCOMPORTEMENT(TwinEEngine *engine, ScriptContext& ctx) {
scriptPtr++;
return 0;
}
/*0x21*/
-static int32 lSET_COMPORTEMENT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInLifeScript = *((int16 *)scriptPtr);
+static int32 lSET_COMPORTEMENT(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInLifeScript = *((int16 *)scriptPtr);
scriptPtr += 2;
return 0;
}
/*0x22*/
-static int32 lSET_COMPORTEMENT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_COMPORTEMENT_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
const int32 otherActorIdx = *(scriptPtr++);
engine->_scene->getActor(otherActorIdx)->positionInLifeScript = *((int16 *)scriptPtr);
@@ -681,12 +686,12 @@ static int32 lSET_COMPORTEMENT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStr
}
/*0x23*/
-static int32 lEND_COMPORTEMENT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lEND_COMPORTEMENT(TwinEEngine *engine, ScriptContext& ctx) {
return 1; // break
}
/*0x24*/
-static int32 lSET_FLAG_GAME(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_FLAG_GAME(TwinEEngine *engine, ScriptContext& ctx) {
const int32 flagIdx = *(scriptPtr++);
const int32 flagValue = *(scriptPtr++);
@@ -696,7 +701,7 @@ static int32 lSET_FLAG_GAME(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
}
/*0x25*/
-static int32 lKILL_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lKILL_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
const int32 otherActorIdx = *(scriptPtr++);
engine->_actor->processActorCarrier(otherActorIdx);
@@ -710,18 +715,18 @@ static int32 lKILL_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
}
/*0x26*/
-static int32 lSUICIDE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- engine->_actor->processActorCarrier(actorIdx);
- actor->dynamicFlags.bIsDead = 1;
- actor->entity = -1;
- actor->zone = -1;
- actor->life = 0;
+static int32 lSUICIDE(TwinEEngine *engine, ScriptContext& ctx) {
+ engine->_actor->processActorCarrier(ctx.actorIdx);
+ ctx.actor->dynamicFlags.bIsDead = 1;
+ ctx.actor->entity = -1;
+ ctx.actor->zone = -1;
+ ctx.actor->life = 0;
return 0;
}
/*0x27*/
-static int32 lUSE_ONE_LITTLE_KEY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lUSE_ONE_LITTLE_KEY(TwinEEngine *engine, ScriptContext& ctx) {
engine->_gameState->inventoryNumKeys--;
if (engine->_gameState->inventoryNumKeys < 0) {
@@ -734,9 +739,9 @@ static int32 lUSE_ONE_LITTLE_KEY(TwinEEngine *engine, int32 actorIdx, ActorStruc
}
/*0x28*/
-static int32 lGIVE_GOLD_PIECES(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lGIVE_GOLD_PIECES(TwinEEngine *engine, ScriptContext& ctx) {
int16 oldNumKashes = engine->_gameState->inventoryNumKashes;
- int16 hideRange = 0;
+ bool hideRange = false;
int16 kashes = *((int16 *)scriptPtr);
scriptPtr += 2;
@@ -753,7 +758,7 @@ static int32 lGIVE_GOLD_PIECES(TwinEEngine *engine, int32 actorIdx, ActorStruct
overlay->info0 = engine->_collision->getAverageValue(overlay->info1, overlay->info0, 100, overlay->lifeTime - engine->lbaTime - 50);
overlay->info1 = engine->_gameState->inventoryNumKashes;
overlay->lifeTime = engine->lbaTime + 150;
- hideRange = 1;
+ hideRange = true;
break;
}
}
@@ -766,26 +771,26 @@ static int32 lGIVE_GOLD_PIECES(TwinEEngine *engine, int32 actorIdx, ActorStruct
}
/*0x29*/
-static int32 lEND_LIFE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInLifeScript = -1;
+static int32 lEND_LIFE(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInLifeScript = -1;
return 1; // break;
}
/*0x2A*/
-static int32 lSTOP_L_TRACK(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->pausedTrackPtr = actor->currentLabelPtr;
- actor->positionInMoveScript = -1;
+static int32 lSTOP_L_TRACK(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->pausedTrackPtr = ctx.actor->currentLabelPtr;
+ ctx.actor->positionInMoveScript = -1;
return 0;
}
/*0x2B*/
-static int32 lRESTORE_L_TRACK(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript = actor->pausedTrackPtr;
+static int32 lRESTORE_L_TRACK(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript = ctx.actor->pausedTrackPtr;
return 0;
}
/*0x2C*/
-static int32 lMESSAGE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lMESSAGE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
const int32 otherActorIdx = *(scriptPtr++);
const int32 textIdx = *((int16 *)scriptPtr);
scriptPtr += 2;
@@ -804,13 +809,13 @@ static int32 lMESSAGE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *acto
}
/*0x2D*/
-static int32 lINC_CHAPTER(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lINC_CHAPTER(TwinEEngine *engine, ScriptContext& ctx) {
engine->_gameState->gameChapter++;
return 0;
}
/*0x2E*/
-static int32 lFOUND_OBJECT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFOUND_OBJECT(TwinEEngine *engine, ScriptContext& ctx) {
const int32 item = *(scriptPtr++);
engine->freezeTime();
@@ -822,74 +827,74 @@ static int32 lFOUND_OBJECT(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
}
/*0x2F*/
-static int32 lSET_DOOR_LEFT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DOOR_LEFT(TwinEEngine *engine, ScriptContext& ctx) {
int32 distance = *((int16 *)scriptPtr);
scriptPtr += 2;
- actor->angle = 0x300;
- actor->x = actor->lastX - distance;
- actor->dynamicFlags.bIsSpriteMoving = 0;
- actor->speed = 0;
+ ctx.actor->angle = 0x300;
+ ctx.actor->x = ctx.actor->lastX - distance;
+ ctx.actor->dynamicFlags.bIsSpriteMoving = 0;
+ ctx.actor->speed = 0;
return 0;
}
/*0x30*/
-static int32 lSET_DOOR_RIGHT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DOOR_RIGHT(TwinEEngine *engine, ScriptContext& ctx) {
int32 distance = *((int16 *)scriptPtr);
scriptPtr += 2;
- actor->angle = 0x100;
- actor->x = actor->lastX + distance;
- actor->dynamicFlags.bIsSpriteMoving = 0;
- actor->speed = 0;
+ ctx.actor->angle = 0x100;
+ ctx.actor->x = ctx.actor->lastX + distance;
+ ctx.actor->dynamicFlags.bIsSpriteMoving = 0;
+ ctx.actor->speed = 0;
return 0;
}
/*0x31*/
-static int32 lSET_DOOR_UP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DOOR_UP(TwinEEngine *engine, ScriptContext& ctx) {
int32 distance = *((int16 *)scriptPtr);
scriptPtr += 2;
- actor->angle = 0x200;
- actor->z = actor->lastZ - distance;
- actor->dynamicFlags.bIsSpriteMoving = 0;
- actor->speed = 0;
+ ctx.actor->angle = 0x200;
+ ctx.actor->z = ctx.actor->lastZ - distance;
+ ctx.actor->dynamicFlags.bIsSpriteMoving = 0;
+ ctx.actor->speed = 0;
return 0;
}
/*0x32*/
-static int32 lSET_DOOR_DOWN(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DOOR_DOWN(TwinEEngine *engine, ScriptContext& ctx) {
int32 distance = *((int16 *)scriptPtr);
scriptPtr += 2;
- actor->angle = 0;
- actor->z = actor->lastZ + distance;
- actor->dynamicFlags.bIsSpriteMoving = 0;
- actor->speed = 0;
+ ctx.actor->angle = 0;
+ ctx.actor->z = ctx.actor->lastZ + distance;
+ ctx.actor->dynamicFlags.bIsSpriteMoving = 0;
+ ctx.actor->speed = 0;
return 0;
}
/*0x33*/
-static int32 lGIVE_BONUS(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lGIVE_BONUS(TwinEEngine *engine, ScriptContext& ctx) {
int32 flag = *(scriptPtr++);
- if (actor->bonusParameter & 0x1F0) {
- engine->_actor->processActorExtraBonus(actorIdx);
+ if (ctx.actor->bonusParameter & 0x1F0) {
+ engine->_actor->processActorExtraBonus(ctx.actorIdx);
}
if (flag != 0) {
- actor->bonusParameter |= 1;
+ ctx.actor->bonusParameter |= 1;
}
return 0;
}
/*0x34*/
-static int32 lCHANGE_CUBE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lCHANGE_CUBE(TwinEEngine *engine, ScriptContext& ctx) {
int32 sceneIdx = *(scriptPtr++);
engine->_scene->needChangeScene = sceneIdx;
engine->_scene->heroPositionType = ScenePositionType::kScene;
@@ -897,37 +902,37 @@ static int32 lCHANGE_CUBE(TwinEEngine *engine, int32 actorIdx, ActorStruct *acto
}
/*0x35*/
-static int32 lOBJ_COL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lOBJ_COL(TwinEEngine *engine, ScriptContext& ctx) {
int32 collision = *(scriptPtr++);
if (collision != 0) {
- actor->staticFlags.bComputeCollisionWithObj = 1;
+ ctx.actor->staticFlags.bComputeCollisionWithObj = 1;
} else {
- actor->staticFlags.bComputeCollisionWithObj = 0;
+ ctx.actor->staticFlags.bComputeCollisionWithObj = 0;
}
return 0;
}
/*0x36*/
-static int32 lBRICK_COL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBRICK_COL(TwinEEngine *engine, ScriptContext& ctx) {
int32 collision = *(scriptPtr++);
- actor->staticFlags.bComputeCollisionWithBricks = 0;
- actor->staticFlags.bComputeLowCollision = 0;
+ ctx.actor->staticFlags.bComputeCollisionWithBricks = 0;
+ ctx.actor->staticFlags.bComputeLowCollision = 0;
if (collision == 1) {
- actor->staticFlags.bComputeCollisionWithBricks = 1;
+ ctx.actor->staticFlags.bComputeCollisionWithBricks = 1;
} else if (collision == 2) {
- actor->staticFlags.bComputeCollisionWithBricks = 1;
- actor->staticFlags.bComputeLowCollision = 1;
+ ctx.actor->staticFlags.bComputeCollisionWithBricks = 1;
+ ctx.actor->staticFlags.bComputeLowCollision = 1;
}
return 0;
}
/*0x37*/
-static int32 lOR_IF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- int32 valueSize = processLifeConditions(engine, actor);
+static int32 lOR_IF(TwinEEngine *engine, ScriptContext& ctx) {
+ int32 valueSize = processLifeConditions(engine, ctx);
if (processLifeOperators(engine, valueSize)) {
- scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+ scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
} else {
scriptPtr += 2;
}
@@ -936,13 +941,13 @@ static int32 lOR_IF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
}
/*0x38*/
-static int32 lINVISIBLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->staticFlags.bIsHidden = *(scriptPtr++);
+static int32 lINVISIBLE(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->staticFlags.bIsHidden = *(scriptPtr++);
return 0;
}
/*0x39*/
-static int32 lZOOM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lZOOM(TwinEEngine *engine, ScriptContext& ctx) {
engine->zoomScreen = *(scriptPtr++);
if (engine->zoomScreen && !engine->_redraw->drawInGameTransBox && engine->cfgfile.SceZoom) {
@@ -962,7 +967,7 @@ static int32 lZOOM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
}
/*0x3A*/
-static int32 lPOS_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPOS_POINT(TwinEEngine *engine, ScriptContext& ctx) {
int32 trackIdx = *(scriptPtr++);
const ScenePoint &sp = engine->_scene->sceneTracks[trackIdx];
@@ -970,22 +975,22 @@ static int32 lPOS_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
engine->_renderer->destY = sp.y;
engine->_renderer->destZ = sp.z;
- actor->x = sp.x;
- actor->y = sp.y;
- actor->z = sp.z;
+ ctx.actor->x = sp.x;
+ ctx.actor->y = sp.y;
+ ctx.actor->z = sp.z;
return 0;
}
/*0x3B*/
-static int32 lSET_MAGIC_LEVEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_MAGIC_LEVEL(TwinEEngine *engine, ScriptContext& ctx) {
engine->_gameState->magicLevelIdx = *(scriptPtr++);
engine->_gameState->inventoryMagicPoints = engine->_gameState->magicLevelIdx * 20;
return 0;
}
/*0x3C*/
-static int32 lSUB_MAGIC_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSUB_MAGIC_POINT(TwinEEngine *engine, ScriptContext& ctx) {
engine->_gameState->inventoryMagicPoints = *(scriptPtr++);
if (engine->_gameState->inventoryMagicPoints < 0) {
engine->_gameState->inventoryMagicPoints = 0;
@@ -994,7 +999,7 @@ static int32 lSUB_MAGIC_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *
}
/*0x3D*/
-static int32 lSET_LIFE_POINT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_LIFE_POINT_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
int32 otherActorIdx = *(scriptPtr++);
static int32 lifeValue = *(scriptPtr++);
@@ -1004,7 +1009,7 @@ static int32 lSET_LIFE_POINT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruc
}
/*0x3E*/
-static int32 lSUB_LIFE_POINT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSUB_LIFE_POINT_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
int32 otherActorIdx = *(scriptPtr++);
static int32 lifeValue = *(scriptPtr++);
@@ -1018,15 +1023,15 @@ static int32 lSUB_LIFE_POINT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruc
}
/*0x3F*/
-static int32 lHIT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lHIT_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
int32 otherActorIdx = *(scriptPtr++);
int32 strengthOfHit = *(scriptPtr++);
- engine->_actor->hitActor(actorIdx, otherActorIdx, strengthOfHit, engine->_scene->getActor(otherActorIdx)->angle);
+ engine->_actor->hitActor(ctx.actorIdx, otherActorIdx, strengthOfHit, engine->_scene->getActor(otherActorIdx)->angle);
return 0;
}
/*0x40*/
-static int32 lPLAY_FLA(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPLAY_FLA(TwinEEngine *engine, ScriptContext& ctx) {
const char *movie = (const char *)scriptPtr;
int32 nameSize = strlen(movie);
scriptPtr += nameSize + 1;
@@ -1040,14 +1045,14 @@ static int32 lPLAY_FLA(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
}
/*0x41*/
-static int32 lPLAY_MIDI(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPLAY_MIDI(TwinEEngine *engine, ScriptContext& ctx) {
int32 midiIdx = *(scriptPtr++);
engine->_music->playMidiMusic(midiIdx); // TODO: improve this
return 0;
}
/*0x42*/
-static int32 lINC_CLOVER_BOX(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lINC_CLOVER_BOX(TwinEEngine *engine, ScriptContext& ctx) {
if (engine->_gameState->inventoryNumLeafsBox < 10) {
engine->_gameState->inventoryNumLeafsBox++;
}
@@ -1055,7 +1060,7 @@ static int32 lINC_CLOVER_BOX(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
}
/*0x43*/
-static int32 lSET_USED_INVENTORY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_USED_INVENTORY(TwinEEngine *engine, ScriptContext& ctx) {
int32 item = *(scriptPtr++);
if (item < 24) {
engine->_gameState->inventoryFlags[item] = 1;
@@ -1064,7 +1069,7 @@ static int32 lSET_USED_INVENTORY(TwinEEngine *engine, int32 actorIdx, ActorStruc
}
/*0x44*/
-static int32 lADD_CHOICE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lADD_CHOICE(TwinEEngine *engine, ScriptContext& ctx) {
int32 choiceIdx = *((int16 *)scriptPtr);
scriptPtr += 2;
engine->_gameState->gameChoices[engine->_gameState->numChoices++] = choiceIdx;
@@ -1072,15 +1077,15 @@ static int32 lADD_CHOICE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
}
/*0x45*/
-static int32 lASK_CHOICE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lASK_CHOICE(TwinEEngine *engine, ScriptContext& ctx) {
int32 choiceIdx = *((int16 *)scriptPtr);
scriptPtr += 2;
engine->freezeTime();
if (engine->_text->showDialogueBubble) {
- engine->_redraw->drawBubble(actorIdx);
+ engine->_redraw->drawBubble(ctx.actorIdx);
}
- engine->_text->setFontCrossColor(actor->talkColor);
+ engine->_text->setFontCrossColor(ctx.actor->talkColor);
engine->_gameState->processGameChoices(choiceIdx);
engine->_gameState->numChoices = 0;
engine->unfreezeTime();
@@ -1090,17 +1095,17 @@ static int32 lASK_CHOICE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
}
/*0x46*/
-static int32 lBIG_MESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBIG_MESSAGE(TwinEEngine *engine, ScriptContext& ctx) {
int32 textIdx = *((int16 *)scriptPtr);
scriptPtr += 2;
engine->freezeTime();
engine->_text->textClipFull();
if (engine->_text->showDialogueBubble) {
- engine->_redraw->drawBubble(actorIdx);
+ engine->_redraw->drawBubble(ctx.actorIdx);
}
- engine->_text->setFontCrossColor(actor->talkColor);
- engine->_scene->talkingActor = actorIdx;
+ engine->_text->setFontCrossColor(ctx.actor->talkColor);
+ engine->_scene->talkingActor = ctx.actorIdx;
engine->_text->drawTextFullscreen(textIdx);
engine->_text->textClipSmall();
engine->unfreezeTime();
@@ -1110,7 +1115,7 @@ static int32 lBIG_MESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *acto
}
/*0x47*/
-static int32 lINIT_PINGOUIN(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lINIT_PINGOUIN(TwinEEngine *engine, ScriptContext& ctx) {
int32 pingouinActor = *(scriptPtr++);
engine->_scene->mecaPinguinIdx = pingouinActor;
ActorStruct *mecaPinguin = engine->_scene->getActor(pingouinActor);
@@ -1121,7 +1126,7 @@ static int32 lINIT_PINGOUIN(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
}
/*0x48*/
-static int32 lSET_HOLO_POS(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_HOLO_POS(TwinEEngine *engine, ScriptContext& ctx) {
static int32 location = *(scriptPtr++);
engine->_holomap->setHolomapPosition(location);
if (engine->_gameState->gameFlags[InventoryItems::kiHolomap]) {
@@ -1132,14 +1137,14 @@ static int32 lSET_HOLO_POS(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
}
/*0x49*/
-static int32 lCLR_HOLO_POS(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lCLR_HOLO_POS(TwinEEngine *engine, ScriptContext& ctx) {
static int32 location = *(scriptPtr++);
engine->_holomap->clearHolomapPosition(location);
return 0;
}
/*0x4A*/
-static int32 lADD_FUEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lADD_FUEL(TwinEEngine *engine, ScriptContext& ctx) {
engine->_gameState->inventoryNumGas += *(scriptPtr++);
if (engine->_gameState->inventoryNumGas > 100) {
engine->_gameState->inventoryNumGas = 100;
@@ -1148,7 +1153,7 @@ static int32 lADD_FUEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
}
/*0x4B*/
-static int32 lSUB_FUEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSUB_FUEL(TwinEEngine *engine, ScriptContext& ctx) {
engine->_gameState->inventoryNumGas -= *(scriptPtr++);
if (engine->_gameState->inventoryNumGas < 0) {
engine->_gameState->inventoryNumGas = 0;
@@ -1157,18 +1162,18 @@ static int32 lSUB_FUEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
}
/*0x4C*/
-static int32 lSET_GRM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_GRM(TwinEEngine *engine, ScriptContext& ctx) {
engine->_grid->cellingGridIdx = *(scriptPtr++);
engine->_grid->initCellingGrid(engine->_grid->cellingGridIdx);
return 0;
}
/*0x4D*/
-static int32 lSAY_MESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSAY_MESSAGE(TwinEEngine *engine, ScriptContext& ctx) {
int16 textEntry = *((int16 *)scriptPtr);
scriptPtr += 2;
- engine->_redraw->addOverlay(koText, textEntry, 0, 0, actorIdx, koFollowActor, 2);
+ engine->_redraw->addOverlay(koText, textEntry, 0, 0, ctx.actorIdx, koFollowActor, 2);
engine->freezeTime();
engine->_text->initVoxToPlay(textEntry);
@@ -1178,7 +1183,7 @@ static int32 lSAY_MESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *acto
}
/*04E*/
-static int32 lSAY_MESSAGE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSAY_MESSAGE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
int32 otherActorIdx = *(scriptPtr++);
int16 textEntry = *((int16 *)scriptPtr);
scriptPtr += 2;
@@ -1193,23 +1198,23 @@ static int32 lSAY_MESSAGE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *
}
/*0x4F*/
-static int32 lFULL_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFULL_POINT(TwinEEngine *engine, ScriptContext& ctx) {
engine->_scene->sceneHero->life = 50;
engine->_gameState->inventoryMagicPoints = engine->_gameState->magicLevelIdx * 20;
return 0;
}
/*0x50*/
-static int32 lBETA(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBETA(TwinEEngine *engine, ScriptContext& ctx) {
int32 newAngle = *((int16 *)scriptPtr);
scriptPtr += 2;
- actor->angle = newAngle;
- engine->_movements->clearRealAngle(actor);
+ ctx.actor->angle = newAngle;
+ engine->_movements->clearRealAngle(ctx.actor);
return 0;
}
/*0x51*/
-static int32 lGRM_OFF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lGRM_OFF(TwinEEngine *engine, ScriptContext& ctx) {
if (engine->_grid->cellingGridIdx != -1) {
engine->_grid->useCellingGrid = -1;
engine->_grid->cellingGridIdx = -1;
@@ -1221,7 +1226,7 @@ static int32 lGRM_OFF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
}
/*0x52*/
-static int32 lFADE_PAL_RED(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_PAL_RED(TwinEEngine *engine, ScriptContext& ctx) {
engine->freezeTime();
engine->_screens->fadePalRed(engine->_screens->mainPaletteRGBA);
engine->_screens->useAlternatePalette = false;
@@ -1230,7 +1235,7 @@ static int32 lFADE_PAL_RED(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
}
/*0x53*/
-static int32 lFADE_ALARM_RED(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_ALARM_RED(TwinEEngine *engine, ScriptContext& ctx) {
engine->freezeTime();
engine->_hqrdepack->hqrGetEntry(engine->_screens->palette, Resources::HQR_RESS_FILE, RESSHQR_ALARMREDPAL);
engine->_screens->convertPalToRGBA(engine->_screens->palette, engine->_screens->paletteRGBA);
@@ -1241,7 +1246,7 @@ static int32 lFADE_ALARM_RED(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
}
/*0x54*/
-static int32 lFADE_ALARM_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_ALARM_PAL(TwinEEngine *engine, ScriptContext& ctx) {
engine->freezeTime();
engine->_hqrdepack->hqrGetEntry(engine->_screens->palette, Resources::HQR_RESS_FILE, RESSHQR_ALARMREDPAL);
engine->_screens->convertPalToRGBA(engine->_screens->palette, engine->_screens->paletteRGBA);
@@ -1252,7 +1257,7 @@ static int32 lFADE_ALARM_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
}
/*0x55*/
-static int32 lFADE_RED_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_RED_PAL(TwinEEngine *engine, ScriptContext& ctx) {
engine->freezeTime();
engine->_screens->fadeRedPal(engine->_screens->mainPaletteRGBA);
engine->_screens->useAlternatePalette = false;
@@ -1261,7 +1266,7 @@ static int32 lFADE_RED_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
}
/*0x56*/
-static int32 lFADE_RED_ALARM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_RED_ALARM(TwinEEngine *engine, ScriptContext& ctx) {
engine->freezeTime();
engine->_hqrdepack->hqrGetEntry(engine->_screens->palette, Resources::HQR_RESS_FILE, RESSHQR_ALARMREDPAL);
engine->_screens->convertPalToRGBA(engine->_screens->palette, engine->_screens->paletteRGBA);
@@ -1272,7 +1277,7 @@ static int32 lFADE_RED_ALARM(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
}
/*0x57*/
-static int32 lFADE_PAL_ALARM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_PAL_ALARM(TwinEEngine *engine, ScriptContext& ctx) {
engine->freezeTime();
engine->_hqrdepack->hqrGetEntry(engine->_screens->palette, Resources::HQR_RESS_FILE, RESSHQR_ALARMREDPAL);
engine->_screens->convertPalToRGBA(engine->_screens->palette, engine->_screens->paletteRGBA);
@@ -1283,7 +1288,7 @@ static int32 lFADE_PAL_ALARM(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
}
/*0x58*/
-static int32 lEXPLODE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lEXPLODE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
int32 otherActorIdx = *(scriptPtr++);
ActorStruct *otherActor = engine->_scene->getActor(otherActorIdx);
@@ -1293,19 +1298,19 @@ static int32 lEXPLODE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *acto
}
/*0x59*/
-static int32 lBUBBLE_ON(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBUBBLE_ON(TwinEEngine *engine, ScriptContext& ctx) {
engine->_text->showDialogueBubble = 1;
return 0;
}
/*0x5A*/
-static int32 lBUBBLE_OFF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBUBBLE_OFF(TwinEEngine *engine, ScriptContext& ctx) {
engine->_text->showDialogueBubble = 1;
return 0;
}
/*0x5B*/
-static int32 lASK_CHOICE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lASK_CHOICE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
int32 otherActorIdx = *(scriptPtr++);
int32 choiceIdx = *((int16 *)scriptPtr);
scriptPtr += 2;
@@ -1324,7 +1329,7 @@ static int32 lASK_CHOICE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
}
/*0x5C*/
-static int32 lSET_DARK_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DARK_PAL(TwinEEngine *engine, ScriptContext& ctx) {
engine->freezeTime();
engine->_hqrdepack->hqrGetEntry(engine->_screens->palette, Resources::HQR_RESS_FILE, RESSHQR_DARKPAL);
if (!engine->_screens->lockPalette) {
@@ -1337,7 +1342,7 @@ static int32 lSET_DARK_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
}
/*0x5D*/
-static int32 lSET_NORMAL_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_NORMAL_PAL(TwinEEngine *engine, ScriptContext& ctx) {
engine->_screens->useAlternatePalette = false;
if (!engine->_screens->lockPalette) {
engine->setPalette(engine->_screens->mainPaletteRGBA);
@@ -1346,7 +1351,7 @@ static int32 lSET_NORMAL_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
}
/*0x5E*/
-static int32 lMESSAGE_SENDELL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lMESSAGE_SENDELL(TwinEEngine *engine, ScriptContext& ctx) {
engine->freezeTime();
engine->_screens->fadeToBlack(engine->_screens->paletteRGBA);
engine->_screens->loadImage(25);
@@ -1374,24 +1379,24 @@ static int32 lMESSAGE_SENDELL(TwinEEngine *engine, int32 actorIdx, ActorStruct *
}
/*0x5F*/
-static int32 lANIM_SET(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lANIM_SET(TwinEEngine *engine, ScriptContext& ctx) {
AnimationTypes animIdx = (AnimationTypes)*(scriptPtr++);
- actor->anim = kAnimNone;
- actor->previousAnimIdx = -1;
- engine->_animations->initAnim(animIdx, 0, 0, actorIdx);
+ ctx.actor->anim = kAnimNone;
+ ctx.actor->previousAnimIdx = -1;
+ engine->_animations->initAnim(animIdx, 0, 0, ctx.actorIdx);
return 0;
}
/*0x60*/
-static int32 lHOLOMAP_TRAJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lHOLOMAP_TRAJ(TwinEEngine *engine, ScriptContext& ctx) {
scriptPtr++; // TODO
return -1;
}
/*0x61*/
-static int32 lGAME_OVER(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lGAME_OVER(TwinEEngine *engine, ScriptContext& ctx) {
engine->_scene->sceneHero->dynamicFlags.bAnimEnded = 1;
engine->_scene->sceneHero->life = 0;
engine->_gameState->inventoryNumLeafs = 0;
@@ -1399,7 +1404,7 @@ static int32 lGAME_OVER(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
}
/*0x62*/
-static int32 lTHE_END(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lTHE_END(TwinEEngine *engine, ScriptContext& ctx) {
engine->quitGame = 1;
engine->_gameState->inventoryNumLeafs = 0;
engine->_scene->sceneHero->life = 50;
@@ -1413,20 +1418,20 @@ static int32 lTHE_END(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
}
/*0x63*/
-static int32 lMIDI_OFF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lMIDI_OFF(TwinEEngine *engine, ScriptContext& ctx) {
engine->_music->stopMidiMusic();
return 0;
}
/*0x64*/
-static int32 lPLAY_CD_TRACK(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPLAY_CD_TRACK(TwinEEngine *engine, ScriptContext& ctx) {
int32 track = *(scriptPtr++);
engine->_music->playTrackMusic(track);
return 0;
}
/*0x65*/
-static int32 lPROJ_ISO(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPROJ_ISO(TwinEEngine *engine, ScriptContext& ctx) {
engine->_renderer->setOrthoProjection(311, 240, 512);
engine->_renderer->setBaseTranslation(0, 0, 0);
engine->_renderer->setBaseRotation(0, 0, 0);
@@ -1435,7 +1440,7 @@ static int32 lPROJ_ISO(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
}
/*0x66*/
-static int32 lPROJ_3D(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPROJ_3D(TwinEEngine *engine, ScriptContext& ctx) {
engine->_screens->copyScreen(engine->frontVideoBuffer, engine->workVideoBuffer);
engine->flip();
engine->_scene->changeRoomVar10 = 0;
@@ -1450,7 +1455,7 @@ static int32 lPROJ_3D(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
}
/*0x67*/
-static int32 lTEXT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lTEXT(TwinEEngine *engine, ScriptContext& ctx) {
int32 textIdx = *((int16 *)scriptPtr);
scriptPtr += 2;
@@ -1478,7 +1483,7 @@ static int32 lTEXT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
}
/*0x68*/
-static int32 lCLEAR_TEXT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lCLEAR_TEXT(TwinEEngine *engine, ScriptContext& ctx) {
drawVar1 = 0;
engine->_interface->drawSplittedBox(0, 0, 639, 240, 0);
engine->copyBlockPhys(0, 0, 639, 240);
@@ -1486,7 +1491,7 @@ static int32 lCLEAR_TEXT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
}
/*0x69*/
-static int32 lBRUTAL_EXIT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBRUTAL_EXIT(TwinEEngine *engine, ScriptContext& ctx) {
engine->quitGame = 0;
return 1; // break
}
@@ -1613,12 +1618,13 @@ void ScriptLife::processLifeScript(int32 actorIdx) {
int32 end = -2;
+ ScriptContext ctx{actorIdx, actor};
do {
opcodePtr = scriptPtr;
int32 scriptOpcode = *(scriptPtr++);
if (scriptOpcode >= 0 && scriptOpcode < ARRAYSIZE(function_map)) {
- end = function_map[scriptOpcode].function(_engine, actorIdx, actor);
+ end = function_map[scriptOpcode].function(_engine, ctx);
} else {
error("Actor %d with wrong offset/opcode - Offset: %d (opcode: %i)", actorIdx, actor->positionInLifeScript, scriptOpcode);
}
diff --git a/engines/twine/script_move_v1.cpp b/engines/twine/script_move_v1.cpp
index d966360bef..58c1e07f06 100644
--- a/engines/twine/script_move_v1.cpp
+++ b/engines/twine/script_move_v1.cpp
@@ -36,14 +36,18 @@ namespace TwinE {
static uint8 *scriptPtr = nullptr;
static int32 scriptPosition = 0;
-static ActorMoveStruct *move = nullptr;
static int32 numRepeatSample = 1;
+struct ScriptContext {
+ int32 actorIdx;
+ ActorStruct *actor;
+};
+
/** Returns:
-1 - Need implementation
0 - Completed
1 - Break script */
-typedef int32 ScriptMoveFunc(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor);
+typedef int32 ScriptMoveFunc(TwinEEngine *engine, ScriptContext& ctx);
struct ScriptMoveFunction {
const char *name;
@@ -54,39 +58,39 @@ struct ScriptMoveFunction {
{ name, func }
/*0x00*/
-static int32 mEND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript = -1;
+static int32 mEND(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript = -1;
return 1;
}
/*0x01*/
-static int32 mNOP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mNOP(TwinEEngine *engine, ScriptContext& ctx) {
return 0;
}
/*0x02*/
-static int32 mBODY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mBODY(TwinEEngine *engine, ScriptContext& ctx) {
int32 bodyIdx = *(scriptPtr);
- engine->_actor->initModelActor(bodyIdx, actorIdx);
- actor->positionInMoveScript++;
+ engine->_actor->initModelActor(bodyIdx, ctx.actorIdx);
+ ctx.actor->positionInMoveScript++;
return 0;
}
/*0x03*/
-static int32 mANIM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mANIM(TwinEEngine *engine, ScriptContext& ctx) {
AnimationTypes animIdx = (AnimationTypes) * (scriptPtr++);
- if (engine->_animations->initAnim(animIdx, 0, 0, actorIdx)) {
- actor->positionInMoveScript++;
+ if (engine->_animations->initAnim(animIdx, 0, 0, ctx.actorIdx)) {
+ ctx.actor->positionInMoveScript++;
} else {
- actor->positionInMoveScript = scriptPosition;
+ ctx.actor->positionInMoveScript = scriptPosition;
return 1;
}
return 0;
}
/*0x04*/
-static int32 mGOTO_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript++;
+static int32 mGOTO_POINT(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript++;
engine->_scene->currentScriptValue = *(scriptPtr);
const ScenePoint &sp = engine->_scene->sceneTracks[engine->_scene->currentScriptValue];
@@ -94,16 +98,16 @@ static int32 mGOTO_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
engine->_renderer->destY = sp.y;
engine->_renderer->destZ = sp.z;
- const int32 newAngle = engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, sp.x, sp.z);
+ const int32 newAngle = engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->x, ctx.actor->z, sp.x, sp.z);
- if (actor->staticFlags.bIsSpriteActor) {
- actor->angle = newAngle;
+ if (ctx.actor->staticFlags.bIsSpriteActor) {
+ ctx.actor->angle = newAngle;
} else {
- engine->_movements->moveActor(actor->angle, newAngle, actor->speed, &actor->move);
+ engine->_movements->moveActor(ctx.actor->angle, newAngle, ctx.actor->speed, &ctx.actor->move);
}
if (engine->_movements->targetActorDistance > 500) {
- actor->positionInMoveScript -= 2;
+ ctx.actor->positionInMoveScript -= 2;
return 1;
}
@@ -111,42 +115,42 @@ static int32 mGOTO_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
}
/*0x05*/
-static int32 mWAIT_ANIM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- if (!actor->dynamicFlags.bAnimEnded) {
- actor->positionInMoveScript--;
+static int32 mWAIT_ANIM(TwinEEngine *engine, ScriptContext& ctx) {
+ if (!ctx.actor->dynamicFlags.bAnimEnded) {
+ ctx.actor->positionInMoveScript--;
} else {
- engine->_movements->clearRealAngle(actor);
+ engine->_movements->clearRealAngle(ctx.actor);
}
return 1;
}
/*0x06*/
-static int32 mLOOP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mLOOP(TwinEEngine *engine, ScriptContext& ctx) {
// TODO
return -1;
}
/*0x07*/
-static int32 mANGLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript += 2;
- if (actor->staticFlags.bIsSpriteActor) {
+static int32 mANGLE(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript += 2;
+ if (ctx.actor->staticFlags.bIsSpriteActor) {
return 0;
}
engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
- if (actor->move.numOfStep == 0) {
- engine->_movements->moveActor(actor->angle, engine->_scene->currentScriptValue, actor->speed, move);
+ if (ctx.actor->move.numOfStep == 0) {
+ engine->_movements->moveActor(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, move);
}
- if (actor->angle == engine->_scene->currentScriptValue) {
- engine->_movements->clearRealAngle(actor);
+ if (ctx.actor->angle == engine->_scene->currentScriptValue) {
+ engine->_movements->clearRealAngle(ctx.actor);
return 0;
}
- actor->positionInMoveScript -= 3;
+ ctx.actor->positionInMoveScript -= 3;
return 1;
}
/*0x08*/
-static int32 mPOS_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript++;
+static int32 mPOS_POINT(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript++;
engine->_scene->currentScriptValue = *(scriptPtr);
const ScenePoint &sp = engine->_scene->sceneTracks[engine->_scene->currentScriptValue];
@@ -154,40 +158,40 @@ static int32 mPOS_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
engine->_renderer->destY = sp.y;
engine->_renderer->destZ = sp.z;
- if (actor->staticFlags.bIsSpriteActor) {
- actor->speed = 0;
+ if (ctx.actor->staticFlags.bIsSpriteActor) {
+ ctx.actor->speed = 0;
}
- actor->x = sp.x;
- actor->y = sp.y;
- actor->z = sp.z;
+ ctx.actor->x = sp.x;
+ ctx.actor->y = sp.y;
+ ctx.actor->z = sp.z;
return 0;
}
/*0x09*/
-static int32 mLABEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->labelIdx = *(scriptPtr);
- actor->positionInMoveScript++;
- actor->currentLabelPtr = actor->positionInMoveScript - 2;
+static int32 mLABEL(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->labelIdx = *(scriptPtr);
+ ctx.actor->positionInMoveScript++;
+ ctx.actor->currentLabelPtr = ctx.actor->positionInMoveScript - 2;
return 0;
}
/*0x0A*/
-static int32 mGOTO(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript = *((int16 *)scriptPtr);
+static int32 mGOTO(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript = *((int16 *)scriptPtr);
return 0;
}
/*0x0B*/
-static int32 mSTOP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript = -1;
+static int32 mSTOP(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript = -1;
return 1;
}
/*0x0C*/
-static int32 mGOTO_SYM_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript++;
+static int32 mGOTO_SYM_POINT(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript++;
engine->_scene->currentScriptValue = *(scriptPtr);
const ScenePoint &sp = engine->_scene->sceneTracks[engine->_scene->currentScriptValue];
@@ -195,16 +199,16 @@ static int32 mGOTO_SYM_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
engine->_renderer->destY = sp.y;
engine->_renderer->destZ = sp.z;
- const int32 newAngle = 0x200 + engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, sp.x, sp.z);
+ const int32 newAngle = 0x200 + engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->x, ctx.actor->z, sp.x, sp.z);
- if (actor->staticFlags.bIsSpriteActor) {
- actor->angle = newAngle;
+ if (ctx.actor->staticFlags.bIsSpriteActor) {
+ ctx.actor->angle = newAngle;
} else {
- engine->_movements->moveActor(actor->angle, newAngle, actor->speed, &actor->move);
+ engine->_movements->moveActor(ctx.actor->angle, newAngle, ctx.actor->speed, &ctx.actor->move);
}
if (engine->_movements->targetActorDistance > 500) {
- actor->positionInMoveScript -= 2;
+ ctx.actor->positionInMoveScript -= 2;
return 1;
}
@@ -212,11 +216,11 @@ static int32 mGOTO_SYM_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
}
/*0x0D*/
-static int32 mWAIT_NUM_ANIM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript += 2;
+static int32 mWAIT_NUM_ANIM(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript += 2;
bool abortMove = 0;
- if (actor->dynamicFlags.bAnimEnded) {
+ if (ctx.actor->dynamicFlags.bAnimEnded) {
int32 animPos, animRepeats;
animRepeats = *(scriptPtr);
@@ -236,25 +240,25 @@ static int32 mWAIT_NUM_ANIM(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
}
if (abortMove == 1) {
- actor->positionInMoveScript -= 3;
+ ctx.actor->positionInMoveScript -= 3;
}
return abortMove;
}
/*0x0E*/
-static int32 mSAMPLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mSAMPLE(TwinEEngine *engine, ScriptContext& ctx) {
int32 sampleIdx = *((int16 *)scriptPtr);
- engine->_sound->playSample(sampleIdx, 0x1000, 1, actor->x, actor->y, actor->z, actorIdx);
- actor->positionInMoveScript += 2;
+ engine->_sound->playSample(sampleIdx, 0x1000, 1, ctx.actor->x, ctx.actor->y, ctx.actor->z, ctx.actorIdx);
+ ctx.actor->positionInMoveScript += 2;
return 0;
}
/*0x0F*/
-static int32 mGOTO_POINT_3D(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript++;
+static int32 mGOTO_POINT_3D(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript++;
- if (!actor->staticFlags.bIsSpriteActor) {
+ if (!ctx.actor->staticFlags.bIsSpriteActor) {
return 0;
}
@@ -265,48 +269,47 @@ static int32 mGOTO_POINT_3D(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
engine->_renderer->destY = sp.y;
engine->_renderer->destZ = sp.z;
- actor->angle = engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, sp.x, sp.z);
- actor->animType = engine->_movements->getAngleAndSetTargetActorDistance(actor->y, 0, sp.y, engine->_movements->targetActorDistance);
+ ctx.actor->angle = engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->x, ctx.actor->z, sp.x, sp.z);
+ ctx.actor->animType = engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->y, 0, sp.y, engine->_movements->targetActorDistance);
if (engine->_movements->targetActorDistance > 100) {
- actor->positionInMoveScript -= 2;
+ ctx.actor->positionInMoveScript -= 2;
return 1;
- } else {
- actor->x = sp.x;
- actor->y = sp.y;
- actor->z = sp.z;
}
+ ctx.actor->x = sp.x;
+ ctx.actor->y = sp.y;
+ ctx.actor->z = sp.z;
return 0;
}
/*0x10*/
-static int32 mSPEED(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript += 2;
- actor->speed = *((int16 *)scriptPtr);
+static int32 mSPEED(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript += 2;
+ ctx.actor->speed = *((int16 *)scriptPtr);
- if (actor->staticFlags.bIsSpriteActor) {
- engine->_movements->setActorAngle(0, actor->speed, 50, move);
+ if (ctx.actor->staticFlags.bIsSpriteActor) {
+ engine->_movements->setActorAngle(0, ctx.actor->speed, 50, &ctx.actor->move);
}
return 0;
}
/*0x11*/
-static int32 mBACKGROUND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript++;
+static int32 mBACKGROUND(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript++;
if (*scriptPtr != 0) {
- if (!actor->staticFlags.bIsBackgrounded) {
- actor->staticFlags.bIsBackgrounded = 1;
- if (actor->dynamicFlags.bIsVisible) {
+ if (!ctx.actor->staticFlags.bIsBackgrounded) {
+ ctx.actor->staticFlags.bIsBackgrounded = 1;
+ if (ctx.actor->dynamicFlags.bIsVisible) {
engine->_redraw->reqBgRedraw = true;
}
}
} else {
- if (actor->staticFlags.bIsBackgrounded) {
- actor->staticFlags.bIsBackgrounded = 0;
- if (actor->dynamicFlags.bIsVisible) {
+ if (ctx.actor->staticFlags.bIsBackgrounded) {
+ ctx.actor->staticFlags.bIsBackgrounded = 0;
+ if (ctx.actor->dynamicFlags.bIsVisible) {
engine->_redraw->reqBgRedraw = true;
}
}
@@ -316,8 +319,8 @@ static int32 mBACKGROUND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
}
/*0x12*/
-static int32 mWAIT_NUM_SECOND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript += 5;
+static int32 mWAIT_NUM_SECOND(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript += 5;
const int32 numSeconds = *(scriptPtr++);
int32 currentTime = *((int32 *)scriptPtr);
@@ -328,7 +331,7 @@ static int32 mWAIT_NUM_SECOND(TwinEEngine *engine, int32 actorIdx, ActorStruct *
}
if (engine->lbaTime < currentTime) {
- actor->positionInMoveScript -= 6;
+ ctx.actor->positionInMoveScript -= 6;
return 1;
} else {
*((int32 *)scriptPtr) = 0;
@@ -338,93 +341,93 @@ static int32 mWAIT_NUM_SECOND(TwinEEngine *engine, int32 actorIdx, ActorStruct *
}
/*0x13*/
-static int32 mNO_BODY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- engine->_actor->initModelActor(-1, actorIdx);
+static int32 mNO_BODY(TwinEEngine *engine, ScriptContext& ctx) {
+ engine->_actor->initModelActor(-1, ctx.actorIdx);
return 0;
}
/*0x14*/
-static int32 mBETA(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mBETA(TwinEEngine *engine, ScriptContext& ctx) {
const int16 beta = *((int16 *)scriptPtr);
- actor->positionInMoveScript += 2;
+ ctx.actor->positionInMoveScript += 2;
- actor->angle = beta;
+ ctx.actor->angle = beta;
- if (actor->staticFlags.bIsSpriteActor) {
- engine->_movements->clearRealAngle(actor);
+ if (ctx.actor->staticFlags.bIsSpriteActor) {
+ engine->_movements->clearRealAngle(ctx.actor);
}
return 0;
}
/*0x15*/
-static int32 mOPEN_LEFT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript += 2;
- if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
- actor->angle = 0x300;
- actor->doorStatus = *((int16 *)scriptPtr);
- actor->dynamicFlags.bIsSpriteMoving = 1;
- actor->speed = 1000;
- engine->_movements->setActorAngle(0, 1000, 50, move);
+static int32 mOPEN_LEFT(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript += 2;
+ if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+ ctx.actor->angle = 0x300;
+ ctx.actor->doorStatus = *((int16 *)scriptPtr);
+ ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
+ ctx.actor->speed = 1000;
+ engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
}
return 0;
}
/*0x16*/
-static int32 mOPEN_RIGHT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript += 2;
- if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
- actor->angle = 0x100;
- actor->doorStatus = *((int16 *)scriptPtr);
- actor->dynamicFlags.bIsSpriteMoving = 1;
- actor->speed = 1000;
- engine->_movements->setActorAngle(0, 1000, 50, move);
+static int32 mOPEN_RIGHT(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript += 2;
+ if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+ ctx.actor->angle = 0x100;
+ ctx.actor->doorStatus = *((int16 *)scriptPtr);
+ ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
+ ctx.actor->speed = 1000;
+ engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
}
return 0;
}
/*0x17*/
-static int32 mOPEN_UP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript += 2;
- if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
- actor->angle = 0x200;
- actor->doorStatus = *((int16 *)scriptPtr);
- actor->dynamicFlags.bIsSpriteMoving = 1;
- actor->speed = 1000;
- engine->_movements->setActorAngle(0, 1000, 50, move);
+static int32 mOPEN_UP(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript += 2;
+ if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+ ctx.actor->angle = 0x200;
+ ctx.actor->doorStatus = *((int16 *)scriptPtr);
+ ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
+ ctx.actor->speed = 1000;
+ engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
}
return 0;
}
/*0x18*/
-static int32 mOPEN_DOWN(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript += 2;
- if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
- actor->angle = 0;
- actor->doorStatus = *((int16 *)scriptPtr);
- actor->dynamicFlags.bIsSpriteMoving = 1;
- actor->speed = 1000;
- engine->_movements->setActorAngle(0, 1000, 50, move);
+static int32 mOPEN_DOWN(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript += 2;
+ if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+ ctx.actor->angle = 0;
+ ctx.actor->doorStatus = *((int16 *)scriptPtr);
+ ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
+ ctx.actor->speed = 1000;
+ engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
}
return 0;
}
/*0x19*/
-static int32 mCLOSE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
- actor->doorStatus = 0;
- actor->dynamicFlags.bIsSpriteMoving = 1;
- actor->speed = -1000;
- engine->_movements->setActorAngle(0, -1000, 50, move);
+static int32 mCLOSE(TwinEEngine *engine, ScriptContext& ctx) {
+ if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+ ctx.actor->doorStatus = 0;
+ ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
+ ctx.actor->speed = -1000;
+ engine->_movements->setActorAngle(0, -1000, 50, &ctx.actor->move);
}
return 0;
}
/*0x1A*/
-static int32 mWAIT_DOOR(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
- if (actor->speed) {
- actor->positionInMoveScript--;
+static int32 mWAIT_DOOR(TwinEEngine *engine, ScriptContext& ctx) {
+ if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+ if (ctx.actor->speed) {
+ ctx.actor->positionInMoveScript--;
return 1;
}
}
@@ -432,107 +435,105 @@ static int32 mWAIT_DOOR(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
}
/*0x1B*/
-static int32 mSAMPLE_RND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mSAMPLE_RND(TwinEEngine *engine, ScriptContext& ctx) {
int32 freq = engine->getRandomNumber(2048) + 2048;
int32 sampleIdx = *((int16 *)scriptPtr);
- engine->_sound->playSample(sampleIdx, freq, 1, actor->x, actor->y, actor->z, actorIdx);
- actor->positionInMoveScript += 2;
+ engine->_sound->playSample(sampleIdx, freq, 1, ctx.actor->x, ctx.actor->y, ctx.actor->z, ctx.actorIdx);
+ ctx.actor->positionInMoveScript += 2;
return 0;
}
/*0x1C*/
-static int32 mSAMPLE_ALWAYS(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mSAMPLE_ALWAYS(TwinEEngine *engine, ScriptContext& ctx) {
int32 sampleIdx = *((int16 *)scriptPtr);
if (!engine->_sound->isSamplePlaying(sampleIdx)) { // if its not playing
- engine->_sound->playSample(sampleIdx, 0x1000, -1, actor->x, actor->y, actor->z, actorIdx);
+ engine->_sound->playSample(sampleIdx, 0x1000, -1, ctx.actor->x, ctx.actor->y, ctx.actor->z, ctx.actorIdx);
}
- actor->positionInMoveScript += 2;
+ ctx.actor->positionInMoveScript += 2;
return 0;
}
/*0x1D*/
-static int32 mSAMPLE_STOP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mSAMPLE_STOP(TwinEEngine *engine, ScriptContext& ctx) {
int32 sampleIdx = *((int16 *)scriptPtr);
engine->_sound->stopSample(sampleIdx);
- actor->positionInMoveScript += 2;
+ ctx.actor->positionInMoveScript += 2;
return 0;
}
/*0x1E*/
-static int32 mPLAY_FLA(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mPLAY_FLA(TwinEEngine *engine, ScriptContext& ctx) {
// TODO
return -1;
}
/*0x1F*/
-static int32 mREPEAT_SAMPLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mREPEAT_SAMPLE(TwinEEngine *engine, ScriptContext& ctx) {
numRepeatSample = *((int16 *)scriptPtr);
- actor->positionInMoveScript += 2;
+ ctx.actor->positionInMoveScript += 2;
return 0;
}
/*0x20*/
-static int32 mSIMPLE_SAMPLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mSIMPLE_SAMPLE(TwinEEngine *engine, ScriptContext& ctx) {
int32 sampleIdx = *((int16 *)scriptPtr);
- engine->_sound->playSample(sampleIdx, 0x1000, numRepeatSample, actor->x, actor->y, actor->z, actorIdx);
+ engine->_sound->playSample(sampleIdx, 0x1000, numRepeatSample, ctx.actor->x, ctx.actor->y, ctx.actor->z, ctx.actorIdx);
numRepeatSample = 1;
- actor->positionInMoveScript += 2;
+ ctx.actor->positionInMoveScript += 2;
return 0;
}
/*0x21*/
-static int32 mFACE_HERO(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript += 2;
- if (actor->staticFlags.bIsSpriteActor) {
+static int32 mFACE_HERO(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript += 2;
+ if (ctx.actor->staticFlags.bIsSpriteActor) {
return 0;
}
engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
- if (engine->_scene->currentScriptValue == -1 && actor->move.numOfStep == 0) {
- engine->_scene->currentScriptValue = engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, engine->_scene->sceneHero->x, engine->_scene->sceneHero->z);
- engine->_movements->moveActor(actor->angle, engine->_scene->currentScriptValue, actor->speed, &actor->move);
+ if (engine->_scene->currentScriptValue == -1 && ctx.actor->move.numOfStep == 0) {
+ engine->_scene->currentScriptValue = engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->x, ctx.actor->z, engine->_scene->sceneHero->x, engine->_scene->sceneHero->z);
+ engine->_movements->moveActor(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, &ctx.actor->move);
*((int16 *)scriptPtr) = engine->_scene->currentScriptValue;
}
- if (actor->angle != engine->_scene->currentScriptValue) {
- actor->positionInMoveScript -= 3;
+ if (ctx.actor->angle != engine->_scene->currentScriptValue) {
+ ctx.actor->positionInMoveScript -= 3;
return 1;
- } else {
- engine->_movements->clearRealAngle(actor);
- *((int16 *)scriptPtr) = -1;
}
+ engine->_movements->clearRealAngle(ctx.actor);
+ *((int16 *)scriptPtr) = -1;
return 0;
}
/*0x22*/
-static int32 mANGLE_RND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
- actor->positionInMoveScript += 4;
- if (actor->staticFlags.bIsSpriteActor) {
+static int32 mANGLE_RND(TwinEEngine *engine, ScriptContext& ctx) {
+ ctx.actor->positionInMoveScript += 4;
+ if (ctx.actor->staticFlags.bIsSpriteActor) {
return 0;
}
engine->_scene->currentScriptValue = *((int16 *)scriptPtr + 2);
- if (engine->_scene->currentScriptValue == -1 && actor->move.numOfStep == 0) {
+ if (engine->_scene->currentScriptValue == -1 && ctx.actor->move.numOfStep == 0) {
if (engine->getRandomNumber() & 1) {
engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
- const int32 newAngle = actor->angle + 0x100 + (ABS(engine->_scene->currentScriptValue) >> 1);
+ const int32 newAngle = ctx.actor->angle + 0x100 + (ABS(engine->_scene->currentScriptValue) >> 1);
engine->_scene->currentScriptValue = (newAngle - engine->getRandomNumber(engine->_scene->currentScriptValue)) & 0x3FF;
} else {
engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
- const int32 newAngle = actor->angle - 0x100 + (ABS(engine->_scene->currentScriptValue) >> 1);
+ const int32 newAngle = ctx.actor->angle - 0x100 + (ABS(engine->_scene->currentScriptValue) >> 1);
engine->_scene->currentScriptValue = (newAngle - engine->getRandomNumber(engine->_scene->currentScriptValue)) & 0x3FF;
}
- engine->_movements->moveActor(actor->angle, engine->_scene->currentScriptValue, actor->speed, &actor->move);
+ engine->_movements->moveActor(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, &ctx.actor->move);
*((int16 *)scriptPtr + 2) = engine->_scene->currentScriptValue;
}
- if (actor->angle != engine->_scene->currentScriptValue) {
- actor->positionInMoveScript -= 5;
+ if (ctx.actor->angle != engine->_scene->currentScriptValue) {
+ ctx.actor->positionInMoveScript -= 5;
return 1;
- } else {
- engine->_movements->clearRealAngle(actor);
- *((int16 *)scriptPtr + 2) = -1;
}
+ engine->_movements->clearRealAngle(ctx.actor);
+ *((int16 *)scriptPtr + 2) = -1;
return 0;
}
@@ -576,17 +577,16 @@ static const ScriptMoveFunction function_map[] = {
ScriptMove::ScriptMove(TwinEEngine *engine) : _engine(engine) {
scriptPtr = nullptr;
scriptPosition = 0;
- move = nullptr;
numRepeatSample = 1;
}
void ScriptMove::processMoveScript(int32 actorIdx) {
ActorStruct *actor = _engine->_scene->getActor(actorIdx);
- move = &actor->move;
numRepeatSample = 1;
int32 end = -2;
+ ScriptContext ctx{actorIdx, actor};
do {
scriptPosition = actor->positionInMoveScript;
// TODO: use Common::MemoryReadStream for the script parsing
@@ -596,7 +596,7 @@ void ScriptMove::processMoveScript(int32 actorIdx) {
actor->positionInMoveScript++;
if (scriptOpcode >= 0 && scriptOpcode < ARRAYSIZE(function_map)) {
- end = function_map[scriptOpcode].function(_engine, actorIdx, actor);
+ end = function_map[scriptOpcode].function(_engine, ctx);
} else {
error("Actor %d with wrong offset/opcode - Offset: %d (opcode: %i)", actorIdx, actor->positionInLifeScript, scriptOpcode);
}
Commit: bd4fa2e7082f0ca9b5e17eed0eb330795916503e
https://github.com/scummvm/scummvm/commit/bd4fa2e7082f0ca9b5e17eed0eb330795916503e
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: cleanup in move script
Changed paths:
engines/twine/animations.cpp
engines/twine/script_move_v1.cpp
diff --git a/engines/twine/animations.cpp b/engines/twine/animations.cpp
index 8a0a1a420d..9d6e80a366 100644
--- a/engines/twine/animations.cpp
+++ b/engines/twine/animations.cpp
@@ -704,6 +704,7 @@ void Animations::processAnimActions(int32 actorIdx) {
}
}
+// TODO: convert to boolean
int32 Animations::initAnim(AnimationTypes newAnim, int16 animType, uint8 animExtra, int32 actorIdx) {
ActorStruct *actor = _engine->_scene->getActor(actorIdx);
if (actor->entity == -1) {
diff --git a/engines/twine/script_move_v1.cpp b/engines/twine/script_move_v1.cpp
index 58c1e07f06..acb688012c 100644
--- a/engines/twine/script_move_v1.cpp
+++ b/engines/twine/script_move_v1.cpp
@@ -81,11 +81,10 @@ static int32 mANIM(TwinEEngine *engine, ScriptContext& ctx) {
AnimationTypes animIdx = (AnimationTypes) * (scriptPtr++);
if (engine->_animations->initAnim(animIdx, 0, 0, ctx.actorIdx)) {
ctx.actor->positionInMoveScript++;
- } else {
- ctx.actor->positionInMoveScript = scriptPosition;
- return 1;
+ return 0;
}
- return 0;
+ ctx.actor->positionInMoveScript = scriptPosition;
+ return 1;
}
/*0x04*/
@@ -138,7 +137,7 @@ static int32 mANGLE(TwinEEngine *engine, ScriptContext& ctx) {
}
engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
if (ctx.actor->move.numOfStep == 0) {
- engine->_movements->moveActor(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, move);
+ engine->_movements->moveActor(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, &ctx.actor->move);
}
if (ctx.actor->angle == engine->_scene->currentScriptValue) {
engine->_movements->clearRealAngle(ctx.actor);
Commit: 01dc17647a1224d6829e7218d95fb53c65ddf5ab
https://github.com/scummvm/scummvm/commit/01dc17647a1224d6829e7218d95fb53c65ddf5ab
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: replaced magic number
but this looks wrong...
Changed paths:
engines/twine/script_life_v1.cpp
diff --git a/engines/twine/script_life_v1.cpp b/engines/twine/script_life_v1.cpp
index 492c17fa50..983968dedf 100644
--- a/engines/twine/script_life_v1.cpp
+++ b/engines/twine/script_life_v1.cpp
@@ -31,6 +31,7 @@
#include "twine/holomap.h"
#include "twine/input.h"
#include "twine/interface.h"
+#include "twine/menu.h"
#include "twine/movements.h"
#include "twine/music.h"
#include "twine/redraw.h"
@@ -1462,7 +1463,7 @@ static int32 lTEXT(TwinEEngine *engine, ScriptContext& ctx) {
if (drawVar1 < 440) {
if (engine->cfgfile.Version == USA_VERSION) {
if (!textIdx) {
- textIdx = 16;
+ textIdx = TextId::kSaveSettings;
}
}
Commit: 02409852aab1d846af24920c56dd46aecb4bb2cb
https://github.com/scummvm/scummvm/commit/02409852aab1d846af24920c56dd46aecb4bb2cb
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: replaced magic number
Changed paths:
engines/twine/gamestate.h
engines/twine/script_life_v1.cpp
diff --git a/engines/twine/gamestate.h b/engines/twine/gamestate.h
index 94496cc5dc..69c988fdcb 100644
--- a/engines/twine/gamestate.h
+++ b/engines/twine/gamestate.h
@@ -62,7 +62,8 @@ enum InventoryItems {
kKeypad = 24,
kCoffeeCan = 25,
kiBonusList = 26,
- kiCloverLeaf = 27
+ kiCloverLeaf = 27,
+ MaxInventoryItems = 28
};
/** Magicball strength*/
diff --git a/engines/twine/script_life_v1.cpp b/engines/twine/script_life_v1.cpp
index 983968dedf..e6e0fafe4b 100644
--- a/engines/twine/script_life_v1.cpp
+++ b/engines/twine/script_life_v1.cpp
@@ -254,7 +254,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ScriptContext& ctx) {
case kcFLAG_GAME: {
int32 flagIdx = *(scriptPtr++);
if (!engine->_gameState->gameFlags[GAMEFLAG_INVENTORY_DISABLED] ||
- (engine->_gameState->gameFlags[GAMEFLAG_INVENTORY_DISABLED] && flagIdx >= 28)) {
+ (engine->_gameState->gameFlags[GAMEFLAG_INVENTORY_DISABLED] && flagIdx >= MaxInventoryItems)) {
engine->_scene->currentScriptValue = engine->_gameState->gameFlags[flagIdx];
} else {
if (flagIdx == GAMEFLAG_INVENTORY_DISABLED) {
Commit: 526a63610c6c4d1df9d2921a09c00617360035ee
https://github.com/scummvm/scummvm/commit/526a63610c6c4d1df9d2921a09c00617360035ee
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: added give_key debug command
Changed paths:
engines/twine/console.cpp
engines/twine/console.h
diff --git a/engines/twine/console.cpp b/engines/twine/console.cpp
index 788ed8d17e..dd07154124 100644
--- a/engines/twine/console.cpp
+++ b/engines/twine/console.cpp
@@ -30,6 +30,7 @@ namespace TwinE {
TwinEConsole::TwinEConsole(TwinEEngine *engine) : _engine(engine), GUI::Debugger() {
registerCmd("give_allitems", WRAP_METHOD(TwinEConsole, doGiveAllItems));
+ registerCmd("give_key", WRAP_METHOD(TwinEConsole, doGiveKey));
registerCmd("change_scene", WRAP_METHOD(TwinEConsole, doChangeScene));
registerCmd("list_menutext", WRAP_METHOD(TwinEConsole, doListMenuText));
registerCmd("toggle_debug", WRAP_METHOD(TwinEConsole, doToggleDebug));
@@ -38,6 +39,15 @@ TwinEConsole::TwinEConsole(TwinEEngine *engine) : _engine(engine), GUI::Debugger
TwinEConsole::~TwinEConsole() {
}
+bool TwinEConsole::doGiveKey(int argc, const char **argv) {
+ int amount = 1;
+ if (argc >= 1) {
+ amount = atoi(argv[1]);
+ }
+ _engine->_gameState->inventoryNumKeys += amount;
+ return true;
+}
+
bool TwinEConsole::doToggleDebug(int argc, const char **argv) {
if (_engine->cfgfile.Debug) {
debug("Disabling debug mode");
diff --git a/engines/twine/console.h b/engines/twine/console.h
index cf8518bc4a..be14df760f 100644
--- a/engines/twine/console.h
+++ b/engines/twine/console.h
@@ -24,6 +24,7 @@
#define TWINE_CONSOLE_H
#include "gui/debugger.h"
+#include "twine/gamestate.h"
namespace TwinE {
@@ -37,6 +38,7 @@ private:
bool doChangeScene(int argc, const char **argv);
bool doListMenuText(int argc, const char **argv);
bool doToggleDebug(int argc, const char **argv);
+ bool doGiveKey(int argc, const char **argv);
public:
TwinEConsole(TwinEEngine *engine);
~TwinEConsole() override;
Commit: e181baf0e6c13647f87ce21373578eaae846b407
https://github.com/scummvm/scummvm/commit/e181baf0e6c13647f87ce21373578eaae846b407
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: activate some of the scummvm features
Changed paths:
engines/twine/twine.cpp
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 0dbaadffbe..60cae0256b 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -27,13 +27,14 @@
#include "common/events.h"
#include "common/keyboard.h"
#include "common/savefile.h"
+#include "common/scummsys.h"
#include "common/str.h"
#include "common/stream.h"
#include "common/system.h"
#include "common/textconsole.h"
#include "common/translation.h"
-#include "engines/util.h"
#include "engines/metaengine.h"
+#include "engines/util.h"
#include "graphics/managed_surface.h"
#include "graphics/palette.h"
#include "graphics/pixelformat.h"
@@ -174,6 +175,15 @@ Common::Error TwinEEngine::run() {
}
bool TwinEEngine::hasFeature(EngineFeature f) const {
+ switch (f) {
+ case EngineFeature::kSupportsReturnToLauncher:
+ case EngineFeature::kSupportsLoadingDuringRuntime:
+ case EngineFeature::kSupportsSavingDuringRuntime:
+ case EngineFeature::kSupportsChangingOptionsDuringRuntime:
+ return true;
+ default:
+ break;
+ }
return false;
}
@@ -185,21 +195,21 @@ bool TwinEEngine::hasSavedSlots() {
void TwinEEngine::wipeSaveSlot(int slot) {
Common::SaveFileManager *saveFileMan = getSaveFileManager();
- const Common::String& saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
+ const Common::String &saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
saveFileMan->removeSavefile(saveFile);
}
bool TwinEEngine::loadSaveSlot(int slot) {
Common::SaveFileManager *saveFileMan = getSaveFileManager();
- const Common::String& saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
- Common::InSaveFile* file = saveFileMan->openForLoading(saveFile);
+ const Common::String &saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
+ Common::InSaveFile *file = saveFileMan->openForLoading(saveFile);
return _gameState->loadGame(file);
}
bool TwinEEngine::saveSlot(int slot) {
Common::SaveFileManager *saveFileMan = getSaveFileManager();
- const Common::String& saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
- Common::OutSaveFile* file = saveFileMan->openForSaving(saveFile);
+ const Common::String &saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
+ Common::OutSaveFile *file = saveFileMan->openForSaving(saveFile);
return _gameState->saveGame(file);
}
@@ -584,7 +594,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration
// Recenter Screen
if (_input->isActionActive(TwinEActionType::RecenterScreenOnTwinsen) && !disableScreenRecenter) {
- const ActorStruct* currentlyFollowedActor = _scene->getActor(_scene->currentlyFollowedActor);
+ const ActorStruct *currentlyFollowedActor = _scene->getActor(_scene->currentlyFollowedActor);
_grid->newCameraX = currentlyFollowedActor->x >> 9;
_grid->newCameraY = currentlyFollowedActor->y >> 8;
_grid->newCameraZ = currentlyFollowedActor->z >> 9;
Commit: f9fa523c622f464978539106fc586b4888211d9a
https://github.com/scummvm/scummvm/commit/f9fa523c622f464978539106fc586b4888211d9a
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: changed engine init message
Changed paths:
engines/twine/twine.cpp
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 60cae0256b..0db9fae39b 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -138,15 +138,10 @@ TwinEEngine::~TwinEEngine() {
}
Common::Error TwinEEngine::run() {
- /** Engine current version */
- const char *ENGINE_VERSION = "0.2.2";
-
- // Show engine information
- debug("TwinEngine v%s", ENGINE_VERSION);
+ debug("Based on TwinEngine v0.2.2");
debug("(c)2002 The TwinEngine team.");
debug("(c)2020 The ScummVM team.");
debug("Refer to the credits for further details.");
- debug("Released under the terms of the GNU GPL license version 2 (or, at your opinion, any later). See COPYING file.");
debug("The original Little Big Adventure game is:");
debug("(c)1994 by Adeline Software International, All Rights Reserved.");
Commit: dba162cae0c967228dc130b49ba909459ef0873f
https://github.com/scummvm/scummvm/commit/dba162cae0c967228dc130b49ba909459ef0873f
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: reduced scope
Changed paths:
engines/twine/extra.cpp
diff --git a/engines/twine/extra.cpp b/engines/twine/extra.cpp
index 44433020ac..fec4813b24 100644
--- a/engines/twine/extra.cpp
+++ b/engines/twine/extra.cpp
@@ -612,18 +612,16 @@ void Extra::processExtras() {
}
// process actor target hit
if (extra->type & 0x80) {
- int32 actorIdx, actorIdxAttacked, tmpAngle, angle;
-
- actorIdxAttacked = extra->lifeTime;
- actorIdx = extra->actorIdx;
+ int32 actorIdxAttacked = extra->lifeTime;
+ int32 actorIdx = extra->actorIdx;
const ActorStruct *actor = _engine->_scene->getActor(actorIdxAttacked);
currentExtraX = actor->x;
currentExtraY = actor->y + 1000;
currentExtraZ = actor->z;
- tmpAngle = _engine->_movements->getAngleAndSetTargetActorDistance(extra->x, extra->z, currentExtraX, currentExtraZ);
- angle = (tmpAngle - extra->angle) & 0x3FF;
+ int32 tmpAngle = _engine->_movements->getAngleAndSetTargetActorDistance(extra->x, extra->z, currentExtraX, currentExtraZ);
+ int32 angle = (tmpAngle - extra->angle) & 0x3FF;
if (angle > 400 && angle < 600) {
if (extra->strengthOfHit) {
Commit: d72a0ed1f3fe116146241de0919443b4e64adb4d
https://github.com/scummvm/scummvm/commit/d72a0ed1f3fe116146241de0919443b4e64adb4d
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00
Commit Message:
TWINE: removed unused method
Changed paths:
engines/twine/sound.cpp
engines/twine/sound.h
diff --git a/engines/twine/sound.cpp b/engines/twine/sound.cpp
index a8217a6619..c6aaeaad7c 100644
--- a/engines/twine/sound.cpp
+++ b/engines/twine/sound.cpp
@@ -41,17 +41,6 @@ namespace TwinE {
Sound::Sound(TwinEEngine *engine) : _engine(engine) {
}
-void Sound::sampleVolume(int32 chan, int32 volume) {
- if (chan == -1) {
- _engine->_system->getMixer()->setVolumeForSoundType(Audio::Mixer::kPlainSoundType, volume);
- return;
- }
- if (chan < 0 || chan > ARRAYSIZE(samplesPlaying)) {
- error("Given channel index is out of bounds: %i", chan);
- }
- _engine->_system->getMixer()->setChannelVolume(samplesPlaying[chan], volume / 2);
-}
-
void Sound::setSamplePosition(int32 chan, int32 x, int32 y, int32 z) {
int32 distance;
distance = ABS(_engine->_movements->getDistance3D(_engine->_grid->newCameraX << 9, _engine->_grid->newCameraY << 8, _engine->_grid->newCameraZ << 9, x, y, z));
diff --git a/engines/twine/sound.h b/engines/twine/sound.h
index 699a071110..eaf3ef1bab 100644
--- a/engines/twine/sound.h
+++ b/engines/twine/sound.h
@@ -52,12 +52,6 @@ public:
bool isChannelPlaying(int32 channel);
- /**
- * Sample volume
- * @param channel sample channel
- * @param volume sample volume number
- */
- void sampleVolume(int32 channel, int32 volume);
/**
* Play FLA movie samples
Commit: a9aa2dba5d8122d2ca6be97b75c5648c9f71ad63
https://github.com/scummvm/scummvm/commit/a9aa2dba5d8122d2ca6be97b75c5648c9f71ad63
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:22:24+01:00
Commit Message:
TWINE: stop all running samples for a new game
Changed paths:
engines/twine/menuoptions.cpp
diff --git a/engines/twine/menuoptions.cpp b/engines/twine/menuoptions.cpp
index 8b23ed3432..3f409e42f9 100644
--- a/engines/twine/menuoptions.cpp
+++ b/engines/twine/menuoptions.cpp
@@ -33,6 +33,7 @@
#include "twine/resources.h"
#include "twine/scene.h"
#include "twine/screens.h"
+#include "twine/sound.h"
#include "twine/text.h"
#include "twine/twine.h"
@@ -45,6 +46,7 @@ static const char allowedCharIndex[] = " ABCDEFGHIJKLM.NOPQRSTUVWXYZ-abcdefghijk
void MenuOptions::newGame() {
_engine->_music->stopMusic();
+ _engine->_sound->stopSamples();
int32 tmpFlagDisplayText = _engine->cfgfile.FlagDisplayText;
_engine->cfgfile.FlagDisplayText = true;
More information about the Scummvm-git-logs
mailing list