[Scummvm-cvs-logs] SF.net SVN: scummvm:[49057] scummvm/trunk/engines/m4

dreammaster at users.sourceforge.net dreammaster at users.sourceforge.net
Mon May 17 12:30:19 CEST 2010


Revision: 49057
          http://scummvm.svn.sourceforge.net/scummvm/?rev=49057&view=rev
Author:   dreammaster
Date:     2010-05-17 10:30:17 +0000 (Mon, 17 May 2010)

Log Message:
-----------
Bugfixes for animation display, and better understanding of how animations cycle

Modified Paths:
--------------
    scummvm/trunk/engines/m4/m4.cpp
    scummvm/trunk/engines/m4/mads_logic.cpp
    scummvm/trunk/engines/m4/mads_logic.h
    scummvm/trunk/engines/m4/mads_views.cpp
    scummvm/trunk/engines/m4/mads_views.h

Modified: scummvm/trunk/engines/m4/m4.cpp
===================================================================
--- scummvm/trunk/engines/m4/m4.cpp	2010-05-17 09:32:16 UTC (rev 49056)
+++ scummvm/trunk/engines/m4/m4.cpp	2010-05-17 10:30:17 UTC (rev 49057)
@@ -583,13 +583,15 @@
 
 		_animation->updateAnim();
 
-		// Call the updateState method of all views
-		_viewManager->updateState();
-
 		if (g_system->getMillis() >= nextFrame) {
-			_viewManager->refreshAll();
 			nextFrame = g_system->getMillis() + GAME_FRAME_DELAY;
 			++_currentTimer;
+
+			// Call the updateState method of all views
+			_viewManager->updateState();
+
+			// Refresh the display
+			_viewManager->refreshAll();
 		}
 
 		g_system->delayMillis(10);

Modified: scummvm/trunk/engines/m4/mads_logic.cpp
===================================================================
--- scummvm/trunk/engines/m4/mads_logic.cpp	2010-05-17 09:32:16 UTC (rev 49056)
+++ scummvm/trunk/engines/m4/mads_logic.cpp	2010-05-17 10:30:17 UTC (rev 49057)
@@ -77,31 +77,32 @@
 	return _madsVm->scene()->loadSceneSpriteSet(resName);
 }
 
-uint16 MadsSceneLogic::startSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int fld24, int timeoutTicks, int extraTicks) {
+uint16 MadsSceneLogic::startReversibleSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) {
 	M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(1);
 	uint8 depth = _madsVm->_rails->getDepth(Common::Point(spriteFrame->x + (spriteFrame->width() / 2),
 		spriteFrame->y + (spriteFrame->height() / 2)));
 
-	return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, v0, 1, fld24, timeoutTicks, extraTicks, numTicks, 0, 0, 
-		-1, 100, depth - 1, 1, ANIMTYPE_SINGLE_DIRECTION, 0, 0);
+	return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, v0, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, 
+		-1, 100, depth - 1, 1, ANIMTYPE_REVERSIBLE, 0, 0);
 }
 
-uint16 MadsSceneLogic::startCycledSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int fld24, int timeoutTicks, int extraTicks) {
+uint16 MadsSceneLogic::startCycledSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) {
 	M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(1);
+warning("%d %dx%d %d/%d", srcSpriteIdx, spriteFrame->x, spriteFrame->y, spriteFrame->width(), spriteFrame->height());
 	uint8 depth = _madsVm->_rails->getDepth(Common::Point(spriteFrame->x + (spriteFrame->width() / 2),
 		spriteFrame->y + (spriteFrame->height() / 2)));
 
-	return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, v0, 1, fld24, timeoutTicks, extraTicks, numTicks, 0, 0, 
+	return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, v0, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, 
 		-1, 100, depth - 1, 1, ANIMTYPE_CYCLED, 0, 0);
 }
 
