diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2025-01-21 09:07:37 +1100 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2025-01-21 09:07:37 +1100 |
commit | 3f8b480b21538a97e6256ad7a0fcb95cb1b27e46 (patch) | |
tree | 9c0353ebb114127fd9ca11d1339e478b994fb434 /source/game | |
parent | 449d05d195cf7b3215a2338afa593bfcef052796 (diff) |
let chest and leg armor override humanoid config values
Diffstat (limited to 'source/game')
-rw-r--r-- | source/game/StarArmorWearer.cpp | 84 | ||||
-rw-r--r-- | source/game/StarHumanoid.cpp | 10 | ||||
-rw-r--r-- | source/game/StarHumanoid.hpp | 5 |
3 files changed, 51 insertions, 48 deletions
diff --git a/source/game/StarArmorWearer.cpp b/source/game/StarArmorWearer.cpp index 89bebe3..f4dba55 100644 --- a/source/game/StarArmorWearer.cpp +++ b/source/game/StarArmorWearer.cpp @@ -40,79 +40,73 @@ void ArmorWearer::setupHumanoidClothingDrawables(Humanoid& humanoid, bool forceN bool backNeedsSync = nudeChanged || m_backNeedsSync; bool bodyHidden = false; - if (m_headCosmeticItem && !forceNude) { + HeadArmorPtr const& headArmor = m_headCosmeticItem ? m_headCosmeticItem : m_headItem; + if (headArmor && !forceNude) { if (headNeedsSync) { - humanoid.setHeadArmorFrameset(m_headCosmeticItem->frameset(humanoid.identity().gender)); - humanoid.setHeadArmorDirectives(m_headCosmeticItem->directives()); - humanoid.setHelmetMaskDirectives(m_headCosmeticItem->maskDirectives()); + humanoid.setHeadArmorFrameset(headArmor->frameset(humanoid.identity().gender)); + humanoid.setHeadArmorDirectives(headArmor->directives()); + humanoid.setHelmetMaskDirectives(headArmor->maskDirectives()); } - bodyHidden = bodyHidden || m_headCosmeticItem->hideBody(); - } else if (m_headItem && !forceNude) { - if (headNeedsSync) { - humanoid.setHeadArmorFrameset(m_headItem->frameset(humanoid.identity().gender)); - humanoid.setHeadArmorDirectives(m_headItem->directives()); - humanoid.setHelmetMaskDirectives(m_headItem->maskDirectives()); - } - bodyHidden = bodyHidden || m_headItem->hideBody(); + bodyHidden = bodyHidden || headArmor->hideBody(); } else { humanoid.setHeadArmorFrameset(""); humanoid.setHelmetMaskDirectives(""); } - if (m_chestCosmeticItem && !forceNude) { - if (chestNeedsSync) { - humanoid.setBackSleeveFrameset(m_chestCosmeticItem->backSleeveFrameset(humanoid.identity().gender)); - humanoid.setFrontSleeveFrameset(m_chestCosmeticItem->frontSleeveFrameset(humanoid.identity().gender)); - humanoid.setChestArmorFrameset(m_chestCosmeticItem->bodyFrameset(humanoid.identity().gender)); - humanoid.setChestArmorDirectives(m_chestCosmeticItem->directives()); + Json humanoidConfig; + + auto addHumanoidConfig = [&](Item const& item) { + auto newConfig = item.instanceValue("humanoidConfig"); + if (newConfig.isType(Json::Type::Object)) { + if (!humanoidConfig) + humanoidConfig = JsonObject(); + humanoidConfig = jsonMerge(humanoidConfig, newConfig); } - bodyHidden = bodyHidden || m_chestCosmeticItem->hideBody(); - } else if (m_chestItem && !forceNude) { + }; + + ChestArmorPtr const& chestArmor = m_chestCosmeticItem ? m_chestCosmeticItem : m_chestItem; + if (chestArmor && !forceNude) { if (chestNeedsSync) { - humanoid.setBackSleeveFrameset(m_chestItem->backSleeveFrameset(humanoid.identity().gender)); - humanoid.setFrontSleeveFrameset(m_chestItem->frontSleeveFrameset(humanoid.identity().gender)); - humanoid.setChestArmorFrameset(m_chestItem->bodyFrameset(humanoid.identity().gender)); - humanoid.setChestArmorDirectives(m_chestItem->directives()); + humanoid.setBackSleeveFrameset(chestArmor->backSleeveFrameset(humanoid.identity().gender)); + humanoid.setFrontSleeveFrameset(chestArmor->frontSleeveFrameset(humanoid.identity().gender)); + humanoid.setChestArmorFrameset(chestArmor->bodyFrameset(humanoid.identity().gender)); + humanoid.setChestArmorDirectives(chestArmor->directives()); + addHumanoidConfig(*chestArmor); } - bodyHidden = bodyHidden || m_chestItem->hideBody(); + bodyHidden = bodyHidden || chestArmor->hideBody(); } else { humanoid.setBackSleeveFrameset(""); humanoid.setFrontSleeveFrameset(""); humanoid.setChestArmorFrameset(""); } - if (m_legsCosmeticItem && !forceNude) { + LegsArmorPtr const& legsArmor = m_legsCosmeticItem ? m_legsCosmeticItem : m_legsItem; + if (legsArmor && !forceNude) { if (legsNeedsSync) { - humanoid.setLegsArmorFrameset(m_legsCosmeticItem->frameset(humanoid.identity().gender)); - humanoid.setLegsArmorDirectives(m_legsCosmeticItem->directives()); + humanoid.setLegsArmorFrameset(legsArmor->frameset(humanoid.identity().gender)); + humanoid.setLegsArmorDirectives(legsArmor->directives()); + addHumanoidConfig(*chestArmor); } - bodyHidden = bodyHidden || m_legsCosmeticItem->hideBody(); - } else if (m_legsItem && !forceNude) { - if (legsNeedsSync) { - humanoid.setLegsArmorFrameset(m_legsItem->frameset(humanoid.identity().gender)); - humanoid.setLegsArmorDirectives(m_legsItem->directives()); - } - bodyHidden = bodyHidden || m_legsItem->hideBody(); + bodyHidden = bodyHidden || legsArmor->hideBody(); } else { humanoid.setLegsArmorFrameset(""); } - if (m_backCosmeticItem && !forceNude) { - if (backNeedsSync) { - humanoid.setBackArmorFrameset(m_backCosmeticItem->frameset(humanoid.identity().gender)); - humanoid.setBackArmorDirectives(m_backCosmeticItem->directives()); - } - bodyHidden = bodyHidden || m_backCosmeticItem->hideBody(); - } else if (m_backItem && !forceNude) { + BackArmorPtr const& backArmor = m_backCosmeticItem ? m_backCosmeticItem : m_backItem; + if (backArmor && !forceNude) { if (backNeedsSync) { - humanoid.setBackArmorFrameset(m_backItem->frameset(humanoid.identity().gender)); - humanoid.setBackArmorDirectives(m_backItem->directives()); + humanoid.setBackArmorFrameset(backArmor->frameset(humanoid.identity().gender)); + humanoid.setBackArmorDirectives(backArmor->directives()); } - bodyHidden = bodyHidden || m_backItem->hideBody(); + bodyHidden = bodyHidden || backArmor->hideBody(); } else { humanoid.setBackArmorFrameset(""); } + if (chestNeedsSync || legsNeedsSync) { + humanoid.loadConfig(humanoidConfig); + } + m_headNeedsSync = m_chestNeedsSync = m_legsNeedsSync = m_backNeedsSync = false; humanoid.setBodyHidden(bodyHidden); diff --git a/source/game/StarHumanoid.cpp b/source/game/StarHumanoid.cpp index 2acc632..e446142 100644 --- a/source/game/StarHumanoid.cpp +++ b/source/game/StarHumanoid.cpp @@ -251,7 +251,8 @@ bool& Humanoid::globalHeadRotation() { }; Humanoid::Humanoid(Json const& config) { - loadConfig(config); + m_baseConfig = config; + loadConfig(JsonObject()); m_twoHanded = false; m_primaryHand.holdingItem = false; @@ -293,7 +294,12 @@ HumanoidIdentity const& Humanoid::identity() const { return m_identity; } -void Humanoid::loadConfig(Json const& config) { +void Humanoid::loadConfig(Json merger) { + if (m_mergeConfig == merger) + return; + + m_mergeConfig = merger; + auto config = jsonMerge(m_baseConfig, merger); m_timing = HumanoidTiming(config.getObject("humanoidTiming")); m_globalOffset = jsonToVec2F(config.get("globalOffset")) / TilePixels; diff --git a/source/game/StarHumanoid.hpp b/source/game/StarHumanoid.hpp index d43c5ef..d11de1d 100644 --- a/source/game/StarHumanoid.hpp +++ b/source/game/StarHumanoid.hpp @@ -127,7 +127,7 @@ public: void setIdentity(HumanoidIdentity const& identity); HumanoidIdentity const& identity() const; - void loadConfig(Json const& config); + void loadConfig(Json merger = JsonObject()); // All of the image identifiers here are meant to be image *base* names, with // a collection of frames specific to each piece. If an image is set to @@ -308,6 +308,9 @@ private: Maybe<DancePtr> getDance() const; + Json m_baseConfig; + Json m_mergeConfig; + Vec2F m_globalOffset; Vec2F m_headRunOffset; Vec2F m_headSwimOffset; |