ActorRupee 90% (#124)

* Remove `force_data` macro

* Use size_t in `operator new`

* Bump objdiff to v3.0.0-beta.10

* Decompile functions using gRandom

* ActorRupee 90%

* Fix old gRandom.Next calls

* Revert objdiff

* Clean up
This commit is contained in:
Aetias
2025-07-21 19:09:56 +02:00
committed by GitHub
parent 32cc123547
commit aee9c362bb
21 changed files with 103 additions and 68 deletions
+28 -42
View File
@@ -12,7 +12,7 @@ void func_ov000_020d7ad4(u32 *param1, u32 param2);
}
u16 GetRupeeValue(RupeeId id);
char *gShipParts[8] = {"anc", "bow", "hul", "can", "dco", "pdl", "fnl", "brg"};
static char *gShipParts[8] = {"anc", "bow", "hul", "can", "dco", "pdl", "fnl", "brg"};
extern u32 *data_ov014_021589d8;
extern u32 data_ov000_020e9370[];
@@ -21,77 +21,63 @@ 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;
}
static const ActorType_UnkClass data_ov014_021589f4 = ActorType_UnkClass(FLOAT_TO_Q21(0.4662), FLOAT_TO_Q19(0.4661));
ActorRupee::ActorRupee() {
mRupeeId = 8;
mUnk_15c = 0;
}
// https://decomp.me/scratch/1qjCc
bool ActorRupee::Init() {
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;
RupeeId rupeeId = (RupeeId) mUnk_020.mUnk_00[0];
mRupeeId = rupeeId;
s32 iVar1 = (func_ov14_0213b70c(rupeeId) ? data_ov014_021589f4.mUnk_4 : 0xaa8) >> 1;
mHitbox.pos.x = 0;
mHitbox.pos.y = iVar7;
mHitbox.pos.y = iVar1;
mHitbox.pos.z = 0;
mHitbox.size = iVar7;
mUnk_08c.pos = mHitbox.pos;
mHitbox.size = iVar1;
mUnk_08c.pos.x = mHitbox.pos.x;
mUnk_08c.pos.y = mHitbox.pos.y;
mUnk_08c.pos.z = mHitbox.pos.z;
mUnk_08c.size = mHitbox.size;
mUnk_0a4.mUnk_04.x = 0;
mUnk_0a4.mUnk_04.y = iVar7;
mUnk_0a4.mUnk_04.y = iVar1;
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;
mUnk_0a4.mUnk_10 = iVar1 + 0x1000;
mUnk_09c.mUnk_0 = mUnk_09c.mUnk_0 & ~0xb0;
mUnk_09c.mUnk_3 = 1;
mMaxFall = mUnk_08c.size + -1;
if (mUnk_03c >= 0) {
func_ov14_0213b204(1);
this->func_ov14_0213b204(1);
} else {
switch (mUnk_144) {
case 0:
mVel.x = 0;
mVel.y = 0;
mVel.z = 0;
func_ov14_0213b204(0);
this->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);
mVel.x = gRandom.Next(FLOAT_TO_Q20(-0.0666), FLOAT_TO_Q20(0.0666));
mVel.y = gRandom.Next(FLOAT_TO_Q20(0.3333), FLOAT_TO_Q20(0.5333));
mVel.z = gRandom.Next(FLOAT_TO_Q20(-0.0666), FLOAT_TO_Q20(0.0666));
this->func_ov14_0213b204(0);
break;
case 2:
mVel.x = 0;
mVel.y = FLOAT_TO_Q20(0.5);
mVel.z = 0;
func_ov14_0213b204(0);
this->func_ov14_0213b204(0);
break;
case 3:
func_ov14_0213b204(5);
break;
this->func_ov14_0213b204(5);
}
}
return true;
}
@@ -240,12 +226,12 @@ void ActorRupee::Update(bool param1) {
}
}
break;
case 3:
case 3: {
PlayerLinkBase *pLink = gPlayerLink;
if (pLink->PlayItemCutscene(GetRupeeCutsceneItemId())) {
Kill();
}
break;
} break;
case 1:
if (param1) {
mActiveFrames = 0;
@@ -329,8 +315,8 @@ void ActorRupee::func_ov14_0213b6a4(RupeeId id, Actor_UnkStruct_012 *param2) {
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;
param2->mUnk_14 = data_ov014_021589f4.mUnk_0;
param2->mUnk_18 = data_ov014_021589f4.mUnk_4;
} else {
param2->mUnk_08 = 2;
param2->mUnk_0c = 2;
+2 -2
View File
@@ -285,7 +285,7 @@ ARM bool ActorRefillTime::Init() {
case 0:
case 1:
case 3:
s32 temp_ip = gRandom.Next(10);
s32 temp_ip = gRandom.Next(0, 10);
if (temp_ip >= 9) {
mUnk_158 = 30;
} else if (temp_ip >= 6) {
@@ -339,7 +339,7 @@ ARM bool ActorLSTM::Init() {
case 0:
case 1:
case 3:
s32 temp_ip = gRandom.Next(10);
s32 temp_ip = gRandom.Next(0, 10);
if (temp_ip >= 9) {
mUnk_158 = -30;
} else if (temp_ip >= 6) {