removed some debug output I left in accidentally in my last checkin; removed some uses of g_scumm (see Endy, I promised I'd do it <g>); removed getSideOfLine(); some clean up

svn-id: r4378
This commit is contained in:
Max Horn 2002-05-23 21:22:08 +00:00
parent de99ad11b6
commit 0620c9d66a
8 changed files with 142 additions and 146 deletions

171
actor.cpp
View file

@ -23,6 +23,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "scumm.h" #include "scumm.h"
#include "actor.h" #include "actor.h"
#include "akos.h"
#include <math.h> #include <math.h>
@ -76,16 +77,16 @@ void Actor::initActor(int mode)
walk_script = 0; walk_script = 0;
talk_script = 0; talk_script = 0;
if (_scumm->_features & GF_AFTER_V7) { if (_vm->_features & GF_AFTER_V7) {
_scumm->_classData[number] = _scumm->_classData[0]; _vm->_classData[number] = _vm->_classData[0];
} else { } else {
_scumm->_classData[number] = 0; _vm->_classData[number] = 0;
} }
} }
void Actor::stopActorMoving() void Actor::stopActorMoving()
{ {
_scumm->stopScriptNr(walk_script); _vm->stopScriptNr(walk_script);
moving = 0; moving = 0;
} }
@ -168,7 +169,7 @@ int Actor::calcMovementFactor(int newX, int newY)
walkdata.xfrac = 0; walkdata.xfrac = 0;
walkdata.yfrac = 0; walkdata.yfrac = 0;
newDirection = _scumm->getAngleFromPos(XYFactor, YXFactor); newDirection = _vm->getAngleFromPos(XYFactor, YXFactor);
return actorWalkStep(); return actorWalkStep();
} }
@ -181,7 +182,7 @@ int Actor::remapDirection(int dir)
bool flipY; bool flipY;
if (!ignoreBoxes) { if (!ignoreBoxes) {
specdir = _scumm->_extraBoxFlags[walkbox]; specdir = _vm->_extraBoxFlags[walkbox];
if (specdir) { if (specdir) {
if (specdir & 0x8000) { if (specdir & 0x8000) {
dir = specdir & 0x3FFF; dir = specdir & 0x3FFF;
@ -190,19 +191,19 @@ int Actor::remapDirection(int dir)
} }
} }
flags = _scumm->getBoxFlags(walkbox); flags = _vm->getBoxFlags(walkbox);
flipX = (walkdata.XYFactor > 0); flipX = (walkdata.XYFactor > 0);
flipY = (walkdata.YXFactor > 0); flipY = (walkdata.YXFactor > 0);
// Check for X-Flip // Check for X-Flip
if ((flags & 0x08) || _scumm->getClass(number, 0x1E)) { if ((flags & 0x08) || _vm->getClass(number, 0x1E)) {
dir = 360 - dir; dir = 360 - dir;
flipX = !flipX; flipX = !flipX;
} }
// Check for Y-Flip // Check for Y-Flip
if ((flags & 0x10) || _scumm->getClass(number, 0x1D)) { if ((flags & 0x10) || _vm->getClass(number, 0x1D)) {
dir = 180 - dir; dir = 180 - dir;
flipY = !flipY; flipY = !flipY;
} }
@ -241,7 +242,7 @@ int Actor::updateActorDirection()
int num; int num;
bool shouldInterpolate; bool shouldInterpolate;
dirType = _scumm->akos_hasManyDirections(this); dirType = _vm->akos_hasManyDirections(this);
from = Scumm::toSimpleDir(dirType, facing); from = Scumm::toSimpleDir(dirType, facing);
dir = remapDirection(newDirection); dir = remapDirection(newDirection);
@ -272,7 +273,7 @@ int Actor::updateActorDirection()
void Actor::setActorBox(int box) void Actor::setActorBox(int box)
{ {
walkbox = box; walkbox = box;
mask = _scumm->getMaskFromBox(box); mask = _vm->getMaskFromBox(box);
setupActorScale(); setupActorScale();
} }
@ -300,7 +301,7 @@ int Actor::actorWalkStep()
actorY = y; actorY = y;
if (walkbox != walkdata.curbox && if (walkbox != walkdata.curbox &&
_scumm->checkXYInBoxBounds(walkdata.curbox, actorX, actorY)) { _vm->checkXYInBoxBounds(walkdata.curbox, actorX, actorY)) {
setActorBox(walkdata.curbox); setActorBox(walkdata.curbox);
} }
@ -344,10 +345,10 @@ void Actor::setupActorScale()
// FIXME: Special 'no scaling' class for MI1 VGA Floppy // FIXME: Special 'no scaling' class for MI1 VGA Floppy
// Not totally sure if this is correct. // Not totally sure if this is correct.
if(_scumm->_gameId == GID_MONKEY_VGA && _scumm->getClass(number, 0x96)) if(_vm->_gameId == GID_MONKEY_VGA && _vm->getClass(number, 0x96))
return; return;
if (_scumm->_features & GF_NO_SCALLING) { if (_vm->_features & GF_NO_SCALLING) {
scalex = 0xFF; scalex = 0xFF;
scaley = 0xFF; scaley = 0xFF;
return; return;
@ -356,14 +357,14 @@ void Actor::setupActorScale()
if (ignoreBoxes != 0) if (ignoreBoxes != 0)
return; return;
if(_scumm->getBoxFlags(walkbox) & 0x20) if(_vm->getBoxFlags(walkbox) & 0x20)
return; return;
scale = _scumm->getBoxScale(walkbox); scale = _vm->getBoxScale(walkbox);
if (scale & 0x8000) { if (scale & 0x8000) {
scale = (scale & 0x7FFF) + 1; scale = (scale & 0x7FFF) + 1;
resptr = _scumm->getResourceAddress(rtScaleTable, scale); resptr = _vm->getResourceAddress(rtScaleTable, scale);
if (resptr == NULL) if (resptr == NULL)
error("Scale table %d not defined", scale); error("Scale table %d not defined", scale);
int theY = y; int theY = y;
@ -378,7 +379,7 @@ void Actor::setupActorScale()
warning("Actor %d at %d, scale %d out of range", number, y, scale); warning("Actor %d at %d, scale %d out of range", number, y, scale);
// FIXME - Quick fix to ft's fuel tower bug (by yazoo) // FIXME - Quick fix to ft's fuel tower bug (by yazoo)
if(scale == 1 && _scumm->_currentRoom == 76) if(scale == 1 && _vm->_currentRoom == 76)
scale = 0xFF; scale = 0xFF;
scalex = (byte)scale; scalex = (byte)scale;
@ -387,7 +388,7 @@ void Actor::setupActorScale()
void Actor::startAnimActor(int frame) void Actor::startAnimActor(int frame)
{ {
if (_scumm->_features & GF_NEW_COSTUMES) { if (_vm->_features & GF_NEW_COSTUMES) {
switch (frame) { switch (frame) {
case 1001: case 1001:
frame = initFrame; frame = initFrame;
@ -412,7 +413,7 @@ void Actor::startAnimActor(int frame)
needBgReset = true; needBgReset = true;
if (frame == initFrame) if (frame == initFrame)
cost.reset(); cost.reset();
_scumm->akos_decodeData(this, frame, (uint) - 1); _vm->akos_decodeData(this, frame, (uint) - 1);
} }
} else { } else {
@ -443,7 +444,7 @@ void Actor::startAnimActor(int frame)
cost.reset(); cost.reset();
if (frame != 0x3E) { if (frame != 0x3E) {
_scumm->cost_decodeData(this, frame, (uint) - 1); _vm->cost_decodeData(this, frame, (uint) - 1);
} }
} }
@ -470,10 +471,10 @@ void Actor::setActorDirection(int direction)
vald = cost.frame[i]; vald = cost.frame[i];
if (vald == 0xFFFF) if (vald == 0xFFFF)
continue; continue;
if (_scumm->_features & GF_AFTER_V7) if (_vm->_features & GF_AFTER_V7)
_scumm->akos_decodeData(this, vald, aMask); _vm->akos_decodeData(this, vald, aMask);
else else
_scumm->cost_decodeData(this, vald, aMask); _vm->cost_decodeData(this, vald, aMask);
} }
needRedraw = true; needRedraw = true;
@ -611,7 +612,7 @@ void Actor::adjustActorPos()
AdjustBoxResult abr; AdjustBoxResult abr;
byte flags; byte flags;
abr = _scumm->adjustXYToBeInBox(this, x, y, 0); abr = _vm->adjustXYToBeInBox(this, x, y, 0);
x = abr.x; x = abr.x;
y = abr.y; y = abr.y;
@ -624,11 +625,11 @@ void Actor::adjustActorPos()
moving = 0; moving = 0;
cost.animCounter2 = 0; cost.animCounter2 = 0;
if (_scumm->_features & GF_AFTER_V7) { if (_vm->_features & GF_AFTER_V7) {
stopActorMoving(); stopActorMoving();
} }
flags = _scumm->getBoxFlags(walkbox); flags = _vm->getBoxFlags(walkbox);
if (flags & 7) { if (flags & 7) {
turnToDirection(facing); turnToDirection(facing);
} }
@ -664,12 +665,12 @@ void Actor::hideActor()
void Actor::showActor() void Actor::showActor()
{ {
if (_scumm->_currentRoom == 0 || visible) if (_vm->_currentRoom == 0 || visible)
return; return;
adjustActorPos(); adjustActorPos();
_scumm->ensureResourceLoaded(rtCostume, costume); _vm->ensureResourceLoaded(rtCostume, costume);
if (costumeNeedsInit) { if (costumeNeedsInit) {
startAnimActor(initFrame); startAnimActor(initFrame);
@ -773,7 +774,7 @@ void Actor::startWalkAnim(int cmd, int angle)
args[2] = angle; args[2] = angle;
args[0] = number; args[0] = number;
args[1] = cmd; args[1] = cmd;
_scumm->runScript(walk_script, 1, 0, args); _vm->runScript(walk_script, 1, 0, args);
} else*/ { } else*/ {
switch (cmd) { switch (cmd) {
case 1: /* start walk */ case 1: /* start walk */
@ -846,7 +847,7 @@ void Actor::walkActor()
walkdata.curbox = j; walkdata.curbox = j;
if (_scumm->findPathTowards(this, walkbox, j, walkdata.destbox)) { if (_vm->findPathTowards(this, walkbox, j, walkdata.destbox)) {
moving |= MF_LAST_LEG; moving |= MF_LAST_LEG;
calcMovementFactor(walkdata.destx, walkdata.desty); calcMovementFactor(walkdata.destx, walkdata.desty);
return; return;
@ -856,43 +857,43 @@ void Actor::walkActor()
#if 1 #if 1
do { do {
moving &= ~MF_NEW_LEG; moving &= ~MF_NEW_LEG;
if ((!walkbox && (!(_scumm->_features & GF_SMALL_HEADER)))) { if ((!walkbox && (!(_vm->_features & GF_SMALL_HEADER)))) {
setActorBox(walkdata.destbox); setActorBox(walkdata.destbox);
walkdata.curbox = walkdata.destbox; walkdata.curbox = walkdata.destbox;
break; break;
} }
if (walkbox == walkdata.destbox) if (walkbox == walkdata.destbox)
break; break;
j = _scumm->getPathToDestBox(walkbox, walkdata.destbox); j = _vm->getPathToDestBox(walkbox, walkdata.destbox);
if (j == -1 || j > 0xF0) { if (j == -1 || j > 0xF0) {
walkdata.destbox = walkbox; walkdata.destbox = walkbox;
moving |= MF_LAST_LEG; moving |= MF_LAST_LEG;
return; return;
} }
walkdata.curbox = j; walkdata.curbox = j;
if (_scumm->_features & GF_OLD256) { if (_vm->_features & GF_OLD256) {
_scumm->findPathTowardsOld(this, walkbox, j, walkdata.destbox); _vm->findPathTowardsOld(this, walkbox, j, walkdata.destbox);
if (_scumm->gateLoc[2].x == 32000 && _scumm->gateLoc[3].x == 32000) { if (_vm->gateLoc[2].x == 32000 && _vm->gateLoc[3].x == 32000) {
moving |= MF_LAST_LEG; moving |= MF_LAST_LEG;
calcMovementFactor(walkdata.destx, walkdata.desty); calcMovementFactor(walkdata.destx, walkdata.desty);
return; return;
} }
if (_scumm->gateLoc[2].x != 32000) { if (_vm->gateLoc[2].x != 32000) {
if (calcMovementFactor(_scumm->gateLoc[2].x, _scumm->gateLoc[2].y)) { if (calcMovementFactor(_vm->gateLoc[2].x, _vm->gateLoc[2].y)) {
walkdata.destx = _scumm->gateLoc[3].x; walkdata.destx = _vm->gateLoc[3].x;
walkdata.desty = _scumm->gateLoc[3].y; walkdata.desty = _vm->gateLoc[3].y;
return; return;
} }
} }
if (calcMovementFactor(_scumm->gateLoc[3].x, _scumm->gateLoc[3].y)) if (calcMovementFactor(_vm->gateLoc[3].x, _vm->gateLoc[3].y))
return; return;
} else { } else {
if (_scumm->findPathTowards(this, walkbox, j, walkdata.destbox)) if (_vm->findPathTowards(this, walkbox, j, walkdata.destbox))
break; break;
if (calcMovementFactor(_scumm->_foundPathX, _scumm->_foundPathY)) if (calcMovementFactor(_vm->_foundPathX, _vm->_foundPathY))
return; return;
} }
@ -945,19 +946,19 @@ void Scumm::processActors()
void Actor::drawActorCostume() void Actor::drawActorCostume()
{ {
if (!(_scumm->_features & GF_AFTER_V7)) { if (!(_vm->_features & GF_AFTER_V7)) {
CostumeRenderer cr; CostumeRenderer cr;
if (!needRedraw) if (!needRedraw)
return; return;
if (_scumm->getClass(number, 20)) if (_vm->getClass(number, 20))
mask = 0; mask = 0;
else if (_scumm->getClass(number, 21)) else if (_vm->getClass(number, 21))
forceClip = 1; forceClip = 1;
// FIXME: ugly fix for samnmax inventory // FIXME: ugly fix for samnmax inventory
if (_scumm->_gameId==GID_SAMNMAX && _scumm->getState(995)) if (_vm->_gameId==GID_SAMNMAX && _vm->getState(995))
return; return;
needRedraw = false; needRedraw = false;
@ -967,21 +968,21 @@ void Actor::drawActorCostume()
/* First, zero initialize all fields */ /* First, zero initialize all fields */
memset(&cr, 0, sizeof(cr)); memset(&cr, 0, sizeof(cr));
cr._actorX = x - _scumm->virtscr->xstart; cr._actorX = x - _vm->virtscr->xstart;
cr._actorY = y - elevation; cr._actorY = y - elevation;
cr._scaleX = scalex; cr._scaleX = scalex;
cr._scaleY = scaley; cr._scaleY = scaley;
cr._outheight = _scumm->virtscr->height; cr._outheight = _vm->virtscr->height;
cr._vm = _scumm; cr._vm = _vm;
cr._zbuf = mask; cr._zbuf = mask;
if (cr._zbuf > _scumm->gdi._numZBuffer) if (cr._zbuf > _vm->gdi._numZBuffer)
cr._zbuf = (byte)_scumm->gdi._numZBuffer; cr._zbuf = (byte)_vm->gdi._numZBuffer;
if (forceClip) if (forceClip)
cr._zbuf = forceClip; cr._zbuf = forceClip;
cr._shadow_table = _scumm->_shadowPalette; cr._shadow_table = _vm->_shadowPalette;
cr.setCostume(costume); cr.setCostume(costume);
cr.setPalette(palette); cr.setPalette(palette);
@ -997,7 +998,7 @@ void Actor::drawActorCostume()
needRedraw = true; needRedraw = true;
} }
} else { } else {
AkosRenderer ar; AkosRenderer ar(_vm);
if (!needRedraw) if (!needRedraw)
return; return;
@ -1009,24 +1010,24 @@ void Actor::drawActorCostume()
/* First, zero initialize all fields */ /* First, zero initialize all fields */
memset(&ar, 0, sizeof(ar)); memset(&ar, 0, sizeof(ar));
ar.x = x - _scumm->virtscr->xstart; ar.x = x - _vm->virtscr->xstart;
ar.y = y - elevation; ar.y = y - elevation;
ar.scale_x = scalex; ar.scale_x = scalex;
ar.scale_y = scaley; ar.scale_y = scaley;
ar.clipping = forceClip; ar.clipping = forceClip;
if (ar.clipping == 100) { if (ar.clipping == 100) {
ar.clipping = mask; ar.clipping = mask;
if (ar.clipping > (byte)_scumm->gdi._numZBuffer) if (ar.clipping > (byte)_vm->gdi._numZBuffer)
ar.clipping = _scumm->gdi._numZBuffer; ar.clipping = _vm->gdi._numZBuffer;
} }
ar.charsetmask = _scumm->_vars[_scumm->VAR_CHARSET_MASK] != 0; ar.charsetmask = _vm->_vars[_vm->VAR_CHARSET_MASK] != 0;
ar.outptr = _scumm->virtscr->screenPtr + _scumm->virtscr->xstart; ar.outptr = _vm->virtscr->screenPtr + _vm->virtscr->xstart;
ar.outwidth = _scumm->virtscr->width; ar.outwidth = _vm->virtscr->width;
ar.outheight = _scumm->virtscr->height; ar.outheight = _vm->virtscr->height;
ar.shadow_mode = shadow_mode; ar.shadow_mode = shadow_mode;
ar.shadow_table = _scumm->_shadowPalette; ar.shadow_table = _vm->_shadowPalette;
ar.setCostume(costume); ar.setCostume(costume);
ar.setPalette(palette); ar.setPalette(palette);
@ -1053,17 +1054,17 @@ void Actor::actorAnimate()
if (animProgress >= animSpeed) { if (animProgress >= animSpeed) {
animProgress = 0; animProgress = 0;
if (_scumm->_features & GF_AFTER_V7) { if (_vm->_features & GF_AFTER_V7) {
byte *akos = _scumm->getResourceAddress(rtCostume, costume); byte *akos = _vm->getResourceAddress(rtCostume, costume);
assert(akos); assert(akos);
if (_scumm->akos_increaseAnims(akos, this)) { if (_vm->akos_increaseAnims(akos, this)) {
needRedraw = true; needRedraw = true;
needBgReset = true; needBgReset = true;
} }
} else { } else {
LoadedCostume lc; LoadedCostume lc;
_scumm->loadCostume(&lc, costume); _vm->loadCostume(&lc, costume);
if (_scumm->cost_increaseAnims(&lc, this)) { if (_vm->cost_increaseAnims(&lc, this)) {
needRedraw = true; needRedraw = true;
needBgReset = true; needBgReset = true;
} }
@ -1160,8 +1161,6 @@ void Actor::setActorCostume(int c)
costumeNeedsInit = true; costumeNeedsInit = true;
debug(1, "setActorCostume (actor=%d, costume=%d)", (int)number, (int)c);
if (visible) { if (visible) {
hideActor(); hideActor();
cost.reset(); cost.reset();
@ -1180,7 +1179,7 @@ void Actor::startWalkActor(int destX, int destY, int dir)
{ {
AdjustBoxResult abr; AdjustBoxResult abr;
abr = _scumm->adjustXYToBeInBox(this, destX, destY, walkbox); abr = _vm->adjustXYToBeInBox(this, destX, destY, walkbox);
if (!isInCurrentRoom()) { if (!isInCurrentRoom()) {
x = abr.x; x = abr.x;
@ -1194,10 +1193,10 @@ void Actor::startWalkActor(int destX, int destY, int dir)
abr.dist = 0; abr.dist = 0;
walkbox = 0; walkbox = 0;
} else { } else {
if (_scumm->checkXYInBoxBounds(walkdata.destbox, abr.x, abr.y)) { if (_vm->checkXYInBoxBounds(walkdata.destbox, abr.x, abr.y)) {
abr.dist = walkdata.destbox; abr.dist = walkdata.destbox;
} else { } else {
abr = _scumm->adjustXYToBeInBox(this, abr.x, abr.y, walkbox); abr = _vm->adjustXYToBeInBox(this, abr.x, abr.y, walkbox);
} }
if (moving && walkdata.destdir == dir if (moving && walkdata.destdir == dir
&& walkdata.destx == abr.x && walkdata.desty == abr.y) && walkdata.destx == abr.x && walkdata.desty == abr.y)
@ -1221,7 +1220,7 @@ void Actor::startWalkActor(int destX, int destY, int dir)
byte *Actor::getActorName() byte *Actor::getActorName()
{ {
byte *ptr = _scumm->getResourceAddress(rtActorName, number); byte *ptr = _vm->getResourceAddress(rtActorName, number);
if (ptr == NULL) if (ptr == NULL)
return (byte *)" "; return (byte *)" ";
return ptr; return ptr;
@ -1240,12 +1239,12 @@ void Actor::remapActor(int r_fact, int g_fact, int b_fact,
return; return;
} }
if (costume < 1 || costume >= _scumm->_numCostumes - 1) { if (costume < 1 || costume >= _vm->_numCostumes - 1) {
warning("Remap actor %d invalid costume", number, costume); warning("Remap actor %d invalid costume", number, costume);
return; return;
} }
akos = _scumm->getResourceAddress(rtCostume, costume); akos = _vm->getResourceAddress(rtCostume, costume);
akpl = findResource(MKID('AKPL'), akos); akpl = findResource(MKID('AKPL'), akos);
//get num palette entries //get num palette entries
@ -1279,7 +1278,7 @@ void Actor::remapActor(int r_fact, int g_fact, int b_fact,
g = (g * g_fact) >> 8; g = (g * g_fact) >> 8;
if (b_fact != 256) if (b_fact != 256)
b = (b * b_fact) >> 8; b = (b * b_fact) >> 8;
palette[i] = _scumm->remapPaletteColor(r, g, b, threshold); palette[i] = _vm->remapPaletteColor(r, g, b, threshold);
} }
} }
} }
@ -1309,7 +1308,7 @@ void Actor::walkActorOld()
return; return;
} }
next_box = _scumm->getPathToDestBox(walkbox, walkdata.destbox); next_box = _vm->getPathToDestBox(walkbox, walkdata.destbox);
if (next_box == -1) { if (next_box == -1) {
moving |= MF_LAST_LEG; moving |= MF_LAST_LEG;
@ -1318,27 +1317,27 @@ void Actor::walkActorOld()
walkdata.curbox = next_box; walkdata.curbox = next_box;
_scumm->findPathTowardsOld(this, walkbox, next_box, walkdata.destbox); _vm->findPathTowardsOld(this, walkbox, next_box, walkdata.destbox);
if (_scumm->gateLoc[2].x == 32000 && _scumm->gateLoc[3].x == 32000) { if (_vm->gateLoc[2].x == 32000 && _vm->gateLoc[3].x == 32000) {
moving |= MF_LAST_LEG; moving |= MF_LAST_LEG;
calcMovementFactor(walkdata.destx, walkdata.desty); calcMovementFactor(walkdata.destx, walkdata.desty);
return; return;
} }
if (_scumm->gateLoc[2].x != 32000) { if (_vm->gateLoc[2].x != 32000) {
if (calcMovementFactor(_scumm->gateLoc[2].x, _scumm->gateLoc[2].y)) { if (calcMovementFactor(_vm->gateLoc[2].x, _vm->gateLoc[2].y)) {
// FIXME - why is the first actor used here?!? Somebody please add a comment // FIXME - why is the first actor used here?!? Somebody please add a comment
_scumm->getFirstActor()->walkdata.point3x = _scumm->gateLoc[3].x; _vm->getFirstActor()->walkdata.point3x = _vm->gateLoc[3].x;
_scumm->getFirstActor()->walkdata.point3y = _scumm->gateLoc[3].y; _vm->getFirstActor()->walkdata.point3y = _vm->gateLoc[3].y;
return; return;
} }
} }
if (calcMovementFactor(_scumm->gateLoc[3].x, _scumm->gateLoc[3].y)) if (calcMovementFactor(_vm->gateLoc[3].x, _vm->gateLoc[3].y))
return; return;
walkbox = walkdata.destbox; walkbox = walkdata.destbox;
mask = _scumm->getMaskFromBox(walkbox); mask = _vm->getMaskFromBox(walkbox);
goto restart; goto restart;
} }
@ -1373,7 +1372,7 @@ void Actor::walkActorOld()
} }
walkbox = walkdata.curbox; walkbox = walkdata.curbox;
mask = _scumm->getMaskFromBox(walkbox); mask = _vm->getMaskFromBox(walkbox);
moving &= MF_IN_LEG; moving &= MF_IN_LEG;
moving |= MF_NEW_LEG; moving |= MF_NEW_LEG;
goto restart; goto restart;

13
actor.h
View file

@ -29,6 +29,13 @@
class Scumm; class Scumm;
enum MoveFlags {
MF_NEW_LEG = 1,
MF_IN_LEG = 2,
MF_TURN = 4,
MF_LAST_LEG = 8
};
struct ActorWalkData { struct ActorWalkData {
int16 destx,desty; // Final destination int16 destx,desty; // Final destination
byte destbox; byte destbox;
@ -99,13 +106,13 @@ public:
byte palette[64]; byte palette[64];
protected: protected:
Scumm *_scumm; Scumm *_vm;
public: public:
// Constructor, sets all data to 0 // Constructor, sets all data to 0
Actor() { memset(this, 0, sizeof(Actor)); } Actor() { memset(this, 0, sizeof(Actor)); }
void initActorClass(Scumm *scumm) {_scumm = scumm;} void initActorClass(Scumm *scumm) {_vm = scumm;}
//protected: //protected:
void hideActor(); void hideActor();
void showActor(); void showActor();
@ -136,7 +143,7 @@ public:
void remapActor(int b, int c, int d, int e); void remapActor(int b, int c, int d, int e);
void walkActorOld(); void walkActorOld();
bool isInCurrentRoom() { return room == _scumm->_currentRoom; } bool isInCurrentRoom() { return room == _vm->_currentRoom; }
int getAnimVar(byte var) { return animVariable[var]; } int getAnimVar(byte var) { return animVariable[var]; }
void setAnimVar(byte var, int value) { animVariable[var] = value; } void setAnimVar(byte var, int value) { animVariable[var] = value; }

View file

@ -22,6 +22,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "scumm.h" #include "scumm.h"
#include "actor.h" #include "actor.h"
#include "akos.h"
bool Scumm::akos_hasManyDirections(Actor * a) bool Scumm::akos_hasManyDirections(Actor * a)
{ {
@ -155,8 +156,8 @@ void AkosRenderer::setPalette(byte *new_palette)
byte *the_akpl; byte *the_akpl;
uint size, i; uint size, i;
the_akpl = g_scumm->findResourceData(MKID('AKPL'), akos); the_akpl = _vm->findResourceData(MKID('AKPL'), akos);
size = g_scumm->getResourceDataSize(akpl); size = _vm->getResourceDataSize(akpl);
if (size > 256) if (size > 256)
error("akos_setPalette: %d is too many colors", size); error("akos_setPalette: %d is too many colors", size);
@ -168,21 +169,21 @@ void AkosRenderer::setPalette(byte *new_palette)
void AkosRenderer::setCostume(int costume) void AkosRenderer::setCostume(int costume)
{ {
akos = g_scumm->getResourceAddress(rtCostume, costume); akos = _vm->getResourceAddress(rtCostume, costume);
assert(akos); assert(akos);
akhd = (AkosHeader *) g_scumm->findResourceData(MKID('AKHD'), akos); akhd = (AkosHeader *) _vm->findResourceData(MKID('AKHD'), akos);
akof = (AkosOffset *) g_scumm->findResourceData(MKID('AKOF'), akos); akof = (AkosOffset *) _vm->findResourceData(MKID('AKOF'), akos);
akci = g_scumm->findResourceData(MKID('AKCI'), akos); akci = _vm->findResourceData(MKID('AKCI'), akos);
aksq = g_scumm->findResourceData(MKID('AKSQ'), akos); aksq = _vm->findResourceData(MKID('AKSQ'), akos);
akcd = g_scumm->findResourceData(MKID('AKCD'), akos); akcd = _vm->findResourceData(MKID('AKCD'), akos);
akpl = g_scumm->findResourceData(MKID('AKPL'), akos); akpl = _vm->findResourceData(MKID('AKPL'), akos);
codec = READ_LE_UINT16(&akhd->codec); codec = READ_LE_UINT16(&akhd->codec);
} }
void AkosRenderer::setFacing(Actor * a) void AkosRenderer::setFacing(Actor * a)
{ {
mirror = (g_scumm->newDirToOldDir(a->facing) != 0 || akhd->flags & 1); mirror = (_vm->newDirToOldDir(a->facing) != 0 || akhd->flags & 1);
if (a->flip) if (a->flip)
mirror ^= 1; mirror ^= 1;
} }
@ -584,14 +585,14 @@ void AkosRenderer::codec1()
if(g_scumm->isGlobInMemory(rtString,g_scumm->_vars[g_scumm->VAR_CUSTOMSCALETABLE])) { if(_vm->isGlobInMemory(rtString,_vm->_vars[_vm->VAR_CUSTOMSCALETABLE])) {
v1.scaletable = g_scumm->getStringAddressVar(g_scumm->VAR_CUSTOMSCALETABLE); v1.scaletable = _vm->getStringAddressVar(_vm->VAR_CUSTOMSCALETABLE);
} else { } else {
v1.scaletable = default_scale_table; v1.scaletable = default_scale_table;
} }
/* Setup color decoding variables */ /* Setup color decoding variables */
num_colors = g_scumm->getResourceDataSize(akpl); num_colors = _vm->getResourceDataSize(akpl);
if (num_colors == 32) { if (num_colors == 32) {
v1.mask = (1 << 3) - 1; v1.mask = (1 << 3) - 1;
v1.shl = 3; v1.shl = 3;
@ -757,7 +758,7 @@ void AkosRenderer::codec1()
if (v1.skip_width <= 0 || height <= 0) if (v1.skip_width <= 0 || height <= 0)
return; return;
g_scumm->updateDirtyRect(0, x_left, x_right, y_top, y_bottom, 1 << dirty_id); _vm->updateDirtyRect(0, x_left, x_right, y_top, y_bottom, 1 << dirty_id);
y_clipping = ((uint) y_bottom > outheight || y_top < 0); y_clipping = ((uint) y_bottom > outheight || y_top < 0);
@ -779,18 +780,18 @@ void AkosRenderer::codec1()
masking = false; masking = false;
if (clipping) { if (clipping) {
masking = g_scumm->isMaskActiveAt(x_left, y_top, x_right, y_bottom, masking = _vm->isMaskActiveAt(x_left, y_top, x_right, y_bottom,
g_scumm->getResourceAddress(rtBuffer, 9) + _vm->getResourceAddress(rtBuffer, 9) +
g_scumm->gdi._imgBufOffs[clipping] + _vm->gdi._imgBufOffs[clipping] +
g_scumm->_screenStartStrip) != 0; _vm->_screenStartStrip) != 0;
} }
v1.mask_ptr = NULL; v1.mask_ptr = NULL;
if (masking || charsetmask || shadow_mode) { if (masking || charsetmask || shadow_mode) {
v1.mask_ptr = v1.mask_ptr =
g_scumm->getResourceAddress(rtBuffer, 9) + cur_y * 40 + g_scumm->_screenStartStrip; _vm->getResourceAddress(rtBuffer, 9) + cur_y * 40 + _vm->_screenStartStrip;
v1.imgbufoffs = g_scumm->gdi._imgBufOffs[clipping]; v1.imgbufoffs = _vm->gdi._imgBufOffs[clipping];
if (!charsetmask && masking) { if (!charsetmask && masking) {
v1.mask_ptr += v1.imgbufoffs; v1.mask_ptr += v1.imgbufoffs;
v1.imgbufoffs = 0; v1.imgbufoffs = 0;
@ -904,7 +905,7 @@ void AkosRenderer::codec5()
int top; int top;
int bottom; int bottom;
vs = &g_scumm->virtscr[0]; vs = &_vm->virtscr[0];
//setBlastObjectMode(shadow_mode); // not implemented yet //setBlastObjectMode(shadow_mode); // not implemented yet
moveX=move_x_cur; moveX=move_x_cur;
moveY=move_y_cur; moveY=move_y_cur;
@ -930,7 +931,7 @@ void AkosRenderer::codec5()
draw_top = 0; draw_top = 0;
draw_bottom = 200; draw_bottom = 200;
g_scumm->updateDirtyRect(0, left, right+1, top, bottom+1, 1 << dirty_id); _vm->updateDirtyRect(0, left, right+1, top, bottom+1, 1 << dirty_id);
bdd.dataptr = srcptr; bdd.dataptr = srcptr;
bdd.out = vs->screenPtr; bdd.out = vs->screenPtr;
@ -943,7 +944,7 @@ void AkosRenderer::codec5()
bdd.x = left+1; bdd.x = left+1;
bdd.y = top; bdd.y = top;
g_scumm->drawBomp(&bdd,0,bdd.dataptr,0,0); _vm->drawBomp(&bdd,0,bdd.dataptr,0,0);
} }
void AkosRenderer::codec16() void AkosRenderer::codec16()

9
akos.h
View file

@ -104,8 +104,15 @@ struct AkosRenderer {
byte *akcd; byte *akcd;
byte palette[256]; byte palette[256];
protected:
Scumm *_vm;
public: public:
// Constructor, sets all data to 0
AkosRenderer(Scumm *scumm) { memset(this, 0, sizeof(AkosRenderer)); _vm = scumm; }
bool drawCostume(); bool drawCostume();
void setPalette(byte *palette); void setPalette(byte *palette);
void setCostume(int costume); void setCostume(int costume);

View file

@ -131,16 +131,16 @@ bool Scumm::checkXYInBoxBounds(int b, int x, int y)
return 1; return 1;
} }
if (!getSideOfLine(box.ul.x, box.ul.y, box.ur.x, box.ur.y, x, y, b)) if (!compareSlope(box.ul.x, box.ul.y, box.ur.x, box.ur.y, x, y))
return 0; return 0;
if (!getSideOfLine(box.ur.x, box.ur.y, box.ll.x, box.ll.y, x, y, b)) if (!compareSlope(box.ur.x, box.ur.y, box.ll.x, box.ll.y, x, y))
return 0; return 0;
if (!getSideOfLine(box.ll.x, box.ll.y, box.lr.x, box.lr.y, x, y, b)) if (!compareSlope(box.ll.x, box.ll.y, box.lr.x, box.lr.y, x, y))
return 0; return 0;
if (!getSideOfLine(box.lr.x, box.lr.y, box.ul.x, box.ul.y, x, y, b)) if (!compareSlope(box.lr.x, box.lr.y, box.ul.x, box.ul.y, x, y))
return 0; return 0;
return 1; return 1;
@ -187,12 +187,6 @@ uint Scumm::distanceFromPt(int x, int y, int ptx, int pty)
return diffx + diffy; return diffx + diffy;
} }
bool Scumm::getSideOfLine(int x1, int y1, int x2, int y2, int x, int y,
int box)
{
return (x - x1) * (y2 - y1) <= (y - y1) * (x2 - x1);
}
ScummPoint Scumm::closestPtOnLine(int ulx, int uly, int llx, int lly, int x, ScummPoint Scumm::closestPtOnLine(int ulx, int uly, int llx, int lly, int x,
int y) int y)
{ {
@ -885,10 +879,10 @@ int Scumm::findPathTowardsOld(Actor * a, byte trap1, byte trap2,
gateLoc[4].y = actor->walkdata.desty; gateLoc[4].y = actor->walkdata.desty;
if (getMaskFromBox(trap1) == getMaskFromBox(trap2) || 1) { if (getMaskFromBox(trap1) == getMaskFromBox(trap2) || 1) {
if (CompareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[4].x, gateLoc[4].y, gate1ax, gate1ay) != if (compareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[4].x, gateLoc[4].y, gate1ax, gate1ay) !=
CompareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[4].x, gateLoc[4].y, gate1bx, gate1by) && compareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[4].x, gateLoc[4].y, gate1bx, gate1by) &&
CompareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[4].x, gateLoc[4].y, gate2ax, gate2ay) != compareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[4].x, gateLoc[4].y, gate2ax, gate2ay) !=
CompareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[4].x, gateLoc[4].y, gate2bx, gate2by)) { compareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[4].x, gateLoc[4].y, gate2bx, gate2by)) {
return 0; /* same zplane and between both gates? */ return 0; /* same zplane and between both gates? */
} }
} }
@ -898,8 +892,8 @@ int Scumm::findPathTowardsOld(Actor * a, byte trap1, byte trap2,
gateLoc[3].x = pt.x; gateLoc[3].x = pt.x;
gateLoc[3].y = pt.y; gateLoc[3].y = pt.y;
if (CompareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[3].x, gateLoc[3].y, gate1ax, gate1ay) == if (compareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[3].x, gateLoc[3].y, gate1ax, gate1ay) ==
CompareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[3].x, gateLoc[3].y, gate1bx, gate1by)) { compareSlope(gateLoc[1].x, gateLoc[1].y, gateLoc[3].x, gateLoc[3].y, gate1bx, gate1by)) {
closestPtOnLine(gate1ax, gate1ay, gate1bx, gate1by, gateLoc[1].x, gateLoc[1].y); closestPtOnLine(gate1ax, gate1ay, gate1bx, gate1by, gateLoc[1].x, gateLoc[1].y);
gateLoc[2].x = pt.x; /* if point 2 between gates, ignore! */ gateLoc[2].x = pt.x; /* if point 2 between gates, ignore! */
gateLoc[2].y = pt.y; gateLoc[2].y = pt.y;
@ -1009,11 +1003,9 @@ void Scumm::GetGates(int trap1, int trap2)
} }
} }
int Scumm::CompareSlope(int X1, int Y1, int X2, int Y2, int X3, int Y3) bool Scumm::compareSlope(int X1, int Y1, int X2, int Y2, int X3, int Y3)
{ {
if ((Y2 - Y1) * (X3 - X1) > (Y3 - Y1) * (X2 - X1)) return (Y2 - Y1) * (X3 - X1) <= (Y3 - Y1) * (X2 - X1);
return (0);
return (1);
} }
void Scumm::SetGate(int line1, int line2, int polyx[8], int polyy[8]) void Scumm::SetGate(int line1, int line2, int polyx[8], int polyy[8])

View file

@ -1267,7 +1267,6 @@ void Gdi::unkDecode3()
} while (--_tempNumLines); } while (--_tempNumLines);
} }
void Gdi::unkDecode4() void Gdi::unkDecode4()
{ {
byte *src = _smap_ptr; byte *src = _smap_ptr;

View file

@ -907,7 +907,7 @@ void Scumm::animateActor(int act, int anim)
a->startAnimActor(a->standFrame); a->startAnimActor(a->standFrame);
break; break;
case 3: case 3:
a->moving &= ~4; a->moving &= ~MF_TURN;
a->setActorDirection(dir); a->setActorDirection(dir);
break; break;
case 4: case 4:
@ -933,7 +933,7 @@ void Scumm::animateActor(int act, int anim)
a->startAnimActor(a->standFrame); a->startAnimActor(a->standFrame);
break; break;
case 0x3E: case 0x3E:
a->moving &= ~4; a->moving &= ~MF_TURN;
a->setActorDirection(oldDirToNewDir(dir)); a->setActorDirection(oldDirToNewDir(dir));
break; break;
case 0x3D: case 0x3D:

11
scumm.h
View file

@ -276,13 +276,6 @@ enum {
RF_USAGE_MAX = RF_USAGE RF_USAGE_MAX = RF_USAGE
}; };
enum MoveFlags {
MF_NEW_LEG = 1,
MF_IN_LEG = 2,
MF_TURN = 4,
MF_LAST_LEG = 8
};
#define _maxRooms res.num[rtRoom] #define _maxRooms res.num[rtRoom]
#define _maxScripts res.num[rtScript] #define _maxScripts res.num[rtScript]
#define _maxCostumes res.num[rtCostume] #define _maxCostumes res.num[rtCostume]
@ -505,7 +498,6 @@ enum MouseButtonStatus {
#include "gfx.h" #include "gfx.h"
#include "boxes.h" #include "boxes.h"
#include "akos.h"
#include "smush.h" #include "smush.h"
class Scumm { class Scumm {
@ -1182,14 +1174,13 @@ public:
PathNode *unkMatrixProc2(PathVertex *vtx, int i); PathNode *unkMatrixProc2(PathVertex *vtx, int i);
bool areBoxesNeighbours(int i, int j); bool areBoxesNeighbours(int i, int j);
void addToBoxMatrix(byte b); void addToBoxMatrix(byte b);
int CompareSlope(int X1,int Y1,int X2,int Y2,int X3,int Y3); bool compareSlope(int X1,int Y1,int X2,int Y2,int X3,int Y3);
void SetGate(int line1,int line2, int polyx[8], int polyy[8]); void SetGate(int line1,int line2, int polyx[8], int polyy[8]);
void *addToBoxVertexHeap(int size); void *addToBoxVertexHeap(int size);
PathVertex *addPathVertex(); PathVertex *addPathVertex();
bool checkXYInBoxBounds(int box, int x, int y); bool checkXYInBoxBounds(int box, int x, int y);
uint distanceFromPt(int x, int y, int ptx, int pty); uint distanceFromPt(int x, int y, int ptx, int pty);
ScummPoint closestPtOnLine(int ulx, int uly, int llx, int lly, int x, int y); ScummPoint closestPtOnLine(int ulx, int uly, int llx, int lly, int x, int y);
bool getSideOfLine(int x1,int y1, int x2, int y2, int x, int y, int box);
void getBoxCoordinates(int boxnum, BoxCoords *bc); void getBoxCoordinates(int boxnum, BoxCoords *bc);
byte getMaskFromBox(int box); byte getMaskFromBox(int box);
Box *getBoxBaseAddr(int box); Box *getBoxBaseAddr(int box);