[Scummvm-cvs-logs] CVS: scummvm/scumm actor.cpp,1.328,1.329 akos.h,1.34,1.35 base-costume.cpp,2.26,2.27 base-costume.h,1.35,1.36 costume.cpp,1.170,1.171 costume.h,1.33,1.34 scumm.cpp,1.387,1.388 scumm.h,1.548,1.549

Max Horn fingolfin at users.sourceforge.net
Sat Mar 26 16:24:40 CET 2005


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13014

Modified Files:
	actor.cpp akos.h base-costume.cpp base-costume.h costume.cpp 
	costume.h scumm.cpp scumm.h 
Log Message:
Started to overhaul the costume infrastructure a bit, properly separating the NES costume code in the process (sorry if I broke stuff for the NES folks, but I figure it is better to get this done properly now before we have to untangle the mess later)

Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/actor.cpp,v
retrieving revision 1.328
retrieving revision 1.329
diff -u -d -r1.328 -r1.329
--- actor.cpp	25 Mar 2005 00:37:14 -0000	1.328
+++ actor.cpp	27 Mar 2005 00:23:37 -0000	1.329
@@ -1127,6 +1127,8 @@
 	_animProgress++;
 	if (_animProgress >= _animSpeed) {
 		_animProgress = 0;
+		
+		BaseCostume *cost = 0;
 
 		if (_vm->_features & GF_NEW_COSTUMES) {
 			byte *akos = _vm->getResourceAddress(rtCostume, _costume);
@@ -1135,12 +1137,16 @@
 				_needRedraw = true;
 			}
 		} else {
-			LoadedCostume lc(_vm);
-			lc.loadCostume(_costume);
-			if (lc.increaseAnims(this)) {
+			if (_vm->_features & GF_NES)
+				cost = new NESCostume(_vm);
+			else
+				cost = new ClassicCostume(_vm);
+			cost->loadCostume(_costume);
+			if (cost->increaseAnims(this)) {
 				_needRedraw = true;
 			}
 		}
+		delete cost;
 	}
 }
 

Index: akos.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/akos.h,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- akos.h	1 Jan 2005 16:09:13 -0000	1.34
+++ akos.h	27 Mar 2005 00:23:37 -0000	1.35
@@ -37,6 +37,14 @@
 struct AkosHeader;
 struct AkosOffset;
 
+/* TODO:
+class AkosCostume : public BaseCostume {
+public:
+	void loadCostume(int id);
+	byte increaseAnims(Actor *a);
+};
+*/
+
 class AkosRenderer : public BaseCostumeRenderer {
 protected:
 	uint16 codec;

Index: base-costume.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/base-costume.cpp,v
retrieving revision 2.26
retrieving revision 2.27
diff -u -d -r2.26 -r2.27
--- base-costume.cpp	15 Mar 2005 21:48:02 -0000	2.26
+++ base-costume.cpp	27 Mar 2005 00:23:37 -0000	2.27
@@ -90,6 +90,8 @@
 void ScummEngine::costumeDecodeData(Actor *a, int frame, uint usemask) {
 	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);
 }

Index: base-costume.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/base-costume.h,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -d -r1.35 -r1.36
--- base-costume.h	1 Jan 2005 16:09:13 -0000	1.35
+++ base-costume.h	27 Mar 2005 00:23:37 -0000	1.36
@@ -46,8 +46,17 @@
 class ScummEngine;
 struct VirtScreen;
 
+class BaseCostume {
+public:
+	virtual ~BaseCostume() {}
+	
+	virtual void loadCostume(int id) = 0;
+	virtual byte increaseAnims(Actor *a) = 0;
+};
+
+
 /**
- * Base class for both CostumeRenderer and AkosRenderer.
+ * Base class for both ClassicCostumeRenderer and AkosRenderer.
  */
 class BaseCostumeRenderer {
 public:
@@ -119,6 +128,7 @@
 		_skipLimbs = 0;
 		_paletteNum = 0;
 	}
