From abcf7bf2de88c3926843fa3fd613e50f5ea63cd5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 27 Mar 2005 01:07:22 +0000 Subject: Tie the AKOS code into the new costume infrastructure, too svn-id: r17259 --- scumm/actor.cpp | 33 ++++++++++----------------------- scumm/akos.cpp | 42 +++++++++++++++++++++++------------------- scumm/akos.h | 14 +++++++++++--- scumm/base-costume.cpp | 14 -------------- scumm/scumm.cpp | 12 +++++++++--- scumm/scumm.h | 7 +++---- 6 files changed, 56 insertions(+), 66 deletions(-) (limited to 'scumm') 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? */ -- cgit v1.2.3