aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2014-03-17 23:14:54 -0400
committerPaul Gilbert2014-03-17 23:14:54 -0400
commitd494db888e24c04261a46aa89d946ff3c7db3851 (patch)
treec294a56d32b8ef001e12b4c969b1216626a5ad40 /engines
parent0c8a3a47e28075bd559be43bde910587af35d8ab (diff)
downloadscummvm-rg350-d494db888e24c04261a46aa89d946ff3c7db3851.tar.gz
scummvm-rg350-d494db888e24c04261a46aa89d946ff3c7db3851.tar.bz2
scummvm-rg350-d494db888e24c04261a46aa89d946ff3c7db3851.zip
MADS: Beginnings of code for UI inventory item animation
Diffstat (limited to 'engines')
-rw-r--r--engines/mads/mads.cpp2
-rw-r--r--engines/mads/mads.h2
-rw-r--r--engines/mads/sprites.cpp4
-rw-r--r--engines/mads/user_interface.cpp63
-rw-r--r--engines/mads/user_interface.h12
5 files changed, 70 insertions, 13 deletions
diff --git a/engines/mads/mads.cpp b/engines/mads/mads.cpp
index 1785ce3f00..781fd7d01d 100644
--- a/engines/mads/mads.cpp
+++ b/engines/mads/mads.cpp
@@ -39,7 +39,7 @@ MADSEngine::MADSEngine(OSystem *syst, const MADSGameDescription *gameDesc) :
// Initialise fields
_easyMouse = true;
- _invObjectStill = false;
+ _invObjectsAnimated = true;
_textWindowStill = false;
_screenFade = SCREEN_FADE_SMOOTH;
_musicFlag = false;
diff --git a/engines/mads/mads.h b/engines/mads/mads.h
index f19abb3889..3152e84f25 100644
--- a/engines/mads/mads.h
+++ b/engines/mads/mads.h
@@ -100,7 +100,7 @@ public:
ScreenSurface _screen;
SoundManager *_sound;
bool _easyMouse;
- bool _invObjectStill;
+ bool _invObjectsAnimated;
bool _textWindowStill;
ScreenFade _screenFade;
bool _musicFlag;
diff --git a/engines/mads/sprites.cpp b/engines/mads/sprites.cpp
index 18f6a642fd..e519c6966b 100644
--- a/engines/mads/sprites.cpp
+++ b/engines/mads/sprites.cpp
@@ -379,7 +379,9 @@ SpriteSets::~SpriteSets() {
}
int SpriteSets::add(SpriteAsset *asset, int idx) {
- if (!idx)
+ if (idx)
+ idx = idx + 49;
+ else
idx = size();
if (idx >= (int)size())
diff --git a/engines/mads/user_interface.cpp b/engines/mads/user_interface.cpp
index fd9f4c0153..2b5e6c4558 100644
--- a/engines/mads/user_interface.cpp
+++ b/engines/mads/user_interface.cpp
@@ -30,8 +30,8 @@ namespace MADS {
UISlot::UISlot() {
_slotType = ST_NONE;
_field2 = 0;
- _field3 = 0;
- _field4 = 0;
+ _spritesIndex = 0;
+ _frameNumber = 0;
_field6 = 0;
_field8 = 0;
}
@@ -46,7 +46,7 @@ void UISlots::fullRefresh() {
push_back(slot);
}
-void UISlots::add(int v1, int v2, int v3, int v4) {
+void UISlots::add(int v1, int v2, int frameNumber, int spritesIndex) {
assert(size() < 50);
UISlot ie;
@@ -54,8 +54,8 @@ void UISlots::add(int v1, int v2, int v3, int v4) {
ie._field2 = 201;
ie._field6 = v1;
ie._field8 = v2;
- ie._field4 = v3;
- ie._field3 = v4;
+ ie._frameNumber = frameNumber;
+ ie._spritesIndex = spritesIndex;
push_back(ie);
}
@@ -68,6 +68,7 @@ void UISlots::call(int v1, int v2) {
UserInterface::UserInterface(MADSEngine *vm) : _vm(vm) {
_invSpritesIndex = -1;
+ _invFrameNumber = 1;
_category = CAT_NONE;
_screenObjectsCount = 0;
_inventoryTopIndex = 0;
@@ -432,7 +433,23 @@ void UserInterface::drawTalkList() {
}
void UserInterface::loadInventoryAnim(int objectId) {
+ Scene &scene = _vm->_game->_scene;
+ noInventoryAnim();
+ bool flag = true;
+
+ if (_vm->_invObjectsAnimated) {
+ Common::String resName = Common::String::format("*OB%.3dI", objectId);
+ SpriteAsset *asset = new SpriteAsset(_vm, resName, 8);
+ _invSpritesIndex = scene._sprites.add(asset, 1);
+ if (_invSpritesIndex >= 0) {
+ _invFrameNumber = 1;
+ flag = false;
+ }
+ }
+ if (flag) {
+ // TODO: Use of inv_object_data?
+ }
}
void UserInterface::noInventoryAnim() {
@@ -449,9 +466,41 @@ void UserInterface::noInventoryAnim() {
}
void UserInterface::refresh() {
+ _uiSlots.clear();
+ _uiSlots.fullRefresh();
+ _uiSlots.call(0, 0);
+
+ drawTextElements();
+}
+
+void UserInterface::inventoryAnim() {
Scene &scene = _vm->_game->_scene;
- scene._userInterface._uiSlots.clear();
-// scene._userInterface._uiSlots.new()
+ if (scene._screenObjects._v832EC == 1 || scene._screenObjects._v832EC == 2
+ || _invSpritesIndex < 0)
+ return;
+
+ // Move to the next frame number in the sequence, resetting if at the end
+ SpriteAsset *asset = scene._sprites[_invSpritesIndex];
+ if (++_invFrameNumber > asset->getCount())
+ _invFrameNumber = 1;
+
+ // Loop through the slots list for ?? entry
+ for (uint i = 0; i < _uiSlots.size(); ++i) {
+ if (_uiSlots[i]._field2 == 200)
+ _uiSlots[i]._slotType = -5;
+ }
+
+ // Add a new slot entry for the inventory animation
+ UISlot slot;
+ slot._slotType = ST_FOREGROUND;
+ slot._field2 = 200;
+ slot._frameNumber = _invFrameNumber;
+ slot._spritesIndex = _invSpritesIndex;
+ slot._field6 = 160;
+ slot._field8 = 3;
+
+ _uiSlots.push_back(slot);
}
+
} // End of namespace MADS
diff --git a/engines/mads/user_interface.h b/engines/mads/user_interface.h
index 65c7e1ce55..8b87b4e65d 100644
--- a/engines/mads/user_interface.h
+++ b/engines/mads/user_interface.h
@@ -40,8 +40,8 @@ class UISlot {
public:
int _slotType;
int _field2;
- int _field3;
- int _field4;
+ int _spritesIndex;
+ int _frameNumber;
int _field6;
int _field8;
@@ -50,7 +50,7 @@ public:
class UISlots : public Common::Array<UISlot> {
public:
- void add(int v1, int v2, int v3, int v4);
+ void add(int v1, int v2, int frameNumber, int spritesIndex);
void fullRefresh();
void call(int v1, int v2);
@@ -61,6 +61,7 @@ class UserInterface : public MSurface {
private:
MADSEngine *_vm;
int _invSpritesIndex;
+ int _invFrameNumber;
/**
* Loads the elements of the user interface
@@ -108,6 +109,11 @@ private:
void writeVocab(ScrCategory category, int id);
void refresh();
+
+ /**
+ * Handles queuing a new frame of an inventory animation for drawing
+ */
+ void inventoryAnim();
public:
ScrCategory _category;
int _screenObjectsCount;