+	virtual ~BaseCostumeRenderer() {}
 
 	virtual void setPalette(byte *palette) = 0;
 	virtual void setFacing(const Actor *a) = 0;

Index: costume.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/costume.cpp,v
retrieving revision 1.170
retrieving revision 1.171
diff -u -d -r1.170 -r1.171
--- costume.cpp	26 Mar 2005 23:40:01 -0000	1.170
+++ costume.cpp	27 Mar 2005 00:23:37 -0000	1.171
@@ -74,7 +74,7 @@
 };
 #endif
 
-byte CostumeRenderer::mainRoutine(int xmoveCur, int ymoveCur) {
+byte ClassicCostumeRenderer::mainRoutine(int xmoveCur, int ymoveCur) {
 	int i, skip = 0;
 	byte drawFlag = 1;
 	bool use_scaling;
@@ -330,7 +330,7 @@
 			dst[p + 1] = palette[pcolor]; \
 	}
 
-void CostumeRenderer::procC64(Codec1 &v1, int actor) {
+void ClassicCostumeRenderer::procC64(Codec1 &v1, int actor) {
 	const byte *mask, *src;
 	byte *dst;
 	byte len;
@@ -405,7 +405,7 @@
 #undef LINE
 #undef MASK_AT
 
-void CostumeRenderer::proc3(Codec1 &v1) {
+void ClassicCostumeRenderer::proc3(Codec1 &v1) {
 #ifdef __PALM_OS__
 	ARM_START(CostumeProc3Type)
 		ARM_INIT(SCUMM_PROC3)
@@ -501,7 +501,7 @@
 	} while (1);
 }
 
-void CostumeRenderer::proc3_ami(Codec1 &v1) {
+void ClassicCostumeRenderer::proc3_ami(Codec1 &v1) {
 	const byte *mask, *src;
 	byte *dst;
 	byte maskbit, len, height, width;
@@ -575,11 +575,14 @@
 /**
  * costume ID -> v1MMNESLookup[] -> desc -> lens & offs -> data -> Gfx & pal
  */
-void LoadedCostume::loadNEScostume(void) {
+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;
@@ -600,7 +603,7 @@
 	}
 }
 
-void LoadedCostume::loadCostume(int id) {
+void ClassicCostume::loadCostume(int id) {
 	_id = id;
 	byte *ptr = _vm->getResourceAddress(rtCostume, id);
 
@@ -615,10 +618,6 @@
 
 	_baseptr = ptr;
 
-	if (_vm->_features & GF_NES) {
-		loadNEScostume();
-		return;
-	}
 	_numAnim = ptr[6];
 	_format = ptr[7] & 0x7F;
 	_mirror = (ptr[7] & 0x80) != 0;
@@ -663,7 +662,7 @@
 	_animCmds = _baseptr + READ_LE_UINT16(ptr);
 }
 
-void CostumeRenderer::drawNESCostume(const Actor *a, int limb) {
+byte NESCostumeRenderer::drawLimb(const Actor *a, int limb) {
 	const byte darkpalette[16] = {0x00,0x00,0x2D,0x3D,0x00,0x00,0x2D,0x3D,0x00,0x00,0x2D,0x3D,0x00,0x00,0x2D,0x3D};
 	const byte *palette;
 	const byte *src;
@@ -675,6 +674,10 @@
 	byte *bgTransBuf = _vm->getMaskBuffer(0, 0, 0);
 	byte *gfxMaskBuf = _vm->getMaskBuffer(0, 0, 1);
 
+	// If the specified limb is stopped or not existing, do nothing.
+	if (cost.curpos[limb] == 0xFFFF || cost.stopped & (1 << limb))
+		return 0;
+
 	if (_vm->VAR(_vm->VAR_CURRENT_LIGHTS) & LIGHTMODE_actor_color)
 		palette = _vm->_NESPalette[1];
 	else
@@ -758,9 +761,11 @@
 	_draw_bottom = bottom;
 
 	_vm->markRectAsDirty(kMainVirtScreen, left, right, top, bottom, _actorID);
+
+	return 0;
 }
 
-byte CostumeRenderer::drawLimb(const Actor *a, int limb) {
+byte ClassicCostumeRenderer::drawLimb(const Actor *a, int limb) {
 	int i;
 	int code;
 	const byte *frameptr;
@@ -770,11 +775,6 @@
 	if (cost.curpos[limb] == 0xFFFF || cost.stopped & (1 << limb))
 		return 0;
 
-	if (_vm->_features & GF_NES) {
-		drawNESCostume(a, limb);
-		return 0;
-	}
-
 	// Determine the position the limb is at
 	i = cost.curpos[limb] & 0x7FFF;
 	
@@ -819,13 +819,43 @@
 
 }
 
+void NESCostumeRenderer::setPalette(byte *palette) {
+	// TODO
+}
+
+void NESCostumeRenderer::setFacing(const Actor *a) {
+	_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) {
 	const byte *r;
 	uint mask, j;
 	int i;
 	byte extra, cmd;
 	int anim;
-	LoadedCostume lc(this);
+	ClassicCostume lc(this);
 
 	lc.loadCostume(a->_costume);
 
@@ -835,14 +865,6 @@
 		return;
 	}
 
-	if (_features & GF_NES) {
-		a->_cost.curpos[0] = 0;
-		a->_cost.start[0] = 0;
-		a->_cost.end[0] = getResourceAddress(rtCostume, a->_costume)[2 + 8 * frame + 2 * newDirToOldDir(a->getFacing()) + 1];
-		a->_cost.frame[0] = frame;
-		return;
-	}
-
 	r = lc._baseptr + READ_LE_UINT16(lc._dataOffsets + anim * 2);
 
 	if (r == lc._baseptr) {
@@ -898,13 +920,11 @@
 	} while (mask&0xFFFF);
 }
 
-void CostumeRenderer::setPalette(byte *palette) {
+void ClassicCostumeRenderer::setPalette(byte *palette) {
 	int i;
 	byte color;
 
-	if (_vm->_features & GF_NES) {
-		// TODO
-	} else if (_loaded._format == 0x57) {
+	if (_loaded._format == 0x57) {
 		memcpy(_palette, palette, 13);
 	} else if (_vm->_features & GF_OLD_BUNDLE) {
 		if ((_vm->VAR(_vm->VAR_CURRENT_LIGHTS) & LIGHTMODE_actor_color)) {
@@ -929,15 +949,15 @@
 	}
 }
 
-void CostumeRenderer::setFacing(const Actor *a) {
+void ClassicCostumeRenderer::setFacing(const Actor *a) {
 	_mirror = newDirToOldDir(a->getFacing()) != 0 || _loaded._mirror;
 }
 
-void CostumeRenderer::setCostume(int costume) {
+void ClassicCostumeRenderer::setCostume(int costume) {
 	_loaded.loadCostume(costume);
 }
 
-byte LoadedCostume::increaseAnims(Actor *a) {
+byte ClassicCostume::increaseAnims(Actor *a) {
 	int i;
 	byte r = 0;
 
@@ -948,18 +968,18 @@
 	return r;
 }
 
-byte LoadedCostume::increaseAnim(Actor *a, int slot) {
+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) {
 	int highflag;
 	int i, end;
 	byte code, nc;
 
-	if (_vm->_features & GF_NES) {
-		a->_cost.curpos[slot]++;
-		if (a->_cost.curpos[slot] >= a->_cost.end[slot])
-			a->_cost.curpos[slot] = a->_cost.start[slot];
-		return 0;
-	}
-
 	if (a->_cost.curpos[slot] == 0xFFFF)
 		return 0;
 

Index: costume.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/costume.h,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- costume.h	14 Mar 2005 21:13:35 -0000	1.33
+++ costume.h	27 Mar 2005 00:23:38 -0000	1.34
@@ -25,7 +25,7 @@
 
 namespace Scumm {
 
-class LoadedCostume {
+class ClassicCostume : public BaseCostume {
 protected:
 	ScummEngine *_vm;
 
@@ -41,29 +41,36 @@
 	byte _format;
 	bool _mirror;
 
-	LoadedCostume(ScummEngine *vm) :
+	ClassicCostume(ScummEngine *vm) :
 		_vm(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);
 	byte increaseAnims(Actor *a);
-	void loadNEScostume(void);
 
 protected:
 	byte increaseAnim(Actor *a, int slot);
 };
 
+class NESCostume : public ClassicCostume {
+public:
+	NESCostume(ScummEngine *vm) : ClassicCostume(vm) {}
+	void loadCostume(int id);
+
+protected:
+	byte increaseAnim(Actor *a, int slot);
+};
 
-class CostumeRenderer : public BaseCostumeRenderer {
+class ClassicCostumeRenderer : public BaseCostumeRenderer {
 protected:
-	LoadedCostume _loaded;
+	ClassicCostume _loaded;
 	
 	byte _scaleIndexX;						/* must wrap at 256 */
 	byte _scaleIndexY;
 	byte _palette[32];
 
 public:
-	CostumeRenderer(ScummEngine *vm) : BaseCostumeRenderer(vm), _loaded(vm) {}
+	ClassicCostumeRenderer(ScummEngine *vm) : BaseCostumeRenderer(vm), _loaded(vm) {}
 
 	void setPalette(byte *palette);
 	void setFacing(const Actor *a);
@@ -71,7 +78,6 @@
 
 protected:
 	byte drawLimb(const Actor *a, int limb);
-	void drawNESCostume(const Actor *a, int limb);
 
 	void proc3(Codec1 &v1);
 	void proc3_ami(Codec1 &v1);
@@ -81,6 +87,21 @@
 	byte mainRoutine(int xmoveCur, int ymoveCur);
 };
 
+class NESCostumeRenderer : public BaseCostumeRenderer {
+protected:
+	NESCostume _loaded;
+
+public:
+	NESCostumeRenderer(ScummEngine *vm) : BaseCostumeRenderer(vm), _loaded(vm) {}
+
+	void setPalette(byte *palette);
+	void setFacing(const Actor *a);
+	void setCostume(int costume);
+
+protected:
+	byte drawLimb(const Actor *a, int limb);
+};
+
 } // End of namespace Scumm
 
 #endif

Index: scumm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.cpp,v
retrieving revision 1.387
retrieving revision 1.388
diff -u -d -r1.387 -r1.388
--- scumm.cpp	25 Mar 2005 17:55:53 -0000	1.387
+++ scumm.cpp	27 Mar 2005 00:23:38 -0000	1.388
@@ -1272,8 +1272,10 @@
 	// Create the costume renderer
 	if (_features & GF_NEW_COSTUMES)
 		_costumeRenderer = new AkosRenderer(this);
+	else if (_features & GF_NES)
+		_costumeRenderer = new NESCostumeRenderer(this);
 	else
-		_costumeRenderer = new CostumeRenderer(this);
+		_costumeRenderer = new ClassicCostumeRenderer(this);
 
 	// Create FT INSANE object
 	if (_gameId == GID_FT)

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.548
retrieving revision 1.549
diff -u -d -r1.548 -r1.549
--- scumm.h	25 Mar 2005 01:52:20 -0000	1.548
+++ scumm.h	27 Mar 2005 00:23:38 -0000	1.549
@@ -848,8 +848,11 @@
 	void costumeDecodeData(Actor *a, int frame, uint usemask);
 	bool isCostumeInUse(int i) const;
 
-	// Costume class
+	// 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





More information about the Scummvm-git-logs mailing list