diff --git a/CMake/Assets.cmake b/CMake/Assets.cmake index 66d6dbd0d..4af5991a6 100644 --- a/CMake/Assets.cmake +++ b/CMake/Assets.cmake @@ -148,6 +148,9 @@ set(devilutionx_assets nlevels/cutl6w.clx nlevels/l5data/cornerstone.dun nlevels/l5data/uberroom.dun + plrgfx/warrior/whu/whufm.trn + plrgfx/warrior/whu/whulm.trn + plrgfx/warrior/whu/whuqm.trn txtdata/Experience.tsv txtdata/classes/barbarian/attributes.tsv txtdata/classes/bard/attributes.tsv diff --git a/Source/engine/trn.cpp b/Source/engine/trn.cpp index 051353672..578bc3dbc 100644 --- a/Source/engine/trn.cpp +++ b/Source/engine/trn.cpp @@ -65,4 +65,16 @@ std::optional> GetClassTRN(Player &player) return std::nullopt; } +std::optional> GetPlayerGraphicTRN(const char *pszName) +{ + char path[MaxMpqPathSize]; + *BufCopy(path, pszName, ".trn") = '\0'; + + std::array trn; + if (LoadOptionalFileInMem(path, &trn[0], 256)) { + return trn; + } + return std::nullopt; +} + } // namespace devilution diff --git a/Source/engine/trn.hpp b/Source/engine/trn.hpp index 3f682a742..42f379c82 100644 --- a/Source/engine/trn.hpp +++ b/Source/engine/trn.hpp @@ -16,5 +16,6 @@ uint8_t *GetInfravisionTRN(); uint8_t *GetStoneTRN(); uint8_t *GetPauseTRN(); std::optional> GetClassTRN(Player &player); +std::optional> GetPlayerGraphicTRN(const char *pszName); } // namespace devilution diff --git a/Source/player.cpp b/Source/player.cpp index fdd78b0a3..45fb5e26d 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -2134,9 +2134,13 @@ void LoadPlrGFX(Player &player, player_graphic graphic) *fmt::format_to(pszName, R"(plrgfx\{0}\{1}\{1}{2})", path, std::string_view(prefix, 3), szCel) = 0; const uint16_t animationWidth = GetPlayerSpriteWidth(cls, graphic, animWeaponId); animationData.sprites = LoadCl2Sheet(pszName, animationWidth); - std::optional> trn = GetClassTRN(player); - if (trn) { - ClxApplyTrans(*animationData.sprites, trn->data()); + std::optional> graphicTRN = GetPlayerGraphicTRN(pszName); + if (graphicTRN) { + ClxApplyTrans(*animationData.sprites, graphicTRN->data()); + } + std::optional> classTRN = GetClassTRN(player); + if (classTRN) { + ClxApplyTrans(*animationData.sprites, classTRN->data()); } } diff --git a/assets/plrgfx/warrior/whu/whufm.trn b/assets/plrgfx/warrior/whu/whufm.trn new file mode 100644 index 000000000..34b6a5cf9 Binary files /dev/null and b/assets/plrgfx/warrior/whu/whufm.trn differ diff --git a/assets/plrgfx/warrior/whu/whulm.trn b/assets/plrgfx/warrior/whu/whulm.trn new file mode 100644 index 000000000..34b6a5cf9 Binary files /dev/null and b/assets/plrgfx/warrior/whu/whulm.trn differ diff --git a/assets/plrgfx/warrior/whu/whuqm.trn b/assets/plrgfx/warrior/whu/whuqm.trn new file mode 100644 index 000000000..34b6a5cf9 Binary files /dev/null and b/assets/plrgfx/warrior/whu/whuqm.trn differ