ItemService improvements (#2322)

* ItemService improvements

* Move Poe increment to item
This commit is contained in:
Luke Street
2026-08-21 00:50:51 -06:00
committed by GitHub
parent 172d06f38d
commit 5f0f3d4ebe
43 changed files with 851 additions and 181 deletions
+24 -1
View File
@@ -1027,6 +1027,9 @@ void daAlink_c::setGetItemFace(u16 i_itemNo) {
|| i_itemNo == dItemNo_ANCIENT_DOCUMENT2_e
|| i_itemNo == dItemNo_DROP_CONTAINER_e
|| i_itemNo == dItemNo_DROP_CONTAINER02_e
#if TARGET_PC
|| i_itemNo == dItemNo_SHADOW_CRYSTAL_e
#endif
|| i_itemNo == dItemNo_DROP_CONTAINER03_e)
{
setFaceBasicBck(dRes_ID_ALANM_BCK_FI_e);
@@ -2009,7 +2012,11 @@ void daAlink_c::setGetSubBgm(int i_itemNo) {
/* dItemNo_WEAR_KOKIRI_e */ SETYPE_NONE,
/* dItemNo_ARMOR_e */ SETYPE_ITEM_GET,
/* dItemNo_WEAR_ZORA_e */ SETYPE_ITEM_GET,
#if TARGET_PC
/* dItemNo_SHADOW_CRYSTAL_e */ SETYPE_ITEM_GET,
#else
/* dItemNo_MAGIC_LV1_e */ SETYPE_NONE,
#endif
/* dItemNo_DUNGEON_EXIT_2_e */ SETYPE_ITEM_GET_MINI,
/* dItemNo_WALLET_LV1_e */ SETYPE_NONE,
/* dItemNo_WALLET_LV2_e */ SETYPE_ITEM_GET,
@@ -2307,8 +2314,13 @@ int daAlink_c::procCoGetItemInit() {
item_no = dComIfGp_event_getGtItm();
}
#if TARGET_PC
const u32 giveTag = mDemo.getParam0() != 0x100 && mDemo.getParam1() != 0 ?
static_cast<u32>(mDemo.getParam1()) :
dusk::mods::item_give_queue_take_tag();
#endif
fpc_ProcID item_partner_id = fopAcM_createItemForPresentDemo(&current.pos, item_no, 0, -1,
fopAcM_GetRoomNo(this), NULL, NULL IF_DUSK_ARG(dusk::mods::item_give_queue_take_tag()));
fopAcM_GetRoomNo(this), NULL, NULL IF_DUSK_ARG(giveTag));
if (item_partner_id != fpcM_ERROR_PROCESS_ID_e) {
dComIfGp_event_setItemPartnerId(item_partner_id);
}
@@ -2533,6 +2545,16 @@ int daAlink_c::procCoGetItem() {
} else if (mProcVar2.field_0x300c == 0x23 && checkStageName("D_MN11")) {
field_0x32cc = 0x5C0;
} else if (mProcVar2.field_0x300c == 0xE0) {
#if TARGET_PC
// Dusklight increments the Poe count when the displayed item is granted.
if (dComIfGs_getPohSpiritNum() + 1 == 20) {
field_0x32cc = 0x4CF;
} else if (dComIfGs_getPohSpiritNum() + 1 == 60) {
field_0x32cc = 0x4D0;
} else {
field_0x32cc = mProcVar2.field_0x300c + 0x65;
}
#else
if (dComIfGs_getPohSpiritNum() == 20) {
field_0x32cc = 0x4CF;
} else if (dComIfGs_getPohSpiritNum() == 60) {
@@ -2540,6 +2562,7 @@ int daAlink_c::procCoGetItem() {
} else {
field_0x32cc = mProcVar2.field_0x300c + 0x65;
}
#endif
} else if (mProcVar2.field_0x300c == 0x21) {
static u32 const heartPieceMessage[5] = {0x86, 0x9C, 0x9D, 0x9E, 0x9F};
field_0x32cc = heartPieceMessage[dComIfGs_getMaxLife() % 5];
+6 -1
View File
@@ -19,6 +19,10 @@
#include "f_op/f_op_actor_enemy.h"
#include "Z2AudioLib/Z2Instances.h"
#if TARGET_PC
#include "mods/items.h"
#endif
enum daB_DS_Joint {
DS_JNT_BACKBONE1,
DS_JNT_BACKBONE2,
@@ -4086,7 +4090,8 @@ void daB_DS_c::executeBattle2Dead() {
dComIfGs_onStageBossEnemy(0x13);
#if TARGET_PC
// This reward has no original grant at this point in the cutscene.
dusk::mods::item_check_enqueue("Arbiters Grounds Dungeon Reward", dItemNo_NONE_e);
dusk::mods::item_check_enqueue_deferred(
ITEM_CHECK_DUNGEON_REWARD_ARBITERS, dItemNo_NONE_e);
#endif
/* dSv_event_flag_c::F_0265 - Arbiter's Grounds - Arbiter's Grounds clear */
dComIfGs_onEventBit(0x2010);
+7
View File
@@ -1090,6 +1090,13 @@ inline int daDemo00_c::execute() {
break;
}
case 1:
#if TARGET_PC
// Suppress demo22_01's M_077 write. On Dusklight, the transform flag
// is set by the Shadow Crystal item.
if (dSv_event_flag_c::saveBitLabels[sp0E] == dSv_event_flag_c::M_077) {
break;
}
#endif
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[sp0E]);
break;
+14 -8
View File
@@ -727,19 +727,25 @@ void daE_HP_c::executeDead() {
}
#if TARGET_PC
mItemCheckOverridden =
dusk::mods::item_check_poe(bitSw, dItemNo_POU_SPIRIT_e, this) != dItemNo_POU_SPIRIT_e;
if (mItemCheckOverridden) {
dusk::mods::item_check_enqueue_poe(bitSw, dItemNo_POU_SPIRIT_e);
} else
const auto itemCheck = dusk::mods::item_check_commit(
dusk::mods::item_give_tag_poe(bitSw), dItemNo_POU_SPIRIT_e, this);
mItemCheckHandled = true;
if (itemCheck.itemNo == dItemNo_NONE_e) {
dusk::mods::item_check_complete(itemCheck, this);
} else {
dusk::mods::item_check_enqueue(itemCheck, dusk::mods::ItemGiveMode::ForcedDemo);
}
#else
dComIfGs_addPohSpiritNum();
#endif
dComIfGs_addPohSpiritNum();
field_0x784 = -1;
if (dComIfGs_getPohSpiritNum() == 20 IF_DUSK(&&!mItemCheckOverridden)) {
#if !TARGET_PC
if (dComIfGs_getPohSpiritNum() == 20) {
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[0x1c9]);
}
#endif
movemode++;
}
@@ -759,7 +765,7 @@ void daE_HP_c::executeDead() {
field_0x788 = 1;
}
}
} else if (field_0x788 != 0 IF_DUSK(|| mItemCheckOverridden)) {
} else if (field_0x788 != 0 IF_DUSK(|| mItemCheckHandled)) {
fopAcM_createDisappear(this, &current.pos, 8, 3, 0xff);
fopAcM_delete(this);
} else {
+21 -12
View File
@@ -1133,21 +1133,24 @@ static void e_po_dead(e_po_class* i_this) {
camera_player->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
#if TARGET_PC
if (dusk::mods::item_check_poe(i_this->BitSW, dItemNo_POU_SPIRIT_e, a_this) ==
dItemNo_POU_SPIRIT_e)
{
#endif
dComIfGs_addPohSpiritNum();
const auto itemCheck = dusk::mods::item_check_commit(
dusk::mods::item_give_tag_poe(i_this->BitSW), dItemNo_POU_SPIRIT_e, a_this);
daPy_getPlayerActorClass()->cancelOriginalDemo();
if (itemCheck.itemNo == dItemNo_NONE_e) {
dusk::mods::item_check_complete(itemCheck, a_this);
} else {
dusk::mods::item_check_enqueue(itemCheck, dusk::mods::ItemGiveMode::ForcedDemo);
}
#else
dComIfGs_addPohSpiritNum();
#if !PLATFORM_SHIELD
if (dComIfGs_getPohSpiritNum() == 0x14) {
/* dSv_event_flag_c::F_0457 - Castle Town - Revived cat */
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[457]);
}
#endif
#if TARGET_PC
}
#endif
daPy_getPlayerActorClass()->cancelOriginalDemo();
#endif
} else if (mArg0Check(i_this, 0) != 0) {
if (!fopAcM_isSwitch(a_this, 0x22)) {
if (fopAcM_SearchByID(i_this->field_0x5B8, &local_1b0_actor) != 0 &&
@@ -1274,10 +1277,16 @@ static void e_po_dead(e_po_class* i_this) {
} else {
if (i_this->field_0x75C == -1) {
#if TARGET_PC
const u8 itemNo =
dusk::mods::item_check_poe(i_this->BitSW, dItemNo_POU_SPIRIT_e, a_this);
i_this->field_0x75C = fopAcM_createItemForPresentDemo(&a_this->current.pos, itemNo,
0, -1, -1, NULL, NULL, dusk::mods::item_give_tag_poe(i_this->BitSW));
const auto itemCheck = dusk::mods::item_check_commit(
dusk::mods::item_give_tag_poe(i_this->BitSW), dItemNo_POU_SPIRIT_e, a_this);
if (itemCheck.itemNo == dItemNo_NONE_e) {
dusk::mods::item_check_complete(itemCheck, a_this);
i_this->field_0x75B = 1;
} else {
i_this->field_0x75C = fopAcM_createItemForPresentDemo(
&a_this->current.pos, itemCheck.itemNo, 0, -1, -1, NULL, NULL,
itemCheck.tag);
}
#else
i_this->field_0x75C = fopAcM_createItemForPresentDemo(&a_this->current.pos, 0xE0, 0,
-1, -1, NULL, NULL);
+16 -3
View File
@@ -16,6 +16,10 @@
#include "f_op/f_op_camera_mng.h"
#include <cstring>
#if TARGET_PC
#include "mods/items.h"
#endif
class daE_RDB_HIO_c : public JORReflexible {
public:
daE_RDB_HIO_c();
@@ -1250,9 +1254,18 @@ static void demo_camera(e_rdb_class* i_this) {
}
if (iVar1 != 0) {
daPy_getPlayerActorClass()->changeDemoMode(11,
DUSK_ITEM_CHECK_EXPR("bulblin_key:D_MN09", dItemNo_SMALL_KEY_e, &i_this->enemy), 0,
0);
#if TARGET_PC
const auto itemCheck = dusk::mods::item_check_commit(
ITEM_CHECK_BULBLIN_KEY, dItemNo_SMALL_KEY_e, &i_this->enemy);
if (itemCheck.itemNo == dItemNo_NONE_e) {
dusk::mods::item_check_complete(itemCheck, &i_this->enemy);
}
daPy_getPlayerActorClass()->changeDemoMode(
11, itemCheck.itemNo == dItemNo_NONE_e ? 0 : itemCheck.itemNo,
itemCheck.itemNo == dItemNo_NONE_e ? 0 : static_cast<int>(itemCheck.tag), 0);
#else
daPy_getPlayerActorClass()->changeDemoMode(11, dItemNo_SMALL_KEY_e, 0, 0);
#endif
i_this->mDemoMode = 12;
i_this->field_0x10aa = 0;
i_this->field_0xfe5 = 1;
+32
View File
@@ -27,8 +27,10 @@
#if TARGET_PC
#include "dusk/frame_interpolation.h"
#include "dusk/mods/item.hpp"
#include "dusk/settings.h"
#include "dusk/version.hpp"
#include "mods/items.h"
#endif
class dmg_rod_HIO_c : public JORReflexible {
@@ -2955,7 +2957,17 @@ static void lure_heart(dmg_rod_class* i_this) {
if (obj_life != NULL) {
fopAcM_delete(obj_life);
fopAcM_onItem(obj_life, 0x80);
#if TARGET_PC
const auto itemCheck = dusk::mods::item_check_commit(
ITEM_CHECK_FISHING_HEART_PIECE, dItemNo_KAKERA_HEART_e, actor);
if (itemCheck.itemNo == dItemNo_KAKERA_HEART_e) {
execItemGet(dItemNo_KAKERA_HEART_e, itemCheck.tag, actor);
} else if (itemCheck.itemNo == dItemNo_NONE_e) {
dusk::mods::item_check_complete(itemCheck, actor);
}
#else
execItemGet(dItemNo_KAKERA_HEART_e);
#endif
u8 eventReg = dComIfGs_getEventReg(0xECFF);
eventReg |= (u8)0x40;
dComIfGs_setEventReg(0xECFF, eventReg);
@@ -4090,7 +4102,15 @@ static void uki_catch(dmg_rod_class* i_this) {
} else if (mgfish->mCaughtType == MG_CATCH_BIN) {
i_this->msgflow.init(actor, 0x139A, 0, NULL);
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[468]);
#if TARGET_PC
const auto itemCheck = dusk::mods::item_check_commit(
ITEM_CHECK_FISHING_BOTTLE, dItemNo_EMPTY_BOTTLE_e, actor);
if (itemCheck.itemNo == dItemNo_EMPTY_BOTTLE_e) {
dComIfGs_setEmptyBottle();
}
#else
dComIfGs_setEmptyBottle();
#endif
} else if (mgfish->mCaughtType == MG_CATCH_KN) {
i_this->msgflow.init(actor, 0x139C, 0, NULL);
} else if (mgfish->mCaughtType == MG_CATCH_ED) {
@@ -4167,6 +4187,18 @@ static void uki_catch(dmg_rod_class* i_this) {
if (mgfish->mCaughtType == MG_CATCH_LH) {
dComIfGp_setItemRupeeCount(10.0f + cM_rndF(40.9f));
}
#if TARGET_PC
else if (mgfish->mCaughtType == MG_CATCH_BIN)
{
const auto itemCheck = dusk::mods::item_check_commit(
ITEM_CHECK_FISHING_BOTTLE, dItemNo_EMPTY_BOTTLE_e, actor);
if (itemCheck.itemNo == dItemNo_EMPTY_BOTTLE_e ||
itemCheck.itemNo == dItemNo_NONE_e)
{
dusk::mods::item_check_complete(itemCheck, actor);
}
}
#endif
} else {
dComIfGs_addFishNum(fish_kind);
if (i_this->field_0x14c0 != 0) {
+6 -2
View File
@@ -1806,17 +1806,21 @@ int daNpcChin_c::_Evt_GameSucceed_CutMain(const int& param_0) {
#if TARGET_PC
const char* itemCheckName = nullptr;
u32 itemGiveTag = 0;
if (itemId1 == dItemNo_ARROW_LV2_e) {
itemCheckName = "star_reward_1";
} else if (itemId1 == dItemNo_ARROW_LV3_e) {
itemCheckName = "star_reward_2";
}
if (itemCheckName != nullptr) {
itemId1 = dusk::mods::item_check(itemCheckName, itemId1, this);
const auto itemCheck =
dusk::mods::item_check_commit(itemCheckName, itemId1, this);
itemId1 = itemCheck.itemNo;
itemGiveTag = itemCheck.tag;
}
#endif
fpc_ProcID itemId2 = fopAcM_createItemForPresentDemo(&current.pos, itemId1, 0, -1, -1,
0, 0 IF_DUSK_ARG(dusk::mods::item_give_tag(itemCheckName)));
0, 0 IF_DUSK_ARG(itemGiveTag));
if (itemId2 != -1) {
dComIfGp_event_setItemPartnerId(itemId2);
}
+6 -4
View File
@@ -4019,14 +4019,16 @@ BOOL daNpc_grA_c::talk(void*) {
if (r26 && talkProc(NULL, TRUE, NULL)) {
if (mFlow.getEventId(&sp8) == 1) {
#if TARGET_PC
const char* itemCheckName = nullptr;
u32 itemGiveTag = 0;
if (sp8 == dItemNo_BOMB_IN_BAG_e) {
itemCheckName = "goron_reward:F_SP113";
sp8 = dusk::mods::item_check(itemCheckName, sp8, this);
const auto itemCheck =
dusk::mods::item_check_commit("goron_reward:F_SP113", sp8, this);
sp8 = itemCheck.itemNo;
itemGiveTag = itemCheck.tag;
}
#endif
field_0x1480 = fopAcM_createItemForPresentDemo(&current.pos, sp8, 0, -1, -1, NULL,
NULL IF_DUSK_ARG(dusk::mods::item_give_tag(itemCheckName)));
NULL IF_DUSK_ARG(itemGiveTag));
if (field_0x1480 != fpcM_ERROR_PROCESS_ID_e) {
s16 r25 = dComIfGp_getEventManager().getEventIdx(this, "DEFAULT_GETITEM", 0xff);
dComIfGp_getEvent()->reset(this);
+5 -3
View File
@@ -1495,9 +1495,11 @@ int daNpcIns_c::talk(void* param_1) {
#if TARGET_PC
u32 itemGiveTag = 0;
if (s_givenInsectId != dItemNo_NONE_e) {
itemNo = dusk::mods::item_check_bug(
s_givenInsectId, itemNo & 0xFF, this);
itemGiveTag = dusk::mods::item_give_tag_bug(s_givenInsectId);
const auto itemCheck = dusk::mods::item_check_commit(
dusk::mods::item_give_tag_bug(s_givenInsectId), itemNo & 0xFF,
this);
itemNo = itemCheck.itemNo;
itemGiveTag = itemCheck.tag;
s_givenInsectId = dItemNo_NONE_e;
}
#endif
+6 -4
View File
@@ -1182,15 +1182,17 @@ int daNpc_Kkri_c::talk(void*) {
case 1:
if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) {
#if TARGET_PC
const char* itemCheckName = nullptr;
u32 itemGiveTag = 0;
if (item_no == dItemNo_OIL_BOTTLE3_e) {
itemCheckName = "coro_bottle";
item_no = dusk::mods::item_check(itemCheckName, item_no, this);
const auto itemCheck =
dusk::mods::item_check_commit("coro_bottle", item_no, this);
item_no = itemCheck.itemNo;
itemGiveTag = itemCheck.tag;
}
#endif
mItemPartnerId = fopAcM_createItemForPresentDemo(&current.pos, item_no,
0, -1, -1, NULL,
NULL IF_DUSK_ARG(dusk::mods::item_give_tag(itemCheckName)));
NULL IF_DUSK_ARG(itemGiveTag));
}
if (fopAcM_IsExecuting(mItemPartnerId)) {
+6 -4
View File
@@ -1192,14 +1192,16 @@ int daNpc_myna2_c::ECut_gameGoalSuccess(int i_staffId) {
int itemNo = 0;
if (mFlow.getEventId(&itemNo) == 1) {
#if TARGET_PC
const char* itemCheckName = nullptr;
u32 itemGiveTag = 0;
if (itemNo == dItemNo_KAKERA_HEART_e) {
itemCheckName = "plumm_minigame_reward";
itemNo = dusk::mods::item_check(itemCheckName, itemNo, this);
const auto itemCheck =
dusk::mods::item_check_commit("plumm_minigame_reward", itemNo, this);
itemNo = itemCheck.itemNo;
itemGiveTag = itemCheck.tag;
}
#endif
mItemPid = fopAcM_createItemForPresentDemo(&current.pos, itemNo, 0, -1, -1, NULL,
NULL IF_DUSK_ARG(dusk::mods::item_give_tag(itemCheckName)));
NULL IF_DUSK_ARG(itemGiveTag));
}
break;
}
+6 -2
View File
@@ -960,17 +960,21 @@ int daNpc_Pouya_c::cutHaveFavorToAsk(int param_0) {
if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) {
#if TARGET_PC
const char* itemCheckName = nullptr;
u32 itemGiveTag = 0;
if (local_64 == dItemNo_DROP_BOTTLE_e) {
itemCheckName = "jovani_reward_1";
} else if (local_64 == dItemNo_SILVER_RUPEE_e) {
itemCheckName = "jovani_reward_2";
}
if (itemCheckName != nullptr) {
local_64 = dusk::mods::item_check(itemCheckName, local_64, this);
const auto itemCheck =
dusk::mods::item_check_commit(itemCheckName, local_64, this);
local_64 = itemCheck.itemNo;
itemGiveTag = itemCheck.tag;
}
#endif
mItemPartnerId = fopAcM_createItemForPresentDemo(&current.pos, local_64, 0,
-1, -1, 0, 0 IF_DUSK_ARG(dusk::mods::item_give_tag(itemCheckName)));
-1, -1, 0, 0 IF_DUSK_ARG(itemGiveTag));
}
if (fopAcM_IsExecuting(mItemPartnerId)) {
field_0xfce = 1;
+6 -2
View File
@@ -2611,17 +2611,21 @@ BOOL daNpc_zrA_c::ECut_thanksBlast(int i_staffID) {
if (mFlow.getEventId(&item_id) == 1) {
#if TARGET_PC
const char* itemCheckName = nullptr;
u32 itemGiveTag = 0;
if (item_id == dItemNo_BOMB_IN_BAG_e) {
itemCheckName = "iza_reward_1";
} else if (item_id == dItemNo_BOMB_BAG_LV2_e) {
itemCheckName = "iza_reward_2";
}
if (itemCheckName != nullptr) {
item_id = dusk::mods::item_check(itemCheckName, item_id, this);
const auto itemCheck =
dusk::mods::item_check_commit(itemCheckName, item_id, this);
item_id = itemCheck.itemNo;
itemGiveTag = itemCheck.tag;
}
#endif
mItemID = fopAcM_createItemForPresentDemo(&current.pos, item_id, 0, -1, -1, NULL,
NULL IF_DUSK_ARG(dusk::mods::item_give_tag(itemCheckName)));
NULL IF_DUSK_ARG(itemGiveTag));
}
field_0x9eb = true;
break;
+72 -19
View File
@@ -14,6 +14,11 @@
#include "d/actor/d_a_obj_ystone.h"
#include <cstring>
#if TARGET_PC
#include "dusk/mods/item.hpp"
#include "mods/items.h"
#endif
static DUSK_CONST char* l_arcName = "ef_Portal";
static char const* l_clearEvName[9] = {
@@ -77,6 +82,27 @@ static int getNowLevel() {
return -1;
}
#if TARGET_PC
static const char* dungeon_reward_check_name(int level) {
switch (level) {
case 0:
return ITEM_CHECK_DUNGEON_REWARD_FOREST;
case 1:
return ITEM_CHECK_DUNGEON_REWARD_GORON;
case 2:
return ITEM_CHECK_DUNGEON_REWARD_LAKEBED;
case 4:
return ITEM_CHECK_DUNGEON_REWARD_SNOWPEAK;
case 5:
return ITEM_CHECK_DUNGEON_REWARD_TIME;
case 6:
return ITEM_CHECK_DUNGEON_REWARD_CITY;
default:
return nullptr;
}
}
#endif
void daObjBossWarp_c::initBaseMtx() {
scale.y = 0.15f;
mpModel->setBaseScale(scale);
@@ -485,6 +511,9 @@ int daObjBossWarp_c::demoProc() {
player->onSceneChangeArea(scene, 0xff, 0);
break;
case 4: // STONE_FALL
#if TARGET_PC
{
#endif
if (ystone != NULL) {
mYstonePos = ystone->current.pos;
if (getNowLevel() < 3) {
@@ -506,28 +535,52 @@ int daObjBossWarp_c::demoProc() {
mDoMtx_stack_c::multVec(&mYstoneTargetPos, &mYstoneTargetPos);
mYstonePos.x = mYstoneTargetPos.x;
mYstonePos.z = mYstoneTargetPos.z;
switch (getNowLevel()) {
case 0:
dComIfGs_onCollectCrystal(0);
break;
case 1:
dComIfGs_onCollectCrystal(1);
break;
case 2:
dComIfGs_onCollectCrystal(2);
break;
case 4:
dComIfGs_onCollectMirror(1);
break;
case 5:
dComIfGs_onCollectMirror(2);
break;
case 6:
dComIfGs_onCollectMirror(3);
break;
#if TARGET_PC
int level = getNowLevel();
const char* checkName = dungeon_reward_check_name(level);
dusk::mods::ItemCheckResult itemCheck{};
bool applyVanillaReward = true;
if (checkName != nullptr) {
itemCheck = dusk::mods::item_check_commit(checkName, dItemNo_NONE_e, this);
applyVanillaReward = itemCheck.itemNo == dItemNo_NONE_e;
}
if (applyVanillaReward) {
switch (level) {
#else
switch (getNowLevel()) {
#endif
case 0:
dComIfGs_onCollectCrystal(0);
break;
case 1:
dComIfGs_onCollectCrystal(1);
break;
case 2:
dComIfGs_onCollectCrystal(2);
break;
case 4:
dComIfGs_onCollectMirror(1);
break;
case 5:
dComIfGs_onCollectMirror(2);
break;
case 6:
dComIfGs_onCollectMirror(3);
break;
}
#if TARGET_PC
if (checkName != nullptr) {
dusk::mods::item_check_complete(itemCheck, this);
}
} else {
dusk::mods::item_check_enqueue(itemCheck, dusk::mods::ItemGiveMode::Silent);
}
#endif
mCounter = 0;
break;
#if TARGET_PC
}
#endif
case 5: // STONE_MIDNA
mCounter = 0;
break;
+30 -6
View File
@@ -287,7 +287,11 @@ int daItem_c::_daItem_create() {
BOOL flag = dItem_data::chkFlag(m_itemNo, 2);
#if DEBUG
#if TARGET_PC
if (dItem_fieldModelArc(m_itemNo) == NULL) {
#else
if (dItem_data::getFieldArc(m_itemNo) == NULL) {
#endif
// "Item Num<%d>: No Resource Archive specified!!\n"
OS_REPORT_ERROR("アイテム番号<%d>:リソースのアーカイブ指定がありません!!\n", m_itemNo);
return cPhs_ERROR_e;
@@ -319,6 +323,20 @@ int daItem_c::_daItem_create() {
if (flag) {
CreateInit();
} else {
#if TARGET_PC
// Resolved items may have no field model; display their get-demo model instead.
if (dItem_data::getFieldArc(m_itemNo) == NULL) {
phase_state = dComIfG_resLoad(&mPhase, dItem_data::getArcName(m_itemNo));
if (phase_state == cPhs_COMPLEATE_e) {
if (!fopAcM_entrySolidHeap(this, CheckItemCreateHeap, 0x4000)) {
return cPhs_ERROR_e;
}
CreateInit();
}
return phase_state;
}
#endif
phase_state = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(m_itemNo));
if (phase_state == cPhs_COMPLEATE_e) {
if (!fopAcM_entrySolidHeap(this, CheckFieldItemCreateHeap,
@@ -412,7 +430,11 @@ int daItem_c::_daItem_delete() {
mSparkleEmtr.remove();
}
#if TARGET_PC
DeleteBase(dItem_fieldModelArc(m_itemNo));
#else
DeleteBase(dItem_data::getFieldArc(m_itemNo));
#endif
return 1;
}
@@ -520,9 +542,10 @@ void daItem_c::procInitGetDemoEvent() {
#if TARGET_PC
const u8 displayItemNo = m_itemNo;
if (mItemOverridden) {
m_itemNo = dusk::mods::item_check_tagged(mItemGiveTag, mOriginalItemNo, this);
}
const auto itemCheck = dusk::mods::item_check_commit(mItemGiveTag, mOriginalItemNo, this);
m_itemNo = itemCheck.itemNo;
mItemGiveTag = itemCheck.tag;
mItemOverridden = m_itemNo != mOriginalItemNo;
#endif
m_item_id = fopAcM_createItemForTrBoxDemo(
&current.pos, m_itemNo, -1, fopAcM_GetRoomNo(this), NULL, NULL IF_DUSK_ARG(mItemGiveTag));
@@ -907,9 +930,10 @@ void daItem_c::itemGetNextExecute() {
void daItem_c::itemGet() {
#if TARGET_PC
const u8 displayItemNo = m_itemNo;
if (mItemOverridden) {
m_itemNo = dusk::mods::item_check_tagged(mItemGiveTag, mOriginalItemNo, this);
}
const auto itemCheck = dusk::mods::item_check_commit(mItemGiveTag, mOriginalItemNo, this);
m_itemNo = itemCheck.itemNo;
mItemGiveTag = itemCheck.tag;
mItemOverridden = m_itemNo != mOriginalItemNo;
#endif
switch (m_itemNo) {
#if TARGET_PC
+21 -3
View File
@@ -6,6 +6,7 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_obj_life_container.h"
#include "d/d_a_itembase_static.h"
#include "d/d_com_inf_game.h"
#include "d/actor/d_a_player.h"
#include "d/d_item_data.h"
@@ -184,11 +185,23 @@ int daObjLife_c::create() {
return cPhs_ERROR_e;
}
#if TARGET_PC
// Resolved items may have no field model; display their get-demo model instead.
const bool useGetModel = dItem_data::getFieldArc(m_itemNo) == NULL;
int phase_state = dComIfG_resLoad(&mPhase, dItem_fieldModelArc(m_itemNo));
if (phase_state == cPhs_COMPLEATE_e) {
if (!fopAcM_entrySolidHeap(
this, useGetModel ? CheckItemCreateHeap : CheckFieldItemCreateHeap, 0x4000))
{
return cPhs_ERROR_e;
}
#else
int phase_state = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(m_itemNo));
if (phase_state == cPhs_COMPLEATE_e) {
if (!fopAcM_entrySolidHeap(this, CheckFieldItemCreateHeap, 0x4000)) {
return cPhs_ERROR_e;
}
#endif
if (!Create()) {
return cPhs_ERROR_e;
@@ -325,9 +338,10 @@ int daObjLife_c::initActionOrderGetDemo() {
#if TARGET_PC
const u8 displayItemNo = m_itemNo;
if (mItemOverridden) {
m_itemNo = dusk::mods::item_check_tagged(mItemGiveTag, mOriginalItemNo, this);
}
const auto itemCheck = dusk::mods::item_check_commit(mItemGiveTag, mOriginalItemNo, this);
m_itemNo = itemCheck.itemNo;
mItemGiveTag = itemCheck.tag;
mItemOverridden = m_itemNo != mOriginalItemNo;
#endif
mItemId = fopAcM_createItemForTrBoxDemo(
&current.pos, m_itemNo, -1, fopAcM_GetRoomNo(this), NULL, NULL IF_DUSK_ARG(mItemGiveTag));
@@ -519,7 +533,11 @@ int daObjLife_c::_delete() {
endEffect00();
endEffect02();
#if TARGET_PC
DeleteBase(dItem_fieldModelArc(m_itemNo));
#else
DeleteBase(dItem_data::getFieldArc(m_itemNo));
#endif
return 1;
}
+40 -1
View File
@@ -1,6 +1,6 @@
/**
* @file d_a_obj_master_sword.cpp
*
*
*/
#include "d/dolzel_rel.h" // IWYU pragma: keep
@@ -10,6 +10,12 @@
#include "d/d_com_inf_game.h"
#include "d/d_meter2_info.h"
#if TARGET_PC
#include "d/d_item.h"
#include "dusk/mods/item.hpp"
#include "mods/items.h"
#endif
DUSK_GAME_DATA daObjMasterSword_Attr_c const daObjMasterSword_c::mAttr = {1.0f};
void daObjMasterSword_c::initBaseMtx() {
@@ -145,7 +151,11 @@ void daObjMasterSword_c::create_init() {
int daObjMasterSword_c::create() {
fopAcM_ct(this, daObjMasterSword_c);
#if TARGET_PC
if (dComIfGs_isEventBit(dSv_event_flag_c::F_0264)) {
#else
if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[getFlagNo()])) {
#endif
return cPhs_ERROR_e;
}
@@ -186,12 +196,41 @@ int daObjMasterSword_c::execute() {
mBrk.play();
if (dComIfGs_isTmpBit(dSv_event_tmp_flag_c::tempBitLabels[73])) {
#if TARGET_PC
const auto masterSword = dusk::mods::item_check_commit(
ITEM_CHECK_MASTER_SWORD, dItemNo_MASTER_SWORD_e, this);
if (masterSword.itemNo == dItemNo_MASTER_SWORD_e) {
dComIfGs_onItemFirstBit(dItemNo_MASTER_SWORD_e);
dMeter2Info_setSword(dItemNo_MASTER_SWORD_e, false);
dComIfGs_setSelectEquipSword(dItemNo_MASTER_SWORD_e);
dusk::mods::item_check_complete(masterSword, this);
} else if (masterSword.itemNo == dItemNo_NONE_e) {
dusk::mods::item_check_complete(masterSword, this);
} else {
dusk::mods::item_check_enqueue(masterSword, dusk::mods::ItemGiveMode::Demo);
}
dComIfGp_setItemLifeCount(dComIfGs_getMaxLife(), 0);
const auto shadowCrystal = dusk::mods::item_check_commit(
ITEM_CHECK_SHADOW_CRYSTAL, dItemNo_SHADOW_CRYSTAL_e, this);
if (shadowCrystal.itemNo == dItemNo_SHADOW_CRYSTAL_e) {
execItemGet(shadowCrystal.itemNo, shadowCrystal.tag, this);
} else if (shadowCrystal.itemNo == dItemNo_NONE_e) {
dusk::mods::item_check_complete(shadowCrystal, this);
} else {
dusk::mods::item_check_enqueue(shadowCrystal, dusk::mods::ItemGiveMode::Demo);
}
dComIfGs_onEventBit(dSv_event_flag_c::F_0264);
#else
dComIfGs_onItemFirstBit(dItemNo_MASTER_SWORD_e);
dMeter2Info_setSword(dItemNo_MASTER_SWORD_e, false);
dComIfGs_setSelectEquipSword(dItemNo_MASTER_SWORD_e);
dComIfGp_setItemLifeCount(dComIfGs_getMaxLife(), 0);
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[getFlagNo()]);
#endif
fopAcM_delete(this);
}
+1 -1
View File
@@ -109,7 +109,7 @@ int daItemShield_c::__CreateHeap() {
int daItemShield_c::create() {
fopAcM_ct(this, daItemShield_c);
m_itemNo = dItemNo_WOOD_SHIELD_e;
DUSK_ITEM_CHECK("ordon_shield", m_itemNo, this);
DUSK_ITEM_CHECK_PREVIEW("ordon_shield", m_itemNo, this);
if (fopAcM_isSwitch(this, getSwBit2())) {
OS_REPORT("木の盾:もう取ったので出ません\n");
return cPhs_ERROR_e;
+1 -1
View File
@@ -37,7 +37,7 @@ int daObjSword_c::Create() {
cPhs_Step daObjSword_c::create() {
fopAcM_ct(this, daObjSword_c);
m_itemNo = 0x28;
DUSK_ITEM_CHECK("ordon_sword", m_itemNo, this);
DUSK_ITEM_CHECK_PREVIEW("ordon_sword", m_itemNo, this);
if (fopAcM_isItem(this, getItemBit())) {
return cPhs_ERROR_e;
}
+1 -1
View File
@@ -32,7 +32,7 @@ int daObjZCloth_c::Create() {
int daObjZCloth_c::create() {
fopAcM_ct(this, daObjZCloth_c);
m_itemNo = 0x31;
DUSK_ITEM_CHECK("zora_armor", m_itemNo, this);
DUSK_ITEM_CHECK_PREVIEW("zora_armor", m_itemNo, this);
int phase = dComIfG_resLoad(&mPhase, dItem_data::getFieldArc(m_itemNo));
if (phase == cPhs_COMPLEATE_e) {
if (!fopAcM_entrySolidHeap(this, (heapCallbackFunc)CheckFieldItemCreateHeap, 0x2fb0)) {
+6 -3
View File
@@ -363,10 +363,13 @@ int daTagStatue_c::demoProc() {
}
#if TARGET_PC
item = dusk::mods::item_check_sky_character(item & 0xFF, this);
const auto itemCheck = dusk::mods::item_check_commit(
dusk::mods::item_give_tag_sky_character(), item & 0xFF, this);
item = itemCheck.itemNo;
#endif
mItemId = fopAcM_createItemForTrBoxDemo(&current.pos, item, -1,
fopAcM_GetRoomNo(this), 0, 0 IF_DUSK_ARG(dusk::mods::item_give_tag_sky_character()));
mItemId =
fopAcM_createItemForTrBoxDemo(&current.pos, item, -1, fopAcM_GetRoomNo(this), 0,
0 IF_DUSK_ARG(itemCheck.tag));
JUT_ASSERT(580, mItemId != fpcM_ERROR_PROCESS_ID_e);
+5 -4
View File
@@ -1391,8 +1391,9 @@ u8 daTbox_c::getBombItemNoMain(u8 i_itemNo) {
int daTbox_c::setGetDemoItem() {
u8 item_no = getItemNo();
#if TARGET_PC
const u32 giveTag = dusk::mods::item_give_tag_chest(getTboxNo());
item_no = dusk::mods::item_check_tagged(giveTag, mOriginalItemNo, this);
const auto itemCheck = dusk::mods::item_check_commit(
dusk::mods::item_give_tag_chest(getTboxNo()), mOriginalItemNo, this);
item_no = itemCheck.itemNo;
#endif
if (item_no == dItemNo_BOMB_5_e || item_no == dItemNo_BOMB_10_e || item_no == dItemNo_BOMB_20_e || item_no == dItemNo_BOMB_30_e ||
item_no == dItemNo_WATER_BOMB_5_e || item_no == dItemNo_WATER_BOMB_10_e || item_no == dItemNo_WATER_BOMB_20_e || item_no == dItemNo_WATER_BOMB_30_e ||
@@ -1404,10 +1405,10 @@ int daTbox_c::setGetDemoItem() {
fpc_ProcID item_id;
if (field_0x718) {
item_id = fopAcM_createItemForPresentDemo(
&current.pos, item_no, 1, -1, -1, NULL, NULL IF_DUSK_ARG(giveTag));
&current.pos, item_no, 1, -1, -1, NULL, NULL IF_DUSK_ARG(itemCheck.tag));
} else {
item_id = fopAcM_createItemForTrBoxDemo(
&current.pos, item_no, -1, -1, NULL, NULL IF_DUSK_ARG(giveTag));
&current.pos, item_no, -1, -1, NULL, NULL IF_DUSK_ARG(itemCheck.tag));
}
if (item_id != fpcM_ERROR_PROCESS_ID_e) {
+7 -4
View File
@@ -383,15 +383,18 @@ int daTbox2_c::setGetDemoItem() {
u8 item_no = getItemNo();
#if TARGET_PC
int tboxNo = fopAcM_GetParamBit(this, 16, 8);
const u32 giveTag = dusk::mods::item_give_tag_chest(tboxNo);
item_no = dusk::mods::item_check_tagged(giveTag, mOriginalItemNo, this);
const auto itemCheck = dusk::mods::item_check_commit(
dusk::mods::item_give_tag_chest(tboxNo), mOriginalItemNo, this);
item_no = itemCheck.itemNo;
#endif
u32 partner_id;
if (mReturnRupee) {
partner_id = fopAcM_createItemForPresentDemo(&current.pos, item_no, 1, -1, -1, NULL, NULL IF_DUSK_ARG(giveTag));
partner_id = fopAcM_createItemForPresentDemo(
&current.pos, item_no, 1, -1, -1, NULL, NULL IF_DUSK_ARG(itemCheck.tag));
} else {
partner_id = fopAcM_createItemForTrBoxDemo(&current.pos, item_no, -1, -1, NULL, NULL IF_DUSK_ARG(giveTag));
partner_id = fopAcM_createItemForTrBoxDemo(
&current.pos, item_no, -1, -1, NULL, NULL IF_DUSK_ARG(itemCheck.tag));
}
if (partner_id != -1) {
+7
View File
@@ -57,6 +57,13 @@ int CheckItemCreateHeap(fopAc_ac_c* i_this) {
dItem_data::getBrkName(item_no), dItem_data::getBtpName(item_no));
}
#if TARGET_PC
const char* dItem_fieldModelArc(u8 itemNo) {
const char* arcName = dItem_data::getFieldArc(itemNo);
return arcName != NULL ? arcName : dItem_data::getArcName(itemNo);
}
#endif
int CheckFieldItemCreateHeap(fopAc_ac_c* i_this) {
daItemBase_c* a_this = static_cast<daItemBase_c*>(i_this);
+17 -1
View File
@@ -741,8 +741,12 @@ void item_func_ARMOR() {}
void item_func_WEAR_ZORA() {}
void item_func_MAGIC_LV1() {
#if TARGET_PC
dComIfGs_onEventBit(0xD04);
#else
dComIfGp_setItemMagicCount(16);
dComIfGp_setItemMaxMagicCount(16);
#endif
}
void item_func_DUNGEON_EXIT_2() {
@@ -1152,7 +1156,15 @@ void item_func_M_MAYFLY() {}
void item_func_F_MAYFLY() {}
void item_func_POU_SPIRIT() {}
void item_func_POU_SPIRIT() {
#if TARGET_PC
dComIfGs_addPohSpiritNum();
if (dComIfGs_getPohSpiritNum() == 20) {
/* dSv_event_flag_c::F_0457 - Castle Town - Revived cat */
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[457]);
}
#endif
}
void item_func_ANCIENT_DOCUMENT() {
dComIfGs_setItem(SLOT_22, dItemNo_ANCIENT_DOCUMENT_e);
@@ -1411,7 +1423,11 @@ int item_getcheck_func_WEAR_ZORA() {
}
int item_getcheck_func_MAGIC_LV1() {
#if TARGET_PC
return dComIfGs_isEventBit(0xD04);
#else
return -1;
#endif
}
int item_getcheck_func_DUNGEON_EXIT_2() {
+4
View File
@@ -53,7 +53,11 @@ DUSK_GAME_DATA dItem_itemResource dItem_data::item_resource[] = {
{"F_gD_rupy", 0x0004,-0x0001,-0x0001, 0x0007,-0x0001, 0x0, -0x1, 0x006B, 0x64, 0x0000},
{"O_gD_marm", 0x0003,-0x0001,-0x0001,-0x0001,-0x0001, -0x1, -0x1, 0x0041, 0x64, 0x01A9},
{"O_gD_zora", 0x0003,-0x0001,-0x0001,-0x0001,-0x0001, -0x1, -0x1, 0x004D, 0x64, 0x01AA},
#if TARGET_PC
{"O_gD_Injy", 0x0003,-0x0001,-0x0001,-0x0001,-0x0001, -0x1, -0x1, 0x002E, 0x64, 0x0000},
#else
{"O_gD_Injy", 0x0003,-0x0001,-0x0001,-0x0001,-0x0001, -0x1, -0x1, 0x002D, 0x64, 0x0000},
#endif
{"O_gD_TKS", 0x0008,-0x0001, 0x0005,-0x0001,-0x0001, -0x1, -0x1, 0x0028, 0x64, 0x0000},
{"O_gD_puL2", 0x0003,-0x0001,-0x0001,-0x0001,-0x0001, -0x1, -0x1, 0x0047, 0x64, 0x0000},
{"O_gD_puL2", 0x0003,-0x0001,-0x0001,-0x0001,-0x0001, -0x1, -0x1, 0x0048, 0x64, 0x0000},
+4
View File
@@ -36,6 +36,7 @@
#include "dusk/language.hpp"
#include "dusk/logging.h"
#include "dusk/menu_pointer.h"
#include "dusk/mods/item.hpp"
#include "dusk/mods/svc/flow.hpp"
#include "dusk/settings.h"
#include "dusk/version.hpp"
@@ -832,6 +833,9 @@ u32 dMsgObject_c::getMessageIndex(u32 param_0) {
u32 dMsgObject_c::getRevoMessageIndex(u32 param_1) {
#if TARGET_PC
const u16 sourceGroup = param_1 > 5000 ? static_cast<u16>(s_groupID) : 0;
param_1 = dusk::mods::item_check_message(sourceGroup, param_1);
u16 customGroup = 0;
if (param_1 <= 0xffff &&
dusk::flow::custom_message_group(static_cast<u16>(param_1), customGroup))
+28 -2
View File
@@ -42,7 +42,9 @@
#if TARGET_PC
#include "dusk/autosave.h"
#include "dusk/memory.h"
#include "dusk/mods/item.hpp"
#include "dusk/ui/ui.hpp"
#include "mods/items.h"
#endif
#if DEBUG
@@ -1192,11 +1194,35 @@ static int phase_1(dScnPly_c* i_this) {
}
// Stage: Ordon Spring, Room: Ordon Spring
#if TARGET_PC
const bool iliaMemoryArrival =
!strcmp(dComIfGp_getStartStageName(), "F_SP104") && dComIfGp_getStartStageRoomNo() == 1 &&
dComIfGp_getStartStagePoint() == 23 && dComIfGp_getStartStageLayer() == 12;
const u32 iliaMemoryTag = dusk::mods::item_give_tag(ITEM_CHECK_ILIA_MEMORY);
if (!iliaMemoryArrival) {
dusk::mods::item_check_cancel(iliaMemoryTag);
}
if (iliaMemoryArrival)
#else
if (!strcmp(dComIfGp_getStartStageName(), "F_SP104") && dComIfGp_getStartStageRoomNo() == 1 &&
dComIfGp_getStartStagePoint() == 23 && dComIfGp_getStartStageLayer() == 12)
#endif
{
dComIfGs_onItemFirstBit(dItemNo_HORSE_FLUTE_e);
dComIfGs_setItem(SLOT_21, dItemNo_HORSE_FLUTE_e);
#if TARGET_PC
const auto itemCheck =
dusk::mods::item_check_commit(iliaMemoryTag, dItemNo_HORSE_FLUTE_e, nullptr);
if (itemCheck.itemNo == dItemNo_HORSE_FLUTE_e) {
#endif
dComIfGs_onItemFirstBit(dItemNo_HORSE_FLUTE_e);
dComIfGs_setItem(SLOT_21, dItemNo_HORSE_FLUTE_e);
#if TARGET_PC
dusk::mods::item_check_complete(itemCheck, nullptr);
} else if (itemCheck.itemNo == dItemNo_NONE_e) {
dusk::mods::item_check_complete(itemCheck, nullptr);
} else {
dusk::mods::item_check_enqueue(itemCheck, dusk::mods::ItemGiveMode::Silent);
}
#endif
}
if ((u8)dKy_darkworld_stage_check(dComIfGp_getStartStageName(),
+9 -5
View File
@@ -906,15 +906,17 @@ int dShopSystem_c::seq_start(fopAc_ac_c* actor, dMsgFlow_c* i_flow) {
if (mFlow.getEventId(&itemNo) == 1) {
if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) {
#if TARGET_PC
const char* itemCheckName = nullptr;
u32 itemGiveTag = 0;
if (itemNo == dItemNo_HALF_MILK_BOTTLE_e) {
itemCheckName = "sera_reward";
itemNo = dusk::mods::item_check(itemCheckName, itemNo, actor);
const auto itemCheck =
dusk::mods::item_check_commit("sera_reward", itemNo, actor);
itemNo = itemCheck.itemNo;
itemGiveTag = itemCheck.tag;
}
#endif
mItemPartnerId =
fopAcM_createItemForPresentDemo(&current.pos, itemNo, 0, -1, -1, NULL,
NULL IF_DUSK_ARG(dusk::mods::item_give_tag(itemCheckName)));
NULL IF_DUSK_ARG(itemGiveTag));
}
if (fpcEx_IsExist(mItemPartnerId)) {
@@ -1205,7 +1207,9 @@ int dShopSystem_c::seq_decide_yes(fopAc_ac_c* actor, dMsgFlow_c* i_flow) {
if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) {
#if TARGET_PC
const u32 itemGiveTag = dusk::mods::item_give_tag_shop(itemNo & 0xFF);
itemNo = dusk::mods::item_check_shop(itemNo & 0xFF, actor);
const auto itemCheck =
dusk::mods::item_check_commit(itemGiveTag, itemNo & 0xFF, actor);
itemNo = itemCheck.itemNo;
#endif
mItemPartnerId = fopAcM_createItemForPresentDemo(
&current.pos, itemNo, 0, -1, -1, NULL, NULL IF_DUSK_ARG(itemGiveTag));