diff --git a/config/eur/arm9/dtcm/symbols.txt b/config/eur/arm9/dtcm/symbols.txt index 1744f8f5..42ca4f97 100644 --- a/config/eur/arm9/dtcm/symbols.txt +++ b/config/eur/arm9/dtcm/symbols.txt @@ -73,7 +73,7 @@ data_027e06d8 kind:bss addr:0x27e06d8 data_027e06e4 kind:bss addr:0x27e06e4 data_027e0718 kind:bss addr:0x27e0718 data_027e071c kind:bss addr:0x27e071c -data_027e0764 kind:bss addr:0x27e0764 +gRandom kind:bss addr:0x27e0764 data_027e077c kind:bss addr:0x27e077c data_027e080c kind:bss addr:0x27e080c data_027e081c kind:bss addr:0x27e081c diff --git a/config/eur/arm9/overlays/ov000/symbols.txt b/config/eur/arm9/overlays/ov000/symbols.txt index 65e60aea..009ce35d 100644 --- a/config/eur/arm9/overlays/ov000/symbols.txt +++ b/config/eur/arm9/overlays/ov000/symbols.txt @@ -143,7 +143,7 @@ func_ov000_02079f3c kind:function(thumb,size=0x20) addr:0x2079f3c func_ov000_02079f5c kind:function(thumb,size=0xa0) addr:0x2079f5c func_ov000_02079ffc kind:function(thumb,size=0x3c) addr:0x2079ffc func_ov000_0207a038 kind:function(thumb,size=0x104) addr:0x207a038 -func_ov000_0207a13c kind:function(arm,size=0x4c) addr:0x207a13c +_ZN19Actor_UnkStruct_012C1Ev kind:function(arm,size=0x4c) addr:0x207a13c _ZN19Actor_UnkStruct_0a4C1Eiiii kind:function(thumb,size=0x1c) addr:0x207a188 func_ov000_0207a1a4 kind:function(arm,size=0x24) addr:0x207a1a4 func_ov000_0207a1c8 kind:function(arm,size=0xcc) addr:0x207a1c8 @@ -619,7 +619,7 @@ _ZN10MapManager18func_ov00_02083ef8EP5Vec3pS1_i kind:function(arm,size=0x4c) add _ZN10MapManager18func_ov00_02083f44EP5Vec3p kind:function(arm,size=0x3c) addr:0x2083f44 _ZN10MapManager16MapData_vfunc_6cEv kind:function(arm,size=0x18) addr:0x2083f80 _ZN10MapManager16MapData_vfunc_70Ev kind:function(arm,size=0x18) addr:0x2083f98 -_ZN10MapManager18func_ov00_02083fb0EiPS_i kind:function(arm,size=0x74) addr:0x2083fb0 +_ZN10MapManager18func_ov00_02083fb0EPjPS_P5Vec3p kind:function(arm,size=0x74) addr:0x2083fb0 _ZN10MapManager18func_ov00_02084024EiP4AABB kind:function(arm,size=0x64) addr:0x2084024 _ZN10MapManager16MapData_vfunc_54Ev kind:function(arm,size=0x18) addr:0x2084088 _ZN10MapManager18func_ov00_020840a0Ecci kind:function(arm,size=0x24) addr:0x20840a0 @@ -2147,7 +2147,7 @@ _ZN11ItemManager8GiveItemEi kind:function(thumb,size=0x59c) addr:0x20adcdc _ZN11ItemManager13GiveEquipItemEit kind:function(thumb,size=0x48) addr:0x20ae278 _ZN11ItemManager13UnequipPotionEv kind:function(thumb,size=0x14) addr:0x20ae2c0 _ZNK11ItemManager12GetMaxRupeesEv kind:function(arm,size=0xc) addr:0x20ae2d4 -_ZN11ItemManager10GiveRupeesEsb kind:function(arm,size=0x70) addr:0x20ae2e0 +_ZN11ItemManager10GiveRupeesEib kind:function(arm,size=0x70) addr:0x20ae2e0 _ZNK11ItemManager10GetNumKeysEv kind:function(arm,size=0x18) addr:0x20ae350 _ZN11ItemManager8GiveKeysEj kind:function(thumb,size=0x28) addr:0x20ae368 _ZNK11ItemManager15GetEquippedItemEv kind:function(arm,size=0x18) addr:0x20ae390 @@ -2577,7 +2577,7 @@ func_ov000_020bcc78 kind:function(arm,size=0x50) addr:0x20bcc78 func_ov000_020bccc8 kind:function(arm,size=0xf0) addr:0x20bccc8 func_ov000_020bcdb8 kind:function(arm,size=0x34) addr:0x20bcdb8 func_ov000_020bcdec kind:function(arm,size=0x5c) addr:0x20bcdec -func_ov000_020bce48 kind:function(arm,size=0x80) addr:0x20bce48 +_ZN14PlayerLinkBase18func_ov00_020bce48Ei kind:function(arm,size=0x80) addr:0x20bce48 func_ov000_020bcec8 kind:function(arm,size=0x34) addr:0x20bcec8 func_ov000_020bcefc kind:function(arm,size=0x30) addr:0x20bcefc func_ov000_020bcf2c kind:function(arm,size=0x24) addr:0x20bcf2c @@ -2920,7 +2920,7 @@ func_ov000_020c56d8 kind:function(arm,size=0x9c) addr:0x20c56d8 func_ov000_020c5774 kind:function(arm,size=0x88) addr:0x20c5774 func_ov000_020c57fc kind:function(arm,size=0x128) addr:0x20c57fc func_ov000_020c5924 kind:function(arm,size=0x100) addr:0x20c5924 -func_ov000_020c5a24 kind:function(arm,size=0x38) addr:0x20c5a24 +_Z13GetRupeeValuej kind:function(arm,size=0x38) addr:0x20c5a24 func_ov000_020c5a5c kind:function(arm,size=0xd8) addr:0x20c5a5c func_ov000_020c5b34 kind:function(arm,size=0xb8) addr:0x20c5b34 func_ov000_020c5bec kind:function(arm,size=0x40) addr:0x20c5bec diff --git a/config/eur/arm9/overlays/ov014/relocs.txt b/config/eur/arm9/overlays/ov014/relocs.txt index dd7bc1cb..2893de9a 100644 --- a/config/eur/arm9/overlays/ov014/relocs.txt +++ b/config/eur/arm9/overlays/ov014/relocs.txt @@ -3214,7 +3214,7 @@ from:0x0213ae80 kind:arm_call to:0x0202e9dc module:main from:0x0213ae8c kind:arm_call to:0x0213ae98 module:overlay(14) from:0x0213ae94 kind:load to:0x027e0fe0 module:dtcm from:0x0213aea0 kind:arm_call to:0x020c1554 module:overlay(0) -from:0x0213aec8 kind:load to:0x021589e4 module:overlay(14) +from:0x0213aec8 kind:load to:0x021589dc add:8 module:overlay(14) from:0x0213aee0 kind:arm_call to:0x0213b70c module:overlay(14) from:0x0213af70 kind:arm_call to:0x0213b204 module:overlay(14) from:0x0213afac kind:arm_call to:0x0213b204 module:overlay(14) diff --git a/config/eur/arm9/overlays/ov014/symbols.txt b/config/eur/arm9/overlays/ov014/symbols.txt index 27b5de82..d53f225f 100644 --- a/config/eur/arm9/overlays/ov014/symbols.txt +++ b/config/eur/arm9/overlays/ov014/symbols.txt @@ -783,7 +783,7 @@ func_ov014_0213ae00 kind:function(arm,size=0x20) addr:0x213ae00 func_ov014_0213ae20 kind:function(arm,size=0x28) addr:0x213ae20 func_ov014_0213ae48 kind:function(arm,size=0x20) addr:0x213ae48 _ZN10ActorRupee6CreateEv kind:function(arm,size=0x30) addr:0x213ae68 -_ZN10ActorRupeeC2Ev kind:function(arm,size=0x34) addr:0x213ae98 +_ZN10ActorRupeeC1Ev kind:function(arm,size=0x34) addr:0x213ae98 _ZN10ActorRupee8vfunc_08Ev kind:function(arm,size=0x240) addr:0x213aecc _ZN10ActorRupee8vfunc_60Ev kind:function(arm,size=0x10) addr:0x213b10c _ZN10ActorRupee8vfunc_64Ev kind:function(arm,size=0x4) addr:0x213b11c @@ -793,9 +793,9 @@ _ZN10ActorRupee18func_ov14_0213b204Ei kind:function(arm,size=0x50) addr:0x213b20 _ZN10ActorRupee6UpdateEb kind:function(arm,size=0x2c8) addr:0x213b254 _ZN10ActorRupee8vfunc_14Ej kind:function(arm,size=0x38) addr:0x213b51c _ZN10ActorRupee8vfunc_18Ej kind:function(arm,size=0x38) addr:0x213b554 -_ZN10ActorRupee8vfunc_20Ei kind:function(arm,size=0x68) addr:0x213b58c +_ZN10ActorRupee8vfunc_20Eb kind:function(arm,size=0x68) addr:0x213b58c _ZN10ActorRupee18func_ov14_0213b5f4EjiP5Vec3pb kind:function(arm,size=0xb0) addr:0x213b5f4 -_ZN10ActorRupee18func_ov14_0213b6a4EjPv kind:function(arm,size=0x68) addr:0x213b6a4 +_ZN10ActorRupee18func_ov14_0213b6a4EjP19Actor_UnkStruct_012 kind:function(arm,size=0x68) addr:0x213b6a4 _ZN10ActorRupee18func_ov14_0213b70cEj kind:function(arm,size=0x3c) addr:0x213b70c _ZN10ActorRupeeD0Ev kind:function(arm,size=0x1c) addr:0x213b748 _ZN10ActorRupeeD2Ev kind:function(arm,size=0x14) addr:0x213b764 @@ -1684,7 +1684,7 @@ func_ov014_0215507c kind:function(arm,size=0x40) addr:0x215507c func_ov014_021550bc kind:function(arm,size=0x40) addr:0x21550bc func_ov014_021550fc kind:function(arm,size=0x40) addr:0x21550fc func_ov014_0215513c kind:function(arm,size=0x40) addr:0x215513c -func_ov014_0215517c kind:function(arm,size=0x5c) addr:0x215517c +__sinit_ActorRupee.cpp kind:function(arm,size=0x5c) addr:0x215517c func_ov014_021551d8 kind:function(arm,size=0x40) addr:0x21551d8 func_ov014_02155218 kind:function(arm,size=0x38) addr:0x2155218 func_ov014_02155250 kind:function(arm,size=0x3c) addr:0x2155250 @@ -1902,7 +1902,9 @@ data_ov014_021589a8 kind:data(any) addr:0x21589a8 data_ov014_021589ac kind:data(any) addr:0x21589ac data_ov014_021589b0 kind:data(any) addr:0x21589b0 data_ov014_021589b4 kind:data(any) addr:0x21589b4 -_ZTV10ActorRupee kind:data(any) addr:0x21589e4 +data_ov014_021589d4 kind:data(any) addr:0x21589d4 +data_ov014_021589d8 kind:data(any) addr:0x21589d8 +_ZTV10ActorRupee kind:data(any) addr:0x21589dc data_ov014_02158aa0 kind:data(any) addr:0x2158aa0 data_ov014_02158b60 kind:data(any) addr:0x2158b60 data_ov014_02158b64 kind:data(any) addr:0x2158b64 diff --git a/config/usa/arm9/dtcm/symbols.txt b/config/usa/arm9/dtcm/symbols.txt index 1744f8f5..42ca4f97 100644 --- a/config/usa/arm9/dtcm/symbols.txt +++ b/config/usa/arm9/dtcm/symbols.txt @@ -73,7 +73,7 @@ data_027e06d8 kind:bss addr:0x27e06d8 data_027e06e4 kind:bss addr:0x27e06e4 data_027e0718 kind:bss addr:0x27e0718 data_027e071c kind:bss addr:0x27e071c -data_027e0764 kind:bss addr:0x27e0764 +gRandom kind:bss addr:0x27e0764 data_027e077c kind:bss addr:0x27e077c data_027e080c kind:bss addr:0x27e080c data_027e081c kind:bss addr:0x27e081c diff --git a/config/usa/arm9/overlays/ov000/symbols.txt b/config/usa/arm9/overlays/ov000/symbols.txt index 88d2aba4..ba0a3d3b 100644 --- a/config/usa/arm9/overlays/ov000/symbols.txt +++ b/config/usa/arm9/overlays/ov000/symbols.txt @@ -143,7 +143,7 @@ func_ov000_02079f3c kind:function(thumb,size=0x20) addr:0x2079edc func_ov000_02079f5c kind:function(thumb,size=0xa0) addr:0x2079efc func_ov000_02079ffc kind:function(thumb,size=0x3c) addr:0x2079f9c func_ov000_0207a038 kind:function(thumb,size=0x104) addr:0x2079fd8 -func_ov000_0207a13c kind:function(arm,size=0x4c) addr:0x207a0dc +_ZN19Actor_UnkStruct_012C1Ev kind:function(arm,size=0x4c) addr:0x207a0dc _ZN19Actor_UnkStruct_0a4C1Eiiii kind:function(thumb,size=0x1c) addr:0x207a128 func_ov000_0207a1a4 kind:function(arm,size=0x24) addr:0x207a144 func_ov000_0207a1c8 kind:function(arm,size=0xcc) addr:0x207a168 @@ -619,7 +619,7 @@ _ZN10MapManager18func_ov00_02083ef8EP5Vec3pS1_i kind:function(arm,size=0x4c) add _ZN10MapManager18func_ov00_02083f44EP5Vec3p kind:function(arm,size=0x3c) addr:0x2083ee4 _ZN10MapManager16MapData_vfunc_6cEv kind:function(arm,size=0x18) addr:0x2083f20 _ZN10MapManager16MapData_vfunc_70Ev kind:function(arm,size=0x18) addr:0x2083f38 -_ZN10MapManager18func_ov00_02083fb0EiPS_i kind:function(arm,size=0x74) addr:0x2083f50 +_ZN10MapManager18func_ov00_02083fb0EPjPS_P5Vec3p kind:function(arm,size=0x74) addr:0x2083f50 _ZN10MapManager18func_ov00_02084024EiP4AABB kind:function(arm,size=0x64) addr:0x2083fc4 _ZN10MapManager16MapData_vfunc_54Ev kind:function(arm,size=0x18) addr:0x2084028 _ZN10MapManager18func_ov00_020840a0Ecci kind:function(arm,size=0x24) addr:0x2084040 @@ -2147,7 +2147,7 @@ _ZN11ItemManager8GiveItemEi kind:function(thumb,size=0x59c) addr:0x20adc7c _ZN11ItemManager13GiveEquipItemEit kind:function(thumb,size=0x48) addr:0x20ae218 _ZN11ItemManager13UnequipPotionEv kind:function(thumb,size=0x14) addr:0x20ae260 _ZNK11ItemManager12GetMaxRupeesEv kind:function(arm,size=0xc) addr:0x20ae274 -_ZN11ItemManager10GiveRupeesEsb kind:function(arm,size=0x70) addr:0x20ae280 +_ZN11ItemManager10GiveRupeesEib kind:function(arm,size=0x70) addr:0x20ae280 _ZNK11ItemManager10GetNumKeysEv kind:function(arm,size=0x18) addr:0x20ae2f0 _ZN11ItemManager8GiveKeysEj kind:function(thumb,size=0x28) addr:0x20ae308 _ZNK11ItemManager15GetEquippedItemEv kind:function(arm,size=0x18) addr:0x20ae330 @@ -2577,7 +2577,7 @@ func_ov000_020bcc78 kind:function(arm,size=0x50) addr:0x20bcc18 func_ov000_020bccc8 kind:function(arm,size=0xf0) addr:0x20bcc68 func_ov000_020bcdb8 kind:function(arm,size=0x34) addr:0x20bcd58 func_ov000_020bcdec kind:function(arm,size=0x5c) addr:0x20bcd8c -func_ov000_020bce48 kind:function(arm,size=0x80) addr:0x20bcde8 +_ZN14PlayerLinkBase18func_ov00_020bce48Ei kind:function(arm,size=0x80) addr:0x20bcde8 func_ov000_020bcec8 kind:function(arm,size=0x34) addr:0x20bce68 func_ov000_020bcefc kind:function(arm,size=0x30) addr:0x20bce9c func_ov000_020bcf2c kind:function(arm,size=0x24) addr:0x20bcecc @@ -2920,7 +2920,7 @@ func_ov000_020c56d8 kind:function(arm,size=0x9c) addr:0x20c5678 func_ov000_020c5774 kind:function(arm,size=0x88) addr:0x20c5714 func_ov000_020c57fc kind:function(arm,size=0x128) addr:0x20c579c func_ov000_020c5924 kind:function(arm,size=0x100) addr:0x20c58c4 -func_ov000_020c5a24 kind:function(arm,size=0x38) addr:0x20c59c4 +_Z13GetRupeeValuej kind:function(arm,size=0x38) addr:0x20c59c4 func_ov000_020c5a5c kind:function(arm,size=0xd8) addr:0x20c59fc func_ov000_020c5b34 kind:function(arm,size=0xb8) addr:0x20c5ad4 func_ov000_020c5bec kind:function(arm,size=0x40) addr:0x20c5b8c diff --git a/config/usa/arm9/overlays/ov014/relocs.txt b/config/usa/arm9/overlays/ov014/relocs.txt index 7a9d94d7..c7441ced 100644 --- a/config/usa/arm9/overlays/ov014/relocs.txt +++ b/config/usa/arm9/overlays/ov014/relocs.txt @@ -3214,7 +3214,7 @@ from:0x0213addc kind:arm_call to:0x0202e9d8 module:main from:0x0213ade8 kind:arm_call to:0x0213adf4 module:overlay(14) from:0x0213adf0 kind:load to:0x027e0fe0 module:dtcm from:0x0213adfc kind:arm_call to:0x020c14f4 module:overlay(0) -from:0x0213ae24 kind:load to:0x02158944 module:overlay(14) +from:0x0213ae24 kind:load to:0x0215893c add:8 module:overlay(14) from:0x0213ae3c kind:arm_call to:0x0213b668 module:overlay(14) from:0x0213aecc kind:arm_call to:0x0213b160 module:overlay(14) from:0x0213af08 kind:arm_call to:0x0213b160 module:overlay(14) diff --git a/config/usa/arm9/overlays/ov014/symbols.txt b/config/usa/arm9/overlays/ov014/symbols.txt index cc99c40b..028839a5 100644 --- a/config/usa/arm9/overlays/ov014/symbols.txt +++ b/config/usa/arm9/overlays/ov014/symbols.txt @@ -783,7 +783,7 @@ func_ov014_0213ae00 kind:function(arm,size=0x20) addr:0x213ad5c func_ov014_0213ae20 kind:function(arm,size=0x28) addr:0x213ad7c func_ov014_0213ae48 kind:function(arm,size=0x20) addr:0x213ada4 _ZN10ActorRupee6CreateEv kind:function(arm,size=0x30) addr:0x213adc4 -_ZN10ActorRupeeC2Ev kind:function(arm,size=0x34) addr:0x213adf4 +_ZN10ActorRupeeC1Ev kind:function(arm,size=0x34) addr:0x213adf4 _ZN10ActorRupee8vfunc_08Ev kind:function(arm,size=0x240) addr:0x213ae28 _ZN10ActorRupee8vfunc_60Ev kind:function(arm,size=0x10) addr:0x213b068 _ZN10ActorRupee8vfunc_64Ev kind:function(arm,size=0x4) addr:0x213b078 @@ -793,9 +793,9 @@ _ZN10ActorRupee18func_ov14_0213b204Ei kind:function(arm,size=0x50) addr:0x213b16 _ZN10ActorRupee6UpdateEb kind:function(arm,size=0x2c8) addr:0x213b1b0 _ZN10ActorRupee8vfunc_14Ej kind:function(arm,size=0x38) addr:0x213b478 _ZN10ActorRupee8vfunc_18Ej kind:function(arm,size=0x38) addr:0x213b4b0 -_ZN10ActorRupee8vfunc_20Ei kind:function(arm,size=0x68) addr:0x213b4e8 +_ZN10ActorRupee8vfunc_20Eb kind:function(arm,size=0x68) addr:0x213b4e8 _ZN10ActorRupee18func_ov14_0213b5f4EjiP5Vec3pb kind:function(arm,size=0xb0) addr:0x213b550 -_ZN10ActorRupee18func_ov14_0213b6a4EjPv kind:function(arm,size=0x68) addr:0x213b600 +_ZN10ActorRupee18func_ov14_0213b6a4EjP19Actor_UnkStruct_012 kind:function(arm,size=0x68) addr:0x213b600 _ZN10ActorRupee18func_ov14_0213b70cEj kind:function(arm,size=0x3c) addr:0x213b668 _ZN10ActorRupeeD0Ev kind:function(arm,size=0x1c) addr:0x213b6a4 _ZN10ActorRupeeD2Ev kind:function(arm,size=0x14) addr:0x213b6c0 @@ -1684,7 +1684,7 @@ func_ov014_0215507c kind:function(arm,size=0x40) addr:0x2154fd8 func_ov014_021550bc kind:function(arm,size=0x40) addr:0x2155018 func_ov014_021550fc kind:function(arm,size=0x40) addr:0x2155058 func_ov014_0215513c kind:function(arm,size=0x40) addr:0x2155098 -func_ov014_0215517c kind:function(arm,size=0x5c) addr:0x21550d8 +__sinit_ActorRupee.cpp kind:function(arm,size=0x5c) addr:0x21550d8 func_ov014_021551d8 kind:function(arm,size=0x40) addr:0x2155134 func_ov014_02155218 kind:function(arm,size=0x38) addr:0x2155174 func_ov014_02155250 kind:function(arm,size=0x3c) addr:0x21551ac @@ -1902,7 +1902,9 @@ data_ov014_021589a8 kind:data(any) addr:0x2158908 data_ov014_021589ac kind:data(any) addr:0x215890c data_ov014_021589b0 kind:data(any) addr:0x2158910 data_ov014_021589b4 kind:data(any) addr:0x2158914 -_ZTV10ActorRupee kind:data(any) addr:0x2158944 +data_ov014_021589d4 kind:data(any) addr:0x2158934 +data_ov014_021589d8 kind:data(any) addr:0x2158938 +_ZTV10ActorRupee kind:data(any) addr:0x215893c data_ov014_02158aa0 kind:data(any) addr:0x2158a00 data_ov014_02158b60 kind:data(any) addr:0x2158ac0 data_ov014_02158b64 kind:data(any) addr:0x2158ac4 diff --git a/include/Actor/Actor.hpp b/include/Actor/Actor.hpp index 8f9378d2..64402237 100644 --- a/include/Actor/Actor.hpp +++ b/include/Actor/Actor.hpp @@ -13,8 +13,25 @@ #include "Player/EquipBoomerang.hpp" #include "System/SysNew.hpp" +struct Actor_UnkStruct_012 { + /* 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 */ u8 mUnk_08[2]; /* 0a */ u8 mUnk_0a[2]; /* 0c */ unk8 mUnk_0c; @@ -28,7 +45,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; @@ -40,8 +57,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 */ @@ -65,6 +82,8 @@ enum PlayerCollide_ { PlayerCollide_Shield = 0x4, PlayerCollide_Gongoron = 0x8, PlayerCollide_Hammer = 0x10, + + PlayerCollide_PickupFlags = PlayerCollide_Hammer | PlayerCollide_Gongoron | PlayerCollide_Sword | PlayerCollide_Player, }; struct Knockback { @@ -118,7 +137,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; @@ -159,7 +178,7 @@ public: /* 14 */ virtual void vfunc_14(u32 param1); /* 18 */ virtual void vfunc_18(u32 param1); /* 1c */ virtual void vfunc_1c(u16 *param1); - /* 20 */ virtual void vfunc_20(s32 param1); + /* 20 */ virtual void vfunc_20(bool param1); /* 24 */ virtual void vfunc_24(); /* 28 */ virtual void vfunc_28(); /* 2c */ virtual s32 vfunc_2c(); diff --git a/include/Actor/ActorRupee.hpp b/include/Actor/ActorRupee.hpp index c0618394..56519394 100644 --- a/include/Actor/ActorRupee.hpp +++ b/include/Actor/ActorRupee.hpp @@ -6,7 +6,8 @@ #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_ { @@ -27,7 +28,7 @@ public: /* 000 (base) */ /* 158 */ RupeeId mRupeeId; - /* 15c */ unk16 mUnk_15c; + /* 15c */ u16 mUnk_15c; /* 15e */ unk16 mUnk_15e; /* 160 */ @@ -35,7 +36,7 @@ public: /* 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; + /* 20 */ virtual void vfunc_20(bool param1) override; /* 60 */ virtual bool vfunc_60() override; /* 64 */ virtual void vfunc_64() override; /* b4 */ @@ -47,6 +48,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/Actor/ActorType.hpp b/include/Actor/ActorType.hpp index 76fb560d..4adc3a7a 100644 --- a/include/Actor/ActorType.hpp +++ b/include/Actor/ActorType.hpp @@ -126,6 +126,18 @@ enum ActorTypeId_ { ActorTypeId_VLR0 = __ACTOR_TYPE_ID(V, L, R, 0), }; +class ActorType_UnkClass { +public: + u32 unk_00; + u32 unk_04; + u32 unk_08; + u32 unk_0C; + u32 unk_10; + ActorType_UnkClass(u32 unk_00, u32 unk_04) : + unk_00(unk_00), + unk_04(unk_04) {} +}; + class Actor; typedef Actor *(*ActorCreateFunc)(); diff --git a/include/Item/Item.hpp b/include/Item/Item.hpp index cc3b9777..1b67ada3 100644 --- a/include/Item/Item.hpp +++ b/include/Item/Item.hpp @@ -89,7 +89,8 @@ enum ItemFlag_ { typedef s32 ItemId; enum ItemId_ { - /* 0x00 */ ItemId_None = 0, + /* -1 */ ItemId_None = -1, + /* 0x00 */ ItemId_Nothing = 0, /* 0x01 */ ItemId_SmallKey = 1, /* 0x02 */ ItemId_GreenRupee = 2, /* 0x03 */ ItemId_OshusSword = 3, diff --git a/include/Item/ItemManager.hpp b/include/Item/ItemManager.hpp index 1cc75738..ae5e8cad 100644 --- a/include/Item/ItemManager.hpp +++ b/include/Item/ItemManager.hpp @@ -314,7 +314,7 @@ public: // Rupees s32 GetMaxRupees() const; - void GiveRupees(s16 amount, bool param2); + void GiveRupees(s32 amount, bool param2); // Potion void SetPotion(u32 index, Potion potion); diff --git a/include/Map/MapManager.hpp b/include/Map/MapManager.hpp index 8df6e51e..4e969c5a 100644 --- a/include/Map/MapManager.hpp +++ b/include/Map/MapManager.hpp @@ -171,7 +171,7 @@ public: void func_ov00_02083f44(Vec3p *param_2); unk8 MapData_vfunc_6c(); unk8 MapData_vfunc_70(); - static unk8 func_ov00_02083fb0(unk32 param_1, MapManager *param_2, unk32 param_3); + static unk8 func_ov00_02083fb0(u32 *param_1, MapManager *param_2, Vec3p *param_3); void func_ov00_02084024(unk32 param_2, AABB *param_3); unk8 MapData_vfunc_54(); unk8 func_ov00_020840a0(unk8 param_2, unk8 param_3, unk32 param_4); diff --git a/include/Player/PlayerLinkBase.hpp b/include/Player/PlayerLinkBase.hpp index 7d9c4b75..02cf3219 100644 --- a/include/Player/PlayerLinkBase.hpp +++ b/include/Player/PlayerLinkBase.hpp @@ -75,6 +75,7 @@ public: bool func_ov00_020bbd80(s32 param1); void func_ov00_020bc854(Vec3p *param1); + bool func_ov00_020bce48(ItemId cutsceneItemId); // PlayItemCutscene bool func_ov00_020bd304(); bool GongoronCollidesWith(Cylinder *hitbox); s32 GetGrabActorId(); diff --git a/include/System/Random.hpp b/include/System/Random.hpp new file mode 100644 index 00000000..4506466d --- /dev/null +++ b/include/System/Random.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "global.h" +#include "types.h" + +struct Random { + /* 00 */ u64 mRandomValue; + /* 08 */ u64 mFactor; + /* 10 */ u64 mAddend; + /* 18 */ + + /** + * Generate a random number from 0 (inclusive) to `max` (exclusive) + */ + inline u32 Next(u32 max) { + mRandomValue = mAddend + mFactor * mRandomValue; + u64 result = (mRandomValue >> 32) * max; + return result >> 32; + } +}; + +extern Random *gRandom; diff --git a/include/lib/math.h b/include/lib/math.h index f11bd10e..f7204acc 100644 --- a/include/lib/math.h +++ b/include/lib/math.h @@ -9,7 +9,9 @@ typedef s32 q20; typedef s16 q4; #define INT_TO_Q20(n) ((s32) ((n) << 12)) +#define FLOAT_TO_Q21(n) ((s32) (((n) * 8192 + 1) / 4)) #define FLOAT_TO_Q20(n) ((s32) (((n) * 8192 + 1) / 2)) +#define FLOAT_TO_Q19(n) ((s32) (((n) * 8192 + 1))) #define ROUND_Q20(n) (((s32) (n) + 0x800) >> 12) #define MUL_Q20(a, b) (q20)((((s64) (a)) * ((s64) (b)) + 0x800) >> 12) diff --git a/src/00_Core/Actor/Actor.cpp b/src/00_Core/Actor/Actor.cpp index 57f405b8..3f1f2850 100644 --- a/src/00_Core/Actor/Actor.cpp +++ b/src/00_Core/Actor/Actor.cpp @@ -187,7 +187,7 @@ ARM void Actor::vfunc_1c(u16 *param1) { } } -ARM void Actor::vfunc_20(s32 param1) {} +ARM void Actor::vfunc_20(bool param1) {} ARM void Actor::SetUnk_129(bool value) { if (mUnk_128) mUnk_129 = value; @@ -957,3 +957,5 @@ Actor_UnkStruct_09c::Actor_UnkStruct_09c() { mUnk_3 = 0; mUnk_4 = 0; } + +Actor_UnkStruct_012::Actor_UnkStruct_012() {} diff --git a/src/00_Core/Item/ItemManager.cpp b/src/00_Core/Item/ItemManager.cpp index 46a0add0..9b4a71fb 100644 --- a/src/00_Core/Item/ItemManager.cpp +++ b/src/00_Core/Item/ItemManager.cpp @@ -379,7 +379,7 @@ extern "C" ItemModel *func_ov00_02079ffc(void *, const char *modelName, const ch extern "C" ItemModel *LoadTreasureItemFanfare(ItemModel **, s32 treasureType, bool, bool); static char *sDefaultItemModel = "key"; static char *sItemModelNames[70] = { - [ItemId_None] = "key", + [ItemId_Nothing] = "key", [ItemId_SmallKey] = "key", [ItemId_GreenRupee] = "rupee_g", [ItemId_OshusSword] = "swA", @@ -794,7 +794,7 @@ THUMB void ItemManager::GiveItem(ItemId id) { this->GiveRupees(-50, true); } break; - case ItemId_None: break; + case ItemId_Nothing: break; case ItemId_Unk_5: break; case ItemId_Unk_16: break; case ItemId_Unk_131: break; @@ -839,7 +839,7 @@ ARM s32 ItemManager::GetMaxRupees() const { extern void *data_027e103c; extern "C" s32 func_ov00_020cf374(void *param1, bool param2); extern "C" void func_ov05_02104004(void *param1); -ARM void ItemManager::GiveRupees(s16 amount, bool param2) { +ARM void ItemManager::GiveRupees(s32 amount, bool param2) { s32 newRupees = mNumRupees + amount; if (newRupees > this->GetMaxRupees()) { newRupees = this->GetMaxRupees(); @@ -1020,7 +1020,7 @@ THUMB void ItemManager::PlayItemFanfareSfx(ItemId item) { sfx = SfxId_Fanfare_Rupoor; } break; - case ItemId_None: + case ItemId_Nothing: case ItemId_HerosNewClothes: { sfx = SfxId_Fanfare_Nothing_2; } break; diff --git a/src/00_Core/Map/MapManager.cpp b/src/00_Core/Map/MapManager.cpp index 83ebbbf7..3dc72153 100644 --- a/src/00_Core/Map/MapManager.cpp +++ b/src/00_Core/Map/MapManager.cpp @@ -131,7 +131,7 @@ s32 MapManager::func_ov00_02083ef8(Vec3p *param_2, Vec3p *param_3, unk32 param_4 void MapManager::func_ov00_02083f44(Vec3p *param_2) {} unk8 MapManager::MapData_vfunc_6c() {} unk8 MapManager::MapData_vfunc_70() {} -unk8 MapManager::func_ov00_02083fb0(unk32 param_1, MapManager *param_2, unk32 param_3) {} +unk8 MapManager::func_ov00_02083fb0(u32 *param_1, MapManager *param_2, Vec3p *param_3) {} void MapManager::func_ov00_02084024(unk32 param_2, AABB *param_3) {} unk8 MapManager::MapData_vfunc_54() {} unk8 MapManager::func_ov00_020840a0(unk8 param_2, unk8 param_3, unk32 param_4) {} diff --git a/src/14_Land/Actor/ActorRupee.cpp b/src/14_Land/Actor/ActorRupee.cpp index 8725dd4f..f45f2c7a 100644 --- a/src/14_Land/Actor/ActorRupee.cpp +++ b/src/14_Land/Actor/ActorRupee.cpp @@ -1,20 +1,335 @@ #include "Actor/ActorRupee.hpp" +#include "Item/ItemManager.hpp" +#include "Map/MapManager.hpp" +#include "Player/PlayerLinkBase.hpp" +#include "System/Random.hpp" -ActorType ActorRupee::gType; +extern "C" { + void func_ov000_0207a1c8(bool *param_1, unk32 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_ov005_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_ov000_020d7ad4(u32 *param1, u32 param2); +} +u16 GetRupeeValue(RupeeId id); + +char *gShipParts[8] = {"anc", "bow", "hul", "can", "dco", "pdl", "fnl", "brg"}; + +extern u32 *data_ov014_021589d8; +extern u32 data_ov000_020e9370[]; +extern u32 data_ov000_020eec9c[]; +extern u32 **data_027e0fe0[]; + +ActorType ActorRupee::gType = ActorType(ActorTypeId_Rupee, (ActorCreateFunc) ActorRupee::Create, NULL); + +#pragma section force_data begin +ActorType_UnkClass data_ov014_021589f4 = ActorType_UnkClass(FLOAT_TO_Q21(0.4662), FLOAT_TO_Q19(0.4661)); +#pragma section force_data end + +ActorRupee *ActorRupee::Create() { + ActorRupee *newRupee = new(*data_027e0fe0[0], 4) ActorRupee(); + return newRupee; +} + +ActorRupee::ActorRupee() { + mRupeeId = 8; + mUnk_15c = 0; +} + +// https://decomp.me/scratch/1qjCc +bool ActorRupee::vfunc_08() { + u32 dVar5; + u32 iVar7; + + mRupeeId = mUnk_020.mUnk_00[0]; + + dVar5 = func_ov14_0213b70c(mRupeeId) ? *data_ov014_021589d8 : 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; + + 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: + q20 x = gRandom->Next(FLOAT_TO_Q20(0.1335)); + q20 y = gRandom->Next(FLOAT_TO_Q20(0.2)); + q20 z = gRandom->Next(FLOAT_TO_Q20(0.1335)); + + mVel.x = x - FLOAT_TO_Q20(0.0666); + mVel.y = y + FLOAT_TO_Q20(0.3333); + mVel.z = z - 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; +} + +bool ActorRupee::vfunc_60() { + return func_ov14_0213b70c(mRupeeId); +} -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) {} + +void ActorRupee::Move() { + s32 size; + + ApplyGravity(); + Vec3p_Add(&mPos, &mVel, &mPos); // Vec3p::Add() + mUnk_09c.mUnk_3 = 1; + size = mMaxFall = mUnk_08c.size - 1; + + size += mUnk_014.y; + if (size < mPos.y) { + mUnk_09c.mUnk_0 = 0x49; + } else { + mUnk_09c.mUnk_0 = 0xcb; + } + + if (this->func_01fffd04(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 (gPlayerLink->func_ov00_020bce48(cutsceneItemId)) { + Kill(); + } else { + func_ov14_0213b204(3); + } + } else { + ItemManager *pItemMgr = gItemManager; + rupeeValue = GetRupeeValue(mRupeeId); + pItemMgr->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_ov000_020d7ad4(data_ov000_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; + MapManager::func_ov00_02083fb0(&local_20, gMapManager, &local_1c); + if (((local_20 >> 5) & 3) == 2) { + Kill(); + } else { + func_ov14_0213b204(1); + } + } + break; + case 3: + PlayerLinkBase *pLink = gPlayerLink; + if (pLink->func_ov00_020bce48(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(u32 param1) { + if (func_ov00_020c313c(param1)) { + Update(false); + } + func_ov000_0207a1c8(&mUnk_0a4.mUnk_00, param1, &mPos); +} + +void ActorRupee::vfunc_18(u32 param1) { + if (func_ov00_020c313c(param1)) { + Update(true); + } + func_ov000_0207a1c8(&mUnk_0a4.mUnk_00, param1, &mPos); +} + +#define VFUNC20_COND (param1 ? mUnk_0a4.mUnk_01 : mUnk_0a4.mUnk_00) +void ActorRupee::vfunc_20(bool param1) { + if (VFUNC20_COND && !(mUnk_130 == 2 && mActiveFrames % 8 < 4) && VFUNC20_COND) { + 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 const u32 data_ov014_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_ov014_02153e28[id], &unk_class, 0); + + if (param4) { + u32 var = func_ov14_0213b70c(id) ? 0x4cd : 0x400; + func_ov005_02102c2c(&data_ov000_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_ov014_021589f4.unk_00; + param2->mUnk_18 = data_ov014_021589f4.unk_04; + } else { + param2->mUnk_08 = 2; + param2->mUnk_0c = 2; + param2->mUnk_14 = FLOAT_TO_Q21(0.333); + param2->mUnk_18 = FLOAT_TO_Q19(0.333); + } +} + +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() {}