aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
authorMax Horn2005-03-27 01:07:22 +0000
committerMax Horn2005-03-27 01:07:22 +0000
commitabcf7bf2de88c3926843fa3fd613e50f5ea63cd5 (patch)
treeac27f9a9639270ceff80adb478f19fba339ea9bc /scumm
parent5bd26a52df502391714b539df30eb76e50c72cf7 (diff)
downloadscummvm-rg350-abcf7bf2de88c3926843fa3fd613e50f5ea63cd5.tar.gz
scummvm-rg350-abcf7bf2de88c3926843fa3fd613e50f5ea63cd5.tar.bz2
scummvm-rg350-abcf7bf2de88c3926843fa3fd613e50f5ea63cd5.zip
Tie the AKOS code into the new costume infrastructure, too
svn-id: r17259
Diffstat (limited to 'scumm')
-rw-r--r--scumm/actor.cpp33
-rw-r--r--scumm/akos.cpp42
-rw-r--r--scumm/akos.h14
-rw-r--r--scumm/base-costume.cpp14
-rw-r--r--scumm/scumm.cpp12
-rw-r--r--scumm/scumm.h7
6 files changed, 56 insertions, 66 deletions
diff --git a/scumm/actor.cpp b/scumm/actor.cpp
index 4178d629b8..cf1691279c 100644
--- a/scumm/actor.cpp
+++ b/scumm/actor.cpp
@@ -320,14 +320,16 @@ int Actor::remapDirection(int dir, bool is_walking) {
int Actor::updateActorDirection(bool is_walking) {
int from;
- int dirType;
+ bool dirType = false;
int dir;
bool shouldInterpolate;
if ((_vm->_version == 6) && _ignoreTurns)
return _facing;
- dirType = (_vm->_version >= 7) ? _vm->akos_hasManyDirections(_costume) : false;
+ if (_vm->_version >= 7) {
+ dirType = ((AkosCostumeLoader *)_vm->_costumeLoader)->hasManyDirections(_costume);
+ }
from = toSimpleDir(dirType, _facing);
dir = remapDirection(_targetFacing, is_walking);
@@ -467,7 +469,7 @@ void Actor::startAnimActor(int f) {
_needRedraw = true;
if (f == _initFrame)
_cost.reset();
- _vm->costumeDecodeData(this, f, (uint) - 1);
+ _vm->_costumeLoader->costumeDecodeData(this, f, (uint) - 1);
_frame = f;
}
} else {
@@ -501,7 +503,7 @@ void Actor::startAnimActor(int f) {
_cost.reset();
_auxBlock.visible = false;
}
- _vm->costumeDecodeData(this, f, (uint) - 1);
+ _vm->_costumeLoader->costumeDecodeData(this, f, (uint) - 1);
_frame = f;
}
}
@@ -570,7 +572,7 @@ void Actor::setDirection(int direction) {
vald = _cost.frame[i];
if (vald == 0xFFFF)
continue;
- _vm->costumeDecodeData(this, vald, (_vm->_version <= 2) ? 0xFFFF : aMask);
+ _vm->_costumeLoader->costumeDecodeData(this, vald, (_vm->_version <= 2) ? 0xFFFF : aMask);
}
_needRedraw = true;
@@ -1128,25 +1130,10 @@ void Actor::animateCostume() {
if (_animProgress >= _animSpeed) {
_animProgress = 0;
- BaseCostumeLoader *cost = 0;
-
- if (_vm->_features & GF_NEW_COSTUMES) {
- byte *akos = _vm->getResourceAddress(rtCostume, _costume);
- assert(akos);
- if (_vm->akos_increaseAnims(akos, this)) {
- _needRedraw = true;
- }
- } else {
- if (_vm->_features & GF_NES)
- cost = new NESCostumeLoader(_vm);
- else
- cost = new ClassicCostumeLoader(_vm);
- cost->loadCostume(_costume);
- if (cost->increaseAnims(this)) {
- _needRedraw = true;
- }
+ _vm->_costumeLoader->loadCostume(_costume);
+ if (_vm->_costumeLoader->increaseAnims(this)) {
+ _needRedraw = true;
}
- delete cost;
}
}
diff --git a/scumm/akos.cpp b/scumm/akos.cpp
index 28ef532c93..920141d4af 100644
--- a/scumm/akos.cpp
+++ b/scumm/akos.cpp
@@ -137,20 +137,21 @@ static bool akos_compare(int a, int b, byte cmd) {
}
}
-bool ScummEngine::akos_hasManyDirections(int costume) {
- byte *akos;
- const AkosHeader *akhd;
+void AkosCostumeLoader::loadCostume(int id) {
+ _akos = _vm->getResourceAddress(rtCostume, id);
+ assert(_akos);
+}
- akos = getResourceAddress(rtCostume, costume);
- assert(akos);
+bool AkosCostumeLoader::hasManyDirections() {
+ const AkosHeader *akhd;
- akhd = (const AkosHeader *)findResourceData(MKID('AKHD'), akos);
+ akhd = (const AkosHeader *)_vm->findResourceData(MKID('AKHD'), _akos);
return (akhd->flags & 2) != 0;
}
-void ScummEngine::akos_decodeData(Actor *a, int frame, uint usemask) {
+void AkosCostumeLoader::costumeDecodeData(Actor *a, int frame, uint usemask) {
uint anim;
- const byte *akos, *r;
+ const byte *r;
const AkosHeader *akhd;
uint offs;
int i;
@@ -161,20 +162,19 @@ void ScummEngine::akos_decodeData(Actor *a, int frame, uint usemask) {
if (a->_costume == 0)
return;
- if (_version >= 7 && akos_hasManyDirections(a->_costume))
+ loadCostume(a->_costume);
+
+ if (_vm->_version >= 7 && hasManyDirections())
anim = toSimpleDir(1, a->getFacing()) + frame * 8;
else
anim = newDirToOldDir(a->getFacing()) + frame * 4;
- akos = getResourceAddress(rtCostume, a->_costume);
- assert(akos);
-
- akhd = (const AkosHeader *)findResourceData(MKID('AKHD'), akos);
+ akhd = (const AkosHeader *)_vm->findResourceData(MKID('AKHD'), _akos);
if (anim >= READ_LE_UINT16(&akhd->num_anims))
return;
- r = findResourceData(MKID('AKCH'), akos);
+ r = _vm->findResourceData(MKID('AKCH'), _akos);
assert(r);
offs = READ_LE_UINT16(r + anim * sizeof(uint16));
@@ -182,8 +182,8 @@ void ScummEngine::akos_decodeData(Actor *a, int frame, uint usemask) {
return;
r += offs;
- const uint8 *akst = findResourceData(MKID('AKST'), akos);
- const uint8 *aksf = findResourceData(MKID('AKSF'), akos);
+ const uint8 *akst = _vm->findResourceData(MKID('AKST'), _akos);
+ const uint8 *aksf = _vm->findResourceData(MKID('AKSF'), _akos);
i = 0;
mask = READ_LE_UINT16(r); r += 2;
@@ -201,7 +201,7 @@ void ScummEngine::akos_decodeData(Actor *a, int frame, uint usemask) {
a->_cost.seq3[i] = 0;
if (akst) {
- int size = getResourceDataSize(akst) / 8;
+ int size = _vm->getResourceDataSize(akst) / 8;
if (size > 0) {
bool found = false;
while (size--) {
@@ -231,7 +231,7 @@ void ScummEngine::akos_decodeData(Actor *a, int frame, uint usemask) {
a->_cost.seq1[i] = 0;
a->_cost.seq2[i] = 0;
if (aksf) {
- int size = getResourceDataSize(aksf) / 6;
+ int size = _vm->getResourceDataSize(aksf) / 6;
if (size > 0) {
bool found = false;
while (size--) {
@@ -256,7 +256,7 @@ void ScummEngine::akos_decodeData(Actor *a, int frame, uint usemask) {
a->_cost.curpos[i] = start;
a->_cost.seq3[i] = 0;
if (akst) {
- int size = getResourceDataSize(akst) / 8;
+ int size = _vm->getResourceDataSize(akst) / 8;
if (size > 0) {
bool found = false;
while (size--) {
@@ -1239,6 +1239,10 @@ byte AkosRenderer::codec32(int xmoveCur, int ymoveCur) {
return 0;
}
+byte AkosCostumeLoader::increaseAnims(Actor *a) {
+ return _vm->akos_increaseAnims(_akos, a);
+}
+
bool ScummEngine::akos_increaseAnims(const byte *akos, Actor *a) {
const byte *aksq, *akfo;
int i;
diff --git a/scumm/akos.h b/scumm/akos.h
index 1055f9ab88..bbd1f41f60 100644
--- a/scumm/akos.h
+++ b/scumm/akos.h
@@ -37,18 +37,26 @@ struct CostumeData;
struct AkosHeader;
struct AkosOffset;
-/* TODO:
class AkosCostumeLoader : public BaseCostumeLoader {
+protected:
+ const byte *_akos;
+
public:
- AkosCostumeLoader(ScummEngine *vm);
+ AkosCostumeLoader(ScummEngine *vm) : BaseCostumeLoader(vm) {}
void loadCostume(int id);
byte increaseAnims(Actor *a);
void costumeDecodeData(Actor *a, int frame, uint usemask);
//void animateLimb(int limb, int f);
+ bool hasManyDirections(int id) {
+ loadCostume(id);
+ return hasManyDirections();
+ }
+
+protected:
+ bool hasManyDirections();
};
-*/
class AkosRenderer : public BaseCostumeRenderer {
protected:
diff --git a/scumm/base-costume.cpp b/scumm/base-costume.cpp
index c1402f922e..89df0607a3 100644
--- a/scumm/base-costume.cpp
+++ b/scumm/base-costume.cpp
@@ -88,18 +88,4 @@ bool ScummEngine::isCostumeInUse(int cost) const {
return false;
}
-void ScummEngine::costumeDecodeData(Actor *a, int frame, uint usemask) {
- // TODO: This should eventually become a method of the appropriate
- // BaseCostumeLoader subclasses.
- if (_features & GF_NEW_COSTUMES)
- akos_decodeData(a, frame, usemask);
- else if (_features & GF_NES) {
- NESCostumeLoader lc(this);
- lc.costumeDecodeData(a, frame, usemask);
- } else {
- ClassicCostumeLoader lc(this);
- lc.costumeDecodeData(a, frame, usemask);
- }
-}
-
} // End of namespace Scumm
diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp
index 8fe5f0080e..a96bd09de2 100644
--- a/scumm/scumm.cpp
+++ b/scumm/scumm.cpp
@@ -857,6 +857,7 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS
_existLanguageFile = false;
_languageBuffer = NULL;
_languageIndex = NULL;
+ _costumeLoader = NULL;
_costumeRenderer = NULL;
_2byteFontPtr = 0;
_V1TalkingActor = 0;
@@ -1154,6 +1155,7 @@ ScummEngine::~ScummEngine() {
free(_languageBuffer);
free(_audioNames);
+ delete _costumeLoader;
delete _costumeRenderer;
free(_shadowPalette);
@@ -1270,12 +1272,16 @@ int ScummEngine::init(GameDetector &detector) {
_charset = new CharsetRendererClassic(this);
// Create the costume renderer
- if (_features & GF_NEW_COSTUMES)
+ if (_features & GF_NEW_COSTUMES) {
_costumeRenderer = new AkosRenderer(this);
- else if (_features & GF_NES)
+ _costumeLoader = new AkosCostumeLoader(this);
+ } else if (_features & GF_NES) {
_costumeRenderer = new NESCostumeRenderer(this);
- else
+ _costumeLoader = new NESCostumeLoader(this);
+ } else {
_costumeRenderer = new ClassicCostumeRenderer(this);
+ _costumeLoader = new ClassicCostumeLoader(this);
+ }
// Create FT INSANE object
if (_gameId == GID_FT)
diff --git a/scumm/scumm.h b/scumm/scumm.h
index 31006b61a8..eed39e4b91 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -43,6 +43,7 @@ class GameDetector;
namespace Scumm {
class Actor;
+class BaseCostumeLoader;
class BaseCostumeRenderer;
class CharsetRenderer;
class IMuse;
@@ -470,7 +471,8 @@ public:
int _numCostumes; // FIXME - should be protected, used by Actor::remapActorPalette
int _numCharsets; // FIXME - should be protected, used by CharsetRenderer
- BaseCostumeRenderer* _costumeRenderer;
+ BaseCostumeLoader *_costumeLoader;
+ BaseCostumeRenderer *_costumeRenderer;
int _NESCostumeSet;
void NES_loadCostumeSet(int n);
@@ -845,7 +847,6 @@ public:
void setTalkingActor(int variable);
// Generic costume code
- void costumeDecodeData(Actor *a, int frame, uint usemask);
bool isCostumeInUse(int i) const;
// Akos Class
@@ -863,8 +864,6 @@ public:
bool akos_increaseAnim(Actor *a, int i, const byte *aksq, const uint16 *akfo, int numakfo);
void akos_queCommand(byte cmd, Actor *a, int param_1, int param_2);
void akos_processQueue();
- void akos_decodeData(Actor *a, int frame, uint usemask);
- bool akos_hasManyDirections(int costume);
protected:
/* Should be in Graphics class? */