-uint16 MadsSceneLogic::startSpriteSequence3(uint16 srcSpriteIdx, int v0, int numTicks, int fld24, int timeoutTicks, int extraTicks) {
+uint16 MadsSceneLogic::startSpriteSequence3(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) {
 	M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(1);
 	uint8 depth = _madsVm->_rails->getDepth(Common::Point(spriteFrame->x + (spriteFrame->width() / 2),
 		spriteFrame->y + (spriteFrame->height() / 2)));
 
-	return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, v0, 1, fld24, timeoutTicks, extraTicks, numTicks, 0, 0, 
-		-1, 100, depth - 1, -1, ANIMTYPE_SINGLE_DIRECTION, 0, 0);
+	return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, v0, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, 
+		-1, 100, depth - 1, -1, ANIMTYPE_CYCLED, 0, 0);
 }
 
 void MadsSceneLogic::activateHotspot(int idx, bool active) {
@@ -184,20 +185,21 @@
 	_spriteIndexes[12] = loadSpriteSet(8, 'x');
 	_spriteIndexes[13] = loadSpriteSet(0, 'x');
 
-	_spriteIndexes[15] = startSpriteSequence(_spriteIndexes[0], 0, 5, 0, 0, 25);
-	_spriteIndexes[16] = startSpriteSequence(_spriteIndexes[1], 0, 4, 0, 1, 0);
-	_spriteIndexes[17] = startSpriteSequence(_spriteIndexes[2], 0, 4, 0, 1, 0);
+	_spriteIndexes[15] = startCycledSpriteSequence(_spriteIndexes[0], 0, 5, 0, 0, 25);
 
-	_madsVm->scene()->_sequenceList.addSubEntry(0, SM_FRAME_INDEX, 7, 70);
+	_spriteIndexes[16] = startCycledSpriteSequence(_spriteIndexes[1], 0, 4, 0, 1, 0);
+	_spriteIndexes[17] = startCycledSpriteSequence(_spriteIndexes[2], 0, 4, 0, 1, 0);
 
-	_spriteIndexes[18] = startCycledSpriteSequence(_spriteIndexes[3], 0, 10, 0, 0, 60);
-	_spriteIndexes[19] = startSpriteSequence(_spriteIndexes[4], 0, 5, 0, 1, 0);
-	_spriteIndexes[20] = startSpriteSequence(_spriteIndexes[5], 0, 10, 0, 2, 0);
-	_spriteIndexes[21] = startSpriteSequence(_spriteIndexes[6], 0, 6, 0, 0, 0);
+//	_madsVm->scene()->_sequenceList.addSubEntry(_spriteIndexes[17], SM_FRAME_INDEX, 7, 70);
 
-	_spriteIndexes[23] = startSpriteSequence(_spriteIndexes[8], 0, 6, 0, 10, 4);
-	_spriteIndexes[24] = startSpriteSequence(_spriteIndexes[9], 0, 6, 0, 32, 47);
+	_spriteIndexes[18] = startReversibleSpriteSequence(_spriteIndexes[3], 0, 10, 0, 0, 60);
+	_spriteIndexes[19] = startCycledSpriteSequence(_spriteIndexes[4], 0, 5, 0, 1, 0);
+	_spriteIndexes[20] = startCycledSpriteSequence(_spriteIndexes[5], 0, 10, 0, 2, 0);
+	_spriteIndexes[21] = startCycledSpriteSequence(_spriteIndexes[6], 0, 6, 0, 0, 0);
 
+	_spriteIndexes[23] = startCycledSpriteSequence(_spriteIndexes[8], 0, 6, 0, 10, 4);
+	_spriteIndexes[24] = startCycledSpriteSequence(_spriteIndexes[9], 0, 6, 0, 32, 47);
+
 	activateHotspot(0x137, false);		// SHIELD MODULATOR
 	// shield_panel_opened = 0;
 

Modified: scummvm/trunk/engines/m4/mads_logic.h
===================================================================
--- scummvm/trunk/engines/m4/mads_logic.h	2010-05-17 09:32:16 UTC (rev 49056)
+++ scummvm/trunk/engines/m4/mads_logic.h	2010-05-17 10:30:17 UTC (rev 49057)
@@ -35,9 +35,9 @@
 private:
 	// Library interface methods
 	uint16 loadSpriteSet(uint16 suffixNum, uint16 sepChar);
-	uint16 startSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int fld24, int timeoutTicks, int extraTicks);
-	uint16 startCycledSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int fld24, int timeoutTicks, int extraTicks);
-	uint16 startSpriteSequence3(uint16 srcSpriteIdx, int v0, int numTicks, int fld24, int timeoutTicks, int extraTicks);
+	uint16 startReversibleSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks);
+	uint16 startCycledSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks);
+	uint16 startSpriteSequence3(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks);
 	void activateHotspot(int idx, bool active);
 	void lowRoomsEntrySound();
 private:

