Files
ss/src/d/a/d_a_item.cpp
T
2026-05-24 20:44:09 -04:00

2700 lines
100 KiB
C++

#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<dAcObjBase_c> dAcItem_c::sItemListHead;
dAcRef_c<dAcObjBase_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<dAcOScatterSand *>(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<dAcOScatterSand *>(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<dAcOWarp_c *>(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<dAcItem_c *>(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;
}