mirror of
https://github.com/zeldaret/ph
synced 2026-07-07 21:31:01 -04:00
355 lines
11 KiB
C++
355 lines
11 KiB
C++
#include "Actor/Player/ActorRefill.hpp"
|
|
#include "DTCM/UnkStruct_027e0d38.hpp"
|
|
#include "DTCM/UnkStruct_027e103c.hpp"
|
|
#include "Item/ItemManager.hpp"
|
|
#include "System/Random.hpp"
|
|
|
|
static char *sShipTypes[8] = {"anc", "bow", "hul", "can", "dco", "pdl", "fnl", "brg"};
|
|
|
|
extern u32 **data_027e0fe0[];
|
|
ARM ActorRefillBombs *ActorRefillBombs::Create() {
|
|
return new(*data_027e0fe0[0], 4) ActorRefillBombs();
|
|
}
|
|
ActorType ActorRefillBombs::gType = ActorType(ActorTypeId_RefillBombs, (ActorCreateFunc) ActorRefillBombs::Create, NULL);
|
|
|
|
ARM ActorRefillBombchus *ActorRefillBombchus::Create() {
|
|
return new(*data_027e0fe0[0], 4) ActorRefillBombchus();
|
|
}
|
|
ActorType ActorRefillBombchus::gType =
|
|
ActorType(ActorTypeId_RefillBombchus, (ActorCreateFunc) ActorRefillBombchus::Create, NULL);
|
|
|
|
ARM ActorRefillArrows *ActorRefillArrows::Create() {
|
|
return new(*data_027e0fe0[0], 4) ActorRefillArrows();
|
|
}
|
|
ActorType ActorRefillArrows::gType = ActorType(ActorTypeId_RefillArrows, (ActorCreateFunc) ActorRefillArrows::Create, NULL);
|
|
|
|
ARM ActorRefillTime *ActorRefillTime::Create() {
|
|
return new(*data_027e0fe0[0], 4) ActorRefillTime();
|
|
}
|
|
ActorType ActorRefillTime::gType = ActorType(ActorTypeId_RefillTime, (ActorCreateFunc) ActorRefillTime::Create, NULL);
|
|
|
|
ARM ActorLSTM *ActorLSTM::Create() {
|
|
return new(*data_027e0fe0[0], 4) ActorLSTM();
|
|
}
|
|
ActorType ActorLSTM::gType = ActorType(ActorTypeId_LSTM, (ActorCreateFunc) ActorLSTM::Create, NULL);
|
|
|
|
ARM ActorRefill::ActorRefill(unk32 param1) :
|
|
mUnk_158(0),
|
|
mUnk_15c(0x56),
|
|
mUnk_160(param1),
|
|
mUnk_164(0x1f) {}
|
|
|
|
ARM ActorRefill::~ActorRefill() {}
|
|
|
|
ARM bool ActorRefill::vfunc_08() {
|
|
ItemManager *itemManager;
|
|
|
|
if (this->vfunc_b4() == ItemFlag_None) {
|
|
if (data_027e0d38->func_ov000_02078b40() != 3) {
|
|
return false;
|
|
}
|
|
} else {
|
|
ItemManager *itemManager = gItemManager;
|
|
ItemFlag item = this->vfunc_b4();
|
|
if (!itemManager->HasItem(item)) {
|
|
return false;
|
|
}
|
|
}
|
|
mHitbox.pos.x = 0;
|
|
mHitbox.pos.y = FLOAT_TO_Q20(0.3);
|
|
mHitbox.pos.z = 0;
|
|
mHitbox.size = FLOAT_TO_Q20(0.3);
|
|
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 = FLOAT_TO_Q20(0.3);
|
|
mUnk_0a4.mUnk_04.z = 0;
|
|
mUnk_0a4.mUnk_10 = FLOAT_TO_Q20(1.3);
|
|
mUnk_09c.mUnk_0 &= ~0xa4;
|
|
mUnk_09c.mUnk_3 = 1;
|
|
mMaxFall = mUnk_08c.size + -1;
|
|
this->func_ov014_02135364(0);
|
|
return true;
|
|
}
|
|
|
|
extern unk32 data_ov000_020eec9c;
|
|
extern "C" void func_ov000_020d7ad4(unk32 *param1, unk32 param2);
|
|
ARM void ActorRefill::vfunc_14(u32 param1) {
|
|
s32 temp_r0_4;
|
|
s32 temp_r6;
|
|
s8 var_r0;
|
|
u32 temp_r0;
|
|
u32 temp_r0_3;
|
|
u32 temp_r1;
|
|
Vec3p *temp_r0_2;
|
|
|
|
if (this->func_ov00_020c313c(param1) != 0) {
|
|
this->IncreaseActiveFrames();
|
|
temp_r0 = mUnk_130;
|
|
switch (temp_r0) {
|
|
case 0:
|
|
this->ApplyGravity();
|
|
temp_r0_2 = &mPos;
|
|
Vec3p_Add(temp_r0_2, &mVel, temp_r0_2);
|
|
this->func_01fffd04(0);
|
|
if (mUnk_110 || mUnk_112 || mUnk_113) {
|
|
mVel.x = 0;
|
|
mVel.z = 0;
|
|
}
|
|
if (mUnk_111) {
|
|
this->func_ov014_02135364(1);
|
|
} else if (this->func_ov00_020c2c0c()) {
|
|
this->func_ov014_02135364(4);
|
|
} else if (this->func_ov00_020c2d54()) {
|
|
this->func_ov014_02135364(5);
|
|
}
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
case 4:
|
|
case 5:
|
|
if (this->CollidesWithPlayer(PlayerCollide_PickupFlags) != 0) {
|
|
if (this->vfunc_b4() == -1) {
|
|
data_027e103c->func_ov000_020cfbf0(mUnk_158 * 60, 1, 0);
|
|
} else {
|
|
ItemManager *itemManager = gItemManager;
|
|
itemManager->GiveAmmo(this->vfunc_b4(), mUnk_158);
|
|
}
|
|
func_ov000_020d7ad4(&data_ov000_020eec9c, 0x100);
|
|
this->func_ov014_02135364(3);
|
|
} else {
|
|
temp_r0_3 = mUnk_130;
|
|
switch (temp_r0_3) {
|
|
case 0:
|
|
case 3: break;
|
|
case 1:
|
|
if (this->func_ov00_020c2c0c()) {
|
|
this->func_ov014_02135364(4);
|
|
} else if (this->func_ov00_020c2d54()) {
|
|
this->func_ov014_02135364(5);
|
|
} else if (mActiveFrames >= 180) {
|
|
this->func_ov014_02135364(2);
|
|
}
|
|
break;
|
|
case 2:
|
|
#define ROTATE_RIGHT(x, n) ((x >> n) | (x << (32 - n)))
|
|
temp_r0_4 = mActiveFrames;
|
|
temp_r1 = (u32) temp_r0_4 >> 31;
|
|
|
|
if ((temp_r1 + ROTATE_RIGHT((temp_r0_4 << 29) - temp_r1, 29)) < 4) {
|
|
var_r0 = 0;
|
|
} else {
|
|
var_r0 = 31;
|
|
}
|
|
mUnk_164 = var_r0;
|
|
if (this->func_ov00_020c2c0c()) {
|
|
this->func_ov014_02135364(4);
|
|
} else if (this->func_ov00_020c2d54()) {
|
|
this->func_ov014_02135364(5);
|
|
} else if (mActiveFrames >= 60) {
|
|
this->func_ov014_02135364(3);
|
|
}
|
|
break;
|
|
case 4:
|
|
if (!this->func_ov00_020c2c70()) {
|
|
this->func_ov014_02135364(1);
|
|
}
|
|
break;
|
|
case 5:
|
|
if (!this->func_ov00_020c2de4()) {
|
|
this->func_ov014_02135364(1);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
this->KillInBounds();
|
|
}
|
|
mUnk_0a4.func_ov000_0207a1c8(param1, &mPos);
|
|
}
|
|
|
|
ARM bool ActorRefill::func_ov014_02135364(unk32 param1) {
|
|
mUnk_130 = param1;
|
|
mUnk_164 = 31;
|
|
mActiveFrames = 0;
|
|
switch (mUnk_130) {
|
|
case 0:
|
|
case 2: break;
|
|
case 1:
|
|
mVel.x = 0;
|
|
mVel.y = 0;
|
|
mVel.z = 0;
|
|
break;
|
|
case 3: this->Kill(); break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
extern "C" void func_0202bc38(bool param1, Vec3p *pos, unk32 param2, Actor_UnkStruct_012 *param3, unk32 param4);
|
|
extern u32 data_ov000_020e9370[];
|
|
extern "C" 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);
|
|
ARM void ActorRefill::vfunc_20(bool param1) {
|
|
bool var_r0;
|
|
|
|
if (param1) {
|
|
var_r0 = mUnk_0a4.mUnk_01;
|
|
} else {
|
|
var_r0 = mUnk_0a4.mUnk_00;
|
|
}
|
|
if (var_r0 && mUnk_164 != 0) {
|
|
Actor_UnkStruct_012 sp18;
|
|
sp18.mUnk_04 = 5;
|
|
sp18.mUnk_08 = 2;
|
|
sp18.mUnk_0c = 2;
|
|
sp18.mUnk_14 = 0x800;
|
|
sp18.mUnk_18 = 0x1000;
|
|
sp18.mUnk_02 = mUnk_164;
|
|
func_0202bc38(param1, &mPos, mUnk_15c, &sp18, 0);
|
|
func_ov005_02102c2c(&data_ov000_020e9370[0], 0, &mPos, 0x400, 0, mUnk_164, 0, 0, 1, 0);
|
|
}
|
|
}
|
|
|
|
extern unk32 data_027e0e58;
|
|
extern "C" void func_ov000_0207c1b0(unk32 *param1, unk32 param2, Vec3p *param3, unk32 param4, unk32 param5, unk32 param6);
|
|
ARM void ActorRefill::func_ov014_02135474() {
|
|
s32 iVar1 = mUnk_130;
|
|
if (iVar1 != 4 && iVar1 != 5) {
|
|
func_ov000_0207c1b0(&data_027e0e58, 0x241, &mPos, 2, 0, 0);
|
|
func_ov000_0207c1b0(&data_027e0e58, 0x242, &mPos, 2, 0, 0);
|
|
mAlive = false;
|
|
}
|
|
}
|
|
|
|
ARM ActorRefillBombs::ActorRefillBombs() :
|
|
ActorRefill(0) {
|
|
mUnk_158 = 3;
|
|
mUnk_15c = 0x2e;
|
|
}
|
|
|
|
ARM ActorRefillBombs::~ActorRefillBombs() {}
|
|
|
|
ARM ItemFlag ActorRefillBombs::vfunc_b4() {
|
|
return ItemFlag_BombBag;
|
|
}
|
|
|
|
ARM ActorRefillBombchus::ActorRefillBombchus() :
|
|
ActorRefill(1) {
|
|
mUnk_158 = 3;
|
|
mUnk_15c = 0x2f;
|
|
}
|
|
|
|
ARM ActorRefillBombchus::~ActorRefillBombchus() {}
|
|
|
|
ARM ItemFlag ActorRefillBombchus::vfunc_b4() {
|
|
return ItemFlag_BombchuBag;
|
|
}
|
|
|
|
ARM ActorRefillArrows::ActorRefillArrows() :
|
|
ActorRefill(2) {
|
|
mUnk_158 = 5;
|
|
mUnk_15c = 0x2d;
|
|
}
|
|
|
|
ARM ActorRefillArrows::~ActorRefillArrows() {}
|
|
|
|
ARM ItemFlag ActorRefillArrows::vfunc_b4() {
|
|
return ItemFlag_Bow;
|
|
}
|
|
|
|
ARM ActorRefillTime::ActorRefillTime() :
|
|
ActorRefill(3) {
|
|
mUnk_158 = 5;
|
|
mUnk_15c = 0x44;
|
|
}
|
|
|
|
ARM ActorRefillTime::~ActorRefillTime() {}
|
|
|
|
ARM bool ActorRefillTime::vfunc_08() {
|
|
|
|
if (!ActorRefill::vfunc_08()) {
|
|
return false;
|
|
}
|
|
switch (mUnk_020.mUnk_00[0]) {
|
|
case 2: mUnk_158 = 5; break;
|
|
case 4: mUnk_158 = 15; break;
|
|
case 5: mUnk_158 = 30; break;
|
|
default:
|
|
case 0:
|
|
case 1:
|
|
case 3:
|
|
s32 temp_ip = gRandom->Next(10);
|
|
if (temp_ip >= 9) {
|
|
mUnk_158 = 30;
|
|
} else if (temp_ip >= 6) {
|
|
mUnk_158 = 15;
|
|
} else {
|
|
mUnk_158 = 5;
|
|
}
|
|
break;
|
|
}
|
|
if (mUnk_158 != -0x1E) {
|
|
if (mUnk_158 == -0xF) {
|
|
mUnk_15c = 0x48;
|
|
} else {
|
|
mUnk_15c = 0x47;
|
|
}
|
|
} else {
|
|
mUnk_15c = 0x49;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
ARM ItemFlag ActorRefillTime::vfunc_b4() {
|
|
return ItemFlag_None;
|
|
}
|
|
|
|
ARM ActorLSTM::ActorLSTM() :
|
|
ActorRefill(3) {
|
|
mUnk_158 = -5;
|
|
mUnk_15c = 0x47;
|
|
}
|
|
|
|
ARM ActorLSTM::~ActorLSTM() {}
|
|
|
|
ARM bool ActorLSTM::vfunc_08() {
|
|
if (!ActorRefill::vfunc_08()) {
|
|
return false;
|
|
}
|
|
switch (mUnk_020.mUnk_00[0]) {
|
|
case 2: mUnk_158 = -5; break;
|
|
case 4: mUnk_158 = -15; break;
|
|
case 5: mUnk_158 = -30; break;
|
|
default:
|
|
case 0:
|
|
case 1:
|
|
case 3:
|
|
s32 temp_ip = gRandom->Next(10);
|
|
if (temp_ip >= 9) {
|
|
mUnk_158 = -30;
|
|
} else if (temp_ip >= 6) {
|
|
mUnk_158 = -15;
|
|
} else {
|
|
mUnk_158 = -5;
|
|
}
|
|
break;
|
|
}
|
|
if (mUnk_158 != -0x1E) {
|
|
if (mUnk_158 == -0xF) {
|
|
mUnk_15c = 0x48;
|
|
} else {
|
|
mUnk_15c = 0x47;
|
|
}
|
|
} else {
|
|
mUnk_15c = 0x49;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
ARM ItemFlag ActorLSTM::vfunc_b4() {
|
|
return ItemFlag_None;
|
|
}
|