aboutsummaryrefslogtreecommitdiff
path: root/scumm/actor.cpp
diff options
context:
space:
mode:
authorMax Horn2003-05-20 20:42:28 +0000
committerMax Horn2003-05-20 20:42:28 +0000
commit1a394aa3c764c8a50def5bb9d8aa1342d962fbdd (patch)
treefc456ba99a56a6b594cc4817807a59531af2ecd2 /scumm/actor.cpp
parent410f8b48264ed9fd02f0d18d462d74a67688f9fa (diff)
downloadscummvm-rg350-1a394aa3c764c8a50def5bb9d8aa1342d962fbdd.tar.gz
scummvm-rg350-1a394aa3c764c8a50def5bb9d8aa1342d962fbdd.tar.bz2
scummvm-rg350-1a394aa3c764c8a50def5bb9d8aa1342d962fbdd.zip
added enum's for the known actor/object claasses; extended putClass/getClass to translate the X/Y flip classes; made code use the new enum's; some other cleanup
svn-id: r7753
Diffstat (limited to 'scumm/actor.cpp')
-rw-r--r--scumm/actor.cpp84
1 files changed, 39 insertions, 45 deletions
diff --git a/scumm/actor.cpp b/scumm/actor.cpp
index 4be44f161d..3d6972e0c0 100644
--- a/scumm/actor.cpp
+++ b/scumm/actor.cpp
@@ -32,8 +32,15 @@
#include <math.h>
-byte Actor::INVALID_BOX = 0;
+byte Actor::kInvalidBox = 0;
+Scumm *Actor::_vm = 0;
+void Actor::initActorClass(Scumm *scumm) {
+ _vm = scumm;
+ if (_vm->_features & GF_SMALL_HEADER) {
+ kInvalidBox = 255;
+ }
+}
void Actor::initActor(int mode) {
if (mode == 1) {
@@ -71,30 +78,28 @@ void Actor::initActor(int mode) {
forceClip = 0;
ignoreTurns = false;
- initFrame = 1;
- walkFrame = 2;
- standFrame = 3;
- talkFrame1 = 4;
- talkFrame2 = 5;
+ if (_vm->_features & GF_AFTER_V2) {
+ initFrame = 2;
+ walkFrame = 0;
+ standFrame = 1;
+ talkFrame1 = 5;
+ talkFrame2 = 4;
+ } else {
+ initFrame = 1;
+ walkFrame = 2;
+ standFrame = 3;
+ talkFrame1 = 4;
+ talkFrame2 = 5;
+ }
walk_script = 0;
talk_script = 0;
- if (_vm) {
- if (_vm->_features & GF_AFTER_V2) {
- initFrame = 2;
- walkFrame = 0;
- standFrame = 1;
- talkFrame1 = 5;
- talkFrame2 = 4;
- }
- _vm->_classData[number] = (_vm->_features & GF_AFTER_V7) ? _vm->_classData[0] : 0;
- }
+ _vm->_classData[number] = (_vm->_features & GF_AFTER_V7) ? _vm->_classData[0] : 0;
}
void Actor::stopActorMoving() {
- if (_vm)
- _vm->stopScriptNr(walk_script);
+ _vm->stopScriptNr(walk_script);
moving = 0;
}
@@ -219,12 +224,12 @@ int Actor::remapDirection(int dir, bool is_walking) {
// for other games besides Loom!
// Check for X-Flip
- if ((flags & kBoxXFlip) || isInClass((_vm->_gameId == GID_LOOM256 || _vm->_gameId == GID_LOOM) ? 19 : 30)) {
+ if ((flags & kBoxXFlip) || isInClass(kObjectClassXFlip)) {
dir = 360 - dir;
flipX = !flipX;
}
// Check for Y-Flip
- if ((flags & kBoxYFlip) || isInClass((_vm->_gameId == GID_LOOM256 || _vm->_gameId == GID_LOOM) ? 18 : 29)) {
+ if ((flags & kBoxYFlip) || isInClass(kObjectClassYFlip)) {
dir = 180 - dir;
flipY = !flipY;
}
@@ -605,7 +610,7 @@ AdjustBoxResult Actor::adjustXYToBeInBox(int dstX, int dstY) {
abr.x = dstX;
abr.y = dstY;
- abr.dist = INVALID_BOX;
+ abr.dist = kInvalidBox;
if (ignoreBoxes)
return abr;
@@ -618,14 +623,14 @@ AdjustBoxResult Actor::adjustXYToBeInBox(int dstX, int dstY) {
return abr;
bestDist = (uint) 0xFFFF;
- bestBox = INVALID_BOX;
+ bestBox = kInvalidBox;
// We iterate (backwards) over all boxes, searching the one closes
// to the desired coordinates.
for (box = numBoxes; box >= firstValidBox; box--) {
flags = _vm->getBoxFlags(box);
- if (flags & kBoxInvisible && (!(flags & kBoxPlayerOnly) || isInClass(31)))
+ if (flags & kBoxInvisible && !(flags & kBoxPlayerOnly && !isInClass(kObjectClassPlayer)))
continue;
// For increased performance, we perform a quick test if
@@ -691,7 +696,7 @@ void Actor::adjustActorPos() {
stopActorMoving();
}
- if (walkbox != INVALID_BOX) {
+ if (walkbox != kInvalidBox) {
byte flags = _vm->getBoxFlags(walkbox);
if (flags & 7) {
turnToDirection(facing);
@@ -908,7 +913,7 @@ void Actor::drawActorCostume() {
if (forceClip)
cr._zbuf = forceClip;
- else if (isInClass(20))
+ else if (isInClass(kObjectClassNeverClip))
cr._zbuf = 0;
else {
cr._zbuf = _vm->getMaskFromBox(walkbox);
@@ -1056,7 +1061,8 @@ int Scumm::getActorFromPos(int x, int y) {
for (i = 1; i < _numActors; i++) {
Actor *a = derefActor(i);
assert(a->number == i);
- if (testGfxUsageBit(x >> 3, i) && !getClass(i, 32) && y >= a->top && y <= a->bottom) {
+ if (testGfxUsageBit(x >> 3, i) && !getClass(i, kObjectClassUntouchable)
+ && y >= a->top && y <= a->bottom) {
return i;
}
}
@@ -1182,8 +1188,8 @@ void Actor::startWalkActor(int destX, int destY, int dir) {
}
if (ignoreBoxes) {
- abr.dist = INVALID_BOX;
- walkbox = INVALID_BOX;
+ abr.dist = kInvalidBox;
+ walkbox = kInvalidBox;
} else {
if (_vm->checkXYInBoxBounds(walkdata.destbox, abr.x, abr.y)) {
abr.dist = walkdata.destbox;
@@ -1294,7 +1300,7 @@ void Actor::walkActor() {
do {
moving &= ~MF_NEW_LEG;
- if (walkbox == INVALID_BOX) {
+ if (walkbox == kInvalidBox) {
setBox(walkdata.destbox);
walkdata.curbox = walkdata.destbox;
break;
@@ -1366,7 +1372,7 @@ void Actor::walkActorOld() {
do {
moving &= ~MF_NEW_LEG;
- if (walkbox == INVALID_BOX) {
+ if (walkbox == kInvalidBox) {
walkbox = walkdata.destbox;
walkdata.curbox = walkdata.destbox;
break;
@@ -1385,7 +1391,7 @@ void Actor::walkActorOld() {
// FIXME: not sure if this is needed in non-Zak games, but I think it shouldn't
// hurt there either.
int flags = _vm->getBoxFlags(next_box);
- if (flags & kBoxLocked && (!(flags & kBoxPlayerOnly) || isInClass(31))) {
+ if (flags & kBoxLocked && !(flags & kBoxPlayerOnly && !isInClass(kObjectClassPlayer))) {
moving |= MF_LAST_LEG;
return;
}
@@ -1509,22 +1515,10 @@ void Scumm::resetActorBgs() {
}
void Actor::classChanged(int cls, bool value) {
- switch(cls) {
- case 20: // Never clip
- break;
- case 21: // Always clip
+ if (cls == kObjectClassAlwaysClip)
forceClip = value;
- break;
- case 22: // Ignore boxes
+ if (cls == kObjectClassIgnoreBoxes)
ignoreBoxes = value;
- break;
- case 29: // Y flip
- break;
- case 30: // X flip
- break;
- case 31: // ??
- break;
- }
}
bool Actor::isInClass(int cls) {