diff options
author | Paul Gilbert | 2010-05-17 10:30:17 +0000 |
---|---|---|
committer | Paul Gilbert | 2010-05-17 10:30:17 +0000 |
commit | 68cae03b3c9fc35606ad899362a43e09b823f3e9 (patch) | |
tree | d5126035267a5bec3ff63b86ace8e1c47e1552af /engines/m4/mads_views.cpp | |
parent | 4119fdb9a93207f9de5e925e1d095ca5dd6348b1 (diff) | |
download | scummvm-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/m4/mads_views.cpp')
-rw-r--r-- | engines/m4/mads_views.cpp | 47 |
1 files changed, 24 insertions, 23 deletions
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; } } } |