diff options
author | Torbjörn Andersson | 2004-04-16 06:46:03 +0000 |
---|---|---|
committer | Torbjörn Andersson | 2004-04-16 06:46:03 +0000 |
commit | 0d2d884bb744c1b88dbaa000490f5d6b3395e213 (patch) | |
tree | 3f825b024f371377829e1ddfb726efcf9df2b149 | |
parent | 0a1cefb04e007ddd8097d830f5f296f7effb875e (diff) | |
download | scummvm-rg350-0d2d884bb744c1b88dbaa000490f5d6b3395e213.tar.gz scummvm-rg350-0d2d884bb744c1b88dbaa000490f5d6b3395e213.tar.bz2 scummvm-rg350-0d2d884bb744c1b88dbaa000490f5d6b3395e213.zip |
Cleanup
svn-id: r13582
-rw-r--r-- | sword2/function.cpp | 2 | ||||
-rw-r--r-- | sword2/logic.h | 3 | ||||
-rw-r--r-- | sword2/sword2.h | 3 | ||||
-rw-r--r-- | sword2/walker.cpp | 470 |
4 files changed, 191 insertions, 287 deletions
diff --git a/sword2/function.cpp b/sword2/function.cpp index 81fd3831a0..116b3ce579 100644 --- a/sword2/function.cpp +++ b/sword2/function.cpp @@ -189,7 +189,7 @@ int32 Logic::fnPassMega(int32 *params) { // params: 0 pointer to a mega structure - memcpy(&_vm->_engineMega, _vm->_memory->intToPtr(params[0]), sizeof(ObjectMega)); + memcpy(&_engineMega, _vm->_memory->intToPtr(params[0]), sizeof(ObjectMega)); return IR_CONT; } diff --git a/sword2/logic.h b/sword2/logic.h index 4a3eb378f1..dc9852d09f 100644 --- a/sword2/logic.h +++ b/sword2/logic.h @@ -160,6 +160,9 @@ private: int whatTarget(int startX, int startY, int destX, int destY); + // Set by fnPassMega() + ObjectMega _engineMega; + public: Logic(Sword2Engine *vm) : _vm(vm), _kills(0), _smackerLeadOut(0), diff --git a/sword2/sword2.h b/sword2/sword2.h index 4b95f38653..ecc2e5a0f1 100644 --- a/sword2/sword2.h +++ b/sword2/sword2.h @@ -199,9 +199,6 @@ public: int32 initBackground(int32 res, int32 new_palette); - // Set by fnPassMega() - ObjectMega _engineMega; - int menuClick(int menu_items); void addMenuObject(MenuObject *obj); diff --git a/sword2/walker.cpp b/sword2/walker.cpp index 13485b5da2..9a83ca2c77 100644 --- a/sword2/walker.cpp +++ b/sword2/walker.cpp @@ -19,7 +19,7 @@ // WALKER.CPP by James (14nov96) -// script functions for moving megas about the place & also for keeping tabs +// Script functions for moving megas about the place & also for keeping tabs // on them #include "common/stdafx.h" @@ -33,7 +33,8 @@ namespace Sword2 { /** - * Walk mega to (x,y,dir) + * Walk mega to (x,y,dir). Set RESULT to 0 if it succeeded. Otherwise, set + * RESULT to 1. */ int32 Logic::fnWalk(int32 *params) { @@ -43,32 +44,21 @@ int32 Logic::fnWalk(int32 *params) { // 3 pointer to object's walkdata structure // 4 target x-coord // 5 target y-coord - // 6 target direction + // 6 target direction (8 means end walk on ANY direction) - ObjectLogic *ob_logic; - ObjectGraphic *ob_graph; - ObjectMega *ob_mega; - ObjectWalkdata *ob_walkdata; - int16 target_x; - int16 target_y; - uint8 target_dir; - int32 route; - int32 walk_pc; - WalkData *walkAnim; - - // get the parameters + ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); + ObjectGraphic *ob_graph = (ObjectGraphic *) _vm->_memory->intToPtr(params[1]); + ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->intToPtr(params[2]); - ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); - ob_graph = (ObjectGraphic *) _vm->_memory->intToPtr(params[1]); - ob_mega = (ObjectMega *) _vm->_memory->intToPtr(params[2]); + int16 target_x = (int16) params[4]; + int16 target_y = (int16) params[5]; + uint8 target_dir = (uint8) params[6]; - target_x = (int16) params[4]; - target_y = (int16) params[5]; - target_dir = (uint8) params[6]; + ObjectWalkdata *ob_walkdata; - // if this is the start of the walk, calculate route + // If this is the start of the walk, calculate the route. - if (ob_logic->looping == 0) { + 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 @@ -78,25 +68,22 @@ int32 Logic::fnWalk(int32 *params) { // anim. if (ob_mega->feet_x == target_x && ob_mega->feet_y == target_y && ob_mega->current_dir == target_dir) { - // 0 means ok - finished walk _scriptVars[RESULT] = 0; - return IR_CONT; // may as well continue the script + return IR_CONT; } - // invalid direction (NB. '8' means end walk on ANY direction) - if (params[6] < 0 || params[6] > 8) - error("Invalid direction (%d) in fnWalk", params[6]); + assert(params[6] >= 0 && params[6] <= 8); ob_walkdata = (ObjectWalkdata *) _vm->_memory->intToPtr(params[3]); - ob_mega->walk_pc = 0; // always + ob_mega->walk_pc = 0; - // set up mem for _walkData in route_slots[] & set mega's + // Set up mem for _walkData in route_slots[] & set mega's // 'route_slot_id' accordingly _router->allocateRouteMem(); - route = _router->routeFinder(ob_mega, ob_walkdata, target_x, target_y, target_dir); + int32 route = _router->routeFinder(ob_mega, ob_walkdata, target_x, target_y, target_dir); // 0 = can't make route to target // 1 = created route @@ -116,42 +103,30 @@ int32 Logic::fnWalk(int32 *params) { // (see fnGetPlayerSaveData() in save_rest.cpp } else { - // free up the walkdata mem block _router->freeRouteMem(); - - // 1 means error, no walk created _scriptVars[RESULT] = 1; - - // may as well continue the script return IR_CONT; } - // ok, walk is about to start, so set the mega's graphic - // resource - + // 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->_graphics->getFadeStatus() == RDFADE_BLACK) { - // double clicked an exit so quit the walk when screen is 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; // so script loop stops - _router->freeRouteMem(); // free up the walkdata mem block + ob_logic->looping = 0; + _router->freeRouteMem(); - // must clear in-case on the new screen there's a walk + // Must clear in-case on the new screen there's a walk // instruction (which would get cut short) _scriptVars[EXIT_CLICK_ID] = 0; - // this will be reset when we change screens, so we can use - // it in script to check if a 2nd-click came along - // _scriptVars[EXIT_FADING] = 0; - // finished walk ob_mega->currently_walking = 0; - // (see fnGetPlayerSaveData() in save_rest.cpp + // see fnGetPlayerSaveData() in save_rest.cpp - _scriptVars[RESULT] = 0; // 0 means ok + _scriptVars[RESULT] = 0; // continue the script so that RESULT can be checked! return IR_CONT; @@ -159,37 +134,36 @@ int32 Logic::fnWalk(int32 *params) { // get pointer to walkanim & current frame position - // lock the _walkData array - walkAnim = _router->lockRouteMem(); - walk_pc = ob_mega->walk_pc; + WalkData *walkAnim = _router->lockRouteMem(); + int32 walk_pc = ob_mega->walk_pc; - // if stopping the walk early, overwrite the next step with a + // 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 + // At the beginning of a step ob_walkdata = (ObjectWalkdata *) _vm->_memory->intToPtr(params[3]); _router->earlySlowOut(ob_mega, ob_walkdata); } } - // get new frame of walk + // 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 + // 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; // so script loop stops - _router->freeRouteMem(); // free up the walkdata mem block + ob_logic->looping = 0; + _router->freeRouteMem(); // finished walk ob_mega->currently_walking = 0; @@ -207,11 +181,9 @@ int32 Logic::fnWalk(int32 *params) { if (checkEventWaiting()) { startEvent(); - // 1 means didn't finish walk _scriptVars[RESULT] = 1; return IR_TERMINATE; } else { - // 0 means ok - finished walk _scriptVars[RESULT] = 0; // CONTINUE the script so that RESULT can be checked! @@ -226,12 +198,11 @@ int32 Logic::fnWalk(int32 *params) { } } - // increment the walkanim frame number, float the walkanim & come + // Increment the walkanim frame number, float the walkanim & come // back next cycle ob_mega->walk_pc++; - // allow _walkData array to float about memory again _router->floatRouteMem(); return IR_REPEAT; } @@ -247,62 +218,50 @@ int32 Logic::fnWalkToAnim(int32 *params) { // 3 pointer to object's walkdata structure // 4 anim resource id - ObjectLogic *ob_logic; - uint8 *anim_file; - AnimHeader *anim_head; int32 pars[7]; - // if this is the start of the walk, read anim file to get start coords + // 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]; - ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); + ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); - if (ob_logic->looping == 0) { - // open anim file - anim_file = _vm->_resman->openResource(params[4]); + // If this is the start of the walk, read anim file to get start coords - // point to animation header - anim_head = _vm->fetchAnimHeader( anim_file ); + if (!ob_logic->looping) { + uint8 *anim_file = _vm->_resman->openResource(params[4]); + AnimHeader *anim_head = _vm->fetchAnimHeader( anim_file ); - pars[4] = anim_head->feetStartX; // target_x - pars[5] = anim_head->feetStartY; // target_y - pars[6] = anim_head->feetStartDir; // target_dir + pars[4] = anim_head->feetStartX; + pars[5] = anim_head->feetStartY; + pars[6] = anim_head->feetStartDir; - // close anim file _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 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) { pars[4] = _standbyX; pars[5] = _standbyY; pars[6] = _standbyDir; - debug(5, "WARNING: fnWalkToAnim(%s) used standby coords", _vm->fetchObjectName(params[4])); + debug(3, "WARNING: fnWalkToAnim(%s) used standby coords", _vm->fetchObjectName(params[4])); } - if (pars[6] < 0 || pars[6] > 7) - error("Invalid direction (%d) in fnWalkToAnim", pars[6]); + assert(pars[6] >= 0 && pars[6] <= 7); } - // set up the rest of the parameters for fnWalk() - - pars[0] = params[0]; - pars[1] = params[1]; - pars[2] = params[2]; - pars[3] = params[3]; - - // walkdata (param 3) is needed for earlySlowOut if player clicks - // elsewhere during the walk - - // call fnWalk() with target coords set to anim start position return fnWalk(pars); } /** - * turn mega to <direction> - * just needs to call fnWalk() with current feet coords, so router can - * produce anim of turn frames + * Turn mega to <direction>. Just needs to call fnWalk() with current feet + * coords, so router can produce anim of turn frames. */ int32 Logic::fnTurn(int32 *params) { @@ -312,40 +271,34 @@ int32 Logic::fnTurn(int32 *params) { // 3 pointer to object's walkdata structure // 4 target direction - ObjectLogic *ob_logic; - ObjectMega *ob_mega; int32 pars[7]; - // if this is the start of the turn, get the mega's current feet - // coords + the required direction + pars[0] = params[0]; + pars[1] = params[1]; + pars[2] = params[2]; + pars[3] = params[3]; + + ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); - ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); + // If this is the start of the turn, get the mega's current feet + // coords + the required direction - if (ob_logic->looping == 0) { - if (params[4] < 0 || params[4] > 7) - error("Invalid direction (%d) in fnTurn", params[4]); + if (!ob_logic->looping) { + assert(params[4] >= 0 && params[4] <= 7); - ob_mega = (ObjectMega *) _vm->_memory->intToPtr(params[2]); + ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->intToPtr(params[2]); pars[4] = ob_mega->feet_x; pars[5] = ob_mega->feet_y; - pars[6] = params[4]; // DIRECTION to turn to + pars[6] = params[4]; } - // set up the rest of the parameters for fnWalk() - - pars[0] = params[0]; - pars[1] = params[1]; - pars[2] = params[2]; - pars[3] = params[3]; - - // call fnWalk() with target coords set to feet coords return fnWalk(pars); } /** - * stand mega at (x,y,dir) - * sets up the graphic object, but also needs to set the new 'current_dir' in + * Stand mega at (x,y,dir) + * Sets up the graphic object, but also needs to set the new 'current_dir' in * the mega object, so the router knows in future */ @@ -356,37 +309,30 @@ int32 Logic::fnStandAt(int32 *params) { // 3 target y-coord // 4 target direction - ObjectMega *ob_mega; - ObjectGraphic *ob_graph; - - // check for invalid direction - - if (params[4] < 0 || params[4] > 7) - error("Invalid direction (%d) in fnStandAt", params[4]); + assert(params[4] >= 0 && params[4] <= 7); - // set up pointers to the graphic & mega structure - - ob_graph = (ObjectGraphic *) _vm->_memory->intToPtr(params[0]); - ob_mega = (ObjectMega *) _vm->_memory->intToPtr(params[1]); + ObjectGraphic *ob_graph = (ObjectGraphic *) _vm->_memory->intToPtr(params[0]); + ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->intToPtr(params[1]); // set up the stand frame & set the mega's new direction - // mega-set animation file - ob_graph->anim_resource = ob_mega->megaset_res; - 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; - ob_mega->current_dir = params[4]; - return IR_CONT; } -// stand mega in <direction> at current feet coords -// just needs to call fnStandAt() with current feet coords +/** + * Stand mega in <direction> at current feet coords + * Just needs to call fnStandAt() with current feet coords + */ int32 Logic::fnStand(int32 *params) { // params: 0 pointer to object's graphic structure @@ -394,15 +340,15 @@ int32 Logic::fnStand(int32 *params) { // 2 target direction ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->intToPtr(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]; // DIRECTION to stand in + pars[4] = params[2]; - // call fnStandAt() with target coords set to feet coords return fnStandAt(pars); } @@ -415,17 +361,10 @@ int32 Logic::fnStandAfterAnim(int32 *params) { // 1 pointer to object's mega structure // 2 anim resource id - uint8 *anim_file; - AnimHeader *anim_head; - int32 pars[5]; - - // open the anim file & set up a pointer to the animation header + uint8 *anim_file = _vm->_resman->openResource(params[2]); + AnimHeader *anim_head = _vm->fetchAnimHeader(anim_file); - // open anim file - anim_file = _vm->_resman->openResource(params[2]); - anim_head = _vm->fetchAnimHeader(anim_file); - - // set up the parameter list for fnWalkTo() + int32 pars[5]; pars[0] = params[0]; pars[1] = params[1]; @@ -434,7 +373,7 @@ int32 Logic::fnStandAfterAnim(int32 *params) { pars[3] = anim_head->feetEndY; pars[4] = anim_head->feetEndDir; - // if start coords not available either use the standby coords (which + // 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) { @@ -442,37 +381,28 @@ int32 Logic::fnStandAfterAnim(int32 *params) { pars[3] = _standbyY; pars[4] = _standbyDir; - debug(5, "WARNING: fnStandAfterAnim(%s) used standby coords", _vm->fetchObjectName(params[2])); + debug(3, "WARNING: fnStandAfterAnim(%s) used standby coords", _vm->fetchObjectName(params[2])); } - if (pars[4] < 0 || pars[4] > 7) - error("Invalid direction (%d) in fnStandAfterAnim", pars[4]); + assert(pars[4] >= 0 && pars[4] <= 7); - // close the anim file _vm->_resman->closeResource(params[2]); - - // call fnStandAt() with target coords set to anim end position return fnStandAt(pars); } -// stand mega at start position of anim +/** + * Stand mega at start position of anim + */ int32 Logic::fnStandAtAnim(int32 *params) { // params: 0 pointer to object's graphic structure // 1 pointer to object's mega structure // 2 anim resource id - uint8 *anim_file; - AnimHeader *anim_head; - int32 pars[5]; - - // open the anim file & set up a pointer to the animation header + uint8 *anim_file = _vm->_resman->openResource(params[2]); + AnimHeader *anim_head = _vm->fetchAnimHeader(anim_file); - // open anim file - anim_file = _vm->_resman->openResource(params[2]); - anim_head = _vm->fetchAnimHeader(anim_file); - - // set up the parameter list for fnWalkTo() + int32 pars[5]; pars[0] = params[0]; pars[1] = params[1]; @@ -481,7 +411,7 @@ int32 Logic::fnStandAtAnim(int32 *params) { pars[3] = anim_head->feetStartY; pars[4] = anim_head->feetStartDir; - // if start coords not available use the standby coords (which should + // If start coords not available use the standby coords (which should // be set beforehand in the script) if (pars[2] == 0 && pars[3] == 0) { @@ -489,22 +419,20 @@ int32 Logic::fnStandAtAnim(int32 *params) { pars[3] = _standbyY; pars[4] = _standbyDir; - debug(5, "WARNING: fnStandAtAnim(%s) used standby coords", _vm->fetchObjectName(params[2])); + debug(3, "WARNING: fnStandAtAnim(%s) used standby coords", _vm->fetchObjectName(params[2])); } - if (pars[4] < 0 || pars[4] > 7) - error("Invalid direction (%d) in fnStandAfterAnim", pars[4]); + assert(pars[4] >= 0 && pars[4] <= 7); - // close the anim file _vm->_resman->closeResource(params[2]); - - // call fnStandAt() with target coords set to anim end position return fnStandAt(pars); } -// Code to workout direction from start to dest +/** + * Work out direction from start to dest. + */ -// used in what_target not valid for all megas +// Used in whatTarget(); not valid for all megas #define diagonalx 36 #define diagonaly 8 @@ -535,8 +463,8 @@ int Logic::whatTarget(int startX, int startY, int destX, int destY) { } /** - * turn mega to face point (x,y) on the floor - * just needs to call fnWalk() with current feet coords & direction computed + * Turn mega to face point (x,y) on the floor + * Just needs to call fnWalk() with current feet coords & direction computed * by whatTarget() */ @@ -548,31 +476,26 @@ int32 Logic::fnFaceXY(int32 *params) { // 4 target x-coord // 5 target y-coord - ObjectLogic *ob_logic; - ObjectMega *ob_mega; - int32 pars[7]; + int32 pars[7]; - // if this is the start of the turn, get the mega's current feet - // coords + the required direction + pars[0] = params[0]; + pars[1] = params[1]; + pars[2] = params[2]; + pars[3] = params[3]; + + ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); - ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); + // If this is the start of the turn, get the mega's current feet + // coords + the required direction - if (ob_logic->looping == 0) { - ob_mega = (ObjectMega *) _vm->_memory->intToPtr(params[2]); + if (!ob_logic->looping) { + ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->intToPtr(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]); } - // set up the rest of the parameters for fnWalk() - - pars[0] = params[0]; - pars[1] = params[1]; - pars[2] = params[2]; - pars[3] = params[3]; - - // call fnWalk() with target coords set to feet coords return fnWalk(pars); } @@ -583,52 +506,49 @@ int32 Logic::fnFaceMega(int32 *params) { // 3 pointer to object's walkdata structure // 4 id of target mega to face - uint32 null_pc = 3; // get ob_mega - char *raw_script_ad; int32 pars[7]; - ObjectLogic *ob_logic; - ObjectMega *ob_mega; - StandardHeader *head; - ob_mega = (ObjectMega *) _vm->_memory->intToPtr(params[2]); - ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); + pars[0] = params[0]; + pars[1] = params[1]; + pars[2] = params[2]; + pars[3] = params[3]; + + ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); - if (ob_logic->looping == 0) { - // get targets info - head = (StandardHeader *) _vm->_resman->openResource(params[4]); + // If this is the start of the walk, decide where to walk to. - if (head->fileType != GAME_OBJECT) - error("fnFaceMega %d not an object", params[4]); + if (!ob_logic->looping) { + StandardHeader *head = (StandardHeader *) _vm->_resman->openResource(params[4]); - raw_script_ad = (char *) head; + 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; - //call the base script - this is the graphic/mouse service call runScript(raw_script_ad, raw_script_ad, &null_pc); _vm->_resman->closeResource(params[4]); - // engineMega is now the ObjectMega of mega we want to turn - // to face + ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->intToPtr(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, _vm->_engineMega.feet_x, _vm->_engineMega.feet_y); + pars[6] = whatTarget(ob_mega->feet_x, ob_mega->feet_y, _engineMega.feet_x, _engineMega.feet_y); } - pars[0] = params[0]; - pars[1] = params[1]; - pars[2] = params[2]; - pars[3] = params[3]; - - // call fnWalk() with target coords set to feet coords return fnWalk(pars); } -int32 Logic::fnWalkToTalkToMega(int32 *params) { - // we route to left or right hand side of target id if possible - // target is a shrinking mega +/** + * Route to the left or right hand side of target id, if possible. + */ +int32 Logic::fnWalkToTalkToMega(int32 *params) { // params: 0 pointer to object's logic structure // 1 pointer to object's graphic structure // 2 pointer to object's mega structure @@ -636,115 +556,99 @@ int32 Logic::fnWalkToTalkToMega(int32 *params) { // 4 id of target mega to face // 5 distance - ObjectMega *ob_mega; - ObjectLogic *ob_logic; - - uint32 null_pc = 3; // 4th script - get mega - char *raw_script_ad; int32 pars[7]; - int scale; - int mega_separation = params[5]; - StandardHeader *head; - ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); - ob_mega = (ObjectMega *) _vm->_memory->intToPtr(params[2]); - - pars[0] = params[0]; // standard stuff + pars[0] = params[0]; pars[1] = params[1]; pars[2] = params[2]; - pars[3] = params[3]; // walkdata + pars[3] = params[3]; + + ObjectLogic *ob_logic = (ObjectLogic *) _vm->_memory->intToPtr(params[0]); + + // If this is the start of the walk, calculate the route. - // not been here before so decide where to walk-to if (!ob_logic->looping) { - // first request the targets info - head = (StandardHeader *) _vm->_resman->openResource(params[4]); + StandardHeader *head = (StandardHeader *) _vm->_resman->openResource(params[4]); - if (head->fileType != GAME_OBJECT) - error("fnWalkToTalkToMega %d not an object", params[4]); + assert(head->fileType == GAME_OBJECT); - raw_script_ad = (char *) head; + // 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. + + char *raw_script_ad = (char *) head; + uint32 null_pc = 3; - // call the base script - this is the graphic/mouse service - // call runScript(raw_script_ad, raw_script_ad, &null_pc); _vm->_resman->closeResource(params[4]); - // engineMega is now the ObjectMega of mega we want to - // route to - - // stand exactly beside the mega, ie. at same y-coord - pars[5] = _vm->_engineMega.feet_y; + // Stand exactly beside the mega, ie. at same y-coord + pars[5] = _engineMega.feet_y; - // 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 + ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->intToPtr(params[2]); - scale = (ob_mega->scale_a * ob_mega->feet_y + ob_mega->scale_b) / 256; + // 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 - mega_separation= (mega_separation * scale) / 256; + int scale = (ob_mega->scale_a * ob_mega->feet_y + ob_mega->scale_b) / 256; + int mega_separation = (params[5] * scale) / 256; - debug(5, "separation %d", mega_separation); - debug(5, " target x %d, y %d", _vm->_engineMega.feet_x, _vm->_engineMega.feet_y); + debug(4, "Target is at (%d, %d), separation %d", _engineMega.feet_x, _engineMega.feet_y, mega_separation); - if (_vm->_engineMega.feet_x < ob_mega->feet_x) - { + 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] = _vm->_engineMega.feet_x + mega_separation; + 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] = _vm->_engineMega.feet_x - mega_separation; + pars[4] = _engineMega.feet_x - mega_separation; pars[6] = 3; } } - // first cycle builds the route - thereafter merely follows it - - // Call fnWalk() with target coords set to feet coords. RESULT will - // be 1 when it finishes, or 0 if it failed to build route. return fnWalk(pars); } int32 Logic::fnSetWalkGrid(int32 *params) { // params: none - error("fnSetWalkGrid no longer valid"); + error("fnSetWalkGrid() is no longer a valid opcode"); return IR_CONT; } -// add this walkgrid resource to the list of those used for routing in this -// location - note this is ignored in the resource is already in the list +/** + * Add this walkgrid resource to the list of those used for routing in this + * location. Note that this is ignored if the resource is already in the list. + */ int32 Logic::fnAddWalkGrid(int32 *params) { // params: 0 id of walkgrid resource - // all objects that add walkgrids must be restarted whenever we - // re-enter a location + // All objects that add walkgrids must be restarted whenever we + // re-enter a location. // DON'T EVER KILL GEORGE! if (_scriptVars[ID] != 8) { - // need to call this in case it wasn't called in script! - // ('params' just used as dummy param) - fnAddToKillList(params); + // Need to call this in case it wasn't called in script! + fnAddToKillList(NULL); } _router->addWalkGrid(params[0]); - - // Touch the grid, getting it into memory. - _vm->_resman->openResource(params[0]); - _vm->_resman->closeResource(params[0]); - + fnPreLoad(params); return IR_CONT; } -// remove this walkgrid resource from the list of those used for routing in -// this location - note that this is ignored if the resource isn't actually -// in the list +/** + * Remove this walkgrid resource from the list of those used for routing in + * this location. Note that this is ignored if the resource isn't actually + * in the list. + */ int32 Logic::fnRemoveWalkGrid(int32 *params) { // params: 0 id of walkgrid resource @@ -756,7 +660,7 @@ int32 Logic::fnRemoveWalkGrid(int32 *params) { int32 Logic::fnRegisterWalkGrid(int32 *params) { // params: none - error("fnRegisterWalkGrid no longer valid"); + error("fnRegisterWalkGrid() is no longer a valid opcode"); return IR_CONT; } @@ -767,7 +671,7 @@ int32 Logic::fnSetScaling(int32 *params) { // 256 * s = A * y + B - // where s is system scale, which itself is (256 * actual_scale) ie. + // Where s is system scale, which itself is (256 * actual_scale) ie. // s == 128 is half size ObjectMega *ob_mega = (ObjectMega *) _vm->_memory->intToPtr(params[0]); @@ -778,18 +682,18 @@ int32 Logic::fnSetScaling(int32 *params) { return IR_CONT; } -int32 Logic::fnSetStandbyCoords(int32 *params) { - // set the standby walk coords to be used by fnWalkToAnim and - // fnStandAfterAnim when the anim header's start/end coords are zero - - // useful during development; can stay in final game anyway +/** + * Set the standby walk coords to be used by fnWalkToAnim() and + * fnStandAfterAnim() when the anim header's start/end coords are zero. + * Useful during development; can stay in final game anyway. + */ +int32 Logic::fnSetStandbyCoords(int32 *params) { // params: 0 x-coord // 1 y-coord // 2 direction (0..7) - if (params[2] < 0 || params[2] > 7) - error("Invalid direction (%d) in fnSetStandbyCoords", params[2]); + assert(params[2] >= 0 && params[2] <= 7); _standbyX = (int16) params[0]; _standbyY = (int16) params[1]; |