diff --git a/src/dusk/randomizer/game/tools.cpp b/src/dusk/randomizer/game/tools.cpp index e66ada7b5c..991616c594 100644 --- a/src/dusk/randomizer/game/tools.cpp +++ b/src/dusk/randomizer/game/tools.cpp @@ -3,6 +3,7 @@ #include "d/actor/d_a_alink.h" #include "d/d_item.h" #include "d/d_item_data.h" +#include "f_op/f_op_actor_mng.h" bool playerIsInRoomStage(s32 room, const char* stage) { @@ -84,4 +85,10 @@ void offWarashibeItem(u8 item) { g_dComIfG_gameInfo.info.getSavedata().getPlayer().getGetItem().offFirstBit(item); setNextWarashibeItem(); +} + +int initCreatePlayerItem(u32 item, u32 flag, const cXyz* pos, int roomNo, const csXyz* angle, const cXyz* scale) +{ + u32 params = 0xFF0000 | ((flag & 0xFF) << 0x8) | (item & 0xFF); + return fopAcM_create(539, params, pos, roomNo, angle, scale, -1); } \ No newline at end of file diff --git a/src/dusk/randomizer/game/tools.h b/src/dusk/randomizer/game/tools.h index 4b03fae130..a1f3e1851a 100644 --- a/src/dusk/randomizer/game/tools.h +++ b/src/dusk/randomizer/game/tools.h @@ -6,3 +6,4 @@ bool playerIsInRoomStage(s32 room, const char* stage); void checkTransformFromWolf(); u8 setNextWarashibeItem(); void offWarashibeItem(u8 item); +int initCreatePlayerItem(u32 item, u32 flag, const cXyz* pos, int roomNo, const csXyz* angle, const cXyz* scale); diff --git a/src/dusk/randomizer/game/verify_item_functions.h b/src/dusk/randomizer/game/verify_item_functions.h index 69be545a50..f451a9c4a2 100644 --- a/src/dusk/randomizer/game/verify_item_functions.h +++ b/src/dusk/randomizer/game/verify_item_functions.h @@ -11,5 +11,5 @@ u32 getProgressiveKeyShard(); u32 getProgressiveMirrorShard(); u32 getProgressiveFusedShadow(); u8 getWarashibeItemCount(); -u32 verifyProgressiveItem(); +u32 verifyProgressiveItem(u32 item); diff --git a/src/f_op/f_op_actor_mng.cpp b/src/f_op/f_op_actor_mng.cpp index 208e868db2..bb415b0fdb 100644 --- a/src/f_op/f_op_actor_mng.cpp +++ b/src/f_op/f_op_actor_mng.cpp @@ -18,6 +18,9 @@ #include "SSystem/SComponent/c_math.h" #include "d/actor/d_a_obj_carry.h" #include "d/actor/d_a_player.h" +#if TARGET_PC +#include "d/actor/d_a_alink.h" +#endif #include "d/actor/d_a_tag_stream.h" #include "d/d_item.h" #include "d/d_path.h" @@ -27,6 +30,10 @@ #include "f_op/f_op_camera_mng.h" #include "f_op/f_op_scene_mng.h" #include "m_Do/m_Do_lib.h" +#if TARGET_PC +#include "dusk/randomizer/game/verify_item_functions.h" +#include "dusk/randomizer/game/tools.h" +#endif #include #define MAKE_ITEM_PARAMS(itemNo, itemBitNo, param_2, param_3) \ @@ -1387,6 +1394,11 @@ fopAc_ac_c* fopAcM_getEventPartner(fopAc_ac_c const* i_actor) { fpc_ProcID fopAcM_createItemForPresentDemo(cXyz const* i_pos, int i_itemNo, u8 param_2, int i_itemBitNo, int i_roomNo, csXyz const* i_angle, cXyz const* i_scale) { +#if TARGET_PC + if (dComIfG_isRandomizer()) { + i_itemNo = verifyProgressiveItem(i_itemNo); + } +#endif JUT_ASSERT(3214, 0 <= i_itemNo && i_itemNo < 256); dComIfGp_event_setGtItm(i_itemNo); @@ -1611,8 +1623,23 @@ fpc_ProcID fopAcM_createItemForBoss(const cXyz* i_pos, int i_itemNo, int i_roomN if (dusk::getSettings().game.noHeartDrops && isHeart(i_itemNo)) { return fpcM_ERROR_PROCESS_ID_e; } - #endif + if (dComIfG_isRandomizer()) { + i_itemNo = verifyProgressiveItem(i_itemNo); + if (i_itemNo == dItemNo_Randomizer_UTAWA_HEART_e) + { + param_8 = 0x9F; // Custom flag used for dungeon heart containers. + } + + // If we are in Hyrule Field, we want to spawn the goron HP on the ground. + if (daAlink_c::checkStageName("F_SP121")) + { + *const_cast(&i_pos->y) = -190.f; + } + + return initCreatePlayerItem(i_itemNo, param_8 & 0xFF, i_pos, i_roomNo, i_angle, i_scale); + } else { + #endif int _ = -1; u32 params = 0xFFFF0000 | param_8 << 8 | (i_itemNo & 0xFF); @@ -1624,6 +1651,9 @@ fpc_ProcID fopAcM_createItemForBoss(const cXyz* i_pos, int i_itemNo, int i_roomN } return fopAcM_GetID(actor); + #if TARGET_PC + } + #endif } fpc_ProcID fopAcM_createItemForMidBoss(const cXyz* i_pos, int i_itemNo, int i_roomNo, @@ -1633,6 +1663,14 @@ fpc_ProcID fopAcM_createItemForMidBoss(const cXyz* i_pos, int i_itemNo, int i_ro if (dusk::getSettings().game.noHeartDrops && isHeart(i_itemNo)) { return fpcM_ERROR_PROCESS_ID_e; } + + // If we are fighting Ook in randomizer, we want to handle the boomerang check a different way. + if (dComIfG_isRandomizer()) { + if (daAlink_c::checkStageName("D_MN05B")) { + i_itemNo = verifyProgressiveItem(i_itemNo); + return initCreatePlayerItem(i_itemNo, 0xFF, i_pos, i_roomNo, i_angle, i_scale); + } + } #endif UNUSED(i_angle);