diff --git a/asm/ov14/Actor/ActorRupee_vfunc_08.inc b/asm/ov14/Actor/ActorRupee_vfunc_08.inc new file mode 100644 index 00000000..6a772035 --- /dev/null +++ b/asm/ov14/Actor/ActorRupee_vfunc_08.inc @@ -0,0 +1,149 @@ + + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x18 + mov r4, r0 + ldrh r0, [r4, #0x20] + str r0, [r4, #0x158] + bl _ZN10ActorRupee18func_ov14_0213b70cEj + cmp r0, #0 + ldconst r0, data_ov14_021589b4 + mov r2, #0 + ldrne r0, [r0, #0x24] + str r2, [r4, #0x7c] + ldconst r0, 0x00000aa8 + mov r5, r0, asr #0x1 + str r5, [r4, #0x80] + str r2, [r4, #0x84] + str r5, [r4, #0x88] + ldr r1, [r4, #0x7c] + add r0, r5, #0x1000 + str r1, [r4, #0x8c] + ldr r3, [r4, #0x80] + mov r1, #1 + str r3, [r4, #0x90] + ldr r3, [r4, #0x84] + str r3, [r4, #0x94] + ldr r3, [r4, #0x88] + str r3, [r4, #0x98] + str r2, [r4, #0xa8] + str r5, [r4, #0xac] + str r2, [r4, #0xb0] + str r0, [r4, #0xb4] + ldrh r0, [r4, #0x9c] + bic r0, r0, #0xb0 + strh r0, [r4, #0x9c] + strb r1, [r4, #0x9f] + ldr r0, [r4, #0x98] + sub r0, r0, #1 + str r0, [r4, #0x70] + ldr r0, [r4, #0x3c] + cmp r0, #0 + blt _0213af78 + mov r0, r4 + bl _ZN10ActorRupee18func_ov14_0213b204Ei + b _0213b0f4 +_0213af78: + ldr r0, [r4, #0x144] + cmp r0, #3 + addls pc, pc, r0, lsl #2 + b _0213b0f4 +_0213af88: + b _0213af98 // case 0 + b _0213afb4 // case 1 + b _0213b0c8 // case 2 + b _0213b0e8 // case 3 +_0213af98: + str r2, [r4, #0x60] + str r2, [r4, #0x64] + mov r0, r4 + mov r1, r2 + str r2, [r4, #0x68] + bl _ZN10ActorRupee18func_ov14_0213b204Ei + b _0213b0f4 +_0213afb4: + ldconst r0, data_027e0764 + mvn ip, #0x110 + ldr r5, [r0] + ldmib r0, {r3, r7} + umull sb, r0, r7, r5 + mla r0, r7, r3, r0 + ldconst r3, data_027e0764 + ldr r8, [r3, #0x10] + ldr r6, [r3, #0xc] + adds sl, r8, sb + ldr fp, [r3, #0x14] + mla r0, r6, r5, r0 + umull r3, lr, r7, sl + adc sb, fp, r0 + adds r0, r8, r3 + str r0, [sp, #0x14] + ldconst r0, data_027e0764 + mla lr, r7, sb, lr + str sl, [r0] + ldr r3, [sp, #0x14] + str sb, [r0, #4] + str r3, [r0] + rsb r0, r1, #0x224 + str r0, [sp, #0x10] + umull r0, r5, sb, r0 + str r0, [sp, #4] + mla r5, sb, r2, r5 + mla lr, r6, sl, lr + ldr r0, [sp, #0x10] + mov r3, r2 + mla r5, r3, r0, r5 + add r0, r5, ip + str r0, [sp] + ldr r5, [sp, #0x14] + ldconst r0, data_027e0764 + adc sb, fp, lr + umull sl, r5, r7, r5 + mla r5, r7, sb, r5 + ldr r7, [sp, #0x14] + rsb r1, r1, #0x334 + str sb, [r0, #4] + umull r0, r3, sb, r1 + mla r5, r6, r7, r5 + mov r6, sl + adds r6, r8, r6 + adc r7, fp, r5 + ldconst r5, data_027e0764 + mla r3, sb, r2, r3 + mov r0, r2 + mla r3, r0, r1, r3 + add r0, r3, #0x55 + add r0, r0, #0x500 + str r0, [sp, #8] + add r3, ip, #0x334 + stmia r5, {r6, r7} + umull r5, r6, r7, r3 + mla r6, r7, r2, r6 + mla r6, r2, r3, r6 + mov r1, r2 + add r2, r6, ip + str r2, [r4, #0x60] + ldr r2, [sp, #8] + mov r0, r4 + str r2, [r4, #0x64] + ldr r2, [sp] + str sl, [sp, #0xc] + str r2, [r4, #0x68] + bl _ZN10ActorRupee18func_ov14_0213b204Ei + b _0213b0f4 +_0213b0c8: + str r2, [r4, #0x60] + mov r0, #0x800 + str r0, [r4, #0x64] + mov r0, r4 + mov r1, r2 + str r2, [r4, #0x68] + bl _ZN10ActorRupee18func_ov14_0213b204Ei + b _0213b0f4 +_0213b0e8: + mov r0, r4 + mov r1, #5 + bl _ZN10ActorRupee18func_ov14_0213b204Ei +_0213b0f4: + mov r0, #1 + add sp, sp, #0x18 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} diff --git a/include/Actor/Actor.hpp b/include/Actor/Actor.hpp index c5b71193..78151cc0 100644 --- a/include/Actor/Actor.hpp +++ b/include/Actor/Actor.hpp @@ -11,8 +11,26 @@ #include "Physics/Transform.hpp" #include "Player/EquipBoomerang.hpp" +class Actor_UnkStruct_012 { + public: + /* 00 */ u16 mUnk_00; + /* 02 */ u8 mUnk_02; + /* 03 */ u8 mUnk_03; + /* 04 */ u32 mUnk_04; + /* 08 */ u32 mUnk_08; + /* 0c */ u32 mUnk_0c; + /* 10 */ u8 mUnk_10; + /* 11 */ u8 mUnk_11; + /* 12 */ u8 mUnk_12[0x2]; + /* 14 */ u32 mUnk_14; + /* 18 */ u32 mUnk_18; + /* 1c */ + + Actor_UnkStruct_012(); +}; + struct Actor_UnkStruct_020 { - /* 00 */ unk16 mUnk_00[4]; + /* 00 */ u16 mUnk_00[4]; /* 08 */ unk8 mUnk_08[2]; /* 0a */ unk8 mUnk_0a[2]; /* 0c */ unk8 mUnk_0c; @@ -24,7 +42,7 @@ struct Actor_UnkStruct_020 { }; struct Actor_UnkStruct_09c { - /* 0 */ unk16 mUnk_0; + /* 0 */ u16 mUnk_0; /* 2 */ unk8 mUnk_2; /* 3 */ unk8 mUnk_3; /* 4 */ unk32 mUnk_4; @@ -36,8 +54,8 @@ struct Actor_UnkStruct_09c { struct Actor_UnkStruct_0a4 { /* 00 */ bool mUnk_00; /* 01 */ bool mUnk_01; - /* 01 */ bool mUnk_02; - /* 01 */ bool mUnk_03; + /* 02 */ bool mUnk_02; + /* 03 */ bool mUnk_03; /* 04 */ Vec3p mUnk_04; /* 10 */ s32 mUnk_10; /* 14 */ @@ -58,9 +76,15 @@ enum PlayerCollide_ { PlayerCollide_Shield = 0x4, PlayerCollide_Gongoron = 0x8, PlayerCollide_Hammer = 0x10, + + PlayerCollide_PickupFlags = PlayerCollide_Hammer | PlayerCollide_Gongoron | PlayerCollide_Sword | PlayerCollide_Player, }; -class Actor { +#include "System/SysNew.hpp" + +#include "Item/Item.hpp" + +class Actor : public SysObject { public: /* 000 (vtable) */ /* 004 */ unk32 mType; @@ -103,7 +127,7 @@ public: /* 109 */ unk8 mUnk_109; /* 10a */ unk8 mUnk_10a[0x6]; /* 110 */ unk8 mUnk_110; - /* 111 */ unk8 mUnk_111; + /* 111 */ bool mUnk_111; /* 112 */ unk8 mUnk_112; /* 113 */ unk8 mUnk_113; /* 114 */ unk8 mUnk_114; diff --git a/include/Actor/ActorRupee.hpp b/include/Actor/ActorRupee.hpp index 93c3082c..0944bc03 100644 --- a/include/Actor/ActorRupee.hpp +++ b/include/Actor/ActorRupee.hpp @@ -7,7 +7,8 @@ #include "System/Resource.hpp" #include "Actor/Actor.hpp" #include "Actor/ActorType.hpp" -#include "Item/Item.hpp" +#include "Item/ItemManager.hpp" +#include "Player/PlayerLinkBase.hpp" typedef u32 RupeeId; enum RupeeId_ { @@ -29,15 +30,15 @@ public: /* 000 (base) */ /* 158 */ RupeeId mRupeeId; - /* 15c */ unk16 mUnk_15c; + /* 15c */ s16 mUnk_15c; /* 15e */ unk16 mUnk_15e; /* 160 */ /* 00 */ virtual ~ActorRupee() override; /* 08 */ virtual bool vfunc_08() override; - /* 14 */ virtual void vfunc_14(u32 param1) override; - /* 18 */ virtual void vfunc_18(u32 param1) override; - /* 20 */ virtual void vfunc_20(s32 param1) override; + /* 14 */ virtual void vfunc_14(bool param1) override; + /* 18 */ virtual void vfunc_18(bool param1) override; + /* 20 */ virtual void vfunc_20(bool param1) override; /* 60 */ virtual bool vfunc_60() override; /* 64 */ virtual void vfunc_64() override; /* b4 */ @@ -49,6 +50,6 @@ public: void func_ov14_0213b204(unk32 param1); void Update(bool param1); static void func_ov14_0213b5f4(RupeeId id, unk32 param2, Vec3p *param3, bool param4); - static void func_ov14_0213b6a4(RupeeId id, void *param2); + static void func_ov14_0213b6a4(RupeeId id, Actor_UnkStruct_012 *param2); static bool func_ov14_0213b70c(RupeeId id); }; diff --git a/include/Item/Item.hpp b/include/Item/Item.hpp index a2b02076..5aab40dc 100644 --- a/include/Item/Item.hpp +++ b/include/Item/Item.hpp @@ -50,6 +50,7 @@ enum ItemFlag_ { typedef s32 ItemId; enum ItemId_ { + /* -1 */ ItemId_None = -1, /* 0x01 */ ItemId_SmallKey = 1, /* 0x02 */ ItemId_GreenRupee = 2, /* 0x03 */ ItemId_OshusSword = 3, diff --git a/include/Player/PlayerLinkBase.hpp b/include/Player/PlayerLinkBase.hpp index e708f235..f8b291cf 100644 --- a/include/Player/PlayerLinkBase.hpp +++ b/include/Player/PlayerLinkBase.hpp @@ -73,4 +73,6 @@ class PlayerLinkBase: public PlayerBase { /* 80 */ virtual void SetUnk_5e(); /* 84 */ virtual void ResetUnk_5e(); /* 88 */ + public: + bool PlayItemCutscene(ItemId cutsceneItemId); }; diff --git a/src/00_Core/Actor/Actor.cpp b/src/00_Core/Actor/Actor.cpp index d0b2d086..719cad35 100644 --- a/src/00_Core/Actor/Actor.cpp +++ b/src/00_Core/Actor/Actor.cpp @@ -105,5 +105,6 @@ void Actor::vfunc_b0() {} void Actor::GetLinkPos(Vec3p *result) {} void Actor::GetLinkDummyPos(Vec3p *result) {} Actor_UnkStruct_09c::Actor_UnkStruct_09c() {} +Actor_UnkStruct_012::Actor_UnkStruct_012() {} #endif diff --git a/src/14_Land/Actor/ActorRupee.cpp b/src/14_Land/Actor/ActorRupee.cpp index 20d98de4..0fb129d7 100644 --- a/src/14_Land/Actor/ActorRupee.cpp +++ b/src/14_Land/Actor/ActorRupee.cpp @@ -1,25 +1,423 @@ #include "Actor/ActorRupee.hpp" - -#ifdef STUBS +#include "Item/ItemManager.hpp" Resource ActorRupee::gResource; ActorType ActorRupee::gType; -ActorRupee* ActorRupee::Create() {} -ActorRupee::ActorRupee() {} -bool ActorRupee::vfunc_08() {} -bool ActorRupee::vfunc_60() {} -void ActorRupee::vfunc_64() {} -void ActorRupee::Move() {} -ItemId ActorRupee::GetRupeeCutsceneItemId() {} -void ActorRupee::func_ov14_0213b204(unk32 param1) {} -void ActorRupee::Update(bool param1) {} -void ActorRupee::vfunc_14(u32 param1) {} -void ActorRupee::vfunc_18(u32 param1) {} -void ActorRupee::vfunc_20(s32 param1) {} -void ActorRupee::func_ov14_0213b5f4(RupeeId id, unk32 param2, Vec3p *param3, bool param4) {} -void ActorRupee::func_ov14_0213b6a4(RupeeId id, void *param2) {} -bool ActorRupee::func_ov14_0213b70c(RupeeId id) {} -ActorRupee::~ActorRupee() {} +extern u32 **data_027e0fe0[]; +extern u32 data_ov14_021589b4[]; -#endif + +u32 func_01fffd04(void*, u32); +void func_01ff9bc4(Vec3p *a, Vec3p *b, Vec3p *sum); + +extern u32 data_ov00_020e9370[]; +bool func_ov00_020c313c(); +void func_ov00_0207a1c8(bool *param_1, bool param_2, Vec3p *param_3); + +// --- + +void func_0202bc38(unk32 param_1, Vec3p *param_2, u32 param_3, Actor_UnkStruct_012 *param_4, bool); +void func_ov05_02102c2c(u32* param_1, int param_2, Vec3p *param_3, int param_4, int param_5, + u32 param_6, int param_7, char param_8, char param_9, char param_10); + +void func_ov00_020d7ad4(u32* param1, u32 param2); +void func_ov00_02083fb0(u32* param1, void* param2, Vec3p* param3); +u16 GetRupeeValue(RupeeId id); +extern u32 data_ov00_020eec9c[]; +extern PlayerLinkBase *data_027e0fc8; // gPlayerLink +extern void *data_027e0e60; + +// void func_ov05_02102c2c(int param_1, int param_2, Vec3p *param_3); +// void func_0202bc38(unk32 param_1, Vec3p *param_2, u32 param_3, Actor_UnkStruct_012 *param_4, s16 param_5); +// extern u32 sRupeePalettes[]; + +ActorRupee* ActorRupee::Create() { + ActorRupee* newRupee = new(*data_027e0fe0[0], 4) ActorRupee(); + return newRupee; +} + +// match? +ActorRupee::ActorRupee() { + mRupeeId = 8; + mUnk_15c = 0; +} + +// https://decomp.me/scratch/1qjCc +extern "C" void _ZN10ActorRupee18func_ov14_0213b204Ei(); +bool NONMATCH(ActorRupee::vfunc_08)() { + #ifndef NONMATCHING + #include "../../../asm/ov14/Actor/ActorRupee_vfunc_08.inc" + #else + u32 *puVar2; // undefined + u32 uVar4; + u32 dVar5; + u32 uVar6; + u32 iVar7; + u32 uVar8; + u32 uVar9; + u32 uVar10; + u32 uVar11; + u32 iVar12; + + mRupeeId = mUnk_020.mUnk_00[0]; + + dVar5 = func_ov14_0213b70c(mRupeeId) ? data_ov14_021589b4[9] : FLOAT_TO_Q20(0.666); + iVar7 = (s32)dVar5 >> 1; + + mHitbox.pos.x = 0; + mHitbox.pos.y = iVar7; + mHitbox.pos.z = 0; + mHitbox.size = iVar7; + mUnk_08c.pos = mHitbox.pos; + mUnk_08c.size = mHitbox.size; + mUnk_0a4.mUnk_04.x = 0; + mUnk_0a4.mUnk_04.y = iVar7; + mUnk_0a4.mUnk_04.z = 0; + mUnk_0a4.mUnk_10 = iVar7 + FLOAT_TO_Q20(1.0); + mUnk_09c.mUnk_0 &= 0xFFFFFF4F; + mUnk_09c.mUnk_3 = 1; + mMaxFall = mUnk_08c.size - 1; + + puVar2 = data_027e0764; + + if (mUnk_03c >= 0) { + func_ov14_0213b204(1); + } else { + switch(mUnk_144) { + case 0: + mVel.x = 0; + mVel.y = 0; + mVel.z = 0; + func_ov14_0213b204(0); + break; + case 1: + uVar8 = PTR_DWORD_overlay_d_14__0213b108[8]; + uVar4 = PTR_DWORD_overlay_d_14__0213b108[uVar8]; + + uVar9 = PTR_DWORD_overlay_d_14__0213b108[16]; + iVar7 = PTR_DWORD_overlay_d_14__0213b108[12]; + uVar11 = uVar9 + uVar4; + + iVar12 = PTR_DWORD_overlay_d_14__0213b108[20]; + uVar6 = (u64)uVar11 * (u64)uVar8; + uVar10 = ( + iVar12 + + (iVar7 * PTR_DWORD_overlay_d_14__0213b108[0]) + + (uVar8 * PTR_DWORD_overlay_d_14__0213b108[4]) + + ((uVar4) >> 0x20) + // + CARRY4(uVar9, uVar4) + ); + + uVar4 = uVar9 + uVar6; + PTR_DWORD_overlay_d_14__0213b108[0] = uVar11; + puVar2[4] = uVar10; + + puVar2[0] = uVar4; + uVar6 = ( + iVar12 + + (iVar7 * uVar11) + + (uVar8 * uVar10) + + ((u64)uVar11 * (FP_1(uVar8) >> 0x20)) + // + CARRY4(uVar9, uVar6) + ); + uVar11 = uVar4 * uVar8; + + PTR_DWORD_overlay_d_14__0213b108[4] = uVar6; + puVar2 = PTR_DWORD_overlay_d_14__0213b108; + uVar4 = ( + iVar12 + + (iVar7 * uVar4) + + (uVar8 * uVar6) + + ((u64)uVar4 * (FP_1(uVar8) >> 0x20)) + // + CARRY4(uVar9, uVar11) + ); + + PTR_DWORD_overlay_d_14__0213b108[0] = uVar9 + uVar11; + puVar2[4] = uVar4; + + mVel.x = (s32)((u64)uVar4 * FLOAT_TO_Q20(0.1335) >> 0x20) - FLOAT_TO_Q20(0.0666); + mVel.y = (s32)((u64)uVar6 * FLOAT_TO_Q20(0.2) >> 0x20) + FLOAT_TO_Q20(0.3333); + mVel.z = (s32)((u64)uVar10 * FLOAT_TO_Q20(0.1335) >> 0x20) - FLOAT_TO_Q20(0.0666); + func_ov14_0213b204(0); + break; + case 2: + mVel.x = 0; + mVel.y = FLOAT_TO_Q20(0.5); + mVel.z = 0; + func_ov14_0213b204(0); + break; + case 3: + func_ov14_0213b204(5); + break; + } + } + + return true; + #endif +} + +bool ActorRupee::vfunc_60() { + return func_ov14_0213b70c(mRupeeId); +} + +void ActorRupee::vfunc_64() {} + +void ActorRupee::Move() { + s32 size; + + ApplyGravity(); + func_01ff9bc4(&mPos, &mVel, &mPos); // Vec3p::Add() + mUnk_09c.mUnk_3 = 1; + size = mMaxFall = mUnk_08c.size - 1; + + size += mUnk_018; + if (size < mPos.y) { + mUnk_09c.mUnk_0 = 0x49; + } else { + mUnk_09c.mUnk_0 = 0xcb; + } + + if (func_01fffd04(this, 0)) { + mVel.x = 0; + mVel.z = 0; + } +} + +ItemId ActorRupee::GetRupeeCutsceneItemId() { + switch (mRupeeId) { + case RupeeId_Green: + return ItemId_None; + + case RupeeId_Blue: + return ItemId_None; + + case RupeeId_Red: + return ItemId_None; + + case RupeeId_BigGreen: + return ItemId_BigGreenRupee; + + case RupeeId_BigRed: + return ItemId_BigRedRupee; + + case RupeeId_Gold: + return ItemId_GoldRupee; + + case RupeeId_Rupoor10: + return ItemId_Rupoor10; + + case RupeeId_Rupoor50: + return ItemId_Rupoor50; + + default: + break; + } + + return ItemId_None; +} + +void ActorRupee::func_ov14_0213b204(unk32 param1) { + switch (param1) { + case 0: + mVisible = true; + break; + case 1: + case 2: + case 3: + case 4: + case 5: + mVel.x = 0; + mVel.y = 0; + mVel.z = 0; + break; + } + + mActiveFrames = 0; + mUnk_130 = param1; +} + +void ActorRupee::Update(bool param1) { + ItemId cutsceneItemId; + s32 uVar3; + Vec3p local_1c; + u32 local_20; + u16 rupeeValue; + + mPrevPos = mPos; + IncreaseActiveFrames(); + + if ((mUnk_130 != 3) && (++mUnk_15c >= 6) && CollidesWithPlayer(PlayerCollide_PickupFlags)) { + cutsceneItemId = GetRupeeCutsceneItemId(); + + if (cutsceneItemId >= 0) { + if (data_027e0fc8->PlayItemCutscene(cutsceneItemId)) { + Kill(); + } else { + func_ov14_0213b204(3); + } + } else { + ItemManager* pItem = gItemManager; + rupeeValue = GetRupeeValue(mRupeeId); + pItem->GiveRupees(rupeeValue, false); + uVar3 = -1; + + switch (mRupeeId) { + case RupeeId_Green: + uVar3 = 0xfa; + break; + case RupeeId_Blue: + uVar3 = 0xfb; + break; + case RupeeId_Red: + uVar3 = 0xfc; + break; + default: + break; + } + + func_ov00_020d7ad4(data_ov00_020eec9c, uVar3); + Kill(); + } + } + + if (!(mUnk_130 != 0 && mUnk_130 != 1 && mUnk_130 != 2)) { + if (func_ov00_020c2c0c()) { + func_ov14_0213b204(4); + } else if (func_ov00_020c2d54()) { + func_ov14_0213b204(5); + } + } + + switch (mUnk_130) { + case 0: + Move(); + if (mUnk_111) { + local_1c = mPos; + func_ov00_02083fb0(&local_20, data_027e0e60, &local_1c); + if (((local_20 >> 5) & 3) == 2) { + Kill(); + } else { + func_ov14_0213b204(1); + } + } + break; + case 3: + PlayerLinkBase* pLink = data_027e0fc8; + if (pLink->PlayItemCutscene(GetRupeeCutsceneItemId())) { + Kill(); + } + break; + case 1: + if (param1) { + mActiveFrames = 0; + } + if ((mUnk_03c < 0) && (mActiveFrames >= 180)) { + func_ov14_0213b204(2); + } + break; + case 2: + if (param1) { + mActiveFrames = 0; + } + if (mActiveFrames >= 60) { + Kill(); + } + break; + case 4: + if (!func_ov00_020c2c70()) { + func_ov14_0213b204(1); + } + break; + case 5: + if (!func_ov00_020c2de4()) { + func_ov14_0213b204(1); + } + break; + default: + break; + } + + KillInBounds(); +} + +void ActorRupee::vfunc_14(bool param1) { + if (func_ov00_020c313c(param1)) { + Update(false); + } + func_ov00_0207a1c8(&mUnk_0a4.mUnk_00, param1, &mPos); +} + +void ActorRupee::vfunc_18(bool param1) { + if (func_ov00_020c313c(param1)) { + Update(true); + } + func_ov00_0207a1c8(&mUnk_0a4.mUnk_00, param1, &mPos); +} + +void ActorRupee::vfunc_20(bool param1) { + if (param1 ? mUnk_0a4.mUnk_01 : mUnk_0a4.mUnk_00) { + if (mUnk_130 == 2 && mActiveFrames % 8 < 4) { + return; + } + + if (param1 ? mUnk_0a4.mUnk_01 : mUnk_0a4.mUnk_00) { + func_ov14_0213b5f4(mRupeeId, param1, &mPos, true); + } + } +} + +void ActorRupee::func_ov14_0213b5f4(RupeeId id, unk32 param2, Vec3p *param3, bool param4) { + Actor_UnkStruct_012 unk_class; + static u32 data_ov14_02153e28[] = { // sRupeePalettes + 0x9, // RupeeId_Green + 0xA, // RupeeId_Blue + 0x8, // RupeeId_Red + 0x9, // RupeeId_BigGreen + 0x8, // RupeeId_BigRed + 0xB, // RupeeId_Gold + 0xC, // RupeeId_Rupoor10 + 0xC, // RupeeId_Rupoor50 + }; + + func_ov14_0213b6a4(id, &unk_class); + func_0202bc38(param2, param3, data_ov14_02153e28[id], &unk_class, 0); + + if (param4) { + u32 var = func_ov14_0213b70c(id) ? 0x4cd : 0x400; + func_ov05_02102c2c(&data_ov00_020e9370[0], 0, param3, var, var, 0, 0x1f, 0, 1, 1); + } +} + +void ActorRupee::func_ov14_0213b6a4(RupeeId id, Actor_UnkStruct_012 *param2) { + param2->mUnk_04 = 3; + + if (func_ov14_0213b70c(id)) { + param2->mUnk_08 = 2; + param2->mUnk_0c = 2; + param2->mUnk_14 = data_ov14_021589b4[0x8]; + param2->mUnk_18 = data_ov14_021589b4[0x9]; + } else { + param2->mUnk_08 = 2; + param2->mUnk_0c = 2; + param2->mUnk_14 = 0x2aa; + param2->mUnk_18 = 0xaa8; + } +} + +bool ActorRupee::func_ov14_0213b70c(RupeeId id) { + switch (id) { + case RupeeId_BigGreen: + case RupeeId_BigRed: + case RupeeId_Gold: + case RupeeId_Rupoor50: + return true; + + default: + break; + } + + return false; +} + +ActorRupee::~ActorRupee() {}