aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2010-05-16 01:32:46 +0000
committerPaul Gilbert2010-05-16 01:32:46 +0000
commit43e61ec60f804b2540d1188801ba44cf37727782 (patch)
tree0f75a9ac6ebacefebb127c5367075ace412ce711 /engines
parent5e4868fb008712d6504f0c1dab51b3566998b55f (diff)
downloadscummvm-rg350-43e61ec60f804b2540d1188801ba44cf37727782.tar.gz
scummvm-rg350-43e61ec60f804b2540d1188801ba44cf37727782.tar.bz2
scummvm-rg350-43e61ec60f804b2540d1188801ba44cf37727782.zip
Bugfixes for animation depth logic
svn-id: r49045
Diffstat (limited to 'engines')
-rw-r--r--engines/m4/mads_logic.cpp18
-rw-r--r--engines/m4/mads_views.cpp13
-rw-r--r--engines/m4/mads_views.h9
-rw-r--r--engines/m4/rails.cpp6
-rw-r--r--engines/m4/rails.h1
5 files changed, 30 insertions, 17 deletions
diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp
index 9d6c4e169b..7c70b780f1 100644
--- a/engines/m4/mads_logic.cpp
+++ b/engines/m4/mads_logic.cpp
@@ -79,29 +79,29 @@ uint16 MadsSceneLogic::loadSpriteSet(uint16 suffixNum, uint16 sepChar) {
uint16 MadsSceneLogic::startSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int fld24, int timeoutTicks, int extraTicks) {
M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(1);
- uint8 pixel = *_madsVm->scene()->getWalkSurface()->getBasePtr(spriteFrame->x + (spriteFrame->width() / 2),
- spriteFrame->y + (spriteFrame->height() / 2));
+ 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, (int)pixel - 1, 1, ANIMTYPE_SINGLE_DIRECTION, 0, 0);
+ -1, 100, depth - 1, 1, ANIMTYPE_SINGLE_DIRECTION, 0, 0);
}
uint16 MadsSceneLogic::startCycledSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int fld24, int timeoutTicks, int extraTicks) {
M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(1);
- uint8 pixel = *_madsVm->scene()->getWalkSurface()->getBasePtr(spriteFrame->x + (spriteFrame->width() / 2),
- spriteFrame->y + (spriteFrame->height() / 2));
+ 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, (int)pixel - 1, 1, ANIMTYPE_CYCLED, 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) {
M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(1);
- uint8 pixel = *_madsVm->scene()->getWalkSurface()->getBasePtr(spriteFrame->x + (spriteFrame->width() / 2),
- spriteFrame->y + (spriteFrame->height() / 2));
+ 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, (int)pixel - 1, -1, ANIMTYPE_SINGLE_DIRECTION, 0, 0);
+ -1, 100, depth - 1, -1, ANIMTYPE_SINGLE_DIRECTION, 0, 0);
}
void MadsSceneLogic::activateHotspot(int idx, bool active) {
diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp
index a99976338b..04e8afd21a 100644
--- a/engines/m4/mads_views.cpp
+++ b/engines/m4/mads_views.cpp
@@ -258,7 +258,7 @@ void MadsKernelMessageList::clear() {
_talkFont = _vm->_font->getFont(FONT_CONVERSATION_MADS);
}
-int MadsKernelMessageList::add(const Common::Point &pt, uint fontColour, uint8 flags, uint8 v2, uint32 timeout, char *msg) {
+int MadsKernelMessageList::add(const Common::Point &pt, uint fontColour, uint8 flags, uint8 v2, uint32 timeout, const char *msg) {
// Find a free slot
uint idx = 0;
while ((idx < _entries.size()) && ((_entries[idx].flags & KMSG_ACTIVE) != 0))
@@ -291,6 +291,11 @@ int MadsKernelMessageList::add(const Common::Point &pt, uint fontColour, uint8 f
return idx;
}
+int MadsKernelMessageList::addQuote(int quoteId, int v2, uint32 timeout) {
+ const char *quoteStr = _madsVm->globals()->getQuote(quoteId);
+ return add(Common::Point(0, 0), 0x1110, KMSG_2 | KMSG_20, v2, timeout, quoteStr);
+}
+
void MadsKernelMessageList::unk1(int msgIndex, int v1, int v2) {
if (msgIndex < 0)
return;
@@ -322,8 +327,8 @@ void MadsKernelMessageList::remove(int msgIndex) {
if (rec.flags & KMSG_ACTIVE) {
if (rec.flags & KMSG_8) {
- *(rec.msg + rec.msgOffset) = rec.asciiChar;
- *(rec.msg + rec.msgOffset + 1) = rec.asciiChar2;
+ //*(rec.msg + rec.msgOffset) = rec.asciiChar;
+ //*(rec.msg + rec.msgOffset + 1) = rec.asciiChar2;
}
if (rec.textDisplayIndex >= 0)
@@ -497,7 +502,7 @@ bool MadsSequenceList::addSubEntry(int index, SequenceSubEntryMode mode, int fra
}
int MadsSequenceList::add(int spriteListIndex, int v0, int frameIndex, char field_24, int timeoutTicks, int extraTicks, int numTicks,
- int height, int width, char field_12, char scale, char depth, int frameInc, SpriteAnimType animType, int numSprites,
+ int height, int width, char field_12, char scale, uint8 depth, int frameInc, SpriteAnimType animType, int numSprites,
int frameStart) {
// Find a free slot
diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h
index 37c797b931..224acdfb51 100644
--- a/engines/m4/mads_views.h
+++ b/engines/m4/mads_views.h
@@ -131,7 +131,7 @@ public:
#define TIMED_TEXT_SIZE 10
#define TEXT_4A_SIZE 30
-enum KernelMessageFlags {KMSG_1 = 1, KMSG_2 = 2, KMSG_4 = 4, KMSG_8 = 8, KMSG_40 = 0x40, KMSG_ACTIVE = 0x80};
+enum KernelMessageFlags {KMSG_1 = 1, KMSG_2 = 2, KMSG_4 = 4, KMSG_8 = 8, KMSG_20 = 0x20, KMSG_40 = 0x40, KMSG_ACTIVE = 0x80};
class MadsKernelMessageListEntry {
public:
@@ -151,7 +151,7 @@ public:
bool field_1C;
AbortTimerMode abortMode;
uint16 actionNouns[3];
- char *msg;
+ const char *msg;
};
class MadsKernelMessageList {
@@ -163,7 +163,8 @@ public:
MadsKernelMessageList(MadsView &owner);
void clear();
- int add(const Common::Point &pt, uint fontColour, uint8 flags, uint8 v2, uint32 timeout, char *msg);
+ int add(const Common::Point &pt, uint fontColour, uint8 flags, uint8 v2, uint32 timeout, const char *msg);
+ int addQuote(int quoteId, int v2, uint32 timeout);
void unk1(int msgIndex, int v1, int v2);
void setSeqIndex(int msgIndex, int seqIndex);
void remove(int msgIndex);
@@ -295,7 +296,7 @@ public:
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 height, int width, char field_12, char scale, char depth, int frameInc, SpriteAnimType animType,
+ int height, int width, char field_12, char scale, uint8 depth, int frameInc, SpriteAnimType animType,
int numSprites, int frameStart);
void remove(int timerIndex);
void setSpriteSlot(int timerIndex, MadsSpriteSlot &spriteSlot);
diff --git a/engines/m4/rails.cpp b/engines/m4/rails.cpp
index 56faf204f0..fbad6995eb 100644
--- a/engines/m4/rails.cpp
+++ b/engines/m4/rails.cpp
@@ -95,6 +95,12 @@ bool Rails::isLineWalkable(int x0, int y0, int x1, int y1) {
return isWalkableData.result;
}
+uint8 Rails::getDepth(const Common::Point &pt) {
+ // TODO: Check based on sceneResources
+ const byte *b = _walkCodes->getBasePtr(pt.x, pt.y);
+ return *b & 0xf;
+}
+
// helper function
uint8 getEndCode(int32 x, int32 y, Common::Rect rect) {
uint8 endCode = 0;
diff --git a/engines/m4/rails.h b/engines/m4/rails.h
index d7320eef4d..a7add5a8eb 100644
--- a/engines/m4/rails.h
+++ b/engines/m4/rails.h
@@ -72,6 +72,7 @@ public:
void setCodeSurface(M4Surface *surface) { _walkCodes = surface; }
void clearRails();
int32 addRailNode(int32 x, int32 y, bool restoreEdges);
+ uint8 getDepth(const Common::Point &pt);
private:
Common::Array<RailNode *> _nodes;