diff options
author | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-03-02 16:01:51 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-03-02 16:30:10 +0100 |
commit | 8546361abaa6123acd9dc1429575d1fd1cf6a4ec (patch) | |
tree | c104ef0073dbc93ba491ecb03352402c1a8f72c4 /src/resources/beinginfo.cpp | |
parent | c7e48aaf7eb0f2df76327b963879416a0cc8d5e7 (diff) | |
download | Mana-8546361abaa6123acd9dc1429575d1fd1cf6a4ec.tar.gz Mana-8546361abaa6123acd9dc1429575d1fd1cf6a4ec.tar.bz2 Mana-8546361abaa6123acd9dc1429575d1fd1cf6a4ec.tar.xz Mana-8546361abaa6123acd9dc1429575d1fd1cf6a4ec.zip |
Added support for customizing NPC and Monster hover cursor
To match support for this in M+, since TMW uses this functionality on
two of its NPCs.
Diffstat (limited to 'src/resources/beinginfo.cpp')
-rw-r--r-- | src/resources/beinginfo.cpp | 59 |
1 files changed, 45 insertions, 14 deletions
diff --git a/src/resources/beinginfo.cpp b/src/resources/beinginfo.cpp index da65355a..e76cb8e3 100644 --- a/src/resources/beinginfo.cpp +++ b/src/resources/beinginfo.cpp @@ -26,42 +26,73 @@ #include "utils/gettext.h" +#include <optional> + BeingInfo *BeingInfo::Unknown = new BeingInfo; +static std::optional<ActorSprite::TargetCursorSize> targetCursorSizeFromString(const std::string &cursor) +{ + if (cursor == "small") return ActorSprite::TC_SMALL; + if (cursor == "medium") return ActorSprite::TC_MEDIUM; + if (cursor == "large") return ActorSprite::TC_LARGE; + + return {}; +} + +static std::optional<Cursor> cursorFromString(const std::string &cursor) +{ + if (cursor == "pointer") return Cursor::POINTER; + if (cursor == "attack") return Cursor::FIGHT; + if (cursor == "pickup") return Cursor::PICKUP; + if (cursor == "talk") return Cursor::TALK; + if (cursor == "action") return Cursor::ACTION; + if (cursor == "left") return Cursor::LEFT; + if (cursor == "up") return Cursor::UP; + if (cursor == "right") return Cursor::RIGHT; + if (cursor == "down") return Cursor::DOWN; + + return {}; +} + BeingInfo::BeingInfo(): mName(_("unnamed")), - mWalkMask(Map::BLOCKMASK_WALL | Map::BLOCKMASK_CHARACTER - | Map::BLOCKMASK_MONSTER) + mWalkMask(Map::BLOCKMASK_WALL | Map::BLOCKMASK_CHARACTER | Map::BLOCKMASK_MONSTER) { SpriteDisplay display; SpriteReference errorSprite(paths.getStringValue("spriteErrorFile"), 0); display.sprites.push_back(errorSprite); - setDisplay(display); + setDisplay(std::move(display)); } BeingInfo::~BeingInfo() = default; void BeingInfo::setDisplay(SpriteDisplay display) { - mDisplay = display; + mDisplay = std::move(display); } void BeingInfo::setTargetCursorSize(const std::string &size) { - if (size == "small") - setTargetCursorSize(ActorSprite::TC_SMALL); - else if (size == "medium") - setTargetCursorSize(ActorSprite::TC_MEDIUM); - else if (size == "large") - setTargetCursorSize(ActorSprite::TC_LARGE); - else + const auto targetCursorSize = targetCursorSizeFromString(size); + if (!targetCursorSize) + { + logger->log("Unknown targetCursor value \"%s\" for %s", + size.c_str(), getName().c_str()); + } + setTargetCursorSize(targetCursorSize.value_or(ActorSprite::TC_MEDIUM)); +} + +void BeingInfo::setHoverCursor(const std::string &cursorName) +{ + const auto cursor = cursorFromString(cursorName); + if (!cursor) { - logger->log("Unknown target cursor type \"%s\" for %s - using medium " - "sized one", size.c_str(), getName().c_str()); - setTargetCursorSize(ActorSprite::TC_MEDIUM); + logger->log("Unknown hoverCursor value \"%s\" for %s", + cursorName.c_str(), getName().c_str()); } + setHoverCursor(cursor.value_or(Cursor::POINTER)); } void BeingInfo::addSound(SoundEvent event, const std::string &filename) |