Modified: scummvm/trunk/engines/m4/mads_views.cpp
===================================================================
--- scummvm/trunk/engines/m4/mads_views.cpp	2010-05-17 09:32:16 UTC (rev 49056)
+++ scummvm/trunk/engines/m4/mads_views.cpp	2010-05-17 10:30:17 UTC (rev 49057)
@@ -121,7 +121,7 @@
 			// Minimalised drawing
 			assert(slot.spriteListIndex < (int)_sprites.size());
 			M4Sprite *spr = spriteSet.getFrame(slot.frameNumber - 1);
-			spr->draw1(view, slot.scale, slot.depth, slot.xp, MADS_Y_OFFSET + slot.yp);
+			spr->draw1(view, slot.scale, slot.depth, slot.xp, slot.yp);
 		} else {
 			int xp, yp;
 			M4Sprite *spr = spriteSet.getFrame(slot.frameNumber - 1);
@@ -135,9 +135,9 @@
 			}
 
 			if (slot.depth > 1) {
-				spr->draw2(view, slot.depth, xp, MADS_Y_OFFSET + yp);
+				spr->draw2(view, slot.depth, xp, yp);
 			} else {
-				spr->draw3(view, xp, MADS_Y_OFFSET + yp);
+				spr->draw3(view, xp, yp);
 			}
 		}
 	}
@@ -501,7 +501,7 @@
 	return false;
 }
 
