diff options
Diffstat (limited to 'engines/m4/actor.cpp')
-rw-r--r-- | engines/m4/actor.cpp | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/engines/m4/actor.cpp b/engines/m4/actor.cpp new file mode 100644 index 0000000000..c7c90ac3ae --- /dev/null +++ b/engines/m4/actor.cpp @@ -0,0 +1,202 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "common/system.h" +#include "common/array.h" +#include "m4/actor.h" +#include "m4/m4_views.h" +#include "m4/assets.h" + +namespace M4 { + +#define WALKER_BURGER "Wilbur0%i" // wilbur, with a number denoting his current direction + +Actor::Actor(M4Engine *vm) : _vm(vm) { + _scaling = 100; + _direction = 5; + _walkerSprites.resize(10); + loadWalkers(); +} + +Actor::~Actor() { + unloadWalkers(); +} + +int Actor::getWalkerWidth() { return _walkerSprites[kFacingSouth]->getFrame(0)->w; } +int Actor::getWalkerHeight() { return _walkerSprites[kFacingSouth]->getFrame(0)->h; } + +void Actor::placeWalkerSpriteAt(int spriteNum, int x, int y) { + if (_direction < 1 || _direction > 9) { + warning("Direction is %i, fixing", _direction); + _direction = 1; // TODO: this is a temporary fix + } + SpriteInfo info; + info.sprite = _walkerSprites[_direction]->getFrame(spriteNum); + info.hotX = info.hotY = 0; + info.width = info.sprite->w; + info.height = info.sprite->h; + info.scaleX = info.scaleY = _scaling; + info.palette = _walkerSprites[_direction]->getPalette(); + info.inverseColorTable = _vm->_scene->getInverseColorTable(); + + _vm->_scene->drawSprite(x, y, info, Common::Rect(640, 400)); +} + +void Actor::loadWalkers() { + for (uint8 i = 1; i < 10; i++) { + if (i == 6) + continue; // walker sprite 6 is unused + loadWalkerDirection(i); + } +} + +void Actor::loadWalkerDirection(uint8 direction) { + char name[20]; + Common::SeekableReadStream *walkerS; + + if (_vm->getGameType() == GType_Burger) { + sprintf(name, WALKER_BURGER, direction); + } else { + //warning("Actor::loadWalkerDirection: unspecified walker type, not loading walker"); + // TODO: Master Lu walkers + return; + } + + walkerS = _vm->res()->get(name); + _walkerSprites.insert_at(direction, new SpriteAsset(_vm, walkerS, walkerS->size(), name)); + _vm->res()->toss(name); +} + +void Actor::unloadWalkers() { + for (uint8 i = 9; i > 0; i--) { + if (i == 6) + continue; // walker sprite 6 is unused + SpriteAsset *tempSprite = _walkerSprites[i]; + _walkerSprites.remove_at(i); + if (tempSprite) + delete tempSprite; + } +} + +void Actor::setWalkerPalette() { + _vm->_palette->setPalette(_walkerSprites[kFacingSouthEast]->getPalette(), 0, + _walkerSprites[kFacingSouthEast]->getColorCount()); +} + +Inventory::Inventory(M4Engine *vm) : _vm(vm) { +} + +Inventory::~Inventory() { + _inventory.clear(); +} + +void Inventory::registerObject(char* name, int32 scene, int32 icon) { + InventoryObject *newObject = new InventoryObject(); + int newObjectIndex = 0; + + // Capitalize registered inventory object names + str_upper(name); + + newObject->name = strdup(name); + newObject->scene = scene; + newObject->icon = icon; + + newObjectIndex = _inventory.size(); + + _inventory.push_back(newObject); + + if (scene == BACKPACK) + addToBackpack(newObjectIndex); +} + +void Inventory::moveObject(char* name, int32 scene) { + uint i = 0; + + for (i = 0; i < _inventory.size(); i++) { + if (!scumm_stricmp(_inventory[i]->name, name)) { + if (_inventory[i]->scene == BACKPACK && scene != BACKPACK) + removeFromBackpack(i); + + _inventory[i]->scene = scene; + + if (scene == BACKPACK) + addToBackpack(i); + + return; + } + } +} + +void Inventory::addToBackpack(uint32 objectIndex) { + _vm->_interfaceView->inventoryAdd(_inventory[objectIndex]->name, "", _inventory[objectIndex]->icon); +} + +void Inventory::removeFromBackpack(uint32 objectIndex) { + _vm->_interfaceView->inventoryRemove(_inventory[objectIndex]->name); +} + +bool Inventory::isInCurrentScene(char* name) { + return (getScene(name) == _vm->_scene->getCurrentScene()); +} + +int Inventory::getScene(char* name) { + uint i = 0; + + for (i = 0; i < _inventory.size(); i++) { + if (!scumm_stricmp(_inventory[i]->name, name)) + return _inventory[i]->scene; + } + return UNKNOWN_OBJECT; +} + +int Inventory::getIcon(char* name) { + uint i = 0; + + for (i = 0; i < _inventory.size(); i++) { + if (!scumm_stricmp(_inventory[i]->name, name)) + return _inventory[i]->icon; + } + return UNKNOWN_OBJECT; +} + +int Inventory::getIndex(char* name) { + uint i = 0; + + for (i = 0; i < _inventory.size(); i++) { + if (!scumm_stricmp(_inventory[i]->name, name)) + return i; + } + return UNKNOWN_OBJECT; +} + +void Inventory::clear() { + for (uint i = 0; i < _inventory.size(); i++) { + delete _inventory[i]->name; + delete _inventory[i]; + _inventory.remove_at(i); + } +} + +} // End of namespace M4 |