mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-11 05:36:12 +00:00
![Bastien Bouclet](/assets/img/avatar_default.png)
* Implement the mouse item description delay * Implement inventory auto close * Implement action menu auto close * Implement the action menu item description
499 lines
13 KiB
C++
499 lines
13 KiB
C++
/* ResidualVM - A 3D game interpreter
|
|
*
|
|
* ResidualVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the AUTHORS
|
|
* 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.
|
|
*
|
|
*/
|
|
|
|
#ifndef STARK_RESOURCES_ITEM_H
|
|
#define STARK_RESOURCES_ITEM_H
|
|
|
|
#include "engines/stark/resources/object.h"
|
|
#include "engines/stark/resourcereference.h"
|
|
|
|
#include "common/rect.h"
|
|
#include "common/str.h"
|
|
|
|
#include "math/vector3d.h"
|
|
|
|
namespace Stark {
|
|
|
|
class AnimHandler;
|
|
class Movement;
|
|
class Visual;
|
|
|
|
namespace Gfx {
|
|
class RenderEntry;
|
|
}
|
|
|
|
namespace Formats {
|
|
class XRCReadStream;
|
|
}
|
|
|
|
namespace Resources {
|
|
|
|
class Anim;
|
|
class AnimHierarchy;
|
|
class BonesMesh;
|
|
class Bookmark;
|
|
class ItemVisual;
|
|
class Script;
|
|
class TextureSet;
|
|
|
|
/**
|
|
* A scene element
|
|
*
|
|
* Can be a character, background, animation, ...
|
|
*/
|
|
class Item : public Object {
|
|
public:
|
|
static const Type::ResourceType TYPE = Type::kItem;
|
|
|
|
enum SubType {
|
|
kItemGlobalTemplate = 1,
|
|
kItemInventory = 2,
|
|
kItemLevelTemplate = 3,
|
|
kItemStaticProp = 5,
|
|
kItemAnimatedProp = 6,
|
|
kItemBackgroundElement = 7,
|
|
kItemBackground = 8,
|
|
kItemModel = 10
|
|
};
|
|
|
|
/** Item factory */
|
|
static Object *construct(Object *parent, byte subType, uint16 index, const Common::String &name);
|
|
|
|
Item(Object *parent, byte subType, uint16 index, const Common::String &name);
|
|
virtual ~Item();
|
|
|
|
// Resource API
|
|
virtual void readData(Formats::XRCReadStream *stream) override;
|
|
virtual void onGameLoop() override;
|
|
virtual void saveLoad(ResourceSerializer *serializer) override;
|
|
virtual void saveLoadCurrent(ResourceSerializer *serializer) override;
|
|
|
|
/** Is the item present in the scene */
|
|
bool isEnabled() const;
|
|
|
|
/** Enable or disable the item */
|
|
virtual void setEnabled(bool enabled);
|
|
|
|
/** Get the item's character index */
|
|
int32 getCharacterIndex() const;
|
|
|
|
/** Obtain the render entry to use to display the item */
|
|
virtual Gfx::RenderEntry *getRenderEntry(const Common::Point &positionOffset);
|
|
|
|
/** Obtain the concrete instance of an item template */
|
|
virtual ItemVisual *getSceneInstance() = 0;
|
|
|
|
/** Replace the current movement with an other */
|
|
void setMovement(Movement *movement);
|
|
|
|
/** Get the current movement if any */
|
|
Movement *getMovement() const;
|
|
|
|
/**
|
|
* Set the script waiting for the item's movement to complete.
|
|
*
|
|
* This script will be updated with the outcome of the movement
|
|
* (completion or abortion)
|
|
*/
|
|
void setMovementSuspendedScript(Script *script);
|
|
|
|
/** Set the currently active anim hierachy */
|
|
virtual void setAnimHierarchy(AnimHierarchy *animHierarchy) = 0;
|
|
|
|
/** List all the exit positions */
|
|
virtual Common::Array<Common::Point> listExitPositions();
|
|
|
|
protected:
|
|
void printData() override;
|
|
|
|
bool _enabled;
|
|
int32 _characterIndex;
|
|
|
|
Movement *_movement;
|
|
Script *_movementSuspendedScript;
|
|
};
|
|
|
|
/**
|
|
* A renderable item
|
|
*
|
|
* Renderable items are found in location layers
|
|
*/
|
|
class ItemVisual : public Item {
|
|
public:
|
|
ItemVisual(Object *parent, byte subType, uint16 index, const Common::String &name);
|
|
virtual ~ItemVisual();
|
|
|
|
// Resource API
|
|
virtual void readData(Formats::XRCReadStream *stream) override;
|
|
virtual void onAllLoaded() override;
|
|
virtual void saveLoad(ResourceSerializer *serializer) override;
|
|
virtual void saveLoadCurrent(ResourceSerializer *serializer) override;
|
|
|
|
// Item API
|
|
void setEnabled(bool enabled) override;
|
|
ItemVisual *getSceneInstance() override;
|
|
void setAnimHierarchy(AnimHierarchy *animHierarchy) override;
|
|
|
|
/**
|
|
* Change the item's 2D position.
|
|
*
|
|
* Only applies to 2D items
|
|
*/
|
|
virtual void setPosition2D(const Common::Point &position);
|
|
|
|
/** Get the hotspot index for an item relative position */
|
|
int getHotspotIndexForPoint(const Common::Point &point);
|
|
|
|
/** Obtain the title for one of the item's hotspots */
|
|
Common::String getHotspotTitle(uint32 hotspotIndex);
|
|
|
|
/** Check whether the item has runnable scripts for the specified action */
|
|
bool canPerformAction(uint32 action, uint32 hotspotIndex);
|
|
|
|
/** Perform an action on one of the item's hotspots */
|
|
bool doAction(uint32 action, uint32 hotspotIndex);
|
|
|
|
/** Define the current animation kind for the item */
|
|
void setAnimActivity(int32 activity);
|
|
|
|
/** Get the current animation kind */
|
|
int32 getAnimActivity() const;
|
|
|
|
/** Get the currently playing animation */
|
|
Anim *getAnim() const;
|
|
|
|
/** Get the currently playing action animation, if any */
|
|
Anim *getActionAnim() const;
|
|
|
|
/** Replace the current generic animation with an action specific animation */
|
|
void playActionAnim(Anim *anim);
|
|
|
|
/** Remove the current specific animation and revert to a generic one */
|
|
void resetActionAnim();
|
|
|
|
protected:
|
|
// Resource API
|
|
void printData() override;
|
|
|
|
/** Implemented version used in FloorPositionedImageItem and ImageItem */
|
|
Common::Array<Common::Point> listExitPositionsImpl();
|
|
|
|
Visual *getVisual();
|
|
|
|
Gfx::RenderEntry *_renderEntry;
|
|
|
|
Anim *_actionAnim;
|
|
AnimHierarchy *_animHierarchy;
|
|
int32 _currentAnimActivity;
|
|
bool _clickable;
|
|
};
|
|
|
|
/**
|
|
* An item template
|
|
*
|
|
* Item templates need to be instanciated into renderable items to be displayed
|
|
*/
|
|
class ItemTemplate : public Item {
|
|
public:
|
|
ItemTemplate(Object *parent, byte subType, uint16 index, const Common::String &name);
|
|
virtual ~ItemTemplate();
|
|
|
|
// Resource API
|
|
void onAllLoaded() override;
|
|
void onEnterLocation() override;
|
|
void saveLoadCurrent(ResourceSerializer *serializer) override;
|
|
|
|
// Item API
|
|
ItemVisual *getSceneInstance() override;
|
|
void setAnimHierarchy(AnimHierarchy *animHierarchy) override;
|
|
|
|
/** Obtain the bone mesh to use to render the item */
|
|
virtual BonesMesh *findBonesMesh() = 0;
|
|
|
|
/** Obtain the texture to use to render the item */
|
|
virtual TextureSet *findTextureSet(uint32 textureType) = 0;
|
|
|
|
/** Obtain the animation hierarchy to fetch animations from */
|
|
virtual AnimHierarchy *findStockAnimHierarchy() = 0;
|
|
|
|
/** Define the anim hierarchy to be persisted across locations */
|
|
void setStockAnimHierachy(AnimHierarchy *animHierarchy);
|
|
|
|
/** Change the item's mesh */
|
|
void setBonesMesh(int32 index);
|
|
|
|
/** Set the mesh main or face texture */
|
|
void setTexture(int32 index, uint32 textureType);
|
|
|
|
/** Set the scene instanciation for this template */
|
|
void setInstanciatedItem(Item *instance);
|
|
|
|
protected:
|
|
int32 _meshIndex;
|
|
int32 _textureNormalIndex;
|
|
int32 _textureFaceIndex;
|
|
int32 _animHierarchyIndex;
|
|
|
|
Item *_instanciatedItem;
|
|
ItemTemplate *_referencedItem;
|
|
};
|
|
|
|
/**
|
|
* A global item template
|
|
*
|
|
* Global item templates are found in the global level
|
|
*/
|
|
class GlobalItemTemplate : public ItemTemplate {
|
|
public:
|
|
GlobalItemTemplate(Object *parent, byte subType, uint16 index, const Common::String &name);
|
|
virtual ~GlobalItemTemplate();
|
|
|
|
// ItemTemplate API
|
|
BonesMesh *findBonesMesh() override;
|
|
TextureSet *findTextureSet(uint32 textureType) override;
|
|
AnimHierarchy *findStockAnimHierarchy() override;
|
|
|
|
protected:
|
|
};
|
|
|
|
/**
|
|
* An inventory item
|
|
*/
|
|
class InventoryItem : public ItemVisual {
|
|
public:
|
|
InventoryItem(Object *parent, byte subType, uint16 index, const Common::String &name);
|
|
virtual ~InventoryItem();
|
|
|
|
// Item API
|
|
Gfx::RenderEntry *getRenderEntry(const Common::Point &positionOffset) override;
|
|
void setEnabled(bool enabled) override;
|
|
|
|
/** Obtain an action menu icon */
|
|
Visual *getActionVisual(bool active) const;
|
|
|
|
/** Obtain an inventory item cursor */
|
|
Visual *getCursorVisual() const;
|
|
|
|
protected:
|
|
};
|
|
|
|
/**
|
|
* A level item template
|
|
*
|
|
* Level item templates are found in levels so that they can be shared between
|
|
* locations.
|
|
*/
|
|
class LevelItemTemplate : public ItemTemplate {
|
|
public:
|
|
LevelItemTemplate(Object *parent, byte subType, uint16 index, const Common::String &name);
|
|
virtual ~LevelItemTemplate();
|
|
|
|
// Resource API
|
|
void readData(Formats::XRCReadStream *stream) override;
|
|
void onAllLoaded() override;
|
|
|
|
// ItemTemplate API
|
|
BonesMesh *findBonesMesh() override;
|
|
TextureSet *findTextureSet(uint32 textureType) override;
|
|
AnimHierarchy *findStockAnimHierarchy() override;
|
|
|
|
/** Get the item's level or global template if any */
|
|
ItemTemplate *getItemTemplate() const;
|
|
|
|
protected:
|
|
void printData() override;
|
|
|
|
ResourceReference _reference;
|
|
};
|
|
|
|
/**
|
|
* 3D positioned item
|
|
*
|
|
* Items with a 3D position, used in 3D layers. The sort key determines the order
|
|
* in which such items are drawn in.
|
|
*/
|
|
class FloorPositionedItem : public ItemVisual {
|
|
public:
|
|
FloorPositionedItem(Object *parent, byte subType, uint16 index, const Common::String &name);
|
|
virtual ~FloorPositionedItem();
|
|
|
|
// Object API
|
|
void saveLoad(ResourceSerializer *serializer) override;
|
|
|
|
/** Move the item to a bookmarked position */
|
|
void placeOnBookmark(Bookmark *target);
|
|
|
|
/** Place the item on the center of the first floor face */
|
|
void placeDefaultPosition();
|
|
|
|
/** Get the item position */
|
|
Math::Vector3d getPosition3D() const;
|
|
/** Move the item */
|
|
void setPosition3D(const Math::Vector3d &position);
|
|
|
|
/** Get the floor face index the item is standing on */
|
|
int32 getFloorFaceIndex() const;
|
|
/** Change the face the item is standing on */
|
|
void setFloorFaceIndex(int32 faceIndex);
|
|
|
|
/** Get a vector pointing in the same direction as the item */
|
|
Math::Vector3d getDirectionVector() const;
|
|
|
|
/** Set the direction the item faces */
|
|
void setDirection(const Math::Angle &direction);
|
|
|
|
/** Obtain the sort value for the item, used to compute the draw order */
|
|
float getSortKey() const;
|
|
|
|
/**
|
|
* Don't rely on the floor face to compute the sort key, use the provided value instead.
|
|
*
|
|
* This can be used to handle cases where the item is not over the floor.
|
|
*/
|
|
void overrideSortKey(float sortKey);
|
|
|
|
protected:
|
|
int32 _floorFaceIndex;
|
|
Math::Vector3d _position3D;
|
|
float _direction3D;
|
|
|
|
bool _sortKeyOverride;
|
|
float _sortKeyOverridenValue;
|
|
};
|
|
|
|
/**
|
|
* 3D positioned image item
|
|
*
|
|
* Used to display still images or animated images in 3D layers
|
|
*/
|
|
class FloorPositionedImageItem : public FloorPositionedItem {
|
|
public:
|
|
FloorPositionedImageItem(Object *parent, byte subType, uint16 index, const Common::String &name);
|
|
virtual ~FloorPositionedImageItem();
|
|
|
|
// Resource API
|
|
virtual void readData(Formats::XRCReadStream *stream) override;
|
|
|
|
// Item API
|
|
Gfx::RenderEntry *getRenderEntry(const Common::Point &positionOffset) override;
|
|
Common::Array<Common::Point> listExitPositions() override;
|
|
|
|
// ItemVisual API
|
|
void setPosition2D(const Common::Point &position) override;
|
|
|
|
protected:
|
|
void printData() override;
|
|
|
|
Common::Point _position;
|
|
};
|
|
|
|
/**
|
|
* Model item
|
|
*
|
|
* Used to draw characters
|
|
*/
|
|
class ModelItem : public FloorPositionedItem {
|
|
public:
|
|
ModelItem(Object *parent, byte subType, uint16 index, const Common::String &name);
|
|
virtual ~ModelItem();
|
|
|
|
// Resource API
|
|
void readData(Formats::XRCReadStream *stream) override;
|
|
void onAllLoaded() override;
|
|
void onEnterLocation() override;
|
|
void onExitLocation() override;
|
|
void saveLoadCurrent(ResourceSerializer *serializer) override;
|
|
|
|
// Item API
|
|
Gfx::RenderEntry *getRenderEntry(const Common::Point &positionOffset) override;
|
|
|
|
/** Set the mesh main or face texture */
|
|
void setTexture(int32 index, uint32 textureType);
|
|
|
|
/** Change the item's mesh */
|
|
void setBonesMesh(int32 index);
|
|
|
|
/** Obtain the bone mesh to use to render the item */
|
|
BonesMesh *findBonesMesh();
|
|
|
|
/** Obtain the texture to use to render the item */
|
|
TextureSet *findTextureSet(uint32 textureType);
|
|
|
|
/** Get the item's level or global template if any */
|
|
ItemTemplate *getItemTemplate() const;
|
|
|
|
/** Update the item's animation after a texture / mesh change */
|
|
void updateAnim();
|
|
|
|
/** Reset animation blending */
|
|
void resetAnimationBlending();
|
|
|
|
/** Randomize an idle action animation */
|
|
Anim *getIdleActionAnim() const;
|
|
|
|
AnimHandler *getAnimHandler() const;
|
|
|
|
protected:
|
|
void printData() override;
|
|
|
|
int32 _meshIndex;
|
|
int32 _textureNormalIndex;
|
|
int32 _textureFaceIndex;
|
|
|
|
ResourceReference _reference;
|
|
ItemTemplate *_referencedItem;
|
|
|
|
AnimHandler *_animHandler;
|
|
};
|
|
|
|
/**
|
|
* 2D positioned image item
|
|
*
|
|
* Used to display background elements in 2D layers
|
|
*/
|
|
class ImageItem : public ItemVisual {
|
|
public:
|
|
ImageItem(Object *parent, byte subType, uint16 index, const Common::String &name);
|
|
virtual ~ImageItem();
|
|
|
|
// Resource API
|
|
virtual void readData(Formats::XRCReadStream *stream) override;
|
|
|
|
// Item API
|
|
Gfx::RenderEntry *getRenderEntry(const Common::Point &positionOffset) override;
|
|
Common::Array<Common::Point> listExitPositions() override;
|
|
|
|
// ItemVisual API
|
|
void setPosition2D(const Common::Point &position) override;
|
|
|
|
protected:
|
|
void printData() override;
|
|
|
|
ResourceReference _reference;
|
|
Common::Point _position;
|
|
};
|
|
|
|
} // End of namespace Resources
|
|
} // End of namespace Stark
|
|
|
|
#endif // STARK_RESOURCES_ITEM_H
|