aboutsummaryrefslogtreecommitdiff
path: root/sword2
diff options
context:
space:
mode:
authorTorbjörn Andersson2005-05-12 06:30:16 +0000
committerTorbjörn Andersson2005-05-12 06:30:16 +0000
commitf45b23b63f01188066cfc2de02b5dce99b165ea9 (patch)
tree53b24c58e77b9baae580117d40699005d57177e9 /sword2
parent907dec571a2165debcb68ca48deef4b896f24f1d (diff)
downloadscummvm-rg350-f45b23b63f01188066cfc2de02b5dce99b165ea9.tar.gz
scummvm-rg350-f45b23b63f01188066cfc2de02b5dce99b165ea9.tar.bz2
scummvm-rg350-f45b23b63f01188066cfc2de02b5dce99b165ea9.zip
Moved some more animation stuff out of the Logic class and into the
increasingly misnamed Router class. (I'll fix the naming later. Probably.) svn-id: r18066
Diffstat (limited to 'sword2')
-rw-r--r--sword2/anims.cpp105
-rw-r--r--sword2/function.cpp56
-rw-r--r--sword2/logic.h6
-rw-r--r--sword2/router.h8
4 files changed, 82 insertions, 93 deletions
diff --git a/sword2/anims.cpp b/sword2/anims.cpp
index d4badbf640..c60a5a3e06 100644
--- a/sword2/anims.cpp
+++ b/sword2/anims.cpp
@@ -34,21 +34,15 @@
#include "sword2/logic.h"
#include "sword2/maketext.h"
#include "sword2/resman.h"
+#include "sword2/router.h"
#include "sword2/sound.h"
#include "sword2/driver/animation.h"
namespace Sword2 {
-int32 Logic::animate(int32 *params, bool reverse) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 resource id of animation file
-
- ObjectLogic *ob_logic = (ObjectLogic *) decodePtr(params[0]);
- ObjectGraphic *ob_graphic = (ObjectGraphic *) decodePtr(params[1]);
+int Router::doAnimate(ObjectLogic *ob_logic, ObjectGraphic *ob_graphic, int32 animRes, bool reverse) {
byte *anim_file;
AnimHeader *anim_head;
- int32 res = params[2];
if (ob_logic->looping == 0) {
StandardHeader *head;
@@ -61,40 +55,38 @@ int32 Logic::animate(int32 *params, bool reverse) {
// 'testing_routines' object in George's Player Character
// section of linc
- if (_scriptVars[SYSTEM_TESTING_ANIMS]) {
- // if the resource number is within range & it's not
- // a null resource
-
- if (_vm->_resman->checkValid(res)) {
- // Open the resource. Can close it immediately.
- // We've got a pointer to the header.
- head = (StandardHeader *) _vm->_resman->openResource(res);
- _vm->_resman->closeResource(res);
-
- // if it's not an animation file
- if (head->fileType != ANIMATION_FILE) {
- // switch off the sprite
- // don't animate - just continue
- // script next cycle
- fnNoSprite(params + 1);
- return IR_STOP;
- }
- } else {
+ if (Logic::_scriptVars[SYSTEM_TESTING_ANIMS]) {
+ if (!_vm->_resman->checkValid(animRes)) {
// Not a valid resource number. Switch off
// the sprite. Don't animate - just continue
// script next cycle.
- fnNoSprite(params + 1);
+ setSpriteStatus(ob_graphic, NO_SPRITE);
return IR_STOP;
}
+ head = (StandardHeader *) _vm->_resman->openResource(animRes);
+
+ // if it's not an animation file
+ if (head->fileType != ANIMATION_FILE) {
+ _vm->_resman->closeResource(animRes);
+
+ // switch off the sprite
+ // don't animate - just continue
+ // script next cycle
+ setSpriteStatus(ob_graphic, NO_SPRITE);
+ return IR_STOP;
+ }
+
+ _vm->_resman->closeResource(animRes);
+
// switch on the sprite
- fnSortSprite(params + 1);
+ setSpriteStatus(ob_graphic, SORT_SPRITE);
}
- assert(res);
+ assert(animRes);
// open anim file
- anim_file = _vm->_resman->openResource(res);
+ anim_file = _vm->_resman->openResource(animRes);
head = (StandardHeader *) anim_file;
assert(head->fileType == ANIMATION_FILE);
@@ -102,17 +94,17 @@ int32 Logic::animate(int32 *params, bool reverse) {
// point to anim header
anim_head = _vm->fetchAnimHeader(anim_file);
- // now running an anim, looping back to this 'FN' call again
+ // now running an anim, looping back to this call again
ob_logic->looping = 1;
- ob_graphic->anim_resource = res;
+ ob_graphic->anim_resource = animRes;
if (reverse)
ob_graphic->anim_pc = anim_head->noAnimFrames - 1;
else
ob_graphic->anim_pc = 0;
- } else if (getSync() != -1) {
+ } else if (_vm->_logic->getSync() != -1) {
// We've received a sync - return to script immediately
- debug(5, "**sync stopped %d**", _scriptVars[ID]);
+ debug(5, "**sync stopped %d**", Logic::_scriptVars[ID]);
// If sync received, anim finishes right now (remaining on
// last frame). Quit animation, but continue script.
@@ -138,7 +130,7 @@ int32 Logic::animate(int32 *params, bool reverse) {
if (ob_graphic->anim_pc == 0)
ob_logic->looping = 0;
} else {
- if (ob_graphic->anim_pc == (int32) (anim_head->noAnimFrames - 1))
+ if (ob_graphic->anim_pc == anim_head->noAnimFrames - 1)
ob_logic->looping = 0;
}
@@ -149,49 +141,30 @@ int32 Logic::animate(int32 *params, bool reverse) {
return ob_logic->looping ? IR_REPEAT : IR_STOP;
}
-int32 Logic::megaTableAnimate(int32 *params, bool reverse) {
- // params: 0 pointer to object's logic structure
- // 1 pointer to object's graphic structure
- // 2 pointer to object's mega structure
- // 3 pointer to animation table
-
- int32 pars[3];
-
- // Set up the parameters for animate().
-
- pars[0] = params[0];
- pars[1] = params[1];
+int Router::megaTableAnimate(ObjectLogic *ob_logic, ObjectGraphic *ob_graph, ObjectMega *ob_mega, uint32 *animTable, bool reverse) {
+ int32 animRes = 0;
// If this is the start of the anim, read the anim table to get the
// appropriate anim resource
- ObjectLogic *ob_logic = (ObjectLogic *) decodePtr(params[0]);
-
if (ob_logic->looping == 0) {
- ObjectMega *ob_mega = (ObjectMega *) decodePtr(params[2]);
- uint32 *anim_table = (uint32 *) decodePtr(params[3]);
-
- // appropriate anim resource is in 'table[direction]'
- pars[2] = anim_table[ob_mega->current_dir];
+ // Appropriate anim resource is in 'table[direction]'
+ animRes = animTable[ob_mega->current_dir];
}
- return animate(pars, reverse);
+ return doAnimate(ob_logic, ob_graph, animRes, reverse);
}
-void Logic::setSpriteStatus(uint32 sprite, uint32 type) {
- ObjectGraphic *ob_graphic = (ObjectGraphic *) decodePtr(sprite);
-
+void Router::setSpriteStatus(ObjectGraphic *ob_graph, uint32 type) {
// Remove the previous status, but don't affect the shading upper-word
- ob_graphic->type = (ob_graphic->type & 0xffff0000) | type;
+ ob_graph->type = (ob_graph->type & 0xffff0000) | type;
}
-void Logic::setSpriteShading(uint32 sprite, uint32 type) {
- ObjectGraphic *ob_graphic = (ObjectGraphic *) decodePtr(sprite);
-
+void Router::setSpriteShading(ObjectGraphic *ob_graph, uint32 type) {
// Remove the previous shading, but don't affect the status lower-word.
- // Note that drivers may still shade mega frames automatically, even
- // when not sent 'RDSPR_SHADOW'.
- ob_graphic->type = (ob_graphic->type & 0x0000ffff) | type;
+ // Note that mega frames may still be shaded automatically, even when
+ // not sent 'RDSPR_SHADOW'.
+ ob_graph->type = (ob_graph->type & 0x0000ffff) | type;
}
void Logic::createSequenceSpeech(MovieTextObject *sequenceText[]) {
diff --git a/sword2/function.cpp b/sword2/function.cpp
index da921ba4a4..eb10e46557 100644
--- a/sword2/function.cpp
+++ b/sword2/function.cpp
@@ -81,19 +81,19 @@ int32 Logic::fnSetSession(int32 *params) {
int32 Logic::fnBackSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], BACK_SPRITE);
+ _router->setSpriteStatus((ObjectGraphic *) decodePtr(params[0]), BACK_SPRITE);
return IR_CONT;
}
int32 Logic::fnSortSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], SORT_SPRITE);
+ _router->setSpriteStatus((ObjectGraphic *) decodePtr(params[0]), SORT_SPRITE);
return IR_CONT;
}
int32 Logic::fnForeSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], FORE_SPRITE);
+ _router->setSpriteStatus((ObjectGraphic *) decodePtr(params[0]), FORE_SPRITE);
return IR_CONT;
}
@@ -106,9 +106,7 @@ int32 Logic::fnRegisterMouse(int32 *params) {
// params: 0 pointer to ObjectMouse or 0 for no write to mouse
// list
- ObjectMouse *ob_mouse = (ObjectMouse *) decodePtr(params[0]);
-
- _vm->_mouse->registerMouse(ob_mouse, NULL);
+ _vm->_mouse->registerMouse((ObjectMouse *) decodePtr(params[0]), NULL);
return IR_CONT;
}
@@ -117,8 +115,11 @@ int32 Logic::fnAnim(int32 *params) {
// 1 pointer to object's graphic structure
// 2 resource id of animation file
- // 0 means normal forward anim
- return animate(params, false);
+ // Normal forward animation
+ return _router->doAnimate(
+ (ObjectLogic *) decodePtr(params[0]),
+ (ObjectGraphic *) decodePtr(params[1]),
+ params[2], false);
}
int32 Logic::fnRandom(int32 *params) {
@@ -324,8 +325,13 @@ int32 Logic::fnMegaTableAnim(int32 *params) {
// 2 pointer to object's mega structure
// 3 pointer to animation table
- // 0 means normal forward anim
- return megaTableAnimate(params, false);
+ // Normal forward anim
+ return _router->megaTableAnimate(
+ (ObjectLogic *) decodePtr(params[0]),
+ (ObjectGraphic *) decodePtr(params[1]),
+ (ObjectMega *) decodePtr(params[2]),
+ (uint32 *) decodePtr(params[3]),
+ false);
}
int32 Logic::fnAddMenuObject(int32 *params) {
@@ -428,7 +434,7 @@ int32 Logic::fnRegisterFrame(int32 *params) {
int32 Logic::fnNoSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], NO_SPRITE);
+ _router->setSpriteStatus((ObjectGraphic *) decodePtr(params[0]), NO_SPRITE);
return IR_CONT;
}
@@ -1663,8 +1669,13 @@ int32 Logic::fnReverseMegaTableAnim(int32 *params) {
// 2 pointer to object's mega structure
// 3 pointer to animation table
- // 1 means reverse anim
- return megaTableAnimate(params, true);
+ // Reverse anim
+ return _router->megaTableAnimate(
+ (ObjectLogic *) decodePtr(params[0]),
+ (ObjectGraphic *) decodePtr(params[1]),
+ (ObjectMega *) decodePtr(params[2]),
+ (uint32 *) decodePtr(params[3]),
+ true);
}
int32 Logic::fnReverseAnim(int32 *params) {
@@ -1672,8 +1683,11 @@ int32 Logic::fnReverseAnim(int32 *params) {
// 1 pointer to object's graphic structure
// 2 resource id of animation file
- // 1 means reverse anim
- return animate(params, true);
+ // Reverse anim
+ return _router->doAnimate(
+ (ObjectLogic *) decodePtr(params[0]),
+ (ObjectGraphic *) decodePtr(params[1]),
+ params[2], true);
}
/**
@@ -1731,25 +1745,25 @@ int32 Logic::fnSetStandbyCoords(int32 *params) {
int32 Logic::fnBackPar0Sprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], BGP0_SPRITE);
+ _router->setSpriteStatus((ObjectGraphic *) decodePtr(params[0]), BGP0_SPRITE);
return IR_CONT;
}
int32 Logic::fnBackPar1Sprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], BGP1_SPRITE);
+ _router->setSpriteStatus((ObjectGraphic *) decodePtr(params[0]), BGP1_SPRITE);
return IR_CONT;
}
int32 Logic::fnForePar0Sprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], FGP0_SPRITE);
+ _router->setSpriteStatus((ObjectGraphic *) decodePtr(params[0]), FGP0_SPRITE);
return IR_CONT;
}
int32 Logic::fnForePar1Sprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- setSpriteStatus(params[0], FGP1_SPRITE);
+ _router->setSpriteStatus((ObjectGraphic *) decodePtr(params[0]), FGP1_SPRITE);
return IR_CONT;
}
@@ -2187,13 +2201,13 @@ int32 Logic::fnPlaySequence(int32 *params) {
int32 Logic::fnShadedSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- setSpriteShading(params[0], SHADED_SPRITE);
+ _router->setSpriteShading((ObjectGraphic *) decodePtr(params[0]), SHADED_SPRITE);
return IR_CONT;
}
int32 Logic::fnUnshadedSprite(int32 *params) {
// params: 0 pointer to object's graphic structure
- setSpriteShading(params[0], UNSHADED_SPRITE);
+ _router->setSpriteShading((ObjectGraphic *) decodePtr(params[0]), UNSHADED_SPRITE);
return IR_CONT;
}
diff --git a/sword2/logic.h b/sword2/logic.h
index e770e162df..ebb58f3e9e 100644
--- a/sword2/logic.h
+++ b/sword2/logic.h
@@ -77,12 +77,6 @@ private:
uint32 _smackerLeadIn;
uint32 _smackerLeadOut;
- int32 animate(int32 *params, bool reverse);
- int32 megaTableAnimate(int32 *params, bool reverse);
-
- void setSpriteStatus(uint32 sprite, uint32 type);
- void setSpriteShading(uint32 sprite, uint32 type);
-
// keeps count of number of text lines to disaply during the sequence
uint32 _sequenceTextLines;
diff --git a/sword2/router.h b/sword2/router.h
index a016579fa6..27c2c0bb35 100644
--- a/sword2/router.h
+++ b/sword2/router.h
@@ -231,6 +231,14 @@ public:
void setStandbyCoords(int16 x, int16 y, uint8 dir);
int whatTarget(int startX, int startY, int destX, int destY);
+ // Sprites
+ void setSpriteStatus(ObjectGraphic *ob_graph, uint32 type);
+ void setSpriteShading(ObjectGraphic *ob_graph, uint32 type);
+
+ // Animation
+ int doAnimate(ObjectLogic *ob_logic, ObjectGraphic *ob_graph, int32 animRes, bool reverse);
+ int megaTableAnimate(ObjectLogic *ob_logic, ObjectGraphic *ob_graph, ObjectMega *ob_mega, uint32 *animTable, bool reverse);
+
// Walking
int doWalk(ObjectLogic *ob_logic, ObjectGraphic *ob_graph, ObjectMega *ob_mega, ObjectWalkdata *ob_walkdata, int16 target_x, int16 target_y, uint8 target_dir);
int walkToAnim(ObjectLogic *ob_logic, ObjectGraphic *ob_graph, ObjectMega *ob_mega, ObjectWalkdata *ob_walkdata, uint32 animRes);