aboutsummaryrefslogtreecommitdiff
path: root/sword2/function.cpp
diff options
context:
space:
mode:
authorTorbjörn Andersson2005-05-03 09:00:06 +0000
committerTorbjörn Andersson2005-05-03 09:00:06 +0000
commitf5f9da940b6071df1e921faa42fa56a501e2ab62 (patch)
treef4ce163f7ed645ed75cae8a98307d8e7a5059101 /sword2/function.cpp
parent5f7b3d8cf2bd69b01258b8facdabc9b9de736555 (diff)
downloadscummvm-rg350-f5f9da940b6071df1e921faa42fa56a501e2ab62.tar.gz
scummvm-rg350-f5f9da940b6071df1e921faa42fa56a501e2ab62.tar.bz2
scummvm-rg350-f5f9da940b6071df1e921faa42fa56a501e2ab62.zip
More cleanup/restructuring: Moved walk-related code from Logic to Router.
(I may have to think up some better name for that class later.) svn-id: r17901
Diffstat (limited to 'sword2/function.cpp')
-rw-r--r--sword2/function.cpp557
1 files changed, 91 insertions, 466 deletions
diff --git a/sword2/function.cpp b/sword2/function.cpp
index 6508cee08a..da921ba4a4 100644
--- a/sword2/function.cpp
+++ b/sword2/function.cpp
@@ -29,7 +29,6 @@
#include "sword2/interpreter.h"
#include "sword2/logic.h"
#include "sword2/maketext.h"
-#include "sword2/memory.h"
#include "sword2/mouse.h"
#include "sword2/resman.h"
#include "sword2/router.h"
@@ -53,7 +52,7 @@ int32 Logic::fnRegisterStartPoint(int32 *params) {
// 1 pointer to ascii message
int32 key = params[0];
- char *name = (char *) _vm->_memory->decodePtr(params[1]);
+ char *name = (char *) decodePtr(params[1]);
_vm->registerStartPoint(key, name);
return IR_CONT;
@@ -107,7 +106,7 @@ int32 Logic::fnRegisterMouse(int32 *params) {
// params: 0 pointer to ObjectMouse or 0 for no write to mouse
// list
- ObjectMouse *ob_mouse = (ObjectMouse *) _vm->_memory->decodePtr(params[0]);
+ ObjectMouse *ob_mouse = (ObjectMouse *) decodePtr(params[0]);
_vm->_mouse->registerMouse(ob_mouse, NULL);
return IR_CONT;
@@ -197,162 +196,12 @@ int32 Logic::fnWalk(int32 *params) {
// 5 target y-coord
// 6 target direction (8 means end walk on ANY direction)
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
- ObjectGraphic *ob_graph = (ObjectGraphic *) _vm->_memory->decodePtr(params[1]);
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[2]);
-
- int16 target_x = (int16) params[4];
- int16 target_y = (int16) params[5];
- uint8 target_dir = (uint8) params[6];
-
- ObjectWalkdata *ob_walkdata;
-
- // If this is the start of the walk, calculate the route.
-
- if (!ob_logic->looping) {
- // If we're already there, don't even bother allocating
- // memory and calling the router, just quit back & continue
- // the script! This avoids an embarassing mega stand frame
- // appearing for one cycle when we're already in position for
- // an anim eg. repeatedly clicking on same object to repeat
- // an anim - no mega frame will appear in between runs of the
- // anim.
-
- if (ob_mega->feet_x == target_x && ob_mega->feet_y == target_y && ob_mega->current_dir == target_dir) {
- _scriptVars[RESULT] = 0;
- return IR_CONT;
- }
-
- assert(params[6] >= 0 && params[6] <= 8);
-
- ob_walkdata = (ObjectWalkdata *) _vm->_memory->decodePtr(params[3]);
-
- ob_mega->walk_pc = 0;
-
- // Set up mem for _walkData in route_slots[] & set mega's
- // 'route_slot_id' accordingly
-
- _router->allocateRouteMem();
-
- int32 route = _router->routeFinder(ob_mega, ob_walkdata, target_x, target_y, target_dir);
-
- // 0 = can't make route to target
- // 1 = created route
- // 2 = zero route but may need to turn
-
- if (route == 1 || route == 2) {
- // so script fnWalk loop continues until end of
- // walk-anim
-
- ob_logic->looping = 1;
-
- // need to animate the route now, so don't set result
- // or return yet!
-
- // started walk
- ob_mega->currently_walking = 1;
-
- // (see fnGetPlayerSaveData() in save_rest.cpp
- } else {
- _router->freeRouteMem();
- _scriptVars[RESULT] = 1;
- return IR_CONT;
- }
-
- // Walk is about to start, so set the mega's graphic resource
- ob_graph->anim_resource = ob_mega->megaset_res;
- } else if (_scriptVars[EXIT_FADING] && _vm->_screen->getFadeStatus() == RDFADE_BLACK) {
- // Double clicked an exit so quit the walk when screen is black
- // ok, thats it - back to script and change screen
-
- ob_logic->looping = 0;
- _router->freeRouteMem();
-
- // Must clear in-case on the new screen there's a walk
- // instruction (which would get cut short)
- _scriptVars[EXIT_CLICK_ID] = 0;
-
- // finished walk
- ob_mega->currently_walking = 0;
-
- // see fnGetPlayerSaveData() in save_rest.cpp
-
- _scriptVars[RESULT] = 0;
-
- // continue the script so that RESULT can be checked!
- return IR_CONT;
- }
-
- // get pointer to walkanim & current frame position
-
- WalkData *walkAnim = _router->getRouteMem();
- int32 walk_pc = ob_mega->walk_pc;
-
- // If stopping the walk early, overwrite the next step with a
- // slow-out, then finish
-
- if (checkEventWaiting()) {
- if (walkAnim[walk_pc].step == 0 && walkAnim[walk_pc + 1].step == 1) {
- // At the beginning of a step
- ob_walkdata = (ObjectWalkdata *) _vm->_memory->decodePtr(params[3]);
- _router->earlySlowOut(ob_mega, ob_walkdata);
- }
- }
-
- // Get new frame of walk
-
- ob_graph->anim_pc = walkAnim[walk_pc].frame;
- ob_mega->current_dir = walkAnim[walk_pc].dir;
- ob_mega->feet_x = walkAnim[walk_pc].x;
- ob_mega->feet_y = walkAnim[walk_pc].y;
-
- // Check if NEXT frame is in fact the end-marker of the walk sequence
- // so we can return to script just as the final (stand) frame of the
- // walk is set - so that if followed by an anim, the anim's first
- // frame replaces the final stand-frame of the walk (see below)
-
- // '512' is end-marker
- if (walkAnim[walk_pc + 1].frame == 512) {
- ob_logic->looping = 0;
- _router->freeRouteMem();
-
- // finished walk
- ob_mega->currently_walking = 0;
-
- // (see fnGetPlayerSaveData() in save_rest.cpp
-
- // if George's walk has been interrupted to run a new action
- // script for instance or Nico's walk has been interrupted by
- // player clicking on her to talk
-
- // There used to be code here for checking if two megas were
- // colliding, but that code had been commented out, and it
- // was only run if a function that always returned zero
- // returned non-zero.
-
- if (checkEventWaiting()) {
- startEvent();
- _scriptVars[RESULT] = 1;
- return IR_TERMINATE;
- } else {
- _scriptVars[RESULT] = 0;
-
- // CONTINUE the script so that RESULT can be checked!
- // Also, if an anim command follows the fnWalk command,
- // the 1st frame of the anim (which is always a stand
- // frame itself) can replace the final stand frame of
- // the walk, to hide the slight difference between the
- // shrinking on the mega frames and the pre-shrunk anim
- // start-frame.
-
- return IR_CONT;
- }
- }
-
- // Increment the walkanim frame number and come back next cycle
-
- ob_mega->walk_pc++;
- return IR_REPEAT;
+ return _router->doWalk(
+ (ObjectLogic *) decodePtr(params[0]),
+ (ObjectGraphic *) decodePtr(params[1]),
+ (ObjectMega *) decodePtr(params[2]),
+ (ObjectWalkdata *) decodePtr(params[3]),
+ params[4], params[5], params[6]);
}
/**
@@ -366,52 +215,16 @@ int32 Logic::fnWalkToAnim(int32 *params) {
// 3 pointer to object's walkdata structure
// 4 anim resource id
- int32 pars[7];
-
- // Walkdata is needed for earlySlowOut if player clicks elsewhere
- // during the walk.
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = params[2];
- pars[3] = params[3];
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
-
- // If this is the start of the walk, read anim file to get start coords
-
- if (!ob_logic->looping) {
- byte *anim_file = _vm->_resman->openResource(params[4]);
- AnimHeader *anim_head = _vm->fetchAnimHeader( anim_file );
-
- pars[4] = anim_head->feetStartX;
- pars[5] = anim_head->feetStartY;
- pars[6] = anim_head->feetStartDir;
-
- _vm->_resman->closeResource(params[4]);
-
- // If start coords not yet set in anim header, use the standby
- // coords (which should be set beforehand in the script).
-
- if (pars[4] == 0 && pars[5] == 0) {
- byte buf[NAME_LEN];
-
- pars[4] = _standbyX;
- pars[5] = _standbyY;
- pars[6] = _standbyDir;
-
- debug(3, "WARNING: fnWalkToAnim(%s) used standby coords", _vm->fetchObjectName(params[4], buf));
- }
-
- assert(pars[6] >= 0 && pars[6] <= 7);
- }
-
- return fnWalk(pars);
+ return _router->walkToAnim(
+ (ObjectLogic *) decodePtr(params[0]),
+ (ObjectGraphic *) decodePtr(params[1]),
+ (ObjectMega *) decodePtr(params[2]),
+ (ObjectWalkdata *) decodePtr(params[3]),
+ params[4]);
}
/**
- * Turn mega to the specified direction. Just needs to call fnWalk() with
- * current feet coords, so router can produce anim of turn frames.
+ * Turn mega to the specified direction.
*/
int32 Logic::fnTurn(int32 *params) {
@@ -421,29 +234,12 @@ int32 Logic::fnTurn(int32 *params) {
// 3 pointer to object's walkdata structure
// 4 target direction
- int32 pars[7];
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = params[2];
- pars[3] = params[3];
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
-
- // If this is the start of the turn, get the mega's current feet
- // coords + the required direction
-
- if (!ob_logic->looping) {
- assert(params[4] >= 0 && params[4] <= 7);
-
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[2]);
-
- pars[4] = ob_mega->feet_x;
- pars[5] = ob_mega->feet_y;
- pars[6] = params[4];
- }
-
- return fnWalk(pars);
+ return _router->doFace(
+ (ObjectLogic *) decodePtr(params[0]),
+ (ObjectGraphic *) decodePtr(params[1]),
+ (ObjectMega *) decodePtr(params[2]),
+ (ObjectWalkdata *) decodePtr(params[3]),
+ params[4]);
}
/**
@@ -459,47 +255,28 @@ int32 Logic::fnStandAt(int32 *params) {
// 3 target y-coord
// 4 target direction
- assert(params[4] >= 0 && params[4] <= 7);
-
- ObjectGraphic *ob_graph = (ObjectGraphic *) _vm->_memory->decodePtr(params[0]);
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[1]);
-
- // set up the stand frame & set the mega's new direction
-
- ob_mega->feet_x = params[2];
- ob_mega->feet_y = params[3];
- ob_mega->current_dir = params[4];
-
- // mega-set animation file
- ob_graph->anim_resource = ob_mega->megaset_res;
-
- // dir + first stand frame (always frame 96)
- ob_graph->anim_pc = params[4] + 96;
-
+ _router->standAt(
+ (ObjectGraphic *) decodePtr(params[0]),
+ (ObjectMega *) decodePtr(params[1]),
+ params[2], params[3], params[4]);
return IR_CONT;
}
/**
* Stand mega into the specified direction at current feet coords.
- * Just needs to call fnStandAt() with current feet coords.
+ * Just needs to call standAt() with current feet coords.
*/
int32 Logic::fnStand(int32 *params) {
// params: 0 pointer to object's graphic structure
// 1 pointer to object's mega structure
// 2 target direction
+ ObjectMega *ob_mega = (ObjectMega *) decodePtr(params[1]);
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[1]);
-
- int32 pars[5];
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = ob_mega->feet_x;
- pars[3] = ob_mega->feet_y;
- pars[4] = params[2];
-
- return fnStandAt(pars);
+ _router->standAt(
+ (ObjectGraphic *) decodePtr(params[0]),
+ ob_mega, ob_mega->feet_x, ob_mega->feet_y, params[2]);
+ return IR_CONT;
}
/**
@@ -511,35 +288,11 @@ int32 Logic::fnStandAfterAnim(int32 *params) {
// 1 pointer to object's mega structure
// 2 anim resource id
- byte *anim_file = _vm->_resman->openResource(params[2]);
- AnimHeader *anim_head = _vm->fetchAnimHeader(anim_file);
-
- int32 pars[5];
-
- pars[0] = params[0];
- pars[1] = params[1];
-
- pars[2] = anim_head->feetEndX;
- pars[3] = anim_head->feetEndY;
- pars[4] = anim_head->feetEndDir;
-
- // If start coords not available either use the standby coords (which
- // should be set beforehand in the script)
-
- if (pars[2] == 0 && pars[3] == 0) {
- byte buf[NAME_LEN];
-
- pars[2] = _standbyX;
- pars[3] = _standbyY;
- pars[4] = _standbyDir;
-
- debug(3, "WARNING: fnStandAfterAnim(%s) used standby coords", _vm->fetchObjectName(params[2], buf));
- }
-
- assert(pars[4] >= 0 && pars[4] <= 7);
-
- _vm->_resman->closeResource(params[2]);
- return fnStandAt(pars);
+ _router->standAfterAnim(
+ (ObjectGraphic *) decodePtr(params[0]),
+ (ObjectMega *) decodePtr(params[1]),
+ params[2]);
+ return IR_CONT;
}
int32 Logic::fnPause(int32 *params) {
@@ -549,7 +302,7 @@ int32 Logic::fnPause(int32 *params) {
// NB. Pause-value of 0 causes script to continue, 1 causes a 1-cycle
// quit, 2 gives 2 cycles, etc.
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
+ ObjectLogic *ob_logic = (ObjectLogic *) decodePtr(params[0]);
if (ob_logic->looping == 0) {
ob_logic->looping = 1;
@@ -577,9 +330,8 @@ int32 Logic::fnMegaTableAnim(int32 *params) {
int32 Logic::fnAddMenuObject(int32 *params) {
// params: 0 pointer to a MenuObject structure to copy down
- MenuObject *menuObject = (MenuObject *) _vm->_memory->decodePtr(params[0]);
- _vm->_mouse->addMenuObject(menuObject);
+ _vm->_mouse->addMenuObject((MenuObject *) decodePtr(params[0]));
return IR_CONT;
}
@@ -628,7 +380,7 @@ int32 Logic::fnSetFrame(int32 *params) {
AnimHeader *anim_head = _vm->fetchAnimHeader(anim_file);
// set up anim resource in graphic object
- ObjectGraphic *ob_graphic = (ObjectGraphic *) _vm->_memory->decodePtr(params[0]);
+ ObjectGraphic *ob_graphic = (ObjectGraphic *) decodePtr(params[0]);
ob_graphic->anim_resource = res;
ob_graphic->anim_pc = params[2] ? anim_head->noAnimFrames - 1 : 0;
@@ -643,7 +395,7 @@ int32 Logic::fnRandomPause(int32 *params) {
// 1 minimum number of game-cycles to pause
// 2 maximum number of game-cycles to pause
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
+ ObjectLogic *ob_logic = (ObjectLogic *) decodePtr(params[0]);
int32 pars[2];
if (ob_logic->looping == 0) {
@@ -666,9 +418,9 @@ int32 Logic::fnRegisterFrame(int32 *params) {
// 1 pointer to graphic structure
// 2 pointer to mega structure or NULL if not a mega
- ObjectMouse *ob_mouse = (ObjectMouse *) _vm->_memory->decodePtr(params[0]);
- ObjectGraphic *ob_graph = (ObjectGraphic *) _vm->_memory->decodePtr(params[1]);
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[2]);
+ ObjectMouse *ob_mouse = (ObjectMouse *) decodePtr(params[0]);
+ ObjectGraphic *ob_graph = (ObjectGraphic *) decodePtr(params[1]);
+ ObjectMega *ob_mega = (ObjectMega *) decodePtr(params[2]);
_vm->_screen->registerFrame(ob_mouse, ob_graph, ob_mega);
return IR_CONT;
@@ -705,7 +457,7 @@ int32 Logic::fnUpdatePlayerStats(int32 *params) {
// params: 0 pointer to mega structure
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[0]);
+ ObjectMega *ob_mega = (ObjectMega *) decodePtr(params[0]);
ScreenInfo *screenInfo = _vm->_screen->getScreenInfo();
screenInfo->player_feet_x = ob_mega->feet_x;
@@ -738,7 +490,7 @@ int32 Logic::fnPassGraph(int32 *params) {
int32 Logic::fnInitFloorMouse(int32 *params) {
// params: 0 pointer to object's mouse structure
- ObjectMouse *ob_mouse = (ObjectMouse *) _vm->_memory->decodePtr(params[0]);
+ ObjectMouse *ob_mouse = (ObjectMouse *) decodePtr(params[0]);
ScreenInfo *screenInfo = _vm->_screen->getScreenInfo();
// floor is always lowest priority
@@ -762,14 +514,12 @@ int32 Logic::fnPassMega(int32 *params) {
// params: 0 pointer to a mega structure
- memcpy(&_engineMega, _vm->_memory->decodePtr(params[0]), sizeof(ObjectMega));
+ memcpy(&_engineMega, decodePtr(params[0]), sizeof(ObjectMega));
return IR_CONT;
}
/**
* Turn mega to face point (x,y) on the floor
- * Just needs to call fnWalk() with current feet coords & direction computed
- * by whatTarget()
*/
int32 Logic::fnFaceXY(int32 *params) {
@@ -780,27 +530,12 @@ int32 Logic::fnFaceXY(int32 *params) {
// 4 target x-coord
// 5 target y-coord
- int32 pars[7];
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = params[2];
- pars[3] = params[3];
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
-
- // If this is the start of the turn, get the mega's current feet
- // coords + the required direction
-
- if (!ob_logic->looping) {
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[2]);
-
- pars[4] = ob_mega->feet_x;
- pars[5] = ob_mega->feet_y;
- pars[6] = whatTarget(ob_mega->feet_x, ob_mega->feet_y, params[4], params[5]);
- }
-
- return fnWalk(pars);
+ return _router->faceXY(
+ (ObjectLogic *) decodePtr(params[0]),
+ (ObjectGraphic *) decodePtr(params[1]),
+ (ObjectMega *) decodePtr(params[2]),
+ (ObjectWalkdata *) decodePtr(params[3]),
+ params[4], params[5]);
}
/**
@@ -894,7 +629,7 @@ int32 Logic::fnTheyDoWeWait(int32 *params) {
_vm->_resman->closeResource(target);
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
+ ObjectLogic *ob_logic = (ObjectLogic *) decodePtr(params[0]);
if (_scriptVars[RESULT] == 1 && !_scriptVars[INS_COMMAND] && ob_logic->looping == 0) {
// The target is waiting, i.e. not busy, and there is no other
@@ -1001,65 +736,14 @@ int32 Logic::fnWalkToTalkToMega(int32 *params) {
// 2 pointer to object's mega structure
// 3 pointer to object's walkdata structure
// 4 id of target mega to face
- // 5 distance
-
- int32 pars[7];
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = params[2];
- pars[3] = params[3];
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
-
- // If this is the start of the walk, calculate the route.
-
- if (!ob_logic->looping) {
- StandardHeader *head = (StandardHeader *) _vm->_resman->openResource(params[4]);
-
- assert(head->fileType == GAME_OBJECT);
-
- // Call the base script. This is the graphic/mouse service
- // call, and will set _engineMega to the ObjectMega of mega we
- // want to route to.
+ // 5 separation
- char *raw_script_ad = (char *) head;
- uint32 null_pc = 3;
-
- runScript(raw_script_ad, raw_script_ad, &null_pc);
-
- _vm->_resman->closeResource(params[4]);
-
- // Stand exactly beside the mega, ie. at same y-coord
- pars[5] = _engineMega.feet_y;
-
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[2]);
-
- // Apply scale factor to walk distance. Ay+B gives 256 * scale
- // ie. 256 * 256 * true_scale for even better accuracy, ie.
- // scale = (Ay + B) / 256
-
- int scale = (ob_mega->scale_a * ob_mega->feet_y + ob_mega->scale_b) / 256;
- int mega_separation = (params[5] * scale) / 256;
-
- debug(4, "Target is at (%d, %d), separation %d", _engineMega.feet_x, _engineMega.feet_y, mega_separation);
-
- if (_engineMega.feet_x < ob_mega->feet_x) {
- // Target is left of us, so aim to stand to their
- // right. Face down_left
-
- pars[4] = _engineMega.feet_x + mega_separation;
- pars[6] = 5;
- } else {
- // Ok, must be right of us so aim to stand to their
- // left. Face down_right.
-
- pars[4] = _engineMega.feet_x - mega_separation;
- pars[6] = 3;
- }
- }
-
- return fnWalk(pars);
+ return _router->walkToTalkToMega(
+ (ObjectLogic *) decodePtr(params[0]),
+ (ObjectGraphic *) decodePtr(params[1]),
+ (ObjectMega *) decodePtr(params[2]),
+ (ObjectWalkdata *) decodePtr(params[3]),
+ params[4], params[5]);
}
int32 Logic::fnFadeDown(int32 *params) {
@@ -1111,8 +795,8 @@ int32 Logic::fnISpeak(int32 *params) {
// Set up the pointers which we know we'll always need
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[S_OB_LOGIC]);
- ObjectGraphic *ob_graphic = (ObjectGraphic *) _vm->_memory->decodePtr(params[S_OB_GRAPHIC]);
+ ObjectLogic *ob_logic = (ObjectLogic *) decodePtr(params[S_OB_LOGIC]);
+ ObjectGraphic *ob_graphic = (ObjectGraphic *) decodePtr(params[S_OB_GRAPHIC]);
// FIRST TIME ONLY: create the text, load the wav, set up the anim,
// etc.
@@ -1229,8 +913,8 @@ int32 Logic::fnISpeak(int32 *params) {
// Use this direction table to derive the anim
// NB. ASSUMES WE HAVE A MEGA OBJECT!!
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[S_OB_MEGA]);
- int32 *anim_table = (int32 *) _vm->_memory->decodePtr(params[S_DIR_TABLE]);
+ ObjectMega *ob_mega = (ObjectMega *) decodePtr(params[S_OB_MEGA]);
+ int32 *anim_table = (int32 *) decodePtr(params[S_DIR_TABLE]);
_animId = anim_table[ob_mega->current_dir];
} else {
@@ -1504,7 +1188,7 @@ int32 Logic::fnSpeechProcess(int32 *params) {
// 3 pointer to ob_mega
// 4 pointer to ob_walkdata
- ObjectSpeech *ob_speech = (ObjectSpeech *) _vm->_memory->decodePtr(params[1]);
+ ObjectSpeech *ob_speech = (ObjectSpeech *) decodePtr(params[1]);
while (1) {
int32 pars[9];
@@ -1733,7 +1417,7 @@ int32 Logic::fnSetScaling(int32 *params) {
// Where s is system scale, which itself is (256 * actual_scale) ie.
// s == 128 is half size
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[0]);
+ ObjectMega *ob_mega = (ObjectMega *) decodePtr(params[0]);
ob_mega->scale_a = params[1];
ob_mega->scale_b = params[2];
@@ -1793,7 +1477,7 @@ int32 Logic::fnTimedWait(int32 *params) {
StandardHeader *head = (StandardHeader *) _vm->_resman->openResource(params[1]);
assert(head->fileType == GAME_OBJECT);
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
+ ObjectLogic *ob_logic = (ObjectLogic *) decodePtr(params[0]);
if (!ob_logic->looping) {
// This is the first time, so set up the time-out.
@@ -1915,7 +1599,7 @@ int32 Logic::fnSetValue(int32 *params) {
// params: 0 pointer to object's mega structure
// 1 value to set it to
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[0]);
+ ObjectMega *ob_mega = (ObjectMega *) decodePtr(params[0]);
ob_mega->megaset_res = params[1];
return IR_CONT;
@@ -2041,12 +1725,7 @@ int32 Logic::fnSetStandbyCoords(int32 *params) {
// 1 y-coord
// 2 direction (0..7)
- assert(params[2] >= 0 && params[2] <= 7);
-
- _standbyX = (int16) params[0];
- _standbyY = (int16) params[1];
- _standbyDir = (uint8) params[2];
-
+ _router->setStandbyCoords(params[0], params[1], params[2]);
return IR_CONT;
}
@@ -2122,35 +1801,11 @@ int32 Logic::fnStandAtAnim(int32 *params) {
// 1 pointer to object's mega structure
// 2 anim resource id
- byte *anim_file = _vm->_resman->openResource(params[2]);
- AnimHeader *anim_head = _vm->fetchAnimHeader(anim_file);
-
- int32 pars[5];
-
- pars[0] = params[0];
- pars[1] = params[1];
-
- pars[2] = anim_head->feetStartX;
- pars[3] = anim_head->feetStartY;
- pars[4] = anim_head->feetStartDir;
-
- // If start coords not available use the standby coords (which should
- // be set beforehand in the script)
-
- if (pars[2] == 0 && pars[3] == 0) {
- byte buf[NAME_LEN];
-
- pars[2] = _standbyX;
- pars[3] = _standbyY;
- pars[4] = _standbyDir;
-
- debug(3, "WARNING: fnStandAtAnim(%s) used standby coords", _vm->fetchObjectName(params[2], buf));
- }
-
- assert(pars[4] >= 0 && pars[4] <= 7);
-
- _vm->_resman->closeResource(params[2]);
- return fnStandAt(pars);
+ _router->standAtAnim(
+ (ObjectGraphic *) decodePtr(params[0]),
+ (ObjectMega *) decodePtr(params[1]),
+ params[2]);
+ return IR_CONT;
}
#define SCROLL_MOUSE_WIDTH 20
@@ -2158,7 +1813,7 @@ int32 Logic::fnStandAtAnim(int32 *params) {
int32 Logic::fnSetScrollLeftMouse(int32 *params) {
// params: 0 pointer to object's mouse structure
- ObjectMouse *ob_mouse = (ObjectMouse *) _vm->_memory->decodePtr(params[0]);
+ ObjectMouse *ob_mouse = (ObjectMouse *) decodePtr(params[0]);
ScreenInfo *screenInfo = _vm->_screen->getScreenInfo();
// Highest priority
@@ -2183,7 +1838,7 @@ int32 Logic::fnSetScrollLeftMouse(int32 *params) {
int32 Logic::fnSetScrollRightMouse(int32 *params) {
// params: 0 pointer to object's mouse structure
- ObjectMouse *ob_mouse = (ObjectMouse *) _vm->_memory->decodePtr(params[0]);
+ ObjectMouse *ob_mouse = (ObjectMouse *) decodePtr(params[0]);
ScreenInfo *screenInfo = _vm->_screen->getScreenInfo();
// Highest priority
@@ -2302,9 +1957,9 @@ int32 Logic::fnGetPlayerSaveData(int32 *params) {
// 1 pointer to object's graphic structure
// 2 pointer to object's mega structure
- byte *logic_ptr = _vm->_memory->decodePtr(params[0]);
- byte *graphic_ptr = _vm->_memory->decodePtr(params[1]);
- byte *mega_ptr = _vm->_memory->decodePtr(params[2]);
+ byte *logic_ptr = decodePtr(params[0]);
+ byte *graphic_ptr = decodePtr(params[1]);
+ byte *mega_ptr = decodePtr(params[2]);
// Copy from savegame header to player object
@@ -2352,9 +2007,9 @@ int32 Logic::fnPassPlayerSaveData(int32 *params) {
// Copy from player object to savegame header
- memcpy(&_vm->_saveGameHeader.logic, _vm->_memory->decodePtr(params[0]), sizeof(ObjectLogic));
- memcpy(&_vm->_saveGameHeader.graphic, _vm->_memory->decodePtr(params[1]), sizeof(ObjectGraphic));
- memcpy(&_vm->_saveGameHeader.mega, _vm->_memory->decodePtr(params[2]), sizeof(ObjectMega));
+ memcpy(&_vm->_saveGameHeader.logic, decodePtr(params[0]), sizeof(ObjectLogic));
+ memcpy(&_vm->_saveGameHeader.graphic, decodePtr(params[1]), sizeof(ObjectGraphic));
+ memcpy(&_vm->_saveGameHeader.mega, decodePtr(params[2]), sizeof(ObjectMega));
return IR_CONT;
}
@@ -2426,7 +2081,7 @@ int32 Logic::fnPauseForEvent(int32 *params) {
// params: 0 pointer to object's logic structure
// 1 number of game-cycles to pause
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
+ ObjectLogic *ob_logic = (ObjectLogic *) decodePtr(params[0]);
if (checkEventWaiting()) {
ob_logic->looping = 0;
@@ -2451,42 +2106,12 @@ int32 Logic::fnFaceMega(int32 *params) {
// 3 pointer to object's walkdata structure
// 4 id of target mega to face
- int32 pars[7];
-
- pars[0] = params[0];
- pars[1] = params[1];
- pars[2] = params[2];
- pars[3] = params[3];
-
- ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->decodePtr(params[0]);
-
- // If this is the start of the walk, decide where to walk to.
-
- if (!ob_logic->looping) {
- StandardHeader *head = (StandardHeader *) _vm->_resman->openResource(params[4]);
-
- assert(head->fileType == GAME_OBJECT);
-
- // Call the base script. This is the graphic/mouse service
- // call, and will set _engineMega to the ObjectMega of mega we
- // want to turn to face.
-
- char *raw_script_ad = (char *) head;
- uint32 null_pc = 3;
-
- runScript(raw_script_ad, raw_script_ad, &null_pc);
-
- _vm->_resman->closeResource(params[4]);
-
- ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->decodePtr(params[2]);
-
- pars[3] = params[3];
- pars[4] = ob_mega->feet_x;
- pars[5] = ob_mega->feet_y;
- pars[6] = whatTarget(ob_mega->feet_x, ob_mega->feet_y, _engineMega.feet_x, _engineMega.feet_y);
- }
-
- return fnWalk(pars);
+ return _router->faceMega(
+ (ObjectLogic *) decodePtr(params[0]),
+ (ObjectGraphic *) decodePtr(params[1]),
+ (ObjectMega *) decodePtr(params[2]),
+ (ObjectWalkdata *) decodePtr(params[3]),
+ params[4]);
}
int32 Logic::fnPlaySequence(int32 *params) {
@@ -2501,11 +2126,11 @@ int32 Logic::fnPlaySequence(int32 *params) {
// of computer games" - but at the very least we want to show the
// cutscene subtitles, so I removed them.
- debug(5, "fnPlaySequence(\"%s\");", (const char *) _vm->_memory->decodePtr(params[0]));
+ debug(5, "fnPlaySequence(\"%s\");", (const char *) decodePtr(params[0]));
// add the appropriate file extension & play it
- strcpy(filename, (const char *) _vm->_memory->decodePtr(params[0]));
+ strcpy(filename, (const char *) decodePtr(params[0]));
// Write to walkthrough file (zebug0.txt)
debug(5, "PLAYING SEQUENCE \"%s\"", filename);