aboutsummaryrefslogtreecommitdiff
path: root/engines/m4/mads_views.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/m4/mads_views.cpp')
-rw-r--r--engines/m4/mads_views.cpp96
1 files changed, 86 insertions, 10 deletions
diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp
index 32328f8a13..66968527da 100644
--- a/engines/m4/mads_views.cpp
+++ b/engines/m4/mads_views.cpp
@@ -32,6 +32,8 @@
#include "m4/m4.h"
#include "m4/staticres.h"
+#include "common/algorithm.h"
+
namespace M4 {
static const int INV_ANIM_FRAME_SPEED = 8;
@@ -41,6 +43,86 @@ static const int SCROLLER_DELAY = 200;
//--------------------------------------------------------------------------
+int MadsSpriteSlots::getIndex() {
+ return startIndex++;
+}
+
+void MadsSpriteSlots::addSprites(const char *resName) {
+ // Get the sprite set
+ Common::SeekableReadStream *data = _vm->res()->get(resName);
+ SpriteAsset *spriteSet = new SpriteAsset(_vm, data, data->size(), resName);
+ spriteSet->translate(_madsVm->_palette);
+
+ _sprites.push_back(SpriteList::value_type(spriteSet));
+ _vm->res()->toss(resName);
+
+ // Translate the sprite set to the current palette
+}
+
+class DepthEntry {
+public:
+ int depth;
+ int index;
+
+ DepthEntry(int depthAmt, int indexVal) { depth = depthAmt; index = indexVal; }
+};
+
+bool sortHelper(const DepthEntry &entry1, const DepthEntry &entry2) {
+ return entry1.depth < entry2.depth;
+}
+
+typedef Common::List<DepthEntry> DepthList;
+
+void MadsSpriteSlots::draw(View *view) {
+ DepthList depthList;
+
+ // Get a list of sprite object depths for active objects
+ for (int i = 0; i < startIndex; ++i) {
+ if (_entries[i].spriteId >= 0) {
+ DepthEntry rec(_entries[i].depth, i);
+ depthList.push_back(rec);
+ }
+ }
+
+ // Sort the list in order of the depth
+ Common::sort(depthList.begin(), depthList.end(), sortHelper);
+
+ // Loop through each of the objectes
+ DepthList::iterator i;
+ for (i = depthList.begin(); i != depthList.end(); ++i) {
+ DepthEntry &de = *i;
+ MadsSpriteSlot &slot = _entries[de.index];
+ assert(slot.spriteListIndex < (int)_sprites.size());
+ SpriteAsset &spriteSet = *_sprites[slot.spriteListIndex].get();
+
+ if (slot.scale < 100) {
+ // Minimalised drawing
+ assert(slot.spriteListIndex < (int)_sprites.size());
+ M4Sprite *spr = spriteSet.getFrame(slot.frameNumber - 1);
+ spr->draw(view, slot.scale, slot.depth, slot.xp, MADS_Y_OFFSET + slot.yp);
+ } else {
+ int xp, yp;
+ M4Sprite *spr = spriteSet.getFrame(slot.frameNumber - 1);
+
+ if (slot.scale == -1) {
+ xp = slot.xp; // - widthAdjust;
+ yp = slot.yp; // - heightAdjust;
+ } else {
+ xp = slot.xp - (spr->width() / 2); // - widthAdjust;
+ yp = slot.yp - spr->height() + 1; // - heightAdjust;
+ }
+
+ if (slot.depth > 1) {
+ spr->draw2(view, slot.depth, xp, MADS_Y_OFFSET + yp);
+ } else {
+ spr->draw3(view, xp, MADS_Y_OFFSET + yp);
+ }
+ }
+ }
+}
+
+//--------------------------------------------------------------------------
+
MadsTextDisplay::MadsTextDisplay() {
for (int i = 0; i < TEXT_DISPLAY_SIZE; ++i) {
MadsTextDisplayEntry rec;
@@ -132,12 +214,9 @@ int ScreenObjects::scan(int xp, int yp, int layer) {
}
int ScreenObjects::scanBackwards(int xp, int yp, int layer) {
- for (uint i = _entries.size() - 1; ; --i) {
+ for (int i = (int)_entries.size() - 1; i >= 0; --i) {
if (_entries[i].active && _entries[i].bounds.contains(xp, yp) && (_entries[i].layer == layer))
return i + 1;
-
- if (i == 0)
- break;
}
// Entry not found
@@ -154,18 +233,15 @@ void ScreenObjects::setActive(int category, int idx, bool active) {
//--------------------------------------------------------------------------
MadsView::MadsView(MadsM4Engine *vm, const Common::Rect &viewBounds, bool transparent): View(vm, viewBounds, transparent) {
- _spriteSlotsStart = 0;
}
MadsView::MadsView(MadsM4Engine *vm, int x, int y, bool transparent): View(vm, x, y, transparent) {
- _spriteSlotsStart = 0;
-}
-
-int MadsView::getSpriteSlotsIndex() {
- return _spriteSlotsStart++;
}
void MadsView::onRefresh(RectList *rects, M4Surface *destSurface) {
+ // Draw any sprites
+ _spriteSlots.draw(this);
+
// Draw text elements onto the view
_textDisplay.draw(this);