diff --git a/include/d/actor/d_a_obj_life_container.h b/include/d/actor/d_a_obj_life_container.h index 1b98c1afe8..d832c63843 100644 --- a/include/d/actor/d_a_obj_life_container.h +++ b/include/d/actor/d_a_obj_life_container.h @@ -92,6 +92,7 @@ private: u8 mOriginalItemNo; bool mItemOverridden; bool mOverrideHover; + bool mGoldenWolfItem; #endif }; diff --git a/sdk/include/mods/items.h b/sdk/include/mods/items.h index e10b6df639..e0b1cae2d9 100644 --- a/sdk/include/mods/items.h +++ b/sdk/include/mods/items.h @@ -8,6 +8,7 @@ #define ITEM_CHECK_BUG_PREFIX "bug:" /* */ #define ITEM_CHECK_CHEST_PREFIX "chest:" /* : */ #define ITEM_CHECK_FREESTANDING_PREFIX "freestanding:" /* : */ +#define ITEM_CHECK_GOLDEN_WOLF_PREFIX "golden_wolf:" /* */ #define ITEM_CHECK_POE_PREFIX "poe:" /* : */ #define ITEM_CHECK_SHOP_PREFIX "shop:" /* : */ #define ITEM_CHECK_SKY_PREFIX "sky:" /* : */ diff --git a/src/d/actor/d_a_obj_life_container.cpp b/src/d/actor/d_a_obj_life_container.cpp index cd58c828dc..815d03f390 100644 --- a/src/d/actor/d_a_obj_life_container.cpp +++ b/src/d/actor/d_a_obj_life_container.cpp @@ -159,9 +159,19 @@ int daObjLife_c::create() { if (mItemOverridden) { fopAcM_SetParam(this, (params & 0xFFFFFF00) | resolvedItem); } + } else if (mGoldenWolfItem) { + mOriginalItemNo = mItemGiveOriginalNo; + const u16 obtainedItemFlag = static_cast(field_0x938); + const u8 resolvedItem = + dusk::mods::item_check_golden_wolf(obtainedItemFlag, mOriginalItemNo, this); + mItemGiveTag = dusk::mods::item_give_tag_golden_wolf(obtainedItemFlag); + mItemOverridden = resolvedItem != mOriginalItemNo; + if (resolvedItem != parameterItemNo) { + fopAcM_SetParam(this, (params & 0xFFFFFF00) | resolvedItem); + } } else { mOriginalItemNo = mItemGiveOriginalNo; - mItemOverridden = parameterItemNo != mItemGiveOriginalNo; + mItemOverridden = parameterItemNo != mOriginalItemNo; } mOverrideHover = mItemOverridden && diff --git a/src/dusk/mods/item.hpp b/src/dusk/mods/item.hpp index 5577358f38..f27079427e 100644 --- a/src/dusk/mods/item.hpp +++ b/src/dusk/mods/item.hpp @@ -25,12 +25,14 @@ ItemCheckResult item_check_commit(uint32_t giveTag, uint8_t itemNo, fopAc_ac_c* uint8_t item_check_chest(uint8_t boxNo, uint8_t itemNo, fopAc_ac_c* chest); uint8_t item_check_boss(uint8_t itemNo, fopAc_ac_c* boss); uint8_t item_check_freestanding(uint8_t bitNo, uint8_t itemNo, fopAc_ac_c* item); +uint8_t item_check_golden_wolf(uint16_t eventFlag, uint8_t itemNo, fopAc_ac_c* item); uint8_t item_check_shop(uint8_t itemNo, fopAc_ac_c* giver); uint32_t item_give_tag(const char* name); uint32_t item_give_tag_chest(uint8_t boxNo); uint32_t item_give_tag_boss(); uint32_t item_give_tag_freestanding(uint8_t bitNo); +uint32_t item_give_tag_golden_wolf(uint16_t eventFlag); uint32_t item_give_tag_poe(uint8_t bitNo); uint32_t item_give_tag_shop(uint8_t itemNo); uint32_t item_give_tag_bug(uint8_t insectId); diff --git a/src/dusk/mods/item_checks.cpp b/src/dusk/mods/item_checks.cpp index 1684310c42..6327a07e0a 100644 --- a/src/dusk/mods/item_checks.cpp +++ b/src/dusk/mods/item_checks.cpp @@ -143,6 +143,10 @@ std::string freestanding_check_name(uint8_t bitNo) { return fmt::format("freestanding:{}:{}", current_stage_name(), bitNo); } +std::string golden_wolf_check_name(uint16_t eventFlag) { + return fmt::format("golden_wolf:{}", eventFlag); +} + std::string poe_check_name(uint8_t bitNo) { return fmt::format("poe:{}:{}", current_stage_name(), bitNo); } @@ -274,6 +278,14 @@ uint8_t item_check_freestanding(uint8_t bitNo, uint8_t itemNo, fopAc_ac_c* item) return item_check(name.c_str(), itemNo, item); } +uint8_t item_check_golden_wolf(uint16_t eventFlag, uint8_t itemNo, fopAc_ac_c* item) { + if (s_modChecks.empty()) { + return itemNo; + } + const auto name = golden_wolf_check_name(eventFlag); + return item_check(name.c_str(), itemNo, item); +} + uint8_t item_check_shop(uint8_t itemNo, fopAc_ac_c* giver) { if (s_modChecks.empty()) { return itemNo; @@ -314,6 +326,10 @@ uint32_t item_give_tag_freestanding(uint8_t bitNo) { return item_give_tag(freestanding_check_name(bitNo).c_str()); } +uint32_t item_give_tag_golden_wolf(uint16_t eventFlag) { + return item_give_tag(golden_wolf_check_name(eventFlag).c_str()); +} + uint32_t item_give_tag_poe(uint8_t bitNo) { return item_give_tag(poe_check_name(bitNo).c_str()); }