Files
st/src/031_Land/MapObject/MapObjectDoorKey.cpp
T
Yanis 89dedbb3d1 Match ActorBomb (#158)
* actor prog from overlay 0

* fix build issues

* ActorBomb OK for eur

* ActorBomb OK for eur1, usa and jp

* fix regressions
2026-10-08 03:35:12 +02:00

244 lines
6.1 KiB
C++

#include "MapObject/MapObjectDoorKey.hpp"
#include "CommonFuncs.hpp"
#include "System/SysNew.hpp"
#include "Unknown/UnkStruct_027e09a8.hpp"
#include "Unknown/UnkStruct_027e0ce0.hpp"
#include "Unknown/UnkStruct_027e0cec.hpp"
const UnkStruct_ov031_021150b0 data_ov031_02115184(0x1E66);
DECL_PROFILE(MapObjectProfileDoorKey);
MapObject *MapObjectProfileDoorKey::Create() {
return new(HeapIndex_ITCM) MapObjectDoorKey();
}
MapObjectProfileDoorKey::MapObjectProfileDoorKey() :
MapObjectProfile_Derived2(MapObjectId_DoorKey, MapObjectId_DoorKey) {
this->mUnk_0E = 1;
this->mUnk_06 = 2;
this->mUnk_1E |= 0x01;
this->mUnk_0C = 0x2666;
}
MapObjectDoorKey::MapObjectDoorKey() :
mUnk_94(GetModelFromProfile<MapObjectProfileDoorKey>(), true),
mUnk_A0(0),
mUnk_A4(false) {
this->mUnk_8F = true;
SET_FLAG(this->mFlags, MapObjFlag_9);
this->mUnk_18[0] = 0x0E;
}
bool MapObjectDoorKey::Init(void) {
this->func_ov031_020fbf10(true, false);
return true;
}
void MapObjectDoorKey::vfunc_08(void) {
this->MapObjectDoorBase::vfunc_08();
this->mUnk_A4 = false;
}
void MapObjectDoorKey::vfunc_18(s8 *param1) {
this->MapObjectDoorBase::func_ov031_020fcb78(param1);
}
// https://decomp.me/scratch/XO3u2
void MapObjectDoorKey::vfunc_14(unk32 param1) {
f32 factor;
f32 uVar3;
s32 sVar2;
s32 sVar2_2;
u16 uVar2;
if (this->mUnk_8B) {
uVar3 = func_02039f04(this->mUnk_6C) / 4096.0f;
factor = 16384.0f;
} else {
uVar3 = func_02039f04(this->mUnk_6C) / 4096.0f;
factor = -16384.0f;
}
s32 mul = factor * uVar3;
sVar2 = (s16) mul;
u16 angle = (u16) sVar2;
MtxFx33 m;
VecFx32 local_48;
VecFx32 temp;
MtxFx33_InitYRotation(&m, SIN(angle), COS(angle));
temp.x = this->mPos.x - FX_F32_TO_FX32(1.0f) + this->mUnk_70;
temp.z = this->mPos.z;
temp.y = this->mPos.y;
local_48.x = temp.x;
local_48.y = temp.y;
local_48.z = temp.z;
this->mUnk_94.vfunc_14(&m, &local_48);
u16 var = (-0x8000 - sVar2);
MtxFx33_InitYRotation(&m, SIN(var), COS(var));
temp.x = this->mPos.x + FX_F32_TO_FX32(1.0f) - this->mUnk_70;
temp.z = this->mPos.z;
temp.y = this->mPos.y;
local_48.x = temp.x;
local_48.y = temp.y;
local_48.z = temp.z;
this->mUnk_94.vfunc_14(&m, &local_48);
}
void MapObjectDoorKey::vfunc_5C(MapObjState state, unk32 param2) {
this->mUnk_8D = true;
this->MapObjectDoorBase::vfunc_5C(state, param2);
switch (this->mState) {
case MapObjDoorKeyState_3:
if (param2 == 0) {
data_027e0ce0->mUnk_2C->GetInventory()->GiveSmallKeys(-1);
}
UNSET_FLAG(this->mFlags, MapObjFlag_9);
data_027e09a8->func_ov000_02071b30(0x134, &this->mPos, 0);
break;
case MapObjDoorKeyState_8:
UNSET_FLAG(this->mFlags, MapObjFlag_9);
break;
default:
break;
}
}
bool MapObjectDoorKey::func_ov031_020fea88(void) {
if (this->mUnk_A4) {
return false;
}
if (data_027e0ce0->mUnk_2C->GetKeyAmount() != 0) {
return true;
}
return false;
}
unk32 MapObjectDoorKey::vfunc_28(unk32 param1, unk32 param2, unk32 param3) {
if (this->mUnk_A4) {
return -1;
}
if (data_027e0ce0->mUnk_2C->GetKeyAmount() == 0) {
return -1;
}
switch (this->mState) {
case MapObjDoorKeyState_3:
case MapObjDoorKeyState_4:
case MapObjDoorKeyState_5:
case MapObjDoorKeyState_6:
case MapObjDoorKeyState_7:
case MapObjDoorKeyState_8:
return -1;
default:
this->vfunc_5C(MapObjDoorKeyState_3, 0);
break;
}
return 0;
}
bool MapObjectDoorKey::vfunc_64(void) {
return this->func_ov000_0209d668();
}
bool MapObjectDoorKey::vfunc_68(void) {
return false;
}
bool MapObjectDoorKey::vfunc_6C(void) {
return false;
}
void MapObjectDoorKey::vfunc_74(void) {
data_027e0cec->func_ov000_0209ff8c(&this->mUnk_68, 0x89E, &this->mPos, 4);
data_027e0cec->func_ov000_0209ff8c(&this->mUnk_A0, 0x89E, &this->mPos, 4);
}
void MapObjectDoorKey::vfunc_7C(void) {
this->MapObjectDoorBase::vfunc_7C();
if (this->mUnk_A0.mUnk_00 != NULL) {
this->mUnk_A0.func_ov000_020a0334();
}
}
void MapObjectDoorKey::vfunc_78(void) {
VecFx32 local_24;
VecFx32 local_30;
VecFx32 VStack_3c;
VecFx32 VStack_48;
MtxFx43 m;
VecFx32 local_84;
VecFx32 local_90;
VecFx32 temp;
temp.x = this->mPos.x;
temp.z = this->mPos.z;
temp.y = this->mPos.y;
local_24.x = temp.x - FX_F32_TO_FX32(0.999f);
local_24.y = temp.y;
local_24.z = temp.z;
local_30.x = temp.x + FX_F32_TO_FX32(0.999f);
local_30.y = temp.y;
local_30.z = temp.z;
f32 div = func_02039f04(this->mUnk_6C) / 4096.0f;
s16 angle = 16384.0f * div;
MtxFx43_InitYRotation(&m, SIN((u16) angle), COS((u16) angle));
local_84.x = FX_F32_TO_FX32(1.0f);
local_84.y = 0;
local_84.z = 0;
local_90.x = 0;
local_90.y = 0;
local_90.z = FX_F32_TO_FX32(0.3299f);
func_01ffaf74(&local_90, &m, &local_90);
func_01ffaf74(&local_84, &m, &local_84);
VecFx32_Add(&local_24, &local_90, &local_24);
VecFx32_Add(&local_24, &local_84, &VStack_3c);
local_90.x = -local_90.x;
local_84.x = -local_84.x;
VecFx32_Add(&local_30, &local_90, &local_30);
VecFx32_Add(&local_30, &local_84, &VStack_48);
if (this->mUnk_68.mUnk_00 != NULL) {
this->mUnk_68.mUnk_00->func_ov000_02052c48(&VStack_3c, &local_24);
}
if (this->mUnk_A0.mUnk_00 != NULL) {
this->mUnk_A0.mUnk_00->func_ov000_02052c48(&VStack_48, &local_30);
}
}
void MapObjectDoorKey::vfunc_40(void) {
data_027e09a8->func_ov000_02071b30(0x136, &this->mPos, 0);
}
void MapObjectDoorKey::vfunc_44(void) {
unk32 stack = *(u32 *) &this->mRef;
data_027e09a8->func_ov000_02071d34(&stack, 0x135, &this->mPos, 0);
}
void MapObjectDoorKey::vfunc_48(void) {}
void MapObjectDoorKey::vfunc_4C(void) {}
MapObjectDoorKey::~MapObjectDoorKey() {}
MapObjectProfileDoorKey::~MapObjectProfileDoorKey() {}