aboutsummaryrefslogtreecommitdiff
path: root/engines/sherlock/inventory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sherlock/inventory.cpp')
-rw-r--r--engines/sherlock/inventory.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/engines/sherlock/inventory.cpp b/engines/sherlock/inventory.cpp
index 634e664f5a..cbb69f1041 100644
--- a/engines/sherlock/inventory.cpp
+++ b/engines/sherlock/inventory.cpp
@@ -21,7 +21,99 @@
*/
#include "sherlock/inventory.h"
+#include "sherlock/sherlock.h"
namespace Sherlock {
+Inventory::Inventory(SherlockEngine *vm) : Common::Array<InventoryItem>(), _vm(vm) {
+ Common::fill(&_invShapes[0], &_invShapes[MAX_VISIBLE_INVENTORY], (ImageFile *)nullptr);
+ _invGraphicsLoaded = false;
+ _invIndex = 0;
+ _holdings = 0;
+}
+
+Inventory::~Inventory() {
+ freeGraphics();
+}
+
+void Inventory::freeInventory() {
+ freeGraphics();
+
+ _names.clear();
+ _invGraphicsLoaded = false;
+}
+
+/**
+ * Free any loaded inventory graphics
+ */
+void Inventory::freeGraphics() {
+ for (uint idx = 0; idx < MAX_VISIBLE_INVENTORY; ++idx)
+ delete _invShapes[idx];
+
+ Common::fill(&_invShapes[0], &_invShapes[MAX_VISIBLE_INVENTORY], (ImageFile *)nullptr);
+ _invGraphicsLoaded = false;
+}
+
+/** Load the list of names the inventory items correspond to.
+ */
+void Inventory::loadInv() {
+ // Exit if the inventory names are already loaded
+ if (_names.size() > 0)
+ return;
+
+ // Load the inventory names
+ Common::SeekableReadStream *stream = _vm->_res->load("invent.txt");
+ _names.clear();
+
+ while (stream->pos() < stream->size()) {
+ Common::String name;
+ char c;
+ while ((c = stream->readByte()) != 0)
+ name += c;
+
+ _names.push_back(name);
+ }
+
+ delete stream;
+}
+
+/**
+ * Load the list of names of graphics for the inventory
+ */
+void Inventory::loadGraphics() {
+ if (_invGraphicsLoaded)
+ return;
+
+ // Default all inventory slots to empty
+ Common::fill(&_invShapes[0], &_invShapes[MAX_VISIBLE_INVENTORY], (ImageFile *)nullptr);
+
+ for (int idx = _invIndex; (idx < _holdings) && (idx - _invIndex) < 6; ++idx) {
+ // Get the name of the item to be dispalyed, figure out it's accompanying
+ // .VGS file with it's picture, and then load it
+ int invNum = findInv((*this)[idx]._name);
+ Common::String fName = Common::String::format("item%02d.vgs", invNum);
+
+ _invShapes[idx] = new ImageFile(fName);
+ }
+
+ _invGraphicsLoaded = true;
+}
+
+/**
+ * Searches through the list of names that correspond to the inventory items
+ * and returns the numer that matches the passed name
+ */
+int Inventory::findInv(const Common::String &name) {
+ int result = -1;
+
+ for (uint idx = 0; (idx < _holdings) && result == -1; ++idx) {
+ if (scumm_stricmp(name.c_str(), _names[idx].c_str()) == 0)
+ result = idx;
+ }
+
+ if (result == -1)
+ result = 1;
+ return result;
+}
+
} // End of namespace Sherlock