diff options
Diffstat (limited to 'engines/sherlock/inventory.cpp')
-rw-r--r-- | engines/sherlock/inventory.cpp | 92 |
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 |