diff options
| author | Max Horn | 2005-03-27 00:42:53 +0000 | 
|---|---|---|
| committer | Max Horn | 2005-03-27 00:42:53 +0000 | 
| commit | 5bd26a52df502391714b539df30eb76e50c72cf7 (patch) | |
| tree | 68c28db4f1cca6b0c21902424915e17388ed9351 /scumm | |
| parent | 446be21239727bcea559e201b77a48860fd5a34f (diff) | |
| download | scummvm-rg350-5bd26a52df502391714b539df30eb76e50c72cf7.tar.gz scummvm-rg350-5bd26a52df502391714b539df30eb76e50c72cf7.tar.bz2 scummvm-rg350-5bd26a52df502391714b539df30eb76e50c72cf7.zip  | |
More costume code restructuring
svn-id: r17258
Diffstat (limited to 'scumm')
| -rw-r--r-- | scumm/actor.cpp | 6 | ||||
| -rw-r--r-- | scumm/akos.h | 7 | ||||
| -rw-r--r-- | scumm/base-costume.cpp | 14 | ||||
| -rw-r--r-- | scumm/base-costume.h | 9 | ||||
| -rw-r--r-- | scumm/costume.cpp | 164 | ||||
| -rw-r--r-- | scumm/costume.h | 26 | ||||
| -rw-r--r-- | scumm/scumm.h | 7 | 
7 files changed, 129 insertions, 104 deletions
diff --git a/scumm/actor.cpp b/scumm/actor.cpp index ee881d81c7..4178d629b8 100644 --- a/scumm/actor.cpp +++ b/scumm/actor.cpp @@ -1128,7 +1128,7 @@ void Actor::animateCostume() {  	if (_animProgress >= _animSpeed) {  		_animProgress = 0; -		BaseCostume *cost = 0; +		BaseCostumeLoader *cost = 0;  		if (_vm->_features & GF_NEW_COSTUMES) {  			byte *akos = _vm->getResourceAddress(rtCostume, _costume); @@ -1138,9 +1138,9 @@ void Actor::animateCostume() {  			}  		} else {  			if (_vm->_features & GF_NES) -				cost = new NESCostume(_vm); +				cost = new NESCostumeLoader(_vm);  			else -				cost = new ClassicCostume(_vm); +				cost = new ClassicCostumeLoader(_vm);  			cost->loadCostume(_costume);  			if (cost->increaseAnims(this)) {  				_needRedraw = true; diff --git a/scumm/akos.h b/scumm/akos.h index f359c94e98..1055f9ab88 100644 --- a/scumm/akos.h +++ b/scumm/akos.h @@ -38,10 +38,15 @@ struct AkosHeader;  struct AkosOffset;  /* TODO: -class AkosCostume : public BaseCostume { +class AkosCostumeLoader : public BaseCostumeLoader {  public: +	AkosCostumeLoader(ScummEngine *vm); +  	void loadCostume(int id);  	byte increaseAnims(Actor *a); +	void costumeDecodeData(Actor *a, int frame, uint usemask); +	 +	//void animateLimb(int limb, int f);  };  */ diff --git a/scumm/base-costume.cpp b/scumm/base-costume.cpp index b8609aaf49..c1402f922e 100644 --- a/scumm/base-costume.cpp +++ b/scumm/base-costume.cpp @@ -22,6 +22,7 @@  #include "stdafx.h"  #include "scumm/base-costume.h" +#include "scumm/costume.h"  namespace Scumm { @@ -88,12 +89,17 @@ bool ScummEngine::isCostumeInUse(int cost) const {  }  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) -		NES_cost_decodeData(a, frame, usemask); -	else -		cost_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/base-costume.h b/scumm/base-costume.h index 04798c54a8..b54a3f84de 100644 --- a/scumm/base-costume.h +++ b/scumm/base-costume.h @@ -46,12 +46,17 @@ class Actor;  class ScummEngine;  struct VirtScreen; -class BaseCostume { +class BaseCostumeLoader { +protected: +	ScummEngine *_vm; +  public: -	virtual ~BaseCostume() {} +	BaseCostumeLoader(ScummEngine *vm) : _vm(vm) {} +	virtual ~BaseCostumeLoader() {}  	virtual void loadCostume(int id) = 0;  	virtual byte increaseAnims(Actor *a) = 0; +	virtual void costumeDecodeData(Actor *a, int frame, uint usemask) = 0;  }; diff --git a/scumm/costume.cpp b/scumm/costume.cpp index 2ace1dbdfa..40369e9d85 100644 --- a/scumm/costume.cpp +++ b/scumm/costume.cpp @@ -74,6 +74,15 @@ const byte cost_scaleTable[256] = {  };  #endif +static const int v1MMNESLookup[25] = { +	0x00, 0x03, 0x01, 0x06, 0x08, +	0x02, 0x00, 0x07, 0x0C, 0x04, +	0x09, 0x0A, 0x12, 0x0B, 0x14, +	0x0D, 0x11, 0x0F, 0x0E, 0x10, +	0x17, 0x00, 0x01, 0x05, 0x16  +}; + +  byte ClassicCostumeRenderer::mainRoutine(int xmoveCur, int ymoveCur) {  	int i, skip = 0;  	byte drawFlag = 1; @@ -564,46 +573,7 @@ void ClassicCostumeRenderer::proc3_ami(Codec1 &v1) {  	} while (1);  } -static const int v1MMNESLookup[25] = { -	0x00, 0x03, 0x01, 0x06, 0x08, -	0x02, 0x00, 0x07, 0x0C, 0x04, -	0x09, 0x0A, 0x12, 0x0B, 0x14, -	0x0D, 0x11, 0x0F, 0x0E, 0x10, -	0x17, 0x00, 0x01, 0x05, 0x16  -}; - -/** - * costume ID -> v1MMNESLookup[] -> desc -> lens & offs -> data -> Gfx & pal - */ -void NESCostume::loadCostume(int id) { -	const byte *src; -	int frameset, framenum; -	int offset; - -	_id = id; -	_baseptr = _vm->getResourceAddress(rtCostume, id); - -	_format = 0x01; -	_mirror = 0; -	_dataOffsets = _baseptr + 4; - -	frameset = 0; -	framenum = 0; - -	src = _dataOffsets; -	// Cost(a) -	offset = src[(frameset * 4 + framenum) * 2]; - -	// Lookup & desc -	offset = READ_LE_UINT16(_vm->_NEScostdesc + v1MMNESLookup[_id] * 2); -	if (v1MMNESLookup[_id] * 2 + 2 < READ_LE_UINT16(_vm->_NEScostdesc - 2)) { -		_numAnim = (READ_LE_UINT16(_vm->_NEScostdesc + v1MMNESLookup[_id] * 2 + 2) - offset); -	} else { -		_numAnim = ((READ_LE_UINT16(_vm->_NEScostlens - 2) - 2) - offset); -	} -} - -void ClassicCostume::loadCostume(int id) { +void ClassicCostumeLoader::loadCostume(int id) {  	_id = id;  	byte *ptr = _vm->getResourceAddress(rtCostume, id); @@ -824,54 +794,36 @@ void NESCostumeRenderer::setPalette(byte *palette) {  }  void NESCostumeRenderer::setFacing(const Actor *a) { -	_mirror = newDirToOldDir(a->getFacing()) != 0 || _loaded._mirror; +	// TODO +	//_mirror = newDirToOldDir(a->getFacing()) != 0 || _loaded._mirror;  }  void NESCostumeRenderer::setCostume(int costume) {  	_loaded.loadCostume(costume);  } -void ScummEngine::NES_cost_decodeData(Actor *a, int frame, uint usemask) { -	int anim; -	NESCostume lc(this); - -	lc.loadCostume(a->_costume); - -	anim = newDirToOldDir(a->getFacing()) + frame * 4; - -	if (anim > lc._numAnim) { -		return; -	} - -	a->_cost.curpos[0] = 0; -	a->_cost.start[0] = 0; -	a->_cost.end[0] = lc._baseptr[2 + 8 * frame + 2 * newDirToOldDir(a->getFacing()) + 1]; -	a->_cost.frame[0] = frame; -} - -void ScummEngine::cost_decodeData(Actor *a, int frame, uint usemask) { +void ClassicCostumeLoader::costumeDecodeData(Actor *a, int frame, uint usemask) {  	const byte *r;  	uint mask, j;  	int i;  	byte extra, cmd;  	int anim; -	ClassicCostume lc(this); -	lc.loadCostume(a->_costume); +	loadCostume(a->_costume);  	anim = newDirToOldDir(a->getFacing()) + frame * 4; -	if (anim > lc._numAnim) { +	if (anim > _numAnim) {  		return;  	} -	r = lc._baseptr + READ_LE_UINT16(lc._dataOffsets + anim * 2); +	r = _baseptr + READ_LE_UINT16(_dataOffsets + anim * 2); -	if (r == lc._baseptr) { +	if (r == _baseptr) {  		return;  	} -	if (_version == 1) { +	if (_vm->_version == 1) {  		mask = *r++ << 8;  	} else {  		mask = READ_LE_UINT16(r); @@ -880,7 +832,7 @@ void ScummEngine::cost_decodeData(Actor *a, int frame, uint usemask) {  	i = 0;  	do {  		if (mask & 0x8000) { -			if (_version <= 3) { +			if (_vm->_version <= 3) {  				j = *r++;  				if (j == 0xFF) @@ -896,7 +848,7 @@ void ScummEngine::cost_decodeData(Actor *a, int frame, uint usemask) {  					a->_cost.frame[i] = frame;  				} else {  					extra = *r++; -					cmd = lc._animCmds[j]; +					cmd = _animCmds[j];  					if (cmd == 0x7A) {  						a->_cost.stopped &= ~(1 << i);  					} else if (cmd == 0x79) { @@ -957,7 +909,7 @@ void ClassicCostumeRenderer::setCostume(int costume) {  	_loaded.loadCostume(costume);  } -byte ClassicCostume::increaseAnims(Actor *a) { +byte ClassicCostumeLoader::increaseAnims(Actor *a) {  	int i;  	byte r = 0; @@ -968,14 +920,7 @@ byte ClassicCostume::increaseAnims(Actor *a) {  	return r;  } -byte NESCostume::increaseAnim(Actor *a, int slot) { -	a->_cost.curpos[slot]++; -	if (a->_cost.curpos[slot] >= a->_cost.end[slot]) -		a->_cost.curpos[slot] = a->_cost.start[slot]; -	return 0; -} - -byte ClassicCostume::increaseAnim(Actor *a, int slot) { +byte ClassicCostumeLoader::increaseAnim(Actor *a, int slot) {  	int highflag;  	int i, end;  	byte code, nc; @@ -1029,6 +974,71 @@ byte ClassicCostume::increaseAnim(Actor *a, int slot) {  	} while (1);  } +/** + * costume ID -> v1MMNESLookup[] -> desc -> lens & offs -> data -> Gfx & pal + */ +void NESCostumeLoader::loadCostume(int id) { +	const byte *src; +	int frameset, framenum; +	int offset; + +	_id = id; +	_baseptr = _vm->getResourceAddress(rtCostume, id); + +	_dataOffsets = _baseptr + 4; + +	frameset = 0; +	framenum = 0; + +	src = _dataOffsets; +	// Cost(a) +	offset = src[(frameset * 4 + framenum) * 2]; + +	// Lookup & desc +	offset = READ_LE_UINT16(_vm->_NEScostdesc + v1MMNESLookup[_id] * 2); +	if (v1MMNESLookup[_id] * 2 + 2 < READ_LE_UINT16(_vm->_NEScostdesc - 2)) { +		_numAnim = (READ_LE_UINT16(_vm->_NEScostdesc + v1MMNESLookup[_id] * 2 + 2) - offset); +	} else { +		_numAnim = ((READ_LE_UINT16(_vm->_NEScostlens - 2) - 2) - offset); +	} +} + +void NESCostumeLoader::costumeDecodeData(Actor *a, int frame, uint usemask) { +	int anim; + +	loadCostume(a->_costume); + +	anim = newDirToOldDir(a->getFacing()) + frame * 4; + +	if (anim > _numAnim) { +		return; +	} + +	a->_cost.curpos[0] = 0; +	a->_cost.start[0] = 0; +	a->_cost.end[0] = _baseptr[2 + 8 * frame + 2 * newDirToOldDir(a->getFacing()) + 1]; +	a->_cost.frame[0] = frame; +} + +byte NESCostumeLoader::increaseAnims(Actor *a) { +	int i; +	byte r = 0; + +	for (i = 0; i != 16; i++) { +		if (a->_cost.curpos[i] != 0xFFFF) +			r += increaseAnim(a, i); +	} +	return r; +} + +byte NESCostumeLoader::increaseAnim(Actor *a, int slot) { +	a->_cost.curpos[slot]++; +	if (a->_cost.curpos[slot] >= a->_cost.end[slot]) +		a->_cost.curpos[slot] = a->_cost.start[slot]; +	return 0; +} + +  } // End of namespace Scumm  #ifdef __PALM_OS__ diff --git a/scumm/costume.h b/scumm/costume.h index fb311608a4..9cca20eaea 100644 --- a/scumm/costume.h +++ b/scumm/costume.h @@ -25,10 +25,7 @@  namespace Scumm { -class ClassicCostume : public BaseCostume { -protected: -	ScummEngine *_vm; - +class ClassicCostumeLoader : public BaseCostumeLoader {  public:  	int _id;  	const byte *_baseptr; @@ -41,21 +38,30 @@ public:  	byte _format;  	bool _mirror; -	ClassicCostume(ScummEngine *vm) : -		_vm(vm), _id(-1), _baseptr(0), _animCmds(0), _dataOffsets(0), _palette(0), +	ClassicCostumeLoader(ScummEngine *vm) : +		BaseCostumeLoader(vm), +		_id(-1), _baseptr(0), _animCmds(0), _dataOffsets(0), _palette(0),  		_frameOffsets(0), _numColors(0), _numAnim(0), _format(0), _mirror(false) {}  	void loadCostume(int id); +	void costumeDecodeData(Actor *a, int frame, uint usemask);  	byte increaseAnims(Actor *a);  protected:  	byte increaseAnim(Actor *a, int slot);  }; -class NESCostume : public ClassicCostume { +class NESCostumeLoader : public BaseCostumeLoader {  public: -	NESCostume(ScummEngine *vm) : ClassicCostume(vm) {} +	int _id; +	const byte *_baseptr; +	const byte *_dataOffsets; +	byte _numAnim; + +	NESCostumeLoader(ScummEngine *vm) : BaseCostumeLoader(vm) {}  	void loadCostume(int id); +	void costumeDecodeData(Actor *a, int frame, uint usemask); +	byte increaseAnims(Actor *a);  protected:  	byte increaseAnim(Actor *a, int slot); @@ -63,7 +69,7 @@ protected:  class ClassicCostumeRenderer : public BaseCostumeRenderer {  protected: -	ClassicCostume _loaded; +	ClassicCostumeLoader _loaded;  	byte _scaleIndexX;						/* must wrap at 256 */  	byte _scaleIndexY; @@ -89,7 +95,7 @@ protected:  class NESCostumeRenderer : public BaseCostumeRenderer {  protected: -	NESCostume _loaded; +	NESCostumeLoader _loaded;  public:  	NESCostumeRenderer(ScummEngine *vm) : BaseCostumeRenderer(vm), _loaded(vm) {} diff --git a/scumm/scumm.h b/scumm/scumm.h index 485619588e..31006b61a8 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -848,13 +848,6 @@ public:  	void costumeDecodeData(Actor *a, int frame, uint usemask);  	bool isCostumeInUse(int i) const; -	// Classic costume class -	void cost_decodeData(Actor *a, int frame, uint usemask); - -	// NEWS costume class -	void NES_cost_decodeData(Actor *a, int frame, uint usemask); -	void cost_decodeNESCostumeGfx(); -  	// Akos Class  	struct {  		int16 cmd;  | 
