mirror of
https://github.com/zeldaret/st
synced 2026-05-23 06:54:21 -04:00
142 lines
3.6 KiB
C++
142 lines
3.6 KiB
C++
#include "MapObject/MapObjectMiniBlocks.hpp"
|
|
#include "System/SysNew.hpp"
|
|
#include "Unknown/UnkStruct_027e0cd8.hpp"
|
|
|
|
extern "C" void func_01ff9638(void *, s16);
|
|
|
|
enum {
|
|
MiniBlocksVariant_BLCM,
|
|
MiniBlocksVariant_BKCT,
|
|
MiniBlocksVariant_BLKF,
|
|
MiniBlocksVariant_Max,
|
|
};
|
|
|
|
static const u32 data_ov000_020af574[] = {
|
|
'BLCM',
|
|
'BKCT',
|
|
'BLKF',
|
|
};
|
|
|
|
ARM DECL_PROFILE(MapObjectProfileMiniBlocks);
|
|
|
|
ARM MapObject *MapObjectProfileMiniBlocks::Create() {
|
|
return new(HeapIndex_ITCM) MapObjectMiniBlocks();
|
|
}
|
|
|
|
ARM MapObjectProfileMiniBlocks::MapObjectProfileMiniBlocks() :
|
|
MapObjectProfile_Derived1(MapObjectId_MiniBlocks, -1, 0) {
|
|
this->mUnk_06 = -1;
|
|
this->mUnk_1E &= ~0x01;
|
|
}
|
|
|
|
// https://decomp.me/scratch/euvAz
|
|
ARM MapObjectMiniBlocks::MapObjectMiniBlocks() :
|
|
mUnk_40() {
|
|
this->mUnk_44 = 0;
|
|
this->mUnk_48 = 1;
|
|
}
|
|
|
|
ARM bool MapObjectMiniBlocks::vfunc_00(void) {
|
|
GET_PROFILE(MapObjectProfileMiniBlocks)
|
|
->func_ov000_0209ccd8(this->mUnk_20.mUnk_00[1], data_ov000_020af574[this->mUnk_20.mUnk_00[1]]);
|
|
UnkStruct_027e0cd8_0c *pUnkStruct_027e0cd8_0c = data_027e0cd8->mUnk_0C;
|
|
u8 uVar6;
|
|
|
|
if (this->mUnk_20.mUnk_00[1] != MiniBlocksVariant_BLKF) {
|
|
Vec2b vec(this->mUnk_3A.x, this->mUnk_3A.y);
|
|
this->mPos.y = pUnkStruct_027e0cd8_0c->func_01ffedf4(&vec);
|
|
}
|
|
|
|
Vec3p vec(FLOAT_TO_Q20(0.0f), FLOAT_TO_Q20(0.0f), FLOAT_TO_Q20(0.0f));
|
|
uVar6 = 0;
|
|
|
|
switch (this->mUnk_20.mUnk_00[0]) {
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
uVar6 = 1;
|
|
break;
|
|
case 8:
|
|
case 9:
|
|
case 10:
|
|
case 11:
|
|
uVar6 = 2;
|
|
break;
|
|
default:
|
|
if (this->mUnk_20.mUnk_00[1] == MiniBlocksVariant_BLKF) {
|
|
vec.x = FLOAT_TO_Q20(0.0f);
|
|
vec.y = FLOAT_TO_Q20(0.0f);
|
|
vec.z = -FLOAT_TO_Q20(0.375f);
|
|
} else {
|
|
vec.x = FLOAT_TO_Q20(0.0f);
|
|
vec.y = FLOAT_TO_Q20(0.0f);
|
|
vec.z = -FLOAT_TO_Q20(0.25f);
|
|
}
|
|
break;
|
|
}
|
|
|
|
MapObjectProfile_Derived2_20_Base_50 *ptr =
|
|
GET_PROFILE(MapObjectProfileMiniBlocks)->vfunc_1C(this->mUnk_20.mUnk_00[1])->mUnk_50;
|
|
void *var_r1;
|
|
if (ptr != NULL) {
|
|
u16 *temp_r1 = (u16 *) ((u8 *) ptr + 8);
|
|
u32 *var_r0;
|
|
|
|
if (temp_r1 != NULL && uVar6 < ptr->mUnk_09) {
|
|
u32 unk_0E = ptr->mUnk_0E;
|
|
u16 temp = *((u16 *) ((u8 *) temp_r1 + unk_0E));
|
|
var_r0 = (u32 *) ((u8 *) temp_r1 + unk_0E + 4 + temp * uVar6);
|
|
} else {
|
|
var_r0 = NULL;
|
|
}
|
|
|
|
if (var_r0 != NULL) {
|
|
var_r1 = (void *) ((u8 *) ptr + *var_r0);
|
|
goto next;
|
|
}
|
|
}
|
|
|
|
var_r1 = NULL;
|
|
|
|
next:
|
|
this->mUnk_40.vfunc_08((unk32) var_r1);
|
|
|
|
unk32 var_r0_2;
|
|
unk32 var_r0;
|
|
switch (this->mUnk_20.mUnk_00[0]) {
|
|
case 1:
|
|
case 6:
|
|
case 8:
|
|
this->mUnk_14 = -0x8000;
|
|
break;
|
|
case 2:
|
|
case 7:
|
|
case 9:
|
|
this->mUnk_14 = 0x4000;
|
|
break;
|
|
case 3:
|
|
case 5:
|
|
case 11:
|
|
this->mUnk_14 = -0x4000;
|
|
break;
|
|
default:
|
|
this->mUnk_14 = 0;
|
|
break;
|
|
}
|
|
|
|
func_01ff9638(&vec, -this->mUnk_14);
|
|
Vec3p_Add(&this->mPos, &vec, &this->mPos);
|
|
return true;
|
|
}
|
|
|
|
ARM void MapObjectMiniBlocks::vfunc_14(void) {
|
|
Mat3p m;
|
|
u16 unk_14 = this->mUnk_14;
|
|
Mat3p_InitYRotation(&m, SIN(unk_14), COS(unk_14));
|
|
this->mUnk_40.vfunc_14(&m, &this->mPos);
|
|
}
|
|
|
|
ARM MapObjectMiniBlocks::~MapObjectMiniBlocks() {}
|
|
ARM MapObjectProfileMiniBlocks::~MapObjectProfileMiniBlocks() {}
|