#include "d/a/d_a_item.h" #include "c/c_math.h" #include "common.h" #include "d/a/d_a_itembase.h" #include "d/a/d_a_player.h" #include "d/a/npc/d_a_npc_talk_kensei.h" #include "d/a/obj/d_a_obj_boomerang.h" #include "d/a/obj/d_a_obj_warp.h" #include "d/col/bg/d_bg_s.h" #include "d/col/cc/d_cc_d.h" #include "d/col/cc/d_cc_s.h" #include "d/d_camera.h" #include "d/d_linkage.h" #include "d/d_player.h" #include "d/d_pouch.h" #include "d/d_sc_game.h" #include "d/flag/dungeonflag_manager.h" #include "d/flag/itemflag_manager.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "d/snd/d_snd_wzsound.h" #include "d/t/d_t_force_get_flag.h" #include "d/t/d_t_minigame_insect_capture.h" #include "d/t/d_t_siren.h" #include "m/m_angle.h" #include "m/m_vec.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/file_manager.h" #include "toBeSorted/item_mdl.h" #include "toBeSorted/item_mdl_item.h" #include "toBeSorted/item_mdl_light_fruit.h" #include "toBeSorted/item_mdl_misc.h" #include "toBeSorted/item_mdl_rupee.h" #include "toBeSorted/item_mdl_stamina_fruit.h" #include "toBeSorted/minigame_mgr.h" const ItemFlagStruct dAcItemBase_c::sDefaultFlagStruct = {0x28, 0x3C, 0x1E, 0xFF, 0x0000, 0x02, 0x01}; const ItemFlagStruct dAcItemBase_c::sItemFlagStructs[167] = { {0x28, 0x3c, 0x1e, 0xff, 0x0001, 0x00, 0x01}, {0x32, 0x46, 0x1e, 0xff, 0x0002, 0x02, 0x01}, {0x32, 0x46, 0x1e, 0xff, 0x0003, 0x02, 0x01}, {0x32, 0x46, 0x1e, 0xff, 0x0004, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0005, 0x02, 0x00}, {0x32, 0x46, 0x1e, 0xff, 0x0006, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0007, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0008, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0009, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x000a, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x000b, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x000c, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x000d, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x000e, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x000f, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0010, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0011, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0013, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0014, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0015, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x000c, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x000c, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x000c, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x001c, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x000c, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x000c, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x000c, 0x00, 0x01}, {0x32, 0x46, 0x1e, 0xff, 0x0020, 0x00, 0x01}, {0x32, 0x46, 0x1e, 0xff, 0x0021, 0x00, 0x01}, {0x32, 0x46, 0x1e, 0xff, 0x0022, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0023, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0024, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0028, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0029, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x002a, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x002b, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x002c, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x002d, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x002e, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0046, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0030, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0031, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0002, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0033, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0034, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0035, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0036, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0037, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0038, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0039, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x003c, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0041, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0042, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0044, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0046, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0047, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0048, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x004a, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x004b, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x004c, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x004d, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x004e, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x004f, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0051, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0054, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0055, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0056, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0057, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0058, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x005a, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x005b, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x005c, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x005d, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x005e, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x005f, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0060, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0061, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0062, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0063, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0064, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0065, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0066, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0067, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0068, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0069, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x006b, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x006c, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x006d, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x006e, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x006f, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0070, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0071, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0072, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0074, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0075, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0076, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0077, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0078, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0079, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x007a, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x007b, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x007c, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x007d, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x007e, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x007f, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0080, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0081, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0082, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0083, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0084, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0085, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0086, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0087, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0088, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x0089, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x008a, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x008c, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0x00, 0x008d, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x01, 0x008e, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x02, 0x007a, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x03, 0x0090, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x04, 0x0091, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x05, 0x0092, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x06, 0x0093, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x07, 0x0094, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x08, 0x0095, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x09, 0x0096, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x0a, 0x0097, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x0b, 0x0098, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x0099, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x009e, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x009f, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00a0, 0x00, 0x00}, {0x28, 0x3c, 0x1e, 0x0c, 0x02f1, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x0d, 0x02f2, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x0e, 0x02f3, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x0f, 0x02f4, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x10, 0x02f5, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x11, 0x02f6, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x12, 0x02f7, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x13, 0x02f8, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x14, 0x02f9, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x15, 0x02fa, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x16, 0x02fb, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x17, 0x02fc, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x18, 0x02fd, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x19, 0x02fe, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x1a, 0x02ff, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0x1b, 0x0300, 0x00, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x00b1, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00b2, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00b3, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00b4, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00ba, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00bb, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00bc, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00bd, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00be, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00bf, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00c0, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00c1, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00c2, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00c3, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00c4, 0x02, 0x00}, {0x28, 0x3c, 0x1e, 0xff, 0x00c5, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x00c6, 0x02, 0x01}, {0x28, 0x3c, 0x1e, 0xff, 0x00c7, 0x00, 0x00}, }; const u32 dAcItemBase_c::sItemTypeFlags[MAX_ITEM_ID - 1] = { 0x2000, 0x0, 0x3000, 0x3000, 0x0, 0x1000, 0x3000, 0x3000, 0x0, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0, 0x0, 0x1000, 0x1000, 0x1000, 0x3000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x0, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x2000, 0x0, 0x2, 0x1000, 0x1000, 0x1000, 0x3000, 0x0, 0x3000, 0x0, 0x0, 0x0, 0x0, 0x3000, 0x0, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x3002, 0x3002, 0x1000, 0x3000, 0x0, 0x0, 0x0, 0x3000, 0x3000, 0x3000, 0x0, 0x220, 0x220, 0x1000, 0x1000, 0x0, 0x10, 0x1000, 0x0, 0x0, 0x2, 0x1000, 0x1000, 0x1000, 0x10, 0x20, 0x0, 0x20, 0x0, 0x0, 0x111, 0x111, 0x11, 0x11, 0x120, 0x0, 0x1000, 0x1000, 0x1000, 0x1000, 0x0, 0x1000, 0x1000, 0x1000, 0x0, 0x1000, 0x121, 0x2, 0x2, 0x222, 0x4, 0x1000, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x1000, 0x1000, 0x0, 0x0, 0x3, 0x120, 0x120, 0x120, 0x120, 0x120, 0x120, 0x120, 0x120, 0x120, 0x1120, 0x110, 0x110, 0x101, 0x202, 0x203, 0x300, 0x400, 0x500, 0x201, 0x302, 0x303, 0x1000, 0x1000, 0x1000, 0x1000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x21, 0x3, 0x3, 0x3, 0x3, 0x0, 0x0, 0x0, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x0, 0x0, 0x0, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x110, 0x110, 0x110, 0x0, 0x1000, 0x4, 0x0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0, 0xFFFF, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0xFFFF, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, }; struct GlitteringSporeRupeeChance { s32 itemId; s32 weight; }; static const GlitteringSporeRupeeChance sSporeRupeeChances[] = { {ITEM_GREEN_RUPEE, 4}, { ITEM_BLUE_RUPEE, 5}, { ITEM_RED_RUPEE, 1}, { ITEM_RUPOOR, 1}, }; static const dCcD_SrcCyl sSrcCyl = { {{0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, {~(AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, {0, 0x08, 0x407}, 0, 0}, {0xE9}}, {40.0f, 60.0f} }; bool dAcItemBase_c::isValidItemTypeIdx(int itemId) { return itemId < ARRAY_LENGTH(sItemTypeFlags); } bool dAcItemBase_c::getItemTypeFromId(u16 itemID, u32 *pOutType) { bool valid = isValidItemTypeIdx(itemID); if (valid) { *pOutType = sItemTypeFlags[itemID]; } return valid; } bool dAcItemBase_c::getItemAnimType(u16 itemId, u32 *pOutType) { u32 type; bool valid = getItemTypeFromId(itemId, &type); if (valid) { *pOutType = type >> 12 & 0xF; } return valid; } int dAcItemBase_c::getHeartContainerHeartIncrease() { return 1; } int dAcItemBase_c::getCompletedHeartPieceHeartIncrease() { return 1; } u8 dAcItemBase_c::getTearIdx(int tearNum) { return tearNum / 15; } bool dAcItemBase_c::getFlagIdxForTear(int tearNum, u32 *pOutFlag) { u8 idx = getTearIdx(tearNum); if (idx == 0) { *pOutFlag = 0xd; return true; } else if (idx == 1) { *pOutFlag = 0xe; return true; } else { return false; } } u16 dAcItemBase_c::getTearBit(int tearNum) { return 1 << tearNum % 15; } bool dAcItemBase_c::setDungeonFlagForTear(int tearNum) { u32 flag_idx; if (!getFlagIdxForTear(tearNum, &flag_idx)) { return false; } u16 oldVal = DungeonflagManager::sInstance->getCounterOrFlag(flag_idx, 8); u16 tearBit = getTearBit(tearNum); u16 newVal = tearBit | oldVal; DungeonflagManager::sInstance->setToValue(flag_idx, newVal); return true; } static bool isDefaultDeleteGround(s32 specialCode) { // Lava, Cursed Water return specialCode == 7 || specialCode == 17; } static bool isDefaultSwimGround(s32 specialCode) { // Deep Sand (Knee Deep), Very Deep Sand (Void, Instant), Very Deep Sand (Void, Slow) return specialCode == 10 || specialCode == 11 || specialCode == 16; } static bool isHeartDeleteGround(s32 specialCode) { // Lava return specialCode == 7; } static bool isHeartSwimGround(s32 specialCode) { return false; } // This might be a cM::calcTimer thing... bool increment(u32 *value) { if (*value < UINT32_MAX) { (*value)++; return true; } return false; } u16 dAcItemBase_c::getItemId() const { return mId; } // TODO: Incorrect location bool isItemThatHasStruct(u16 itemId) { return itemId; } // TODO: Incorrect location u16 getIndex(u16 itemId) { return itemId; } // TODO: Incorrect location // const ItemFlagStruct *getItemFlagStruct(u16 itemId) { // if (isItemThatHasStruct(itemId)) { // return &sItemFlagStructs[getIndex(itemId)]; // } else { // return &sDefaultFlagStruct; // } // } static const char *const sResNodeName = "Set"; static const char *const sDefaultGetItem = "DefaultGetItem"; static const char *const sItemGetGorgeous = "ItemGetGorgeous"; static const char *const sItemGetDefaultTbox = "ItemGetDefaultTBox"; static const char *const sItemGetGorgeousTbox = "ItemGetGorgeousTBox"; /* static */ extern const char *const sItemGetBird = "ItemGetBird"; const mVec3_c dAcItem_c::sFreestandingDowsingOffset(0.0f, 25.0f, 0.0f); const mVec3_c dAcItem_c::sScale1Maybe(1.0f, 1.0f, 1.0f); const mVec3_c dAcItem_c::sScale2Maybe(1.75f, 1.75f, 1.75f); struct TearIdIdx { dAcItem_c::Tear_e idx; u16 itemId; mColor color1; mColor color2; }; static TearIdIdx sTearIdxes[] = { { dAcItem_c::TEAR_FARON, ITEM_FARORE_TEAR, mColor(0x00, 0x80, 0x30, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, { dAcItem_c::TEAR_ELDIN, ITEM_DIN_TEAR, mColor(0xFF, 0x64, 0x80, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, {dAcItem_c::TEAR_LANAYRU, ITEM_NAYRU_TEAR, mColor(0x80, 0x80, 0x00, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, {dAcItem_c::TEAR_GODDESS, ITEM_SACRED_TEAR, mColor(0x00, 0x64, 0xC8, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, }; struct TearEffectColorThing { mColor color1; mColor color2; mColor color3; mColor color4; mColor color5; mColor color6; }; extern "C" TearEffectColorThing sTearEffectColors[] = { {mColor(0x80, 0xFF, 0x80, 0xFF), mColor(0x00, 0xFF, 0x40, 0xFF), mColor(0xC8, 0xFF, 0xC8, 0xFF), mColor(0x40, 0xFF, 0x40, 0xFF), mColor(0x40, 0xFF, 0x60, 0xFF), mColor(0x00, 0xFF, 0x40, 0xFF)}, {mColor(0xFF, 0x80, 0xA0, 0xFF), mColor(0xFF, 0x40, 0x80, 0xFF), mColor(0xFF, 0xC8, 0xC8, 0xFF), mColor(0xFF, 0x40, 0x80, 0xFF), mColor(0xFF, 0x60, 0x80, 0xFF), mColor(0xFF, 0x00, 0x40, 0xFF)}, {mColor(0xFF, 0xFF, 0x80, 0xFF), mColor(0xFF, 0xFF, 0x00, 0xFF), mColor(0xFF, 0xFF, 0xC8, 0xFF), mColor(0xFF, 0xFF, 0x40, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, {mColor(0x80, 0xFF, 0xFF, 0xFF), mColor(0x00, 0x80, 0xFF, 0xFF), mColor(0xC8, 0xC8, 0xFF, 0xFF), mColor(0x40, 0xA0, 0xFF, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, }; struct UnkFloat { f32 f; UnkFloat(f32 f_) : f(f_) {} }; const mVec3_c dAcItem_c::sUnkOffset1(0.0f, 28.0f, 0.0f); const mVec3_c dAcItem_c::sUnkOffset2(0.0f, 0.0f, 0.0f); const mVec3_c dAcItem_c::sUnkOffset3(0.0f, 28.0f, 0.0f); const mVec3_c dAcItem_c::sUnkOffset4(0.0f, 0.0f, 0.0f); const mVec3_c dAcItem_c::sUnkOffset5(0.0f, 25.0f, 0.0f); const mVec3_c dAcItem_c::sUnkOffset6(0.0f, 25.0f, 0.0f); extern const UnkFloat f1(0.25f); extern const UnkFloat f2(1.0f); /* static */ extern const char *const sGetFairyBody = "GetFairy_body"; /* static */ extern const char *const sBottleFairy_body = "BottleFairy_body"; SPECIAL_ACTOR_PROFILE(ITEM, dAcItem_c, fProfile::ITEM, 0x2B, 0, 2); const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs1[] = { &dAcItem_c::fn_80248020, nullptr, &dAcItem_c::fn_80248010, nullptr, &dAcItem_c::fn_80255B30, &dAcItem_c::fn_80255BA0, }; const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs2[] = { &dAcItem_c::fn_80248040, nullptr, &dAcItem_c::fn_80248030, nullptr, &dAcItem_c::fn_80255BD0, &dAcItem_c::fn_80255C40, }; fLiMgBa_c dAcItem_c::sItemList; dAcRef_c dAcItem_c::sItemListHead; dAcRef_c dAcItem_c::sItemListTail; fLiMgBa_c dAcItem_c::sUnusedList; dAcItem_c::dAcItem_c() : mStateMgr(*this), mEff_0x8F4(this), mEff_0x928(this), mEff_0x95C(this), mEff_0x990(this), mEff_0x9C4(this), mEff_0x9F8(this), mEff_0xA2C(this), mEff_0xA60(this), mNode(this), mEventRelated(*this, nullptr), mDowsingTarget(this, DowsingTarget::SLOT_NONE), mItemQueuePrev(nullptr), mItemQueueNext(nullptr) { field_0xCD8 = 1.0f; mBaseScale = 1.0f; mCurrentScale = 1.0f; field_0xCE4 = 1.0f; field_0xCE8 = 1.0f; field_0xCEC = 1.0f; mItemFlags = 0; field_0xD4C = 0; mbNoDespawn = false; mbNoGravity = false; field_0xD51 = 0; field_0xD56 = 0; mbShowItemLighting = false; field_0xD62 = 0; field_0xD63 = 0; field_0xD65 = 0; field_0xD66 = 0; sItemList.append(&mNode); mTargetFiRelated = 3; } dAcItem_c::~dAcItem_c() { delete mpResurgeCtl; for (int i = 0; i < 2; i++) { delete mpPickupPositionCtl[i]; } delete mpMdl; mDowsingTarget.doUnregister(); } dAcItem_c::Tear_e dAcItem_c::getTearSubtype(u32 id) { // If only this could be written in a simpler way... bool found = false; int i = 0; while (!found && i <= (int)ARRAY_LENGTH(sTearIdxes) - 1) { if (id == sTearIdxes[i].itemId) { found = true; } else { i++; } } if (found) { return sTearIdxes[i].idx; } return TEAR_MAX; } bool dAcItem_c::createHeap() { if (dItemMdlPut_c::isMdlForItemId(mRealItemId)) { mpMdl = new dItemMdlPut_c(); } else if (dItemMdlShield_c::isMdlForItemId(mRealItemId)) { mpMdl = new dItemMdlShield_c(); } else if (dItemMdlBottle_c::isMdlForItemId(mRealItemId)) { mpMdl = new dItemMdlBottle_c(); } else if (dItemMdlTear_c::isMdlForItemId(mRealItemId)) { mpMdl = new dItemMdlTear_c(); } else if (dItemMdlFirefly_c::isMdlForItemId(mRealItemId)) { mpMdl = new dItemMdlFirefly_c(); } else if (dItemMdlPotion_c::isMdlForItemId(mRealItemId)) { mpMdl = new dItemMdlPotion_c(); } else if (dItemMdlItem_c::isMdlForItemId(mRealItemId)) { mpMdl = new dItemMdlItem_c(); } else if (dItemMdlRupee_c::isMdlForItemId(mRealItemId)) { mpMdl = new dItemMdlRupee_c(); } else if (dItemMdlLightFruit_c::isMdlForItemId(mRealItemId)) { mpMdl = new dItemMdlLightFruit_c(); } else if (dItemMdlStaminaFruit_c::isMdlForItemId(mRealItemId)) { mpMdl = new dItemMdlStaminaFruit_c(); } else { return false; } if (mpMdl == nullptr) { return false; } if (!mpMdl->init(mRealItemId, this, &mAllocator)) { return false; } mpPickupPositionCtl[0] = new dAcItemPickupPositionOn_c(); if (mpPickupPositionCtl[0] == nullptr) { return false; } mpPickupPositionCtl[1] = new dAcItemPickupPositionOff_c(); if (mpPickupPositionCtl[1] == nullptr) { return false; } if (getItemInitStruct()->_0x00[6] != 0) { mpResurgeCtl = new dAcItemResurgeOn_c(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); if (mId == ITEM_STAMINA_FRUIT) { mpResurgeCtl->setTimerInitVal(150); } else if (isLightFruit()) { mpResurgeCtl->setTimerInitVal(0); } } else { mpResurgeCtl = new dAcItemResurgeOff_c(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); } if (mpResurgeCtl == nullptr) { return false; } return true; } int dAcItem_c::create() { u32 flag = getFromParams(0xA, 0xFF); if (flag < 0xFF && SceneflagManager::sInstance->checkBoolFlag(mRoomID, flag)) { return FAILED; } u32 paramId = getItemIdFromParams(); if (paramId == ITEM_NONE) { return FAILED; } if (isItemDropFromEnemy()) { mId = determineActualItemIdFromItem(paramId); } else { mId = paramId; } if (isGratitudeCrystal()) { if (!StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_GRATITUDE_QUEST_STARTED) || !dScGame_c::currentSpawnInfo.isNight()) { return FAILED; } } else if (isHeart()) { if (isItemDropFromEnemy() && dScGame_c::isHeroMode()) { switch (adventurePouchCountItem(ITEM_HEART_MEDAL)) { case 0: return FAILED; case 1: if (cM::rndInt(2) < 1) { return FAILED; } } } } setItemId(getItemId2()); switch (getItemInitStruct()->_0x00[9]) { case 0: mFn_0xC90 = &dAcItem_c::fn_80254DE0; break; case 1: mFn_0xC90 = &dAcItem_c::fn_80254DF0; break; default: return FAILED; } if (isSmallKey()) { mFnGetFreestandingScale = &dAcItem_c::getSmallKeyFreestandingScale; } else if (isGreenRupee() || isBlueRupee() || isRedRupee() || isRupoor()) { mFnGetFreestandingScale = &dAcItem_c::getLowValueRupeeFreestandingScale; } else if (isSilverRupee() || isGoldRupee()) { mFnGetFreestandingScale = &dAcItem_c::getHighValueRupeeFreestandingScale; } else if (isSlingshot()) { mFnGetFreestandingScale = &dAcItem_c::getSlingshotFreestandingScale; } else if (isEldinOre()) { mFnGetFreestandingScale = &dAcItem_c::getEldinOreFreestandingScale; } else if (isJellyBlob()) { mFnGetFreestandingScale = &dAcItem_c::getJellyBlobFreestandingScale; } else if (isUnkTreasureGroup1()) { mFnGetFreestandingScale = &dAcItem_c::getUnkTreasureGroup1FreestandingScale; } else if (isHeartPiece()) { mFnGetFreestandingScale = &dAcItem_c::getHeartPieceFreestandingScale; } else if (isGratitudeCrystal()) { mFnGetFreestandingScale = &dAcItem_c::getGratitudeCrystalFreestandingScale; } else { mFnGetFreestandingScale = &dAcItem_c::getDefaultFreestandingScale; } if (isTreasure3()) { mFnGetScale = &dAcItem_c::getTreasure3Scale; } else if (isInsect()) { mFnGetScale = &dAcItem_c::getInsectScale; } else { mFnGetScale = &dAcItem_c::getDefaultScale; } if (isSilverRupee() || isGoldRupee()) { mFnGetPickupDemoScale = &dAcItem_c::getHighValueRupeePickupScale; } else { mFnGetPickupDemoScale = &dAcItem_c::getDefaultPickupScale; } mFnCallGetFreestandingScale = &dAcItem_c::callGetFreestandingModelScale; switch (getItemInitStruct()->_0x00[10]) { case 0: mFnAction = &dAcItem_c::moveNormal0; break; case 1: mFnAction = &dAcItem_c::moveNormal1; break; case 2: mFnAction = &dAcItem_c::moveSpecial; break; default: return FAILED; } if (isHeartV()) { mFunc_0xB58 = &dAcItem_c::fn_802555F0; } else { mFunc_0xB58 = &dAcItem_c::fn_802555D0; } if (isAnyRupee()) { mFnBounce = &dAcItem_c::bounceRupee; } else if (isHeartV()) { mFnBounce = &dAcItem_c::bounceNone; } else { mFnBounce = &dAcItem_c::bounceNormal; } if (isAnyRupee()) { mFnAction3 = &dAcItem_c::fn_802558F0; } else if (isAnyTear() || isTriforce() || isHeartPiece()) { mFnAction3 = &dAcItem_c::fn_80255AE0; } else { mFnAction3 = &dAcItem_c::fn_802558E0; } if (getItemInitStruct()->_0x00[8] == 0) { mFnAction4 = &dAcItem_c::fn_80248060; } else if (getItemInitStruct()->_0x00[8] == 1) { mFnAction4 = &dAcItem_c::fn_80248050; } else if (getItemInitStruct()->_0x00[8] == 2) { mFnAction4 = &dAcItem_c::fn_80255D50; } else if (getItemInitStruct()->_0x00[8] == 3) { mFnAction4 = &dAcItem_c::fn_80255DB0; } else if (getItemInitStruct()->_0x00[8] == 4) { mFnAction4 = &dAcItem_c::fn_80248060; } else { return FAILED; } mSubtype = mId; CREATE_ALLOCATOR(dAcItem_c); if (!getFromParams(0x13, 0x1)) { mpMdl->setPriorityDraw(); } mStts.SetRank(1); mCyl.Set(sSrcCyl); mCyl.SetStts(mStts); mCyl.SetR(getItemFlagStruct(mId)->field_0x00); mCyl.SetH(getItemFlagStruct(mId)->field_0x01); setupUnkColliderFlags2(); if (isAnyRupee()) { mCyl.OnTgInfo_0x2(0x8); mCyl.SetTgSrcField_0x0C(0x8); } u32 unk = getParams2Lower_shift1_0x7(); if ((mId == ITEM_STAMINA_FRUIT && unk) || isLightFruit() || isAnyTear() || isTriforce() || isGratitudeCrystal()) { mCyl.SetCoGrp(0x2); } else { mCyl.SetCoGrp(0xE); } if (mId == ITEM_STAMINA_FRUIT || isHeartPiece() || isTriforce()) { mCyl.ClrTg_0x800000(); } else { mCyl.OnTg_0x800000(); } if (isHeartPiece()) { mCyl.OnTg_0x1000000(); } if (isHeartPiece()) { mCyl.SetTg_0x4C(0x6CC0); } else if (isBabyRattle()) { mCyl.SetTg_0x4C(0x6480); } else if (!isAnyRupee() && !isHeartV() && mId != ITEM_STAMINA_FRUIT) { mCyl.SetTg_0x4C(0x6480); } if (isBabyRattle()) { mCyl.SetTgInfo_0x1(0x13); } else if (isHeartPiece()) { mCyl.SetTgInfo_0x1(0x15); } else if (!isAnyRupee() && !isHeartV() && mId != ITEM_STAMINA_FRUIT) { mCyl.SetTgInfo_0x1(0x13); } if (isHeartPiece()) { mCyl.ClrTg_0x200000(); } else { mCyl.OnTg_0x200000(); } mCyl.SetCoCallback(hitCallback); mAcchCir.SetWall( getItemFlagStruct(getItemId())->field_0x01 * 0.5f, getItemFlagStruct(getItemId())->field_0x00 * 0.6f ); mObjAcch.Set(this, 1, &mAcchCir); mObjAcch.field_0x0D4 = 50.0f; mObjAcch.SetClrSpeedY(); mObjAcch.SetField_0xC(4); mAcceleration = -2.0f; mMaxSpeed = -80.0f; mGetItemPouchSlot = sGetItemPouchSlot; mItemQuantity = sGetItemQuantity; s32 subType = getSubtypeFromParam(mParams); if (subType != 1 && subType != 2 && subType != 3 && subType != 4 && subType != 5 && subType != 6) { fn_80253F90(true); } else { fn_80253F90(false); } if (getSubtypeFromParam(mParams) == 2) { fn_80256790(); } else { fn_802567D0(); } switch (getSubtypeFromParam(mParams)) { default: mStateMgr.changeState(StateID_Wait); break; case 1: mStateMgr.changeState(StateID_Wait); break; case 2: mStateMgr.changeState(StateID_Wait); break; case 3: onTouchLink(); break; case 4: mStateMgr.changeState(StateID_Get); break; case 5: mStateMgr.changeState(StateID_WaitForcedGetDemo); break; case 6: mStateMgr.changeState(StateID_GetBeetle); break; case 7: mStateMgr.changeState(StateID_WaitTBoxGetDemo); break; } fn_80255DF0(); fn_80254BB0(); if (isHeart()) { setDespawnTimer(600); } else { setDespawnTimer(300); } if (isGreenRupee() || isBlueRupee() || isRedRupee() || isRupoor()) { mFnSetBoundingBox = &dAcItem_c::setLowValueRupeeBoundingBox; } else if (isSilverRupee() || isGoldRupee()) { mFnSetBoundingBox = &dAcItem_c::setHighValueRupeeBoundingBox; } else if (isArrowBundle()) { mFnSetBoundingBox = &dAcItem_c::setArrowBundleBoundingBox; } else { mFnSetBoundingBox = &dAcItem_c::setDefaultBoundingBox; } applyBoundingBox(); switch (mId) { case ITEM_SMALL_KEY: mFnGetGravity1 = &dAcItem_c::getSmallKeyGravity1; break; case ITEM_GREEN_RUPEE: mFnGetGravity1 = &dAcItem_c::getGreenRupeeGravity1; break; case ITEM_BLUE_RUPEE: mFnGetGravity1 = &dAcItem_c::getBlueRupeeGravity1; break; case ITEM_RED_RUPEE: mFnGetGravity1 = &dAcItem_c::getRedRupeeGravity1; break; case ITEM_HEART: mFnGetGravity1 = &dAcItem_c::getHeartGravity1; break; case ITEM_SINGLE_ARROW: mFnGetGravity1 = &dAcItem_c::getSingleArrowGravity1; break; case ITEM_BUNDLE_ARROWS: mFnGetGravity1 = &dAcItem_c::getArrowBundleGravity1; break; case ITEM_SILVER_RUPEE: mFnGetGravity1 = &dAcItem_c::getSilverRupeeGravity1; break; case ITEM_GOLD_RUPEE: mFnGetGravity1 = &dAcItem_c::getGoldRupeeGravity1; break; case ITEM_RUPOOR: mFnGetGravity1 = &dAcItem_c::getRupoorGravity1; break; case ITEM_5_BOMBS: mFnGetGravity1 = &dAcItem_c::get5BombsGravity1; break; case ITEM_10_BOMBS: mFnGetGravity1 = &dAcItem_c::get10BombsGravity1; break; case ITEM_FARORE_TEAR: mFnGetGravity1 = &dAcItem_c::getFaroreTearGravity1; break; case ITEM_5_DEKU_SEEDS: mFnGetGravity1 = &dAcItem_c::get5SeedsGravity1; break; default: mFnGetGravity1 = &dAcItem_c::getDefaultGravity1; break; } switch (mId) { case ITEM_HEART: mFnGetHeartGravity = &dAcItem_c::getHeartGravity2; break; default: mFnGetHeartGravity = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getGreenRupeeGravity3; break; case ITEM_BLUE_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getBlueRupeeGravity3; break; case ITEM_RED_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getRedRupeeGravity3; break; case ITEM_SILVER_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getSilverRupeeGravity3; break; case ITEM_GOLD_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getGoldRupeeGravity3; break; case ITEM_RUPOOR: mFnGetRupeeGravity = &dAcItem_c::getRupoorGravity3; break; default: mFnGetRupeeGravity = nullptr; break; } switch (mId) { case ITEM_SMALL_KEY: mFnGetGravity4 = &dAcItem_c::getSmallKeyGravity4; break; case ITEM_GREEN_RUPEE: mFnGetGravity4 = &dAcItem_c::getGreenRupeeGravity4; break; case ITEM_BLUE_RUPEE: mFnGetGravity4 = &dAcItem_c::getBlueRupeeGravity4; break; case ITEM_RED_RUPEE: mFnGetGravity4 = &dAcItem_c::getRedRupeeGravity4; break; case ITEM_HEART: mFnGetGravity4 = &dAcItem_c::getHeartGravity4; break; case ITEM_SINGLE_ARROW: mFnGetGravity4 = &dAcItem_c::getSingleArrowGravity4; break; case ITEM_BUNDLE_ARROWS: mFnGetGravity4 = &dAcItem_c::getArrowBundleGravity4; break; case ITEM_SILVER_RUPEE: mFnGetGravity4 = &dAcItem_c::getSilverRupeeGravity4; break; case ITEM_GOLD_RUPEE: mFnGetGravity4 = &dAcItem_c::getGoldRupeeGravity4; break; case ITEM_RUPOOR: mFnGetGravity4 = &dAcItem_c::getRupoorGravity4; break; case ITEM_5_BOMBS: mFnGetGravity4 = &dAcItem_c::get5BombsGravity4; break; case ITEM_10_BOMBS: mFnGetGravity4 = &dAcItem_c::get10BombsGravity4; break; case ITEM_FARORE_TEAR: mFnGetGravity4 = &dAcItem_c::getFaroreTearGravity4; break; case ITEM_5_DEKU_SEEDS: mFnGetGravity4 = &dAcItem_c::get5SeedsGravity4; break; default: mFnGetGravity4 = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetDirHitKnockback = &dAcItem_c::getGreenRupeeDirHitKnockback; break; case ITEM_BLUE_RUPEE: mFnGetDirHitKnockback = &dAcItem_c::getBlueRupeeDirHitKnockback; break; case ITEM_RED_RUPEE: mFnGetDirHitKnockback = &dAcItem_c::getRedRupeeDirHitKnockback; break; case ITEM_SILVER_RUPEE: mFnGetDirHitKnockback = &dAcItem_c::getSilverRupeeDirHitKnockback; break; case ITEM_GOLD_RUPEE: mFnGetDirHitKnockback = &dAcItem_c::getGoldRupeeDirHitKnockback; break; case ITEM_RUPOOR: mFnGetDirHitKnockback = &dAcItem_c::getRupoorDirHitKnockback; break; default: mFnGetDirHitKnockback = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetDirHitKnockbackRand = &dAcItem_c::getGreenRupeeDirHitKnockbackRand; break; case ITEM_BLUE_RUPEE: mFnGetDirHitKnockbackRand = &dAcItem_c::getBlueRupeeDirHitKnockbackRand; break; case ITEM_RED_RUPEE: mFnGetDirHitKnockbackRand = &dAcItem_c::getRedRupeeDirHitKnockbackRand; break; case ITEM_SILVER_RUPEE: mFnGetDirHitKnockbackRand = &dAcItem_c::getSilverRupeeDirHitKnockbackRand; break; case ITEM_GOLD_RUPEE: mFnGetDirHitKnockbackRand = &dAcItem_c::getGoldRupeeDirHitKnockbackRand; break; case ITEM_RUPOOR: mFnGetDirHitKnockbackRand = &dAcItem_c::getRupoorDirHitKnockbackRand; break; default: mFnGetDirHitKnockbackRand = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetHitKnockback = &dAcItem_c::getGreenRupeeHitKnockback; break; case ITEM_BLUE_RUPEE: mFnGetHitKnockback = &dAcItem_c::getBlueRupeeHitKnockback; break; case ITEM_RED_RUPEE: mFnGetHitKnockback = &dAcItem_c::getRedRupeeHitKnockback; break; case ITEM_SILVER_RUPEE: mFnGetHitKnockback = &dAcItem_c::getSilverRupeeHitKnockback; break; case ITEM_GOLD_RUPEE: mFnGetHitKnockback = &dAcItem_c::getGoldRupeeHitKnockback; break; case ITEM_RUPOOR: mFnGetHitKnockback = &dAcItem_c::getRupoorHitKnockback; break; default: mFnGetHitKnockback = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetHitKnockbackRand = &dAcItem_c::getGreenRupeeHitKnockbackRand; break; case ITEM_BLUE_RUPEE: mFnGetHitKnockbackRand = &dAcItem_c::getBlueRupeeHitKnockbackRand; break; case ITEM_RED_RUPEE: mFnGetHitKnockbackRand = &dAcItem_c::getRedRupeeHitKnockbackRand; break; case ITEM_SILVER_RUPEE: mFnGetHitKnockbackRand = &dAcItem_c::getSilverRupeeHitKnockbackRand; break; case ITEM_GOLD_RUPEE: mFnGetHitKnockbackRand = &dAcItem_c::getGoldRupeeHitKnockbackRand; break; case ITEM_RUPOOR: mFnGetHitKnockbackRand = &dAcItem_c::getRupoorHitKnockbackRand; break; default: mFnGetHitKnockbackRand = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetHitSquareDistance2 = &dAcItem_c::getGreenRupeeHitSquareDistance2; break; case ITEM_BLUE_RUPEE: mFnGetHitSquareDistance2 = &dAcItem_c::getBlueRupeeHitSquareDistance2; break; case ITEM_RED_RUPEE: mFnGetHitSquareDistance2 = &dAcItem_c::getRedRupeeHitSquareDistance2; break; case ITEM_SILVER_RUPEE: mFnGetHitSquareDistance2 = &dAcItem_c::getSilverRupeeHitSquareDistance2; break; case ITEM_GOLD_RUPEE: mFnGetHitSquareDistance2 = &dAcItem_c::getGoldRupeeHitSquareDistance2; break; case ITEM_RUPOOR: mFnGetHitSquareDistance2 = &dAcItem_c::getRupoorHitSquareDistance2; break; case ITEM_HEART: mFnGetHitSquareDistance2 = &dAcItem_c::getHeartHitSquareDistance2; break; default: mFnGetHitSquareDistance2 = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetDirHitKnockback2 = &dAcItem_c::getGreenRupeeDirHitKnockback2; break; case ITEM_BLUE_RUPEE: mFnGetDirHitKnockback2 = &dAcItem_c::getBlueRupeeDirHitKnockback2; break; case ITEM_RED_RUPEE: mFnGetDirHitKnockback2 = &dAcItem_c::getRedRupeeDirHitKnockback2; break; case ITEM_SILVER_RUPEE: mFnGetDirHitKnockback2 = &dAcItem_c::getSilverRupeeDirHitKnockback2; break; case ITEM_GOLD_RUPEE: mFnGetDirHitKnockback2 = &dAcItem_c::getGoldRupeeDirHitKnockback2; break; case ITEM_RUPOOR: mFnGetDirHitKnockback2 = &dAcItem_c::getRupoorDirHitKnockback2; break; case ITEM_HEART: mFnGetDirHitKnockback2 = &dAcItem_c::getHeartDirHitKnockback2; break; default: mFnGetDirHitKnockback2 = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getGreenRupeeDirHitKnockbackRand2; break; case ITEM_BLUE_RUPEE: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getBlueRupeeDirHitKnockbackRand2; break; case ITEM_RED_RUPEE: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getRedRupeeDirHitKnockbackRand2; break; case ITEM_SILVER_RUPEE: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getSilverRupeeDirHitKnockbackRand2; break; case ITEM_GOLD_RUPEE: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getGoldRupeeDirHitKnockbackRand2; break; case ITEM_RUPOOR: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getRupoorDirHitKnockbackRand2; break; case ITEM_HEART: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getHeartDirHitKnockbackRand2; break; default: mFnGetDirHitKnockbackRand2 = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetHitKnockback2 = &dAcItem_c::getGreenRupeeHitKnockback2; break; case ITEM_BLUE_RUPEE: mFnGetHitKnockback2 = &dAcItem_c::getBlueRupeeHitKnockback2; break; case ITEM_RED_RUPEE: mFnGetHitKnockback2 = &dAcItem_c::getRedRupeeHitKnockback2; break; case ITEM_SILVER_RUPEE: mFnGetHitKnockback2 = &dAcItem_c::getSilverRupeeHitKnockback2; break; case ITEM_GOLD_RUPEE: mFnGetHitKnockback2 = &dAcItem_c::getGoldRupeeHitKnockback2; break; case ITEM_RUPOOR: mFnGetHitKnockback2 = &dAcItem_c::getRupoorHitKnockback2; break; case ITEM_HEART: mFnGetHitKnockback2 = &dAcItem_c::getHeartHitKnockback2; break; default: mFnGetHitKnockback2 = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetHitKnockbackRand2 = &dAcItem_c::getGreenRupeeHitKnockbackRand2; break; case ITEM_BLUE_RUPEE: mFnGetHitKnockbackRand2 = &dAcItem_c::getBlueRupeeHitKnockbackRand2; break; case ITEM_RED_RUPEE: mFnGetHitKnockbackRand2 = &dAcItem_c::getRedRupeeHitKnockbackRand2; break; case ITEM_SILVER_RUPEE: mFnGetHitKnockbackRand2 = &dAcItem_c::getSilverRupeeHitKnockbackRand2; break; case ITEM_GOLD_RUPEE: mFnGetHitKnockbackRand2 = &dAcItem_c::getGoldRupeeHitKnockbackRand2; break; case ITEM_RUPOOR: mFnGetHitKnockbackRand2 = &dAcItem_c::getRupoorHitKnockbackRand2; break; case ITEM_HEART: mFnGetHitKnockbackRand2 = &dAcItem_c::getHeartHitKnockbackRand2; break; default: mFnGetHitKnockbackRand2 = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetDirHitKnockback3 = &dAcItem_c::getGreenRupeeDirHitKnockback3; break; case ITEM_BLUE_RUPEE: mFnGetDirHitKnockback3 = &dAcItem_c::getBlueRupeeDirHitKnockback3; break; case ITEM_RED_RUPEE: mFnGetDirHitKnockback3 = &dAcItem_c::getRedRupeeDirHitKnockback3; break; case ITEM_SILVER_RUPEE: mFnGetDirHitKnockback3 = &dAcItem_c::getSilverRupeeDirHitKnockback3; break; case ITEM_GOLD_RUPEE: mFnGetDirHitKnockback3 = &dAcItem_c::getGoldRupeeDirHitKnockback3; break; case ITEM_RUPOOR: mFnGetDirHitKnockback3 = &dAcItem_c::getRupoorDirHitKnockback3; break; case ITEM_HEART: mFnGetDirHitKnockback3 = &dAcItem_c::getHeartDirHitKnockback3; break; default: mFnGetDirHitKnockbackRand2 = nullptr; break; // @bug copypasta mistake } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getGreenRupeeDirHitKnockbackRand3; break; case ITEM_BLUE_RUPEE: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getBlueRupeeDirHitKnockbackRand3; break; case ITEM_RED_RUPEE: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getRedRupeeDirHitKnockbackRand3; break; case ITEM_SILVER_RUPEE: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getSilverRupeeDirHitKnockbackRand3; break; case ITEM_GOLD_RUPEE: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getGoldRupeeDirHitKnockbackRand3; break; case ITEM_RUPOOR: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getRupoorDirHitKnockbackRand3; break; case ITEM_HEART: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getHeartDirHitKnockbackRand3; break; default: mFnGetDirHitKnockbackRand2 = nullptr; break; // @bug copypasta mistake } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetHitKnockback3 = &dAcItem_c::getGreenRupeeHitKnockback3; break; case ITEM_BLUE_RUPEE: mFnGetHitKnockback3 = &dAcItem_c::getBlueRupeeHitKnockback3; break; case ITEM_RED_RUPEE: mFnGetHitKnockback3 = &dAcItem_c::getRedRupeeHitKnockback3; break; case ITEM_SILVER_RUPEE: mFnGetHitKnockback3 = &dAcItem_c::getSilverRupeeHitKnockback3; break; case ITEM_GOLD_RUPEE: mFnGetHitKnockback3 = &dAcItem_c::getGoldRupeeHitKnockback3; break; case ITEM_RUPOOR: mFnGetHitKnockback3 = &dAcItem_c::getRupoorHitKnockback3; break; case ITEM_HEART: mFnGetHitKnockback3 = &dAcItem_c::getHeartHitKnockback3; break; default: mFnGetHitKnockback3 = nullptr; break; } switch (mId) { case ITEM_GREEN_RUPEE: mFnGetHitKnockbackRand3 = &dAcItem_c::getGreenRupeeHitKnockbackRand3; break; case ITEM_BLUE_RUPEE: mFnGetHitKnockbackRand3 = &dAcItem_c::getBlueRupeeHitKnockbackRand3; break; case ITEM_RED_RUPEE: mFnGetHitKnockbackRand3 = &dAcItem_c::getRedRupeeHitKnockbackRand3; break; case ITEM_SILVER_RUPEE: mFnGetHitKnockbackRand3 = &dAcItem_c::getSilverRupeeHitKnockbackRand3; break; case ITEM_GOLD_RUPEE: mFnGetHitKnockbackRand3 = &dAcItem_c::getGoldRupeeHitKnockbackRand3; break; case ITEM_RUPOOR: mFnGetHitKnockbackRand3 = &dAcItem_c::getRupoorHitKnockbackRand3; break; case ITEM_HEART: mFnGetHitKnockbackRand3 = &dAcItem_c::getHeartHitKnockbackRand3; break; default: mFnGetHitKnockbackRand3 = nullptr; break; } if (isHeartV()) { mFnGetSinkSpeed = &dAcItem_c::getSinkSpeedHeart; } else { mFnGetSinkSpeed = &dAcItem_c::getSinkSpeedDefault; } if (mbNoDespawn) { dBgS::GetInstance()->SetLightingCode(this, 10.0f); } else if (isHeartV()) { mLinkage.bushTpFunc(mObjAcch); } if (isHeartV()) { field_0xD20 = 6; } if (isAnyTear()) { mSomeStr = "force"; } if (isAnyTear()) { s32 type = getTearSubtype(mId); if (type == TEAR_MAX) { type = TEAR_FARON; } dAcObjBase_c *forceSign = dAcObjBase_c::create(this, fProfile::OBJ_FORCE_SIGN, type & 0xFF, nullptr, nullptr, nullptr, nullptr, 0x3F); if (forceSign != nullptr) { mForceSignRef.link(forceSign); } } if (isAnyTear()) { dAcBase_c *forceGetFlag = dAcBase_c::createActorStage( fProfile::TAG_FORCE_GET_FLAG, dTgForceGetFlag_c::tearIdxToParam(getTearIdx()), &mPosition, &mRotation, &mScale, 0, mRoomID, this ); if (forceGetFlag == nullptr) { return FAILED; } } if (mId == ITEM_STAMINA_FRUIT && unk) { u32 p1 = (getFirstBitParams2() & 0x1) << 8; u32 parms = ((mParams >> 0x13) & 0x1) | (p1 & ~0x1); dAcObjBase_c *leaves = dAcObjBase_c::create(fProfile::OBJ_FRUIT_GUTS_LEAF, mRoomID, parms, &mPosition, &mRotation, &mScale, -1); if (leaves == nullptr) { return FAILED; } } if (isGreenRupee() || isBlueRupee() || isRedRupee() || isSilverRupee() || isGoldRupee()) { mDowsingTarget.initialize(DowsingTarget::SLOT_RUPEE, 0, &sFreestandingDowsingOffset, 0.0f); mDowsingTarget.doRegister(); } else if (isHeart()) { mDowsingTarget.initialize(DowsingTarget::SLOT_HEART, 0, &sFreestandingDowsingOffset, 0.0f); mDowsingTarget.doRegister(); } else if (is5GratitudeCrystals() || isGratitudeCrystal()) { mDowsingTarget.initialize(DowsingTarget::SLOT_CRYSTAL, 0, &sFreestandingDowsingOffset, 0.0f); mDowsingTarget.doRegister(); } else if (isTreasure2((ITEM_ID)mId)) { mDowsingTarget.initialize(DowsingTarget::SLOT_TREASURE, 0, &sFreestandingDowsingOffset, 0.0f); mDowsingTarget.doRegister(); } if (isGratitudeCrystal() || isUnkTreasureGroup1()) { setFreestandingYOffset(-mpMdl->getMdl()->getResMdl().GetResNode(sResNodeName).GetTranslate().y); } if (mId == ITEM_STAMINA_FRUIT && unk == 0) { mItemFlags |= 4; } if ((isGratitudeCrystal() || is5GratitudeCrystals()) && !isItemDropFromEnemy() && mStateMgr.isState(StateID_Wait)) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_ENERGY_SOURCE_OUTWELL); } if (EventManager::isInEvent() && EventManager::isCurrentEvent("GetGenkiItem")) { setItemFlags(mItemFlags | 0x20); } // okay bool is = isHeartPiece(); if (is) { is = dScGame_c::isCurrentStage("D100"); } if (is) { is = mPosition.squareDistance(mVec3_c(0.0f, -190.0f, -9590.0f)) < 10000.0f; } if (is) { // Skyview Temple - Heart Piece behind bars in main room setItemFlags(mItemFlags | 0x80); } field_0xD48 = cM::rndInt(0x10000); mColorFilter.r = 0; mColorFilter.g = 0; mColorFilter.b = 0; mLightLevelMaybe = 0.0f; return SUCCEEDED; } int dAcItem_c::doDelete() { sItemList.remove(&this->mNode); dAcItem_c *prev = mItemQueuePrev.get(); dAcItem_c *next = mItemQueueNext.get(); if (prev == nullptr) { if (next == nullptr) { if (this == sItemListHead.get()) { sItemListHead.unlink(); } if (this == sItemListTail.get()) { sItemListTail.unlink(); } } else { sItemListHead.link(next); next->mItemQueuePrev.unlink(); } } else if (next == nullptr) { sItemListTail.link(prev); prev->mItemQueueNext.unlink(); } else { prev->mItemQueueNext.link(next); next->mItemQueuePrev.link(prev); } return SUCCEEDED; } int dAcItem_c::actorExecute() { if (!checkActorProperty(AC_PROP_0x10000000)) { if (mId == ITEM_STAMINA_FRUIT) { if (isFirstBitParams2NotSet() && !fn_802577A0()) { field_0xCD8 = 0.0f; } else { field_0xCD8 = 1.0f; } } else if (isLightFruit()) { if ((this->*mFnAction4)()) { field_0xCD8 = 1.0f; } else { field_0xCD8 = 0.0f; } } dAcOScatterSand *ac = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_VSD, nullptr)); bool keepGoing = true; while (keepGoing && ac != nullptr) { if (mPosition.squareDistance(ac->mPosition) < 90000.0f) { mCoveredSand.link(ac); keepGoing = false; } else { ac = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_VSD, ac)); } } } if (field_0xD4C < 0xFF) { field_0xD4C++; } fn_80254BC0(); fn_80255B10(); field_0xD5C = 0; field_0xD66 = 0; mStateMgr.executeState(); updateLightingMaybe(); if (mDespawnTimer == 0) { deleteRequest(); return SUCCEEDED; } if ((mItemFlags & 0x8) != 0) { deleteRequest(); return SUCCEEDED; } mRotation.y += field_0xD38; f32 scaleF = getCurrentScale(); mScale.set(scaleF, scaleF, scaleF); mVec3_c tmp1; fn_802518C0(&tmp1); mPositionCopy2.set(tmp1); mVec3_c tmp2; fn_802518C0(&tmp2); mPositionCopy3.set(tmp2); mLinkage.fn_800511E0(this); if (!checkObjectProperty(OBJ_PROP_0x200)) { mMtx_c mtx = mWorldMtx; mtx.YrotM(mMdlRotY); mtx.ZrotM(field_0xD42); if (isGratitudeCrystal() || isUnkTreasureGroup1()) { if (mStateMgr.isState(StateID_Wait) || mStateMgr.isState(StateID_Carry)) { f32 off = mFreestandingOffsetH; f32 sc = getCurrentScale(); mtx.m[1][3] += sc * off; } } else if (isInsect()) { if (mStateMgr.isState(StateID_Get)) { mtx.YrotM(-0x2000); } } mpMdl->setLocalMtx(mtx); mpMdl->setScale(mScale); if (isFairyV() || isBottleFairyV()) { m3d::smdl_c *mdl = mpMdl->getMdl(); if (mdl != nullptr) { mdl->calc(false); } } } field_0xD51 = 0; mCyl.ClrTgHit(); mCyl.ClrCoHit(); field_0xD65 = 0; if ((isAnyRupeeV() || mId == ITEM_STAMINA_FRUIT) && field_0xD66 && mObjAcch.ChkGroundLanding()) { dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 0.7f, field_0x1B0); } if (isStarryFireflyV() && !checkObjectProperty(OBJ_PROP_0x200)) { fn_802546A0(); } if (isFairyV() && !checkObjectProperty(OBJ_PROP_0x200)) { fn_80254710(); } if (isBottleFairyV() && !checkObjectProperty(OBJ_PROP_0x200)) { fn_80254790(); } if (checkAbovePosition()) { mItemFlags |= 0x10; f32 f = mPosition.y - dBgS_ObjGndChk::GetGroundHeight(); field_0xD18 = f < 0.0f ? 0.0f : f; } else { mItemFlags &= ~0x10; } applyBoundingBox(); if (isField_0xD04GtZero() || mStateMgr.isState(StateID_WaitGetDemo) || mStateMgr.isState(StateID_Get) || mStateMgr.isState(StateID_GetBeetle)) { setActorProperty(AC_PROP_0x4); } else { unsetActorProperty(AC_PROP_0x4); } return SUCCEEDED; } int dAcItem_c::draw() { if (mMdlScaleType == 2 || 0.0f < field_0xCD8) { bool shouldDraw = true; if (isMdlHidden()) { shouldDraw = false; } else if ((mStateMgr.isState(StateID_Wait) || mStateMgr.isState(StateID_Carry)) && mbIsWaiting) { shouldDraw = isBlinkBeforeDespawnShown(mDespawnTimer); } if (shouldDraw) { mpMdl->draw(); } if (mLinkage.checkConnection(dLinkage_c::CONNECTION_9) || (mId == ITEM_STAMINA_FRUIT && getParams2Lower_shift1_0x7()) || isLightFruit() || (mItemFlags & 0x10) == 0) { /* nothing */ } else if (mMdlScaleType == 2) { mQuat_c v(mVec3_c(0.0f, 0.0f, 0.0f), getItemFlagStruct(getItemId())->field_0x02); drawShadow(mShdw, nullptr, mWorldMtx, &v, -1, -1, -1, -1, -1, field_0xD18); } else { mQuat_c v( mVec3_c(0.0f, field_0xCD8 * 0.5f * getItemFlagStruct(getItemId())->field_0x01, 0.0f), field_0xCD8 * getItemFlagStruct(getItemId())->field_0x02 ); drawShadow(mShdw, nullptr, mWorldMtx, &v, -1, -1, -1, -1, -1, field_0xD18); } } return SUCCEEDED; } void dAcItem_c::setSpawnQuantity(s32 quantity) { sGetItemQuantity = quantity; } void dAcItem_c::setFreestandingYOffset(f32 off) { mFreestandingOffsetH = off; } void dAcItem_c::setFramesInAir(u32 numFrames) { mFramesInAir = numFrames; } void dAcItem_c::setItemFlags(u32 flags) { mItemFlags = flags; } bool dAcItem_c::isItemDropFromEnemy() const { return mObjID != 0xFFFF; } void dAcItem_c::unsetSpawnQuantity() { sGetItemQuantity = 0; } void dAcItem_c::unsetFramesInAir() { setFramesInAir(0); } void dAcItem_c::incrementFramesInAir() { u32 v = mFramesInAir; increment(&v); setFramesInAir(v); } void dAcItem_c::initializeState_Wait() { if (mbNoGravity) { setActorProperty(AC_PROP_0x1); mSpeed = 0.0f; mVelocity.y = 0.0f; } mpMdl->setDrawMode(dItemMdl_c::DrawMode_Put); field_0xD5B = 0; field_0xD38 = field_0xD3A = field_0xD3C = 0; fn_80253E20(); if (mbNoGravity) { mObjAcch.SetMoveBGOnly(); } mMdlScaleType = 0; mSinkOffset = 0.0f; mYOffset = 0.0f; } void dAcItem_c::executeState_Wait() { bool isFixedPosition; bool tmp = false; mVec3_c topPos = getPosition() + mVec3_c::Ey * mCyl.GetH(); bool chk = dBgS_ObjRoofChk::CheckPos(&getPosition()); if (chk) { tmp = dBgS_ObjRoofChk::GetRoofHeight() < topPos.y; } if (tmp) { isFixedPosition = false; } else { f32 f = chk ? dBgS_ObjRoofChk::GetRoofHeight() : 500.0f; mVec3_c chkPos = getPosition() + mVec3_c::Ey * f; if (dBgS_ObjGndChk::CheckPos(chkPos)) { if (topPos.y < dBgS_ObjGndChk::GetGroundHeight()) { const dAcObjBase_c *obj = dBgS::GetInstance()->GetActorPointer(dBgS_ObjGndChk::GetInstance()); if (obj == nullptr) { isFixedPosition = false; } else { isFixedPosition = obj->mProfileName == fProfile::OBJ_DESERT; } } else { isFixedPosition = false; } } else { isFixedPosition = false; } } if (isBabyRattle() && !isFixedPosition) { isFixedPosition = mCoveredSand.isLinked(); } if (fn_80255CF0() && field_0xD4C > 16 && (!mbNoGravity || !isFixedPosition)) { mCyl.OnTgCoFlag(0x1); } else { mCyl.OffTgCoFlag(0x1); } if ((mItemFlags & 0x80) != 0) { if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, 0x1D)) { mCyl.OnTgType(0x2); } else { mCyl.OffTgType(0x2); } } dAcPy_c *link = dAcPy_c::GetLinkM(); bool tgHit = mCyl.ChkTgHit(); bool tgBit1; if (tgHit) { tgBit1 = mCyl.ChkTgBit1(); } else { tgBit1 = false; } if (!link->checkFlags0x340(0x10)) { if (field_0xD65 || (tgHit && (mCyl.ChkTgAtHitType(AT_TYPE_SWORD) || mCyl.ChkTgAtHitType(AT_TYPE_BUGNET)))) { onTouchLink(); return; } if (fn_802574A0() && !tgBit1) { // TODO weird double load of link link = dAcPy_c::GetLinkM(); if (!link->getBeetleInFlight()) { addToGetQueue(); if ((link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() && FileManager::GetInstance()->getCurrentHealth() != 0)) { if (isSmallKey() || isBabyRattle()) { mStateMgr.changeState(StateID_WaitForcedGetDemo); } else { mStateMgr.changeState(StateID_Get); } } else { mStateMgr.changeState(StateID_Get); } } else { mStateMgr.changeState(StateID_GetBeetle); } return; } } u32 fruitParam = getParams2Lower_shift1_0x7(); if (tgHit) { if (mId == ITEM_STAMINA_FRUIT) { dJEffManager_c::spawnEffect( PARTICLE_RESOURCE_ID_MAPPING_373_, mPosition, &mRotation, &mScale, nullptr, nullptr, 0, 0 ); startSound(SE_O_REFRESH_FRUIT_BREAK); if (!fruitParam) { deleteRequest(); } else { mStateMgr.changeState(StateID_ResurgeWait); } return; } else if (isLightFruit()) { mStateMgr.changeState(StateID_ResurgeWait); return; } if (mCyl.ChkTgAtHitType(AT_TYPE_GLITTERING_SPORES)) { if (isHeart()) { if (fn_8024A230()) { mVec3_c spawnPos(mPosition.x, mPosition.y + 30.0f, mPosition.z); dAcObjBase_c::create(fProfile::OBJ_FAIRY, mRoomID, 0x3F, &spawnPos, nullptr, nullptr, -1); dJEffManager_c::spawnEffect( PARTICLE_RESOURCE_ID_MAPPING_375_, spawnPos, nullptr, nullptr, nullptr, nullptr, 0, 0 ); deleteRequest(); return; } } else { s32 accWeight = 0; for (int i = 0; i <= (int)ARRAY_LENGTH(sSporeRupeeChances) - 1; i++) { if (getItemId() != sSporeRupeeChances[i].itemId) { accWeight += sSporeRupeeChances[i].weight; } } s32 roll = cM::rndInt(accWeight); s32 acc = 0; bool found = false; int i = 0; while (!found && i <= (int)ARRAY_LENGTH(sSporeRupeeChances) - 1) { if (getItemId() == sSporeRupeeChances[i].itemId) { i++; } else { acc += sSporeRupeeChances[i].weight; if (roll < acc) { found = true; } else { i++; } } } setItemId(sSporeRupeeChances[i].itemId); mpMdl->changeItemId(sSporeRupeeChances[i].itemId); unsetHaveNoGravity(); mVelocity.y = 10.0f; fn_80252A80(); } } } tickDespawnTimer(); if (mDespawnTimer == 0) { return; } if (mLinkage.checkState(dLinkage_c::STATE_ACTIVE)) { mStateMgr.changeState(StateID_Carry); return; } fn_80253D50(); if (mId == ITEM_STAMINA_FRUIT) { if (isFirstBitParams2NotSet() && !fn_802577A0()) { sLib::chase(&field_0xCD8, 0.0f, 0.05f); } else { sLib::chase(&field_0xCD8, 1.0f, 0.05f); } } else if (isLightFruit()) { if ((this->*mFnAction4)()) { sLib::chase(&field_0xCD8, 1.0f, 0.05f); } else { field_0xCD8 = 0.0f; } } bool tgHitArrow = tgHit && mCyl.ChkTgAtHitType(AT_TYPE_ARROW); bool tgHitClawshot = tgHit && mCyl.ChkTgAtHitType(AT_TYPE_CLAWSHOT); if (mbNoGravity && tgHit && ((isAnyRupee() && tgHitArrow) || (isHeartV() && mCyl.ChkTgAtHitType(AT_TYPE_BELLOWS)) || ((isAnyRupee() || isHeartV()) && (mCyl.ChkTgAtHitType(AT_TYPE_SLINGSHOT) || mCyl.ChkTgAtHitType(AT_TYPE_CLAWSHOT))) || mCyl.ChkTgAtHitType(AT_TYPE_BOMB) || mCyl.ChkTgAtHitType(AT_TYPE_0x800000))) { unsetHaveNoGravity(); } if (mbNoGravity && mCyl.ChkCoHit()) { unsetHaveNoGravity(); } if (!mbNoGravity) { unsetActorProperty(AC_PROP_0x1); } if (mbNoGravity) { mObjAcch.SetMoveBGOnly(); } else { mObjAcch.ClrMoveBGOnly(); } if (tgHitArrow) { field_0xD62 = true; } else if (tgHit || (!mObjAcch.ChkGroundLanding() && mObjAcch.ChkGndHit())) { field_0xD62 = false; } if (tgHitClawshot) { field_0xD63 = true; } else if (tgHit || (!mObjAcch.ChkGroundLanding() && mObjAcch.ChkGndHit())) { field_0xD63 = false; } if (!mbNoGravity) { if (!field_0xD51) { if (isAnyRupee()) { s32 which; if (field_0xD62 || field_0xD63) { which = 1; } else { which = 2; } if (which == 1 && mFnGetRupeeGravity == nullptr) { which = 2; } if (which == 2 && mFnGetGravity1 == nullptr) { which = 0; } switch (which) { case 1: mAcceleration = (this->*mFnGetRupeeGravity)(); break; case 2: mAcceleration = (this->*mFnGetGravity1)(); break; } } else if (isHeartV()) { if (field_0xD52) { if (mFnGetHeartGravity != nullptr) { mAcceleration = (this->*mFnGetHeartGravity)(); } } else { if (mFnGetGravity1 != nullptr) { mAcceleration = (this->*mFnGetGravity1)(); } } } else { if (mFnGetRupeeGravity == nullptr || !field_0xD62) { if (mFnGetGravity1 != nullptr) { mAcceleration = (this->*mFnGetGravity1)(); } } else { if (mFnGetRupeeGravity != nullptr) { mAcceleration = (this->*mFnGetRupeeGravity)(); } } } if (mFnGetGravity4 != nullptr) { mMaxSpeed = (this->*mFnGetGravity4)(); } fn_80256F20(); (this->*mFnAction)(); calcVelocity(); mPosition += mVelocity; mPosition += mStts.GetCcMove(); } if ((mId == ITEM_STAMINA_FRUIT && fruitParam) || isLightFruit()) { /* nothing */ } else { if (!mbNoGravity && !field_0xD51 && 0.0f < mVelocity.y) { mObjAcch.ClrRoofNone(); mObjAcch.Clr_0x2000000(); } else { mObjAcch.SetRoofNone(); mObjAcch.Set_0x2000000(); } fn_80256E80(); if (mObjAcch.ChkGndHit() && mVelocity.y <= 0.0f) { u32 specialCode = dBgS::GetInstance()->GetSpecialCode(mObjAcch.GetGnd()); if (isItemDeleteGround(specialCode)) { if (sLib::chase(&mSinkOffset, -100.0f, (this->*mFnGetSinkSpeed)())) { deleteRequest(); } } else if (isItemSwimGround(specialCode)) { sLib::chase(&mSinkOffset, -30.0f, (this->*mFnGetSinkSpeed)()); } else { sLib::chase(&mSinkOffset, 0.0f, 6.0f); } } else { mSinkOffset = 0.0f; } mYOffset = mSinkOffset; if (isAnyTear() && mObjAcch.ChkGroundLanding()) { startSoundWithFloatParam(SE_Item_A43_FALL, mVelocity.y); } } } /* This Function keeps Triforce postion locked 8024edbc */ if (isTriforce()) { f32 factor = field_0xD48.sin(); mPosition = mPositionCopy + mVec3_c::Ey * (factor * 16.0f); field_0xD48.mVal += 182; } if ((mItemFlags & 0x4) != 0 && 3000.0f < mPositionCopy.y - mPosition.y) { mItemFlags |= 0x8; } if ((mItemFlags & 0x8) == 0) { (this->*mFnAction3)(); if (isAnyRupee() && field_0xD3A > 0) { holdSoundWithIntParam(SE_O_RUPEE_ROULETTE, field_0xD3A); } if (!field_0xD51) { mCyl.SetC(mPosition); dCcS::GetInstance()->Set(&mCyl); } if (isSmallKey()) { if (dScGame_c::isCurrentStage("F302")) { f32 fScale; getCurrentModelScale(&fScale); mVec3_c scale(fScale, fScale, fScale); mEff_0x8F4.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_820_, mPosition, nullptr, &scale, nullptr, nullptr); } } else if (isTriforce()) { f32 fScale; getCurrentModelScale(&fScale); mVec3_c scale(fScale, fScale, fScale); mVec3_c offsetPos(mPosition.x, fScale * 20.0f + mPosition.y, mPosition.z); dCamera_c *cam = dScGame_c::getCamera(); mVec3_c dir = offsetPos - cam->getPosition(); if (!dir.normalizeRS()) { dir = cam->getTarget() - cam->getPosition(); if (!dir.normalizeRS()) { dir.set(mVec3_c::Ez); dir.rotX(cam->getYAngle()); dir.rotY(cam->getXZAngle()); } } dir *= -40.0f; mVec3_c efPos = offsetPos + dir; mEff_0x928.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_821_, efPos, nullptr, &scale, nullptr, nullptr); } makeLinkLookTowardItem(); if (!mbNoDespawn && !isItemSmallKeyOrHeartPieceOrStaminaFruit()) { fn_80254CA0(); } } } void dAcItem_c::finalizeState_Wait() { unsetActorProperty(AC_PROP_0x1); mObjAcch.SetRoofNone(); mObjAcch.Clr_0x2000000(); mSinkOffset = 0.0f; mYOffset = 0.0f; if (isTriforce() && mEff_0x928.hasEmitters()) { mEff_0x928.remove(true); } } void dAcItem_c::initializeState_Carry() { mpMdl->setDrawMode(dItemMdl_c::DrawMode_Put); mSpeed = 0.0f; mVelocity.y = 0.0f; unsetHaveNoGravity(); field_0xD38 = field_0xD3A = field_0xD3C = 0; mCyl.OnTgSet(); mCyl.ClrCoSet(); fn_80254BA0(); field_0xD4A = 0; mMdlScaleType = 0; } void dAcItem_c::executeState_Carry() { if (!mbNoDespawn && !isItemSmallKeyOrHeartPieceOrStaminaFruit() && !mbIsWaiting && mLinkage.checkConnection(dLinkage_c::CONNECTION_8)) { fn_80254CA0(); } tickDespawnTimer(); if (mDespawnTimer == 0) { return; } if (fn_802574A0()) { // TODO weird double load dAcPy_c *link = dAcPy_c::GetLinkM(); if (!link->getBeetleInFlight()) { addToGetQueue(); if (link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() && FileManager::sInstance->getCurrentHealth() != 0) { mStateMgr.changeState(StateID_Get); } else { mStateMgr.changeState(StateID_WaitGet); } } else { mStateMgr.changeState(StateID_GetBeetle); } } else if (!mLinkage.checkState(dLinkage_c::STATE_ACTIVE)) { mStateMgr.changeState(StateID_Wait); } else if (mLinkage.checkConnection(dLinkage_c::CONNECTION_9) && mCyl.ChkTgHit() && !mCyl.ChkTgAtHitType(AT_TYPE_WHIP)) { mLinkage.forceRemove(this); mStateMgr.changeState(StateID_Wait); } else { fn_80256E80(); if (mLinkage.checkConnection(dLinkage_c::CONNECTION_9) || mLinkage.checkConnection(dLinkage_c::CONNECTION_8)) { mCyl.SetC(mPosition); dCcS::GetInstance()->Set(&mCyl); } if (mLinkage.checkConnection(dLinkage_c::CONNECTION_7)) { makeLinkLookTowardItem(); } } } void dAcItem_c::finalizeState_Carry() { setupUnkColliderFlags2(); } void dAcItem_c::initializeState_GetBeetle() { mpMdl->setDrawMode(dItemMdl_c::DrawMode_Put); setNotWaiting(); field_0xD38 = field_0xD3A = field_0xD3C = 0; field_0xD0C = 0.0f; if (isAnyRupee()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_RUPEE); } else if (isHeartV()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_HART); } else if (isSmallKey()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_KEY); } else if (mId == ITEM_STAMINA_FRUIT) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_REFRESH_FRUIT); } else if (isUnkTreasureGroup1()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_MATERIAL); } else { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_CONSUMP_ITEM); } addToGetQueue(); mMdlScaleType = 3; fn_802548A0(); } void dAcItem_c::executeState_GetBeetle() { // TODO weird double load dAcPy_c *link = dAcPy_c::GetLinkM(); if (link == nullptr) { return; } dAcBoomerang_c *beetlePtr = (dAcBoomerang_c *)link->getBeetleInFlight(); if (beetlePtr == nullptr) { if (link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() && FileManager::sInstance->getCurrentHealth() != 0) { decideOnGetOrForcedGet(); } else { mStateMgr.changeState(StateID_WaitGet); } } else if (37.6f - field_0xD0C < 1.6f) { // TODO what are these numbers mStateMgr.changeState(StateID_WaitGet); } else { mVec3_c v(0.0f, 5.0f, 0.0f); // This + is weird... inline? v.rotY(+beetlePtr->mRotation.y); mPosition = beetlePtr->mPosition + v; mPosition.y += field_0xD0C; rotateTowardsCamera(); sLib::addCalcScaledDiff(&field_0xD0C, 37.6f, 0.1f, 10000.0f); } } void dAcItem_c::finalizeState_GetBeetle() {} void dAcItem_c::initializeState_WaitGet() { field_0xD64 = 0; setObjectProperty(OBJ_PROP_0x200); // TODO double load dAcPy_c *link = dAcPy_c::GetLinkM(); if (link != nullptr) { mPosition.set(link->getPosition()); } mMdlScaleType = 1; fn_802548A0(); } void dAcItem_c::executeState_WaitGet() { // TODO double load dAcPy_c *link = dAcPy_c::GetLinkM(); if (link != nullptr) { if (link->ifHasHealthAndSomethingElse()) { field_0xD64 = true; } if (field_0xD64 && this == sItemListHead.get() && FileManager::GetInstance()->getCurrentHealth() != 0) { decideOnGetOrForcedGet(); } } } void dAcItem_c::finalizeState_WaitGet() { unsetObjectProperty(OBJ_PROP_0x200); } void dAcItem_c::initializeState_Get() { mpMdl->setDrawMode(dItemMdl_c::DrawMode_Put); performCollection(); if (isAnyTear()) { mVec3_c tmp; fn_80256710(tmp); fn_80257560(tmp); } fn_80254D10(); fn_80254D70(); setNotWaiting(); field_0xD38 = field_0xD3A = field_0xD3C = 0; field_0xD4D = false; mMdlScaleType = 1; fn_802548A0(); } void dAcItem_c::executeState_Get() { if (!fn_80254D70()) { fn_802542E0(); } else { // @bug always true if (field_0xD4D < 0xFFFF) { field_0xD4D++; } if (field_0xD4D > 12) { removeFromGetQueue(); } } } void dAcItem_c::finalizeState_Get() { removeFromGetQueue(); } void dAcItem_c::initializeState_WaitGetDemo() { mpMdl->setDrawMode(dItemMdl_c::DrawMode_Get); setObjectProperty(OBJ_PROP_0x200); setNotWaiting(); field_0xD38 = field_0xD3A = field_0xD3C = 0; mMdlScaleType = 2; fn_802548A0(); unsetFramesInAir(); } void dAcItem_c::executeState_WaitGetDemo() { s32 which = 0; if (EventManager::isInEvent()) { which = 2; } else if (fn_80247BB0()) { which = 2; } else if ((isInsect() || isTreasure3()) && checkTreasureTempCollect(getItemId())) { which = 2; } else if (checkShouldDemo() && fn_80254EC0()) { which = 1; } else if (mFramesInAir > 10) { which = 2; } switch (which) { case 1: addGetEvent(); break; case 2: unsetObjectProperty(OBJ_PROP_0x200); mStateMgr.changeState(StateID_Get); break; } unsetFramesInAir(); } void dAcItem_c::finalizeState_WaitGetDemo() {} void dAcItem_c::initializeState_WaitForcedGetDemo() { mpMdl->setDrawMode(dItemMdl_c::DrawMode_Get); setObjectProperty(OBJ_PROP_0x200); setNotWaiting(); field_0xD38 = field_0xD3A = field_0xD3C = 0; mMdlScaleType = 2; fn_802548A0(); } void dAcItem_c::executeState_WaitForcedGetDemo() { if (isAnyTear() && mFramesInAir < 10) { incrementFramesInAir(); if (mFramesInAir == 10) { fn_80257560(mPosition); } } addGetEvent(); } void dAcItem_c::finalizeState_WaitForcedGetDemo() {} void dAcItem_c::initializeState_GetDemo() { mpMdl->setDrawMode(dItemMdl_c::DrawMode_Get); switch (getItemId()) { case ITEM_FARON_GRASSHOPPER: sCollectionCurrentCount = getFaronGrasshooperCounter(); break; case ITEM_WOODLAND_RHINO_BEETLE: sCollectionCurrentCount = getWoodlandRhinoBeetleCounter(); break; case ITEM_DEKU_HORNET: sCollectionCurrentCount = getDekuHornetCounter(); break; case ITEM_SKYLOFT_MANTIS: sCollectionCurrentCount = getSkyloftMantisCounter(); break; case ITEM_VOLCANIC_LADYBUG: sCollectionCurrentCount = getVolcanicLadybugCounter(); break; case ITEM_BLESSED_BUTTERFLY: sCollectionCurrentCount = getBlessedButterflyCounter(); break; case ITEM_LANAYRU_ANT: sCollectionCurrentCount = getLanayruAntCounter(); break; case ITEM_SAND_CICADA: sCollectionCurrentCount = getSandCicadaCounter(); break; case ITEM_GERUDO_DRAGONFLY: sCollectionCurrentCount = getGerudoDragonflyCounter(); break; case ITEM_ELDIN_ROLLER: sCollectionCurrentCount = getEldinRollerCounter(); break; case ITEM_SKY_STAG_BEETLE: sCollectionCurrentCount = getSkyStagBeetleCounter(); break; case ITEM_STARRY_FIREFLY: sCollectionCurrentCount = getStarryFireflyCounter(); break; case ITEM_HORNET_LARVAE: sCollectionCurrentCount = getHornetLarvaeCounter(); break; case ITEM_BIRD_FEATHER: sCollectionCurrentCount = getBirdFeatherCounter(); break; case ITEM_TUMBLE_WEED: sCollectionCurrentCount = getTumbleWeedCounter(); break; case ITEM_LIZARD_TAIL: sCollectionCurrentCount = getLizardTailCounter(); break; case ITEM_ELDIN_ORE: sCollectionCurrentCount = getEldinOreCounter(); break; case ITEM_ANCIENT_FLOWER: sCollectionCurrentCount = getAncientFlowerCounter(); break; case ITEM_AMBER_RELIC: sCollectionCurrentCount = getAmberRelicCounter(); break; case ITEM_DUSK_RELIC: sCollectionCurrentCount = getDuskRelicCounter(); break; case ITEM_JELLY_BLOB: sCollectionCurrentCount = getJellyBlobCounter(); break; case ITEM_MONSTER_CLAW: sCollectionCurrentCount = getMonsterClawCounter(); break; case ITEM_MONSTER_HORN: sCollectionCurrentCount = getMonsterHornCounter(); break; case ITEM_ORNAMENTAL_SKULL: sCollectionCurrentCount = getSkullCounter(); break; case ITEM_EVIL_CRYSTAL: sCollectionCurrentCount = getEvilCrystalCounter(); break; case ITEM_BLUE_BIRD_FEATHER: sCollectionCurrentCount = getBlueBirdFeatherCounter(); break; case ITEM_GOLDEN_SKULL: sCollectionCurrentCount = getGoldenSkullCounter(); break; case ITEM_GODDESS_PLUME: sCollectionCurrentCount = getGoddessPlumeCounter(); break; } performCollectionPart1(); if (checkItemFlagV()) { if (isAnyTear()) { dAcOWarp_c *warp = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_WARP)); if (warp != nullptr) { warp->onCollectFirstTear(); } } } else { bool doCollect = true; if (ITEM_FARON_GRASSHOPPER <= mId && mId <= ITEM_STARRY_FIREFLY && MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { doCollect = false; } if (doCollect) { setItemFlagV(); } } setTreasureTempCollect(getItemId()); setNotWaiting(); field_0xD38 = field_0xD3A = field_0xD3C = 0; mMdlRotY = 0; setObjectProperty(OBJ_PROP_0x200); mMdlScaleType = 2; if (isBirdStatuette()) { mFn_0xC9C = &dAcItem_c::rotateFixedBirdStatuette; } else { mFn_0xC9C = &dAcItem_c::rotateTowardsCamera; } } void dAcItem_c::executeState_GetDemo() { switch (mEventRelated.getCurrentEventCommand()) { case 'act0': mEventRelated.advanceNext(); break; case 'wait': mEventRelated.advanceNext(); break; case 'halo': { mVec3_c efPos; fn_80254590(efPos); mVec3_c diff = dScGame_c::getCamera()->getPosition() - mPosition; // TODO close but an extsh is missing // Same pattern as in rotateTowardsCamera mAng3_c rot; rot.set(-diff.atan2sY_XZ(), diff.atan2sX_Z(), mAng(0)); u32 alpha = 0xFF; if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) { alpha = 0x80; } mEff_0x95C.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_82_, efPos, &rot, nullptr, nullptr, nullptr); mEff_0x95C.setGlobalAlpha(alpha); mEventRelated.advanceNext(); break; } case '????': break; default: mEventRelated.advanceNext(); break; } if (!checkObjectProperty(OBJ_PROP_0x200)) { mPosition = getLinkPtr()->vt_0x1A4(); if (isUpgradedPotion((ITEM_ID)getItemId())) { fn_80254680(); } else if (isAnyTear()) { fn_80254810(); } mbShowItemLighting = true; field_0x340 = mPosition; (this->*mFn_0xC9C)(); if (!isGratitudeCrystal() && !is5GratitudeCrystals()) { mMdlRotY += getItemRotateAngle(); } field_0xD42 = mAng::d2s_c(0.0f); // TODO - ... } makeLinkLookTowardItem(); } void dAcItem_c::finalizeState_GetDemo() { mMdlRotY = 0; field_0xD42 = 0; performCollectionPart2(); mbShowItemLighting = false; if (mEff_0x95C.hasEmitters()) { mEff_0x95C.remove(true); } if (isAnyTear() && mEff_0xA60.hasEmitters()) { mEff_0xA60.remove(true); } } void dAcItem_c::initializeState_WaitTBoxGetDemo() { mpMdl->setDrawMode(dItemMdl_c::DrawMode_Get); setNotWaiting(); field_0xD38 = field_0xD3A = field_0xD3C = 0; setObjectProperty(OBJ_PROP_0x200); mMdlScaleType = 2; fn_802548A0(); } void dAcItem_c::executeState_WaitTBoxGetDemo() { const char *name; getItemGetTboxEventName(getItemId(), &name); Event ev(name, 1, 0x100001, (void *)itemGetEventStart, (void *)itemGetEventEnd); EventManager::alsoSetAsCurrentEvent(this, &ev, nullptr); } void dAcItem_c::finalizeState_WaitTBoxGetDemo() {} void dAcItem_c::initializeState_ResurgeWait() { mpMdl->setDrawMode(dItemMdl_c::DrawMode_Put); // TODO FPR swap mPosition = mPositionCopy; mRotation = mRotationCopy; mpResurgeCtl->startResurgeTimer(); setNotWaiting(); // TODO ??? mbNoGravity = mbNoDespawn; field_0xD38 = field_0xD3A = field_0xD3C = 0; mMdlScaleType = 0; field_0xCD8 = 0.0f; } void dAcItem_c::executeState_ResurgeWait() { if (mpResurgeCtl->canResurge(this)) { if (!mpResurgeCtl->isTimerExpired()) { mpResurgeCtl->execute(); if (mpResurgeCtl->isTimerExpired()) { if (mId == ITEM_STAMINA_FRUIT) { startSound(SE_O_REFRESH_FRUIT_SPROUT); } mStateMgr.changeState(StateID_Wait); } } } else { mpResurgeCtl->resetTimer(); } } void dAcItem_c::finalizeState_ResurgeWait() {} void dAcItem_c::initializeState_WaitTurnOff() { setNotWaiting(); setObjectProperty(OBJ_PROP_0x200); mSpeed = 0.0f; mVelocity.set(0.0f, 0.0f, 0.0f); field_0xD38 = field_0xD3A = field_0xD3C = 0; mMdlScaleType = 2; } void dAcItem_c::executeState_WaitTurnOff() { if (!isField_0xD04GtZero()) { deleteRequest(); } } void dAcItem_c::finalizeState_WaitTurnOff() {} void dAcItem_c::initializeState_WaitSacredDewGetEffect() { setNotWaiting(); setObjectProperty(OBJ_PROP_0x200); mSpeed = 0.0f; mVelocity.set(0.0f, 0.0f, 0.0f); field_0xD38 = field_0xD3A = field_0xD3C = 0; mMdlScaleType = 2; } void dAcItem_c::executeState_WaitSacredDewGetEffect() { if (!EventManager::isInEvent()) { mVec3_c tmp; fn_80247540(tmp); fn_80247560(tmp); mStateMgr.changeState(StateID_WaitTurnOff); } } void dAcItem_c::finalizeState_WaitSacredDewGetEffect() {} STATE_DEFINE(dAcItem_c, Wait); STATE_DEFINE(dAcItem_c, Carry); STATE_DEFINE(dAcItem_c, GetBeetle); STATE_DEFINE(dAcItem_c, WaitGet); STATE_DEFINE(dAcItem_c, Get); STATE_DEFINE(dAcItem_c, WaitGetDemo); STATE_DEFINE(dAcItem_c, WaitForcedGetDemo); STATE_DEFINE(dAcItem_c, GetDemo); STATE_DEFINE(dAcItem_c, WaitTBoxGetDemo); STATE_DEFINE(dAcItem_c, ResurgeWait); STATE_DEFINE(dAcItem_c, WaitTurnOff); STATE_DEFINE(dAcItem_c, WaitSacredDewGetEffect); void dAcItem_c::getItemFromBWheelItem() { if (mStateMgr.isState(StateID_Get) || mStateMgr.isState(StateID_WaitGetDemo)) { return; } if (!mStateMgr.isState(StateID_ResurgeWait)) { onTouchLink(); } } void dAcItem_c::setItemPosition(const mVec3_c &pos) { mPosition = pos; field_0xD51 = 1; if (!field_0xD5E) { return; } field_0xD5F = 1; mItemPosCopy = pos; } void dAcItem_c::setItemVelocity(f32 f) { mVelocity.y = f; field_0xD51 = 0; if (!field_0xD5E) { return; } field_0xD60 = 0; if (!field_0xD61) { return; } field_0xD5F = 0; field_0xD08 = 1.0f; } bool dAcItem_c::isStateWait() const { return mStateMgr.isState(StateID_Wait); } void dAcItem_c::stopCarryAndGet() { mLinkage.forceRemove(this); mStateMgr.changeState(StateID_Get); } bool dAcItem_c::getEventNameForAnim(u32 anim, const char **outName) { if (outName == nullptr) { return false; } switch (anim) { default: return false; case ANIM_DEFAULT: *outName = sDefaultGetItem; break; case ANIM_GORGEOUS: *outName = sItemGetGorgeous; break; case ANIM_FROWN: *outName = sDefaultGetItem; break; case ANIM_SMALL: *outName = sDefaultGetItem; break; } return true; } bool dAcItem_c::getTboxEventNameForAnim(u32 anim, const char **outName) { if (outName == nullptr) { return false; } switch (anim) { default: return false; case ANIM_DEFAULT: *outName = sItemGetDefaultTbox; break; case ANIM_GORGEOUS: *outName = sItemGetGorgeousTbox; break; case ANIM_FROWN: *outName = sItemGetDefaultTbox; break; case ANIM_SMALL: *outName = sItemGetDefaultTbox; break; } return true; } bool dAcItem_c::getItemGetEventName(u16 item, const char **outName) { u32 anim; if (getItemAnimType(item, &anim) == false) { return false; } return getEventNameForAnim(anim, outName); } bool dAcItem_c::getItemGetTboxEventName(u16 item, const char **outName) { u32 anim; if (getItemAnimType(item, &anim) == false) { return false; } return getTboxEventNameForAnim(anim, outName); } bool dAcItem_c::playHeartStemCutSound() { dSoundSourceIf_c *src = getSoundSource(); if (src == nullptr) { return false; } return src->startSoundAtPosition(SE_O_HEART_STEM_CUT, mPosition); } void dAcItem_c::getOffsetPosition(mVec3_c &position) const { position.set(mPosition.x, mPosition.y + getYOffset(), mPosition.z); } f32 dAcItem_c::scaleBy(f32 f) const { return f * mBaseScale; } void dAcItem_c::itemGetEventStart(dAcBase_c *arg) { // TODO dAcItem_c *item = static_cast(arg); item->mStateMgr.changeState(StateID_GetDemo); item->setObtainedItemId(item->getItemId(), true); if (item->mId == ITEM_DUNGEON_MAP_FI && ItemflagManager::sInstance->getItemCounterOrFlag(0x32) == 0) { Event ev("fays_map_guide", 100, 0x100001, nullptr, nullptr); EventManager::changeOwnEvent(item, dAcNpcTalkKensei_c::GetInstance(), &ev, 0); } } void dAcItem_c::applyBoundingBox() { (this->*mFnSetBoundingBox)(); } void dAcItem_c::performCollection() { performCollectionPart1(); performCollectionPart2(); } void dAcItem_c::performCollectionPart1() { u16 id = getItemId(); if (isKeyPieceV()) { increaseKeyPieceCounter(1); } else if (isLightFruit()) { dTgSiren_c::setLightFruitTime(getLightFruitTime()); } else if (isHeartPiece()) { increaseHeartPieceCounter(1); increaseTotalHeartPieceCounter(1); } else { f32 count; switch (id) { case ITEM_FARON_GRASSHOPPER: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseFaronGrasshopperCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_WOODLAND_RHINO_BEETLE: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseWoodlandRhinoBeetleCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_DEKU_HORNET: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseDekuHornetCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_SKYLOFT_MANTIS: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseSkyloftMantisCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_VOLCANIC_LADYBUG: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseVolcanicLadybugCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_BLESSED_BUTTERFLY: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseBlessedButterflyCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_LANAYRU_ANT: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseLanayruAntCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_SAND_CICADA: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseSandCicadaCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_GERUDO_DRAGONFLY: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseGerudoDragonflyCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_ELDIN_ROLLER: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseEldinRollerCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_SKY_STAG_BEETLE: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseSkyStagBeetleCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_STARRY_FIREFLY: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { increaseStarryFireflyCounter(mItemQuantity != 0 ? mItemQuantity : 1); } break; case ITEM_HORNET_LARVAE: increaseHornetLarvaeCounter(1); break; case ITEM_BIRD_FEATHER: // ??? count = mItemQuantity != 0 ? mItemQuantity : 1; increaseBirdFeatherCounter(0.0f < count ? count : 1.0f); break; case ITEM_TUMBLE_WEED: increaseTumbleWeedCounter(1); break; case ITEM_LIZARD_TAIL: increaseLizardTailCounter(1); break; case ITEM_ELDIN_ORE: increaseEldinOreCounter(1); break; case ITEM_ANCIENT_FLOWER: increaseAncientFlowerCounter(1); break; case ITEM_AMBER_RELIC: increaseAmberRelicCounter(1); break; case ITEM_DUSK_RELIC: increaseDuskRelicCounter(1); break; case ITEM_JELLY_BLOB: increaseJellyBlobCounter(1); break; case ITEM_MONSTER_CLAW: increaseMonsterClawCounter(1); break; case ITEM_MONSTER_HORN: increaseMonsterHornCounter(1); break; case ITEM_ORNAMENTAL_SKULL: increaseSkullCounter(1); break; case ITEM_EVIL_CRYSTAL: increaseEvilCrystalCounter(1); break; case ITEM_BLUE_BIRD_FEATHER: // ??? count = mItemQuantity != 0 ? mItemQuantity : 1; increaseBlueBirdFeatherCounter(0.0f < count ? count : 1.0f); break; case ITEM_GOLDEN_SKULL: increaseGoldenSkullCounter(1); break; case ITEM_GODDESS_PLUME: increaseGoddessPlumeCounter(1); break; default: { if (isTriforce()) { doFullHeal(); } else if (isGratitudeCrystalV()) { increaseGratitudeCrystalCounter(1); } else if (is5GratitudeCrystalsV()) { increaseGratitudeCrystalCounter(5); } else if (id == ITEM_EXTRA_WALLET) { increaseExtraWalletCounter(1); } break; } } } if (mStateMgr.isState(StateID_GetDemo)) { sIsPerformingInitialCollection = !checkFlagV(); } bool doCollect = true; if (ITEM_FARON_GRASSHOPPER <= mId && mId <= ITEM_STARRY_FIREFLY && MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { doCollect = false; } if (doCollect) { setFlagV(); } setSceneFlag(); setDungeonFlag(); if (getSubtypeFromParam(mParams) == 7) { return; } if (isGreenRupee()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_GREEN); } else if (isBlueRupee()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_BLUE); } else if (isRedRupee()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_RED); } else if (isSilverRupee()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_SILVER); } else if (isGoldRupee()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_BLUE); } else if (isRupoor()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_BABA); } else if (isHeartV()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_HEART_PIECE_GET); } else if (isAnyTear()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SIREN_GET_SHINE_DEW); } else if (mId == ITEM_STAMINA_FRUIT) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_REFRESH_FRUIT); } else if (isLightFruit()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SIREN_GET_HOLY_FRUIT); } else if (mId == ITEM_5_DEKU_SEEDS || is10DekuSeeds()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_CONSUMP_ITEM_GET); } else if (isAnyArrow()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_CONSUMP_ITEM_GET); } else if (isAnyBombs()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_CONSUMP_ITEM_GET); } else if (isInsect()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_MATERIAL); } else if (isTreasureV()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_MATERIAL); } else if (is5GratitudeCrystals() || isGratitudeCrystal()) { if ((mItemFlags & 0x20) == 0) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_SOURCE_OUTWELL); } } else if (isBabyRattle()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_GARAGARA); } else if (isLifeTreeFruit()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_LIFE_FRUIT); } else if (mId == ITEM_HEART_CONTAINER) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_HEART_CONTAINER); } else if (isTriforce()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_TRIFORCE); } } void dAcItem_c::performCollectionPart2() { u16 id = getItemId(); if (id == ITEM_SMALL_KEY) { increaseSmallKeyCounter(1); } else if (id == ITEM_GREEN_RUPEE) { if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { increaseRupeeCounter(1); } } else if (id == ITEM_BLUE_RUPEE) { if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { increaseRupeeCounter(5); } } else if (id == ITEM_RED_RUPEE) { if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { increaseRupeeCounter(20); } } else if (isHeartV()) { healLink(4, true); } else if (id == ITEM_SINGLE_ARROW) { increaseArrowAndPouchCounter(1); } else if (id == ITEM_BUNDLE_ARROWS) { increaseArrowAndPouchCounter(10); } else if (id == ITEM_SILVER_RUPEE) { if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { increaseRupeeCounter(100); } } else if (id == ITEM_GOLD_RUPEE) { if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { increaseRupeeCounter(300); } } else if (id == ITEM_RUPOOR) { if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { increaseRupeeCounter(-10); } } else if (id == ITEM_5_BOMBS) { increaseBombAndPouchCounter(5); } else if (id == ITEM_10_BOMBS) { increaseBombAndPouchCounter(10); } else if (mId == ITEM_STAMINA_FRUIT) { restoreStamina(); } else if (id == ITEM_5_DEKU_SEEDS) { increaseDekuSeedAndPouchCounter(5); } else if (is10DekuSeeds()) { increaseDekuSeedAndPouchCounter(10); } else if (id == ITEM_POUCH_EXPANSION) { increaseExtraPouchCounter(1); } else if (id == ITEM_HEART_CONTAINER) { increaseHealthCapacity(getHeartContainerHeartIncrease()); doFullHeal(); } else if (isHeartPiece()) { if (getNumRemainingHeartPiecesForNextHeart() == 0) { increaseHealthCapacity(getCompletedHeartPieceHeartIncrease()); } doFullHeal(); } else if (id == ITEM_LIFE_TREE_SEED) { setLifeTreeSeedlingFlag(1); } else if (id == ITEM_BOW || id == ITEM_IRON_BOW || id == ITEM_SACRED_BOW) { if (!checkFlagV()) { increaseArrowCounter(getBowArrowCapacity() - getBowArrowCount()); } } else if (id == ITEM_SLINGSHOT || id == ITEM_MIGHTY_SCATTERSHOT) { if (!checkFlagV()) { increaseDekuSeedCounter(getSlingshotSeedCapacity() - getSlingshotSeedCount()); } } else if (isAnyPouchItem((ITEM_ID)id)) { if (mGetItemPouchSlot == -1) { collectPouchItem(id); } else { collectPouchItemIntoSlot(mGetItemPouchSlot, id, -1, false); } } if (MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE) && dTgMinigameInsectCapture_c::GetInstance() != nullptr) { dTgMinigameInsectCapture_c::GetInstance()->recordCollectedInsect(mId, mItemQuantity != 0 ? mItemQuantity : 1); } } bool dAcItem_c::isItemDeleteGround(s32 specialCode) const { if (isHeartV()) { return isHeartDeleteGround(specialCode); } else { return isDefaultDeleteGround(specialCode); } } bool dAcItem_c::isItemSwimGround(s32 specialCode) const { if (isHeartV()) { return isHeartSwimGround(specialCode); } else { return isDefaultSwimGround(specialCode); } } void dAcItem_c::rotateTowardsCamera() { dCamera_c *cam = dScGame_c::getCamera(); if (cam == nullptr) { return; } mVec3_c diff = cam->getPosition() - mPosition; // TODO close but an extsh is missing // Same pattern as in executeState_GetDemo mRotation.set(-diff.atan2sY_XZ(), diff.atan2sX_Z(), mAng(0)); } void dAcItem_c::rotateFixedBirdStatuette() { mRotation.x.mVal = 1237; mRotation.y.mVal = 20330; mRotation.z.mVal = 0; } void dAcItemPickupPositionOff_c::init() { // no-op } bool dAcItemPickupPositionOff_c::execute(dAcItem_c *item) { return false; } void dAcItemPickupPositionOn_c::init() { // TODO weird double load dAcPy_c *link = dAcPy_c::GetLinkM(); if (link != nullptr) { mHighestRelativeHeadHeight = link->getHeadTranslation().y - link->getPosition().y; } mNumFrames = 0; } bool dAcItemPickupPositionOn_c::execute(dAcItem_c *item) { if (mNumFrames >= 22) { return false; } // TODO weird double load dAcPy_c *link = dAcPy_c::GetLinkM(); if (link == nullptr) { return false; } mVec3_c linkPos = link->getPosition(); mVec3_c headPos = link->getHeadTranslation(); f32 diff = headPos.y - linkPos.y; if (mHighestRelativeHeadHeight < diff) { mHighestRelativeHeadHeight = diff; } item->mPosition.set(headPos.x, linkPos.y + mHighestRelativeHeadHeight, headPos.z); f32 f = 12.0f; if (mNumFrames != 0) { f = (f32)mNumFrames * 0.5f * ((mNumFrames - 1) * -0.3f + 12.0f) + 12.0f; } item->mPosition.y += f; item->rotateTowardsCamera(); mNumFrames++; return true; } void dAcItemResurgeIf_c::startResurgeTimer() { resetTimer(); postReset(); } bool dAcItemResurgeIf_c::canResurge(dAcItem_c *item) { if (item->getSquareDistToPlayer() < 40000.0f) { return false; } return isResurgeAllowed(item); } void dAcItemResurgeIf_c::resetTimer() { mTimer = getTimerInitVal(); } void dAcItemResurgeIf_c::execute() { if (mTimer == 0) { return; } if (!EventManager::isInEvent()) { mTimer--; } } bool dAcItemResurgeIf_c::isTimerExpired() const { return mTimer == 0; } void dAcItemResurgeOff_c::setTimerInitVal(u16 arg) { // no-op } void dAcItemResurgeOff_c::postReset() { // no-op } bool dAcItemResurgeOff_c::isResurgeAllowed(dAcItem_c *) { return false; } s32 dAcItemResurgeOff_c::getTimerInitVal() { return 0; } void dAcItemResurgeOn_c::setTimerInitVal(u16 arg) { mInitVal = arg; } void dAcItemResurgeOn_c::postReset() { // no-op } bool dAcItemResurgeOn_c::isResurgeAllowed(dAcItem_c *) { return (this->*mCb2)(); } s32 dAcItemResurgeOn_c::getTimerInitVal() { return mInitVal; }