aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2010-05-17 10:30:17 +0000
committerPaul Gilbert2010-05-17 10:30:17 +0000
commit68cae03b3c9fc35606ad899362a43e09b823f3e9 (patch)
treed5126035267a5bec3ff63b86ace8e1c47e1552af /engines
parent4119fdb9a93207f9de5e925e1d095ca5dd6348b1 (diff)
downloadscummvm-rg350-68cae03b3c9fc35606ad899362a43e09b823f3e9.tar.gz
scummvm-rg350-68cae03b3c9fc35606ad899362a43e09b823f3e9.tar.bz2
scummvm-rg350-68cae03b3c9fc35606ad899362a43e09b823f3e9.zip
Bugfixes for animation display, and better understanding of how animations cycle
svn-id: r49057
Diffstat (limited to 'engines')
-rw-r--r--engines/m4/m4.cpp10
-rw-r--r--engines/m4/mads_logic.cpp38
-rw-r--r--engines/m4/mads_logic.h6
-rw-r--r--engines/m4/mads_views.cpp47
-rw-r--r--engines/m4/mads_views.h8
5 files changed, 57 insertions, 52 deletions
diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp
index 33a2fe6b68..897fb468cd 100644
--- a/engines/m4/m4.cpp
+++ b/engines/m4/m4.cpp
@@ -583,13 +583,15 @@ Common::Error MadsEngine::run() {
_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);
diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp
index 7c70b780f1..d0b7021f38 100644
--- a/engines/m4/mads_logic.cpp
+++ b/engines/m4/mads_logic.cpp
@@ -77,31 +77,32 @@ uint16 MadsSceneLogic::loadSpriteSet(uint16 suffixNum, uint16 sepChar) {
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,19 +185,20 @@ void MadsSceneLogic::enterScene() {
_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;
diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h
index 5c66da48fd..a589556a21 100644
--- a/engines/m4/mads_logic.h
+++ b/engines/m4/mads_logic.h
@@ -35,9 +35,9 @@ class MadsSceneLogic {
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:
diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp
index 04e8afd21a..e50c35bc04 100644
--- a/engines/m4/mads_views.cpp
+++ b/engines/m4/mads_views.cpp
@@ -121,7 +121,7 @@ void MadsSpriteSlots::draw(View *view) {
// 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 @@ void MadsSpriteSlots::draw(View *view) {
}
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 @@ bool MadsSequenceList::addSubEntry(int index, SequenceSubEntryMode mode, int fra
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 @@ int MadsSequenceList::add(int spriteListIndex, int v0, int frameIndex, char fiel
_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 @@ bool MadsSequenceList::loadSprites(int timerIndex) {
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 @@ bool MadsSequenceList::loadSprites(int timerIndex) {
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 @@ bool MadsSequenceList::loadSprites(int timerIndex) {
}
}
- 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 @@ bool MadsSequenceList::loadSprites(int timerIndex) {
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 @@ void MadsSequenceList::tick() {
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;
}
}
}
diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h
index 224acdfb51..926702a80b 100644
--- a/engines/m4/mads_views.h
+++ b/engines/m4/mads_views.h
@@ -236,7 +236,7 @@ public:
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 @@ struct MadsSequenceEntry {
int width;
int height;
- int field_24;
- int field_25;
+ int triggerCountdown;
+ bool doneFlag;
MadsSequenceSubEntries entries;
AbortTimerMode abortMode;
@@ -295,7 +295,7 @@ public:
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);