-int MadsSequenceList::add(int spriteListIndex, int v0, int frameIndex, char field_24, int timeoutTicks, int extraTicks, int numTicks, 
+int MadsSequenceList::add(int spriteListIndex, int v0, int frameIndex, int triggerCountdown, int delayTicks, int extraTicks, int numTicks, 
 		int height, int width, char field_12, char scale, uint8 depth, int frameInc, SpriteAnimType animType, int numSprites, 
 		int frameStart) {
 
@@ -536,10 +536,10 @@
 	_entries[timerIndex].numTicks = numTicks;
 	_entries[timerIndex].extraTicks = extraTicks;
 
-	_entries[timerIndex].timeout = _madsVm->_currentTimer + timeoutTicks;
+	_entries[timerIndex].timeout = _madsVm->_currentTimer + delayTicks;
 
-	_entries[timerIndex].field_24 = field_24;
-	_entries[timerIndex].field_25 = 0;
+	_entries[timerIndex].triggerCountdown = triggerCountdown;
+	_entries[timerIndex].doneFlag = false;
 	_entries[timerIndex].field_13 = 0;
 	_entries[timerIndex].dynamicHotspotIndex = -1;
 	_entries[timerIndex].entries.count = 0;
@@ -589,13 +589,14 @@
 	int idx = -1;
 
 	_owner._spriteSlots.deleteTimer(timerIndex);
-	if (seqEntry.field_25 != 0) {
+	if (seqEntry.doneFlag) {
 		remove(timerIndex);
 		return false;
 	}
 
 	if (seqEntry.spriteListIndex == -1) {
-		seqEntry.field_25 = -1;
+		// Doesn't have an associated sprite anymore, so mark as done
+		seqEntry.doneFlag = true;
 	} else if ((slotIndex = _owner._spriteSlots.getIndex()) >= 0) {
 		MadsSpriteSlot &spriteSlot = _owner._spriteSlots[slotIndex];
 		setSpriteSlot(timerIndex, spriteSlot);
@@ -631,17 +632,17 @@
 		if (seqEntry.frameIndex >= seqEntry.frameStart) {
 			if (seqEntry.frameIndex > seqEntry.numSprites) {
 				result = true;
-				if (seqEntry.animType != ANIMTYPE_CYCLED) {
-					// Keep index from exceeding maximum allowed
+				if (seqEntry.animType == ANIMTYPE_CYCLED) {
+					// Reset back to the starting frame (cyclic)
 					seqEntry.frameIndex = seqEntry.frameStart;
 				} else {
-					// Switch into reverse
+					// Switch into reverse mode
 					seqEntry.frameIndex = seqEntry.numSprites - 1;
 					seqEntry.frameInc = -1;
 				}
 			}
 		} else {
-			// Currently in reverse mode
+			// Currently in reverse mode and moved past starting frame
 			result = true;
 
 			if (seqEntry.animType == ANIMTYPE_CYCLED)
@@ -655,13 +656,13 @@
 			}
 		}
 
-		if (result && (seqEntry.field_24 != 0)) {
-			if (--seqEntry.field_24 != 0)
-				seqEntry.field_25 = -1;
+		if (result && (seqEntry.triggerCountdown != 0)) {
+			if (--seqEntry.triggerCountdown == 0)
+				seqEntry.doneFlag = true;
 		}
 	} else {
-		// Out of sprite slots
-		seqEntry.field_25 = -1;
+		// Out of sprite display slots, so mark entry as done
+		seqEntry.doneFlag = true;
 	}
 
 	if (seqEntry.entries.count > 0) {
@@ -669,7 +670,7 @@
 			switch (seqEntry.entries.mode[i]) {
 			case SM_0:
 			case SM_1:
-				if (((seqEntry.entries.mode[i] == SM_0) && (seqEntry.field_25 != 0)) ||
+				if (((seqEntry.entries.mode[i] == SM_0) && seqEntry.doneFlag) ||
 					((seqEntry.entries.mode[i] == SM_1) && result))
 				idx = i;
 				break;
@@ -702,18 +703,18 @@
 		if ((_owner._abortTimers2 == 0) && (_owner._abortTimers != 0))
 			break;
 
-		MadsSequenceEntry &timerEntry = _entries[idx];
+		MadsSequenceEntry &seqEntry = _entries[idx];
 		uint32 currentTimer = _madsVm->_currentTimer;
 
-		if (!timerEntry.active || (currentTimer < timerEntry.timeout))
+		if (!seqEntry.active || (currentTimer < seqEntry.timeout))
 			continue;
 
 		// Set the next timeout for the timer entry
-		timerEntry.timeout = currentTimer + timerEntry.numTicks;		
+		seqEntry.timeout = currentTimer + seqEntry.numTicks;		
 
 		// Action the sprite
 		if (loadSprites(idx)) {
-			timerEntry.timeout += timerEntry.extraTicks;
+			seqEntry.timeout += seqEntry.extraTicks;
 		}
 	}
 }

Modified: scummvm/trunk/engines/m4/mads_views.h
===================================================================
--- scummvm/trunk/engines/m4/mads_views.h	2010-05-17 09:32:16 UTC (rev 49056)
+++ scummvm/trunk/engines/m4/mads_views.h	2010-05-17 10:30:17 UTC (rev 49057)
@@ -236,7 +236,7 @@
 	void reset();
 };
 
-enum SpriteAnimType {ANIMTYPE_SINGLE_DIRECTION = 1, ANIMTYPE_CYCLED = 2};
+enum SpriteAnimType {ANIMTYPE_CYCLED = 1, ANIMTYPE_REVERSIBLE = 2};
 
 enum SequenceSubEntryMode {SM_0 = 0, SM_1 = 1, SM_FRAME_INDEX = 2};
 
@@ -272,8 +272,8 @@
 	int width;
 	int height;
 	
-	int field_24;
-	int field_25;
+	int triggerCountdown;
+	bool doneFlag;
 	MadsSequenceSubEntries entries;
 	AbortTimerMode abortMode;
 
@@ -295,7 +295,7 @@
 	MadsSequenceEntry &operator[](int index) { return _entries[index]; }	
 	void clear();
 	bool addSubEntry(int index, SequenceSubEntryMode mode, int frameIndex, int abortVal);
-	int add(int spriteListIndex, int v0, int v1, char field_24, int timeoutTicks, int extraTicks, int numTicks, 
+	int add(int spriteListIndex, int v0, int v1, int triggerCountdown, int delayTicks, int extraTicks, int numTicks, 
 		int height, int width, char field_12, char scale, uint8 depth, int frameInc, SpriteAnimType animType, 
 		int numSprites, int frameStart);
 	void remove(int timerIndex);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list