diff --git a/config/GMPE01_00/rels/m401Dll/symbols.txt b/config/GMPE01_00/rels/m401Dll/symbols.txt index b74724ac..d997bf79 100644 --- a/config/GMPE01_00/rels/m401Dll/symbols.txt +++ b/config/GMPE01_00/rels/m401Dll/symbols.txt @@ -447,8 +447,8 @@ lbl_2_data_118 = .data:0x00000118; // type:object size:0xC lbl_2_data_124 = .data:0x00000124; // type:object size:0x14 data:4byte lbl_2_data_138 = .data:0x00000138; // type:object size:0x20 data:4byte lbl_2_data_158 = .data:0x00000158; // type:object size:0x140 -lbl_2_data_298 = .data:0x00000298; // type:object size:0x30 -lbl_2_data_2C8 = .data:0x000002C8; // type:object size:0x30 +lbl_2_data_298 = .data:0x00000298; // type:object size:0x30 data:float +lbl_2_data_2C8 = .data:0x000002C8; // type:object size:0x30 data:float jumptable_2_data_2F8 = .data:0x000002F8; // type:object size:0x30 scope:local lbl_2_data_32C = .data:0x0000032C; // type:object size:0x8 lbl_2_data_334 = .data:0x00000334; // type:object size:0xF0 diff --git a/include/REL/m401Dll.h b/include/REL/m401Dll.h index 085cd726..89bdf388 100644 --- a/include/REL/m401Dll.h +++ b/include/REL/m401Dll.h @@ -9,11 +9,63 @@ extern float lbl_2_bss_128; extern float lbl_2_bss_124; extern s16 lbl_2_bss_120; +typedef struct m401_work_player { + s16 unk0; + s32 unk4; + s32 unk8; + Vec unkC; + Vec unk18; + Vec unk24; + Vec unk30; + Vec unk3C; + omObjData *unk48; + omObjData *unk4C; + omObjData *unk50; + omObjData *unk54; + Vec unk58; + float unk64; + s16 unk68; + s16 unk6A; + s16 unk6C; + s16 unk6E; + s16 unk70; + s16 unk72; + s16 unk74; + s16 unk76; + s16 unk78; + s16 unk7A; + s16 unk7C; + s16 unk7E; + float unk80; + s16 unk84; + s16 unk86; + float unk88; + s16 unk8C; + s16 unk8E; + s16 unk90; + s16 unk92; + Vec unk94; + s8 unkA0; + s8 unkA1; +} M401WorkPlayer; + +typedef struct unkwork_10A88 { + Vec unk0; + omObjData *unkC; + s16 unk10; + s16 unk12; + s16 unk14; + s32 unk18; + float unk1C; +} UnkWork10A88; + void fn_2_10240(Vec *arg0, Vec *arg1); void fn_2_1041C(void); void fn_2_10710(void); void fn_2_1079C(void); +omObjData *fn_2_10A88(Vec *arg0, s16 arg1); + omObjData *fn_2_14640(Process *objman); #endif \ No newline at end of file diff --git a/include/ext_math.h b/include/ext_math.h index 2c709a82..6f1703c9 100644 --- a/include/ext_math.h +++ b/include/ext_math.h @@ -12,6 +12,8 @@ typedef struct vec2f { #define ABS(x) (((x) < 0) ? -(x) : (x)) #define VECDistanceXZ(a, b) sqrtf((((a)->x-(b)->x)*((a)->x-(b)->x))+(((a)->z-(b)->z)*((a)->z-(b)->z))) +#define VECDistanceAlt(a, b) sqrtf((((a)->x-(b)->x)*((a)->x-(b)->x))+(((a)->y-(b)->y)*((a)->y-(b)->y))+(((a)->z-(b)->z)*((a)->z-(b)->z))) + #define VECMagXZ(a) sqrtf(((a)->x*(a)->x)+((a)->z*(a)->z)) #define sind(x) sin(M_PI*(x)/180.0) diff --git a/src/REL/m401Dll/main.c b/src/REL/m401Dll/main.c index 308cd7a8..9b6ed04c 100644 --- a/src/REL/m401Dll/main.c +++ b/src/REL/m401Dll/main.c @@ -1,14 +1,19 @@ #include "game/object.h" #include "game/memory.h" #include "game/hsfman.h" +#include "game/hsfmotion.h" #include "game/objsub.h" #include "game/minigame_seq.h" #include "game/gamework_data.h" #include "game/wipe.h" #include "game/esprite.h" #include "game/sprite.h" +#include "game/frand.h" +#include "game/chrman.h" #include "REL/m401Dll.h" +#include "math.h" +#include "ext_math.h" #include "rel_sqrt_consts.h" @@ -178,15 +183,6 @@ void ModuleProlog(void) lbl_2_bss_11C = HuAudFXPlay(1290); } -typedef struct m401_work_player { - s16 unk0; - u8 unk2[0x66]; - s16 unk68; - u8 unk6A[8]; - s16 unk72; - s16 unk74; -} M401WorkPlayer; - void fn_2_70C(omObjData *object) { s32 temp_r31; @@ -509,7 +505,6 @@ void fn_2_1A38(omObjData *object); void fn_2_1B80(omObjData *object); void fn_2_1CF0(omObjData *object); void fn_2_1DE8(omObjData *object); -void fn_2_1DE8(omObjData *object); void fn_2_20B0(omObjData *object); void fn_2_2CBC(omObjData *object); void fn_2_2D64(omObjData *object); @@ -517,7 +512,7 @@ void fn_2_2DCC(omObjData *object); void fn_2_2E20(omObjData *object); void fn_2_2ED0(omObjData *object); -omObjFunc lbl_2_data_CC[] = { +omObjFunc lbl_2_data_CC[][2] = { fn_2_1A38, fn_2_2CBC, fn_2_1B80, @@ -579,7 +574,6 @@ void fn_2_1B80(omObjData *object) Vec sp8; omObjData *temp_r31; HsfObject *temp_r30 = Hu3DModelObjPtrGet(object->model[0], lbl_2_data_124[1]); - temp_r30->type = 2; sp14.x = -1000; sp14.y = 0; @@ -610,4 +604,663 @@ void fn_2_1CF0(omObjData *object) sp8.y = 0; sp8.z = -16300; fn_2_FC40(40, &sp20, &sp14, &sp8); +} + +void fn_2_91AC(omObjData *object, Vec *pos); + +void fn_2_1DE8(omObjData *object) +{ + Vec sp2C; + Vec sp20; + Vec sp14; + Vec sp8; + omObjData *temp_r31; + HsfObject *temp_r30 = Hu3DModelObjPtrGet(object->model[0], lbl_2_data_124[3]); + temp_r30->type = 2; + sp2C.x = 0; + sp2C.y = -150.0f+((1.0f/255.0f)*(300.0f*(u32)frand8())); + sp2C.z = -23000; + fn_2_91AC(lbl_2_bss_100[0], &sp2C); + sp2C.x = 0; + sp2C.y = -150.0f+((1.0f/255.0f)*(300.0f*(u32)frand8())); + sp2C.z = -25000; + fn_2_91AC(lbl_2_bss_100[1], &sp2C); + sp2C.x = 5500; + sp2C.y = 0; + sp2C.z = -29800; + sp20.x = 100; + sp20.y = 100; + sp20.z = 100; + sp14.x = -1500; + sp14.y = 0; + sp14.z = -24900; + temp_r31 = fn_2_FC40(20, &sp2C, &sp20, &sp14); + fn_2_E6BC((omObjData *)temp_r31->work[0], 6, 1.5f, 0.2f, 0.8f, 3.5f); + sp8.x = -650; + sp8.y = -360; + sp8.z = -26300; + lbl_2_bss_D0 = fn_2_10A88(&sp8, 3); + lbl_2_bss_90[0] = HuAudFXEmiterPlay(1291, &sp8); +} + +void fn_2_20B0(omObjData *object) +{ + Vec sp8; + HsfObject *temp_r30 = Hu3DModelObjPtrGet(object->model[0], lbl_2_data_124[4]); + temp_r30->type = 2; + Hu3DModelAttrReset(object->model[7], 1); + sp8.x = 0; + sp8.y = -370; + sp8.z = -43000; + lbl_2_bss_8 = fn_2_10A88(&sp8, 3); + lbl_2_bss_90[1] = HuAudFXEmiterPlay(1291, &sp8); + sp8.x = 380; + sp8.y = -440; + sp8.z = -32000; + lbl_2_bss_CC = fn_2_10A88(&sp8, 3); + lbl_2_bss_90[2] = HuAudFXEmiterPlay(1291, &sp8); + Hu3DModelAttrReset(object->model[2], 1); + Hu3DModelAttrSet(object->model[2], 0xC0000001); +} + +void fn_2_21F8(omObjData *object) +{ + Vec sp2C; + Vec sp20; + Vec sp14; + Vec sp8; + s32 temp_r30; + HsfObject *temp_r29 = Hu3DModelObjPtrGet(object->model[0], lbl_2_data_124[0]); + s32 temp_r28; + temp_r29->type = 2; + Hu3DModelAttrReset(object->model[0], 1); + Hu3DModelAttrReset(object->model[1], 1); + Hu3DModelAttrSet(object->model[0], 0x40000001); + Hu3DModelAttrSet(object->model[1], 0x40000001); + Hu3DModelAttrReset(object->model[3], 1); + lbl_2_bss_44.x = 0; + lbl_2_bss_44.y = 100; + lbl_2_bss_44.z = 0; + lbl_2_bss_38.x = 0; + lbl_2_bss_38.y = 1000; + lbl_2_bss_38.z = -1500; + lbl_2_bss_2C.x = 0; + lbl_2_bss_2C.y = 1; + lbl_2_bss_2C.z = 0; + Hu3DCameraPosSetV(1, &lbl_2_bss_44, &lbl_2_bss_2C, &lbl_2_bss_38); + Hu3DCameraPerspectiveSet(1, lbl_2_bss_12C, lbl_2_bss_128, lbl_2_bss_124, 1.2f); + lbl_2_bss_54 = lbl_2_bss_44; + fn_2_D088(NULL); + sp20 = lbl_2_bss_44; + VECSubtract(&lbl_2_bss_38, &lbl_2_bss_44, &sp2C); + VECNormalize(&sp2C, &sp2C); + HuAudFXListnerSetEX(&sp20, &sp2C, lbl_2_bss_88, lbl_2_bss_84, 300, 300, 300); + sp14.x = 300; + sp14.y = -450; + sp14.z = -3100; + lbl_2_bss_D8 = fn_2_10A88(&sp14, 3); + lbl_2_bss_90[0] = HuAudFXEmiterPlay(1291, &sp14); + sp14.x = -300; + sp14.y = -340; + sp14.z = -4720; + lbl_2_bss_D4 = fn_2_10A88(&sp14, 3); + lbl_2_bss_90[1] = HuAudFXEmiterPlay(1291, &sp14); + Hu3DModelAttrReset(object->model[2], 1); + Hu3DModelAttrSet(object->model[2], 0xC0000001); + temp_r28 = 4; + for(temp_r30=0; temp_r30model[4], 1); + Hu3DModelClusterAttrSet(object->model[4], 0, 0xC0000001); + Hu3DModelAttrReset(object->model[8], 1); + Hu3DModelAttrSet(object->model[8], 0x40000001); + Hu3DModelAttrSet(object->model[4], 0x40000001); + Hu3DModelShadowMapSet(object->model[4]); + Hu3DModelAttrReset(object->model[5], 1); + Hu3DModelPosSet(object->model[4], 0, 0, 0); + Hu3DModelAmbSet(object->model[4], 1, 1, 1); + Hu3DModelPosSet(object->model[5], 0, 0, 0); + Hu3DModelPosSet(object->model[6], 0, 0, 0); + temp_r30 = lbl_2_bss_10C->data; + if(lbl_2_bss_BA) { + temp_r30->unk14[0].x = 210; + temp_r30->unk14[0].y = 1018; + temp_r30->unk14[0].z = 0; + temp_r30->unk14[1].x = -160; + temp_r30->unk14[1].y = 1020; + temp_r30->unk14[1].z = -50; + for(temp_r29=0; temp_r29<2; temp_r29++) { + Hu3DModelPosSet(object->model[temp_r29+9], temp_r30->unk14[temp_r29].x, temp_r30->unk14[temp_r29].y, temp_r30->unk14[temp_r29].z); + Hu3DModelAttrReset(object->model[temp_r29+9], 1); + } + Hu3DMotionSet(object->model[10], object->motion[0]); + Hu3DMotionSet(object->model[9], object->motion[2]); + } else { + temp_r30->unk14[0].x = 210; + temp_r30->unk14[0].y = 1018; + temp_r30->unk14[0].z = 0; + temp_r30->unk14[1].x = -160; + temp_r30->unk14[1].y = 1020; + temp_r30->unk14[1].z = -50; + for(temp_r29=0; temp_r29<2; temp_r29++) { + Hu3DModelPosSet(object->model[temp_r29+9], temp_r30->unk14[temp_r29].x, temp_r30->unk14[temp_r29].y, temp_r30->unk14[temp_r29].z); + Hu3DModelAttrReset(object->model[temp_r29+9], 1); + } + Hu3DMotionSet(object->model[10], object->motion[1]); + Hu3DMotionSet(object->model[9], object->motion[2]); + } + Hu3DModelAttrSet(object->model[9], 0x40000001); + Hu3DModelAttrSet(object->model[10], 0x40000001); + Hu3DModelRotSet(object->model[9], 0, 90, 0); + Hu3DModelPosSet(object->model[11], 210, 1018, 0); + Hu3DModelRotSet(object->model[11], 0, 90, 0); + Hu3DModelAttrReset(object->model[11], 1); + Hu3DModelAttrSet(object->model[11], 0x40000001); + sp2C.x = 0; + sp2C.y = 1300; + sp2C.z = 1300; + sp20.x = 0; + sp20.y = 920; + sp20.z = -100; + sp14.x = 0; + sp14.y = 1; + sp14.z = 0; + Hu3DCameraPosSetV(1, &sp2C, &sp14, &sp20); + lbl_2_bss_12C = 45; + Hu3DShadowData.unk_08.x = lbl_2_bss_12C; + MTXLightPerspective(Hu3DShadowData.unk_68, lbl_2_bss_12C, 1.2f, 0.5f, -0.5f, 0.5f, 0.5f); + Hu3DCameraPerspectiveSet(1, lbl_2_bss_12C, lbl_2_bss_128, lbl_2_bss_124, 1.2f); + VECSubtract(&sp20, &sp2C, &sp8); + VECNormalize(&sp8, &sp8); + HuAudFXListnerUpdate(&sp2C, &sp8); +} + +void fn_2_2CBC(omObjData *object) +{ + HsfObject *temp_r30 = Hu3DModelObjPtrGet(object->model[0], lbl_2_data_124[0]); + temp_r30->type = -1; + Hu3DModelAttrSet(object->model[3], 1); + lbl_2_bss_D8->work[0] = 1; + Hu3DModelAttrSet(object->model[2], 1); + HuAudFXStop(lbl_2_bss_90[0]); + HuAudFXStop(lbl_2_bss_90[1]); +} + +void fn_2_2D64(omObjData *object) +{ + HsfObject *temp_r31 = Hu3DModelObjPtrGet(object->model[0], lbl_2_data_124[1]); + temp_r31->type = -1; + lbl_2_bss_D4->work[0] = 1; +} + +void fn_2_2DCC(omObjData *object) +{ + HsfObject *temp_r31 = Hu3DModelObjPtrGet(object->model[0], lbl_2_data_124[2]); + temp_r31->type = -1; +} + +void fn_2_2E20(omObjData *object) +{ + HsfObject *temp_r30 = Hu3DModelObjPtrGet(object->model[0], lbl_2_data_124[3]); + temp_r30->type = -1; + Hu3DModelAttrSet(lbl_2_bss_100[0]->model[0], 1); + Hu3DModelAttrSet(lbl_2_bss_100[1]->model[0], 1); + lbl_2_bss_D0->work[0] = 1; + HuAudFXStop(lbl_2_bss_90[0]); +} + +void fn_2_2ED0(omObjData *object) +{ + HsfObject *temp_r30 = Hu3DModelObjPtrGet(object->model[0], lbl_2_data_124[4]); + temp_r30->type = -1; + Hu3DModelAttrSet(object->model[7], 1); + Hu3DModelAttrSet(object->model[0], 1); + lbl_2_bss_8->work[0] = 1; + lbl_2_bss_CC->work[0] = 1; + Hu3DModelAttrSet(object->model[2], 1); + HuAudFXStop(lbl_2_bss_90[1]); + HuAudFXStop(lbl_2_bss_90[2]); +} + +void fn_2_2F9C(omObjData *object) +{ + +} + +void fn_2_2FA0(omObjData *object) +{ + +} + +void fn_2_33B4(omObjData *object); + +void fn_2_2FA4(omObjData *object) +{ + Work2FA4 *temp_r30; + s32 temp_r29; + HsfObject *temp_r28; + object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(Work2FA4), MEMORY_DEFAULT_NUM); + temp_r30 = object->data; + fn_2_D088(NULL); + temp_r30->unk0 = 0; + temp_r30->unk8.x = 0; + temp_r30->unk8.y = 0; + temp_r30->unk8.z = 0; + temp_r30->unk2C = 0; + object->model[0] = Hu3DModelCreateFile(0x200000); + Hu3DModelAttrSet(object->model[0], 1); + object->model[1] = Hu3DModelCreateFile(0x200001); + Hu3DModelAttrSet(object->model[1], 1); + object->model[2] = Hu3DModelCreateFile(0x200007); + Hu3DModelAttrSet(object->model[2], 1); + Hu3DModelAttrSet(object->model[2], 0x40000001); + object->model[3] = Hu3DModelCreateFile(0x20001F); + Hu3DModelAttrSet(object->model[3], 1); + object->model[4] = Hu3DModelCreateFile(0x200020); + Hu3DModelAttrSet(object->model[4], 1); + object->model[11] = Hu3DModelCreateFile(0x20002C); + Hu3DModelAttrSet(object->model[11], 1); + object->model[7] = Hu3DModelCreateFile(0x200003); + Hu3DModelAttrSet(object->model[7], 1); + object->model[8] = Hu3DModelCreateFile(0x200023); + Hu3DModelAttrSet(object->model[8], 1); + object->model[9] = Hu3DModelCreateFile(0x200028); + Hu3DModelAttrSet(object->model[9], 1); + object->model[10] = Hu3DModelCreateFile(0x200028); + Hu3DModelAttrSet(object->model[10], 1); + Hu3DModelShadowSet(object->model[10]); + object->model[5] = Hu3DModelCreateFile(0x200021); + Hu3DModelAttrSet(object->model[5], 1); + object->model[6] = Hu3DModelCreateFile(0x200022); + Hu3DModelAttrSet(object->model[6], 1); + object->motion[0] = Hu3DJointMotionFile(object->model[10], 0x200029); + object->motion[1] = Hu3DJointMotionFile(object->model[10], 0x20002A); + object->motion[2] = Hu3DJointMotionFile(object->model[9], 0x20002B); + Hu3DModelPosSet(object->model[1], 0, 0, -1500); + Hu3DModelShadowMapSet(object->model[0]); + for(temp_r29=0; temp_r29<5; temp_r29++) { + temp_r28 = Hu3DModelObjPtrGet(object->model[0], lbl_2_data_124[temp_r29]); + temp_r28->type = -1; + } + fn_2_21F8(object); + object->func = fn_2_33B4; +} + +void fn_2_33B4(omObjData *object) +{ + Hu3DModelPosSet(object->model[3], 110, 5.0*sind(lbl_2_bss_10), -1500); + lbl_2_bss_10 += 2.0f; + if(lbl_2_bss_10 >= 360.0f) { + lbl_2_bss_10 -= 360.0f; + } +} + +void fn_2_9E28(float arg1, float arg2); + +void fn_2_34B8(omObjData *object) +{ + Vec sp8; + Work2FA4 *temp_r31; + s32 temp_r30; + s32 temp_r28; + temp_r31 = object->data; + if(lbl_2_bss_60.z < -5000.0f && temp_r31->unk0 == 0) { + temp_r31->unk0 = 1; + fn_2_9E28(-15500, -20000); + } + if(lbl_2_bss_6C.z <= lbl_2_data_A0[lbl_2_bss_C]) { + lbl_2_bss_C++; + lbl_2_data_CC[lbl_2_bss_C][0](object); + } + if(lbl_2_bss_6C.z <= lbl_2_data_B4[lbl_2_bss_E]) { + lbl_2_data_CC[lbl_2_bss_E][1](object); + lbl_2_bss_E++; + } + if(lbl_2_bss_6C.z <= -40000.0f) { + lbl_2_bss_BE = 1; + } + if(temp_r31->unk2C) { + temp_r31->unk2C--; + } else { + temp_r31->unk2C = 274; + if(lbl_2_bss_60.z > -31260.0f) { + temp_r28 = 4; + for(temp_r30=0; temp_r30data; + temp_r31->unk4 = 5.0*sind(temp_r31->unk8.x); + temp_r31->unk8.y += temp_r31->unk8.z; + Hu3DModelPosSet(object->model[4], temp_r31->unk8.y, temp_r31->unk4, 0); + Hu3DModelPosSet(object->model[5], temp_r31->unk8.y, 0, 0); + Hu3DModelScaleSet(object->model[5], 1.0f-(0.09f*(temp_r31->unk4/5.0f)), 1.0f, 1.0f-(0.09f*(temp_r31->unk4/5.0f))); + for(temp_r29=0; temp_r29<2; temp_r29++) { + temp_f31 = temp_r31->unk14[temp_r29].y+(5.0*sind(temp_r31->unk8.x)); + temp_r31->unk14[temp_r29].x += temp_r31->unk8.z; + Hu3DModelPosSet(object->model[temp_r29+9], temp_r31->unk14[temp_r29].x, temp_f31, temp_r31->unk14[temp_r29].z); + } + Hu3DModelPosSet(object->model[11], temp_r31->unk14[0].x, temp_f31, temp_r31->unk14[0].z); + temp_r31->unk8.z *= 1.04f; + if(temp_r31->unk8.z > 12.0f) { + temp_r31->unk8.z = 12.0f; + } + temp_r31->unk8.x += 2.0f; + if(temp_r31->unk8.x >= 360.0f) { + temp_r31->unk8.x -= 360.0f; + } + lbl_2_data_30.x = temp_r31->unk8.y; + lbl_2_data_48.x = temp_r31->unk8.y; + Hu3DShadowPosSet(&lbl_2_data_30, &lbl_2_data_3C, &lbl_2_data_48); +} + +void fn_2_3F28(omObjData *object); + +s32 lbl_2_data_158[][10] = { + 0x005F002A, + 0x00200031, + 0x005F0000, + 0x005F002B, + 0x005F0005, + 0x005F0017, + 0x00200039, + 0x00200041, + 0x005F0022, + 0x00200049, + 0x001A002A, + 0x00200032, + 0x001A0000, + 0x001A002B, + 0x001A0005, + 0x001A0017, + 0x0020003A, + 0x00200042, + 0x001A0022, + 0x0020004A, + 0x006D002A, + 0x00200033, + 0x006D0000, + 0x006D002B, + 0x006D0005, + 0x006D0017, + 0x0020003B, + 0x00200043, + 0x006D0022, + 0x0020004B, + 0x008A002A, + 0x00200034, + 0x008A0000, + 0x008A002B, + 0x008A0005, + 0x008A0017, + 0x0020003C, + 0x00200044, + 0x008A0022, + 0x0020004C, + 0x0085002A, + 0x00200035, + 0x00850000, + 0x0085002B, + 0x00850005, + 0x00850017, + 0x0020003D, + 0x00200045, + 0x00850022, + 0x0020004D, + 0x0011002A, + 0x00200036, + 0x00110000, + 0x0011002B, + 0x00110005, + 0x00110017, + 0x0020003E, + 0x00200046, + 0x00110022, + 0x0020004E, + 0x000D002A, + 0x00200037, + 0x000D0000, + 0x000D002B, + 0x000D0005, + 0x000D0017, + 0x0020003F, + 0x00200047, + 0x000D0022, + 0x0020004F, + 0x0081002A, + 0x00200038, + 0x00810000, + 0x0081002B, + 0x00810005, + 0x00810017, + 0x00200040, + 0x00200048, + 0x00810022, + 0x00200050, +}; + +Vec lbl_2_data_298[] = { + -150, 1250, -1400, + -50, 1250, -1400, + 50, 1250, -1400, + 150, 1250, -1400, +}; + +Vec lbl_2_data_2C8[] = { + -300, 0, -1500, + -100, 0, -1500, + 100, 0, -1500, + 300, 0, -1500, +}; + +void fn_2_3F28(omObjData *object); + +void fn_2_3B24(omObjData *object) +{ + M401WorkPlayer *temp_r31; + s32 temp_r29; + s32 temp_r28; + s32 temp_r27; + object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(M401WorkPlayer), MEMORY_DEFAULT_NUM); + temp_r31 = object->data; + temp_r29 = object->work[0]; + temp_r31->unk4 = temp_r29; + temp_r31->unk8 = GWPlayerCfg[temp_r29].pad_idx; + temp_r27 = GWPlayerCfg[temp_r29].character; + temp_r31->unk86 = lbl_2_data_4[temp_r27]; + object->model[0] = CharModelCreate(temp_r31->unk86, 4); + if(temp_r29 == 0) { + object->model[2] = Hu3DModelCreateFile(0x200025); + object->model[3] = Hu3DModelCreateFile(0x200027); + } else { + object->model[2] = Hu3DModelLink(lbl_2_bss_118[0]->model[2]); + object->model[3] = Hu3DModelCreateFile(0x200027); + } + Hu3DModelAttrSet(object->model[3], 0x40000002); + Hu3DModelClusterAttrSet(object->model[3], 0, 0xC0000002); + Hu3DModelLayerSet(object->model[3], 7); + for(temp_r28=0; temp_r28<10; temp_r28++) { + object->motion[temp_r28] = CharModelMotionCreate(lbl_2_data_4[temp_r27], lbl_2_data_158[temp_r27][temp_r28]); + } + CharModelMotionSet(temp_r31->unk86, object->motion[2]); + Hu3DModelAttrSet(object->model[0], 0x40000001); + Hu3DModelAttrSet(object->model[2], 1); + Hu3DModelAttrSet(object->model[2], 0x40000001); + Hu3DModelLayerSet(object->model[2], 2); + Hu3DModelAmbSet(object->model[0], 1, 1, 1); + Hu3DModelShadowSet(object->model[0]); + CharModelVoiceEnableSet(lbl_2_data_4[temp_r27], object->motion[4], 0); + temp_r31->unkC = lbl_2_data_2C8[temp_r29]; + temp_r31->unk58.z = 0; + omSetTra(object, lbl_2_data_298[temp_r29].x, lbl_2_data_298[temp_r29].y, lbl_2_data_298[temp_r29].z); + temp_r31->unk0 = 0; + temp_r31->unk6E = 70; + temp_r31->unk24.x = lbl_2_data_2C8[temp_r29].x; + temp_r31->unk24.y = lbl_2_data_2C8[temp_r29].y; + temp_r31->unk24.z = 800+lbl_2_data_2C8[temp_r29].z; + temp_r31->unk6A = 0; + temp_r31->unk72 = 0; + temp_r31->unk74 = 0; + temp_r31->unk78 = 0; + temp_r31->unk7A = 0; + temp_r31->unk7C = 0; + temp_r31->unk76 = 0; + temp_r31->unk88 = 0; + temp_r31->unk84 = 0; + temp_r31->unk8C = 0; + temp_r31->unk8E = 0; + temp_r31->unk94.x = temp_r31->unk94.y = temp_r31->unk94.z = 0; + temp_r31->unk90 = 0; + temp_r31->unkA0 = temp_r31->unkA1 = 0; + CharModelMotionDataClose(temp_r31->unk86); + object->func = fn_2_3F28; +} + +void fn_2_6B44(omObjData *object); +void fn_2_D3E8(omObjData *object); + +void fn_2_3F28(omObjData *object) +{ + Vec sp28; + Vec sp1C; + Vec sp10; + M401WorkPlayer *temp_r31; + CameraData *temp_r29; + omObjData *temp_r28; + UnkWork10A88 *temp_r27; + float temp_f27; + temp_r31 = object->data; + switch(temp_r31->unk0) { + case 0: + if(--temp_r31->unk6E == 0) { + temp_r31->unk0 = 1; + CharModelMotionShiftSet(temp_r31->unk86, object->motion[4], 0, 20, 0); + temp_r31->unk58.x = 16; + temp_r31->unk58.y = 0; + } + break; + + case 1: + if(object->trans.y < 1100) { + + + temp_r31->unk0 = 2; + temp_f27 = VECDistanceAlt(&object->trans, &temp_r31->unk24); + temp_r31->unk58.z = temp_f27; + temp_r31->unk58.y = 0; + temp_r31->unk6E = 110; + temp_r28 = fn_2_10A88(&lbl_2_data_298[temp_r31->unk4], 2); + temp_r31->unk50 = temp_r28; + temp_r27 = temp_r28->data; + temp_r27->unkC = object; + fn_2_6B44(object); + temp_r28 = fn_2_10A88(&lbl_2_data_298[temp_r31->unk4], 4); + temp_r27 = temp_r28->data; + temp_r27->unkC = object; + temp_r31->unk4C = temp_r28; + temp_r28 = fn_2_10A88(&lbl_2_data_298[temp_r31->unk4], 5); + temp_r27 = temp_r28->data; + temp_r27->unkC = object; + temp_r31->unk48 = temp_r28; + CharModelMotionShiftSet(temp_r31->unk86, object->motion[1], 0, 80, 0x40000001); + temp_r31->unk30.x = object->trans.x; + temp_r31->unk30.y = object->trans.y; + temp_r31->unk30.z = object->trans.z; + Hu3DModelAttrReset(object->model[3], 1); + Hu3DModelAttrReset(object->model[3], 0x40000002); + Hu3DModelClusterAttrReset(object->model[3], 0, 0xC0000002); + Hu3DModelPosSet(object->model[3], object->trans.x, 100, 100+object->trans.z); + Hu3DMotionTimeSet(object->model[3], 0); + if(temp_r31->unk4 == 0) { + HuAudFXPlay(1281); + } + omVibrate(temp_r31->unk4, 12, 4, 2); + } else { + object->trans.y += temp_r31->unk58.x-(0.07f*temp_r31->unk58.y*temp_r31->unk58.y); + object->trans.z += 2.0f; + temp_r31->unk58.y += 1.0f; + } + break; + + case 2: + temp_r29 = &Hu3DCamera[0]; + sp1C = temp_r31->unk24; + sp10 = temp_r31->unk30; + VECSubtract(&sp1C, &sp10, &sp28); + VECNormalize(&sp28, &sp28); + object->trans.x = temp_r31->unk30.x+(temp_r31->unk58.z*(sp28.x*sind(temp_r31->unk58.y))); + object->trans.y = temp_r31->unk30.y+(temp_r31->unk58.z*(sp28.y*sind(temp_r31->unk58.y))); + object->trans.z = temp_r31->unk30.z+(temp_r31->unk58.z*(sp28.z*sind(temp_r31->unk58.y))); + temp_r31->unk58.y += 9.0f/11.0f; + omSetRot(object, atan2d(sp28.y, sp28.z)+90.0, 0, 0); + temp_f27 = VECDistanceAlt(&object->trans, &sp1C); + if(--temp_r31->unk6E == 60 && temp_r31->unk4 == 0 && lbl_2_bss_4 == NULL) { + temp_r29 = &Hu3DCamera[0]; + lbl_2_bss_4 = omAddObjEx(HuPrcCurrentGet(), 1400, 0, 0, -1, fn_2_D3E8); + lbl_2_bss_4->trans.x = temp_r29->pos.x; + lbl_2_bss_4->trans.y = temp_r29->pos.y; + lbl_2_bss_4->trans.z = temp_r29->pos.z; + lbl_2_bss_4->rot.x = temp_r29->target.x; + lbl_2_bss_4->rot.y = temp_r29->target.y; + lbl_2_bss_4->rot.z = temp_r29->target.z; + lbl_2_bss_4->scale.x = 0; + } + if(temp_r31->unk6E == 0) { + temp_r31->unk0 = 3; + temp_r31->unk4C->work[0] = 1; + temp_r31->unk48->work[0] = 1; + } + fn_2_6B44(object); + break; + + case 3: + sp1C.x = lbl_2_bss_108->trans.x; + sp1C.y = lbl_2_data_298[temp_r31->unk4].y; + sp1C.z = lbl_2_bss_108->trans.z; + sp10.x = object->trans.x; + sp10.y = object->trans.y; + sp10.z = object->trans.z; + VECSubtract(&sp1C, &sp10, &sp28); + VECNormalize(&sp28, &sp28); + object->rot.x *= 0.95f; + if(object->rot.x < 1.0f) { + object->rot.x = 0.0f; + } + omSetRot(object, object->rot.x, atan2d(sp28.x, sp28.z), 0); + fn_2_6B44(object); + break; + } } \ No newline at end of file