mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-02 15:16:46 +00:00
M4: Bugfixes for depth ordering to fix the Z order of on-screen objects
svn-id: r51239
This commit is contained in:
parent
c8cde0735f
commit
0191f8fd71
@ -443,7 +443,7 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth,
|
||||
for (int rowCtr = 0; rowCtr < copyRect.height(); ++rowCtr) {
|
||||
// Copy each byte one at a time checking against the depth
|
||||
for (int xCtr = 0; xCtr < copyRect.width(); ++xCtr) {
|
||||
if ((depthsPtr[xCtr] > depth) && (srcPtr[xCtr] != transparentColour))
|
||||
if ((depth <= (depthsPtr[xCtr] & 0x7f)) && (srcPtr[xCtr] != transparentColour))
|
||||
destPtr[xCtr] = srcPtr[xCtr];
|
||||
}
|
||||
|
||||
@ -557,7 +557,7 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth,
|
||||
// Not a display pixel
|
||||
continue;
|
||||
|
||||
if ((*srcP != transparentColour) && (depth <= *depthP))
|
||||
if ((*srcP != transparentColour) && (depth <= (*depthP & 0x7f)))
|
||||
*destP = *srcP;
|
||||
|
||||
++destP;
|
||||
|
@ -189,30 +189,30 @@ uint16 MadsSceneLogic::loadSpriteSet(uint16 suffixNum, uint16 sepChar) {
|
||||
return _madsVm->scene()->loadSceneSpriteSet(resName);
|
||||
}
|
||||
|
||||
uint16 MadsSceneLogic::startReversibleSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) {
|
||||
uint16 MadsSceneLogic::startReversibleSpriteSequence(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) {
|
||||
M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(0);
|
||||
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, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0,
|
||||
return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0,
|
||||
true, 100, depth - 1, 1, ANIMTYPE_REVERSIBLE, 0, 0);
|
||||
}
|
||||
|
||||
uint16 MadsSceneLogic::startCycledSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) {
|
||||
uint16 MadsSceneLogic::startCycledSpriteSequence(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) {
|
||||
M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(0);
|
||||
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, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0,
|
||||
return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0,
|
||||
true, 100, depth - 1, 1, ANIMTYPE_CYCLED, 0, 0);
|
||||
}
|
||||
|
||||
uint16 MadsSceneLogic::startSpriteSequence3(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) {
|
||||
uint16 MadsSceneLogic::startSpriteSequence3(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) {
|
||||
M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(0);
|
||||
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, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0,
|
||||
return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0,
|
||||
true, 100, depth - 1, -1, ANIMTYPE_CYCLED, 0, 0);
|
||||
}
|
||||
|
||||
@ -354,20 +354,18 @@ void MadsSceneLogic::enterScene() {
|
||||
_spriteIndexes[12] = loadSpriteSet(8, 'x');
|
||||
_spriteIndexes[13] = loadSpriteSet(0, 'x');
|
||||
|
||||
_spriteIndexes[15] = startCycledSpriteSequence(_spriteIndexes[0], 0, 5, 0, 0, 25);
|
||||
|
||||
_spriteIndexes[16] = startCycledSpriteSequence(_spriteIndexes[1], 0, 4, 0, 1, 0);
|
||||
_spriteIndexes[17] = startCycledSpriteSequence(_spriteIndexes[2], 0, 4, 0, 1, 0);
|
||||
_spriteIndexes[15] = startCycledSpriteSequence(_spriteIndexes[0], false, 5, 0, 0, 25);
|
||||
_spriteIndexes[16] = startCycledSpriteSequence(_spriteIndexes[1], false, 4, 0, 1, 0);
|
||||
_spriteIndexes[17] = startCycledSpriteSequence(_spriteIndexes[2], false, 4, 0, 1, 0);
|
||||
|
||||
_madsVm->scene()->_sequenceList.addSubEntry(_spriteIndexes[17], SM_FRAME_INDEX, 7, 70);
|
||||
|
||||
_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);
|
||||
_spriteIndexes[18] = startReversibleSpriteSequence(_spriteIndexes[3], false, 10, 0, 0, 60);
|
||||
_spriteIndexes[19] = startCycledSpriteSequence(_spriteIndexes[4], false, 5, 0, 1, 0);
|
||||
_spriteIndexes[20] = startCycledSpriteSequence(_spriteIndexes[5], false, 10, 0, 2, 0);
|
||||
_spriteIndexes[21] = startCycledSpriteSequence(_spriteIndexes[6], false, 6, 0, 0, 0);
|
||||
_spriteIndexes[23] = startCycledSpriteSequence(_spriteIndexes[8], false, 6, 0, 10, 4);
|
||||
_spriteIndexes[24] = startCycledSpriteSequence(_spriteIndexes[9], false, 6, 0, 32, 47);
|
||||
|
||||
activateHotspot(0x137, false); // SHIELD MODULATOR
|
||||
// shield_panel_opened = 0;
|
||||
@ -386,7 +384,7 @@ void MadsSceneLogic::enterScene() {
|
||||
_madsVm->_player._direction = 9;
|
||||
|
||||
// TODO: Extra flags setting
|
||||
_spriteIndexes[25] = startCycledSpriteSequence(_spriteIndexes[10], 0, 3, 0, 0, 0);
|
||||
_spriteIndexes[25] = startCycledSpriteSequence(_spriteIndexes[10], false, 3, 0, 0, 0);
|
||||
_madsVm->scene()->_sequenceList.setAnimRange(_spriteIndexes[25], 17, 17);
|
||||
activateHotspot(0x47, false); // CHAIR
|
||||
/*timer_unk1 = */_madsVm->scene()->_dynamicHotspots.add(0x47, 0x13F /*SIT_IN*/, -1,
|
||||
@ -395,7 +393,8 @@ void MadsSceneLogic::enterScene() {
|
||||
//if (_madsVm->globals()->previousScene == 112)
|
||||
// room101Check();
|
||||
} else {
|
||||
_spriteIndexes[26] = startCycledSpriteSequence(_spriteIndexes[11], 0, 6, 0, 0, 0);
|
||||
_spriteIndexes[26] = startCycledSpriteSequence(_spriteIndexes[11], false, 6, 0, 0, 0);
|
||||
_madsVm->scene()->_sequenceList.setDepth(_spriteIndexes[26], 4);
|
||||
}
|
||||
|
||||
_madsVm->globals()->loadQuoteSet(0x31, 0x32, 0x37, 0x38, 0x39, -1);
|
||||
|
@ -37,9 +37,9 @@ class MadsSceneLogic {
|
||||
private:
|
||||
// Library interface methods
|
||||
uint16 loadSpriteSet(uint16 suffixNum, uint16 sepChar);
|
||||
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);
|
||||
uint16 startReversibleSpriteSequence(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks);
|
||||
uint16 startCycledSpriteSequence(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks);
|
||||
uint16 startSpriteSequence3(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks);
|
||||
void activateHotspot(int idx, bool active);
|
||||
void lowRoomsEntrySound();
|
||||
void getPlayerSpritesPrefix();
|
||||
|
@ -136,7 +136,7 @@ void MadsPlayer::update() {
|
||||
int yp = MIN(_playerPos.y, (int16)155);
|
||||
|
||||
for (int idx = 1; idx < 15; ++idx) {
|
||||
if (_madsVm->scene()->getSceneResources().depthTable[newDepth] >= yp)
|
||||
if (_madsVm->scene()->getSceneResources()._depthBands[newDepth] >= yp)
|
||||
newDepth = idx + 1;
|
||||
}
|
||||
_currentDepth = newDepth;
|
||||
|
@ -1262,7 +1262,7 @@ bool MadsSequenceList::addSubEntry(int index, SequenceSubEntryMode mode, int fra
|
||||
return false;
|
||||
}
|
||||
|
||||
int MadsSequenceList::add(int spriteListIndex, int v0, int frameIndex, int triggerCountdown, int delayTicks, int extraTicks, int numTicks,
|
||||
int MadsSequenceList::add(int spriteListIndex, bool flipped, int frameIndex, int triggerCountdown, int delayTicks, int extraTicks, int numTicks,
|
||||
int msgX, int msgY, bool nonFixed, char scale, uint8 depth, int frameInc, SpriteAnimType animType, int numSprites,
|
||||
int frameStart) {
|
||||
|
||||
@ -1283,7 +1283,7 @@ int MadsSequenceList::add(int spriteListIndex, int v0, int frameIndex, int trigg
|
||||
// Set the list entry fields
|
||||
_entries[seqIndex].active = true;
|
||||
_entries[seqIndex].spriteListIndex = spriteListIndex;
|
||||
_entries[seqIndex].field_2 = v0;
|
||||
_entries[seqIndex].flipped = flipped;
|
||||
_entries[seqIndex].frameIndex = frameIndex;
|
||||
_entries[seqIndex].frameStart = frameStart;
|
||||
_entries[seqIndex].numSprites = numSprites;
|
||||
@ -1329,7 +1329,7 @@ void MadsSequenceList::setSpriteSlot(int seqIndex, MadsSpriteSlot &spriteSlot) {
|
||||
spriteSlot.spriteType = spriteSet.isBackground() ? BACKGROUND_SPRITE : FOREGROUND_SPRITE;
|
||||
spriteSlot.seqIndex = seqIndex;
|
||||
spriteSlot.spriteListIndex = timerEntry.spriteListIndex;
|
||||
spriteSlot.frameNumber = ((timerEntry.field_2 == 1) ? 0x8000 : 0) | timerEntry.frameIndex;
|
||||
spriteSlot.frameNumber = (timerEntry.flipped ? 0x8000 : 0) | timerEntry.frameIndex;
|
||||
spriteSlot.depth = timerEntry.depth;
|
||||
spriteSlot.scale = timerEntry.scale;
|
||||
|
||||
@ -1530,6 +1530,13 @@ void MadsSequenceList::scan() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the depth of the specified entry in the sequence list
|
||||
*/
|
||||
void MadsSequenceList::setDepth(int seqIndex, int depth) {
|
||||
_entries[seqIndex].depth = depth;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
Animation::Animation(MadsM4Engine *vm): _vm(vm) {
|
||||
|
@ -392,8 +392,7 @@ struct MadsSequenceSubEntries {
|
||||
struct MadsSequenceEntry {
|
||||
int8 active;
|
||||
int8 spriteListIndex;
|
||||
|
||||
int field_2;
|
||||
bool flipped;
|
||||
|
||||
int frameIndex;
|
||||
int frameStart;
|
||||
@ -433,9 +432,9 @@ 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, int triggerCountdown, int delayTicks, int extraTicks, int numTicks,
|
||||
int msgX, int msgY, bool nonFixed, char scale, uint8 depth, int frameInc, SpriteAnimType animType,
|
||||
int numSprites, int frameStart);
|
||||
int add(int spriteListIndex, bool flipped, int frameIndex, int triggerCountdown, int delayTicks,
|
||||
int extraTicks, int numTicks, int msgX, int msgY, bool nonFixed, char scale, uint8 depth,
|
||||
int frameInc, SpriteAnimType animType, int numSprites, int frameStart);
|
||||
void remove(int seqIndex);
|
||||
void setSpriteSlot(int seqIndex, MadsSpriteSlot &spriteSlot);
|
||||
bool loadSprites(int seqIndex);
|
||||
@ -443,6 +442,7 @@ public:
|
||||
void delay(uint32 v1, uint32 v2);
|
||||
void setAnimRange(int seqIndex, int startVal, int endVal);
|
||||
void scan();
|
||||
void setDepth(int seqIndex, int depth);
|
||||
};
|
||||
|
||||
class Animation {
|
||||
|
Loading…
Reference in New Issue
Block a user