From 2d5f99006033d0642562c557b936b57b458f12c5 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Sat, 31 Aug 2024 12:47:50 -0500 Subject: [PATCH] Match first TU of m455dll --- config/GMPE01_00/rels/m455Dll/symbols.txt | 19 +- config/GMPE01_00/rels/m456Dll/splits.txt | 4 +- configure.py | 2 +- include/game/hsfmotion.h | 2 + src/REL/m455Dll/main.c | 811 ++++++++++++++++++++++ 5 files changed, 826 insertions(+), 12 deletions(-) create mode 100644 src/REL/m455Dll/main.c diff --git a/config/GMPE01_00/rels/m455Dll/symbols.txt b/config/GMPE01_00/rels/m455Dll/symbols.txt index 0038cefd..c0faaa70 100644 --- a/config/GMPE01_00/rels/m455Dll/symbols.txt +++ b/config/GMPE01_00/rels/m455Dll/symbols.txt @@ -225,25 +225,25 @@ lbl_1_data_0 = .data:0x00000000; // type:object size:0x38 data:float lbl_1_data_38 = .data:0x00000038; // type:object size:0xC data:float lbl_1_data_44 = .data:0x00000044; // type:object size:0xC data:float lbl_1_data_50 = .data:0x00000050; // type:object size:0x4 -lbl_1_data_54 = .data:0x00000054; // type:object size:0xC -lbl_1_data_60 = .data:0x00000060; // type:object size:0xC -lbl_1_data_6C = .data:0x0000006C; // type:object size:0x24 +lbl_1_data_54 = .data:0x00000054; // type:object size:0xC data:float +lbl_1_data_60 = .data:0x00000060; // type:object size:0xC data:float +lbl_1_data_6C = .data:0x0000006C; // type:object size:0x23 data:string lbl_1_data_90 = .data:0x00000090; // type:object size:0x2 data:2byte lbl_1_data_94 = .data:0x00000094; // type:object size:0x4 data:4byte lbl_1_data_98 = .data:0x00000098; // type:object size:0x4 data:4byte jumptable_1_data_9C = .data:0x0000009C; // type:object size:0x28 scope:local lbl_1_data_C4 = .data:0x000000C4; // type:object size:0x1C data:string lbl_1_data_E0 = .data:0x000000E0; // type:object size:0x28 -lbl_1_data_108 = .data:0x00000108; // type:object size:0x30 -lbl_1_data_138 = .data:0x00000138; // type:object size:0x1C -lbl_1_data_154 = .data:0x00000154; // type:object size:0x10 -lbl_1_data_164 = .data:0x00000164; // type:object size:0xC -lbl_1_data_170 = .data:0x00000170; // type:object size:0x1 data:byte +lbl_1_data_108 = .data:0x00000108; // type:object size:0x30 data:float +lbl_1_data_138 = .data:0x00000138; // type:object size:0x19 data:string +lbl_1_data_154 = .data:0x00000154; // type:object size:0x10 data:float +lbl_1_data_164 = .data:0x00000164; // type:object size:0xC data:float +lbl_1_data_170 = .data:0x00000170; // type:object size:0x4 data:byte lbl_1_data_174 = .data:0x00000174; // type:object size:0x5 data:string lbl_1_data_179 = .data:0x00000179; // type:object size:0xB data:string lbl_1_data_184 = .data:0x00000184; // type:object size:0x8 data:float lbl_1_data_18C = .data:0x0000018C; // type:object size:0x10 -lbl_1_data_19C = .data:0x0000019C; // type:object size:0x3C +lbl_1_data_19C = .data:0x0000019C; // type:object size:0x3C data:float lbl_1_data_1D8 = .data:0x000001D8; // type:object size:0x30 lbl_1_data_208 = .data:0x00000208; // type:object size:0x1 data:byte lbl_1_data_20C = .data:0x0000020C; // type:object size:0x50 @@ -265,6 +265,7 @@ lbl_1_data_694 = .data:0x00000694; // type:object size:0x8 data:byte lbl_1_data_69C = .data:0x0000069C; // type:object size:0x1 data:byte lbl_1_data_6A0 = .data:0x000006A0; // type:object size:0x10 lbl_1_data_6B0 = .data:0x000006B0; // type:object size:0x10 +lbl_1_bss_0 = .bss:0x00000000; // type:object size:0x4 data:4byte lbl_1_bss_4 = .bss:0x00000004; // type:object size:0x2 data:2byte lbl_1_bss_8 = .bss:0x00000008; // type:object size:0xC data:float lbl_1_bss_14 = .bss:0x00000014; // type:object size:0x2 data:2byte diff --git a/config/GMPE01_00/rels/m456Dll/splits.txt b/config/GMPE01_00/rels/m456Dll/splits.txt index 139bf5cd..a2e9bbaa 100644 --- a/config/GMPE01_00/rels/m456Dll/splits.txt +++ b/config/GMPE01_00/rels/m456Dll/splits.txt @@ -10,13 +10,13 @@ REL/executor.c: .text start:0x00000000 end:0x000000A0 REL/m456Dll/main.c: - .text start:0x000000A0 end:0x00002FAC + .text start:0x000000A0 end:0x00002DF4 .rodata start:0x00000000 end:0x000000F0 .data start:0x00000000 end:0x000002E8 .bss start:0x00000000 end:0x00000090 REL/m456Dll/stage.c: - .text start:0x00002FAC end:0x00009C68 + .text start:0x00002DF4 end:0x00009C68 .rodata start:0x000000F0 end:0x00000318 .data start:0x000002E8 end:0x000007D0 .bss start:0x00000090 end:0x000000BC diff --git a/configure.py b/configure.py index 5f6490b3..bbd9b2a0 100644 --- a/configure.py +++ b/configure.py @@ -1250,7 +1250,7 @@ config.libs = [ "m455Dll", # Rumble Fishing objects={ Object(Matching, "REL/executor.c"), - Object(NonMatching, "REL/m455Dll/main.c"), + Object(Matching, "REL/m455Dll/main.c"), Object(NonMatching, "REL/m455Dll/stage.c"), }, ), diff --git a/include/game/hsfmotion.h b/include/game/hsfmotion.h index 7ec10d4c..f820bd7f 100644 --- a/include/game/hsfmotion.h +++ b/include/game/hsfmotion.h @@ -4,6 +4,8 @@ #include "dolphin.h" #include "game/hsfformat.h" +#define Hu3DMotionCreateFile(data_id) (Hu3DMotionCreate(HuDataSelHeapReadNum((data_id), MEMORY_DEFAULT_NUM, HEAP_DATA))) + #define Hu3DJointMotionFile(model, data_id) (Hu3DJointMotion((model), HuDataSelHeapReadNum((data_id), MEMORY_DEFAULT_NUM, HEAP_DATA))) diff --git a/src/REL/m455Dll/main.c b/src/REL/m455Dll/main.c new file mode 100644 index 00000000..4fe5b14f --- /dev/null +++ b/src/REL/m455Dll/main.c @@ -0,0 +1,811 @@ +#include "game/object.h" +#include "game/objsub.h" +#include "game/hsfman.h" +#include "game/hsfdraw.h" + +#include "game/hsfmotion.h" +#include "game/pad.h" + +#include "game/wipe.h" +#include "game/frand.h" +#include "game/audio.h" +#include "game/minigame_seq.h" +#include "game/gamework_data.h" +#include "game/chrman.h" + +#include "ext_math.h" +#include "math.h" + +#include "rel_sqrt_consts.h" + +void fn_1_32C4(Process *objman); +void fn_1_340C(void); +void fn_1_6698(Vec *arg0, float arg1, float arg2, s32 arg3); +float fn_1_687C(void); +void fn_1_6CB0(Vec *arg0, float arg1); + +typedef struct camera_view_params { + float zoom; + Vec pos; + Vec rot; +} CameraViewParams; + +CameraViewParams lbl_1_data_0[2] = { { 500, { 0, 1000, 0 }, { 40, 0, 0 } }, { 1985, { 0, 300, 0 }, { -6, 0, 0 } } }; +Vec lbl_1_data_38 = { 700, 2500, -700 }; +Vec lbl_1_data_44 = { 0, 0, 0 }; +GXColor lbl_1_data_50 = { 255, 255, 255, 255 }; +Vec lbl_1_data_54 = { 200, 15000, -200 }; +Vec lbl_1_data_60 = { 0, 1, 0 }; + +omObjData *lbl_1_bss_40; +omObjData *lbl_1_bss_3C; +omObjData *lbl_1_bss_38; +s32 lbl_1_bss_34; +s32 lbl_1_bss_30; +s32 lbl_1_bss_2C; +s32 lbl_1_bss_28; +s16 lbl_1_bss_26; +s16 lbl_1_bss_24; +s16 lbl_1_bss_22; +s16 lbl_1_bss_20; +s16 lbl_1_bss_18[4]; +s16 lbl_1_bss_16; +s16 lbl_1_bss_14; +Vec lbl_1_bss_8; +s16 lbl_1_bss_4; +s32 lbl_1_bss_0; + + +void fn_1_330(omObjData *object); +void fn_1_B94(Process *objman); +void fn_1_2A90(Process *objman); + +void ObjectSetup(void) +{ + Process *objman; + CameraData *camera = &Hu3DCamera[0]; + s16 light; + OSReport("******* M455ObjectSetup *********\n"); + objman = omInitObjMan(50, 8192); + omGameSysInit(objman); + Hu3DCameraCreate(HU3D_CAM0); + Hu3DCameraPerspectiveSet(HU3D_CAM0, -1, 20, 25000, 1.2f); + Hu3DCameraViewportSet(HU3D_CAM0, 0, 0, 640, 480, 0, 1); + lbl_1_bss_3C = omAddObjEx(objman, 32730, 0, 0, -1, omOutView); + lbl_1_bss_8.x = lbl_1_data_44.x-lbl_1_data_38.x; + lbl_1_bss_8.y = lbl_1_data_44.y-lbl_1_data_38.y; + lbl_1_bss_8.z = lbl_1_data_44.z-lbl_1_data_38.z; + PSVECNormalize(&lbl_1_bss_8, &lbl_1_bss_8); + light = Hu3DGLightCreateV(&lbl_1_data_38, &lbl_1_bss_8, &lbl_1_data_50); + Hu3DGLightInfinitytSet(light); + Hu3DGLightStaticSet(light, 1); + Hu3DShadowCreate(10, camera->near, camera->far); + Hu3DShadowTPLvlSet(0.7f); + Hu3DShadowPosSet(&lbl_1_data_54, &lbl_1_data_60, &lbl_1_data_44); + HuAudSndGrpSet(77); + lbl_1_bss_38 = omAddObjEx(objman, 0, 0, 0, -1, fn_1_330); + fn_1_2A90(objman); + fn_1_B94(objman); + fn_1_32C4(objman); +} + +void fn_1_310(s32 arg0) +{ + lbl_1_bss_34 = arg0; +} + +s32 fn_1_320(void) +{ + return lbl_1_bss_34; +} + +void fn_1_478(omObjData *object); + +void fn_1_330(omObjData *object) +{ + CameraData *camera = &Hu3DCamera[0]; + lbl_1_bss_34 = 0; + lbl_1_bss_2C = 60; + lbl_1_bss_30 = -1; + lbl_1_bss_26 = 30; + lbl_1_bss_24 = 60; + lbl_1_bss_22 = -1; + lbl_1_bss_20 = 0; + lbl_1_bss_16 = ((frand16()*270.0f)/65536.0f)+30.0f; + WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 60); + camera->fov = 30.0f; + object->func = fn_1_478; +} + +void fn_1_B38(omObjData *object); +void fn_1_C28(void); +s32 fn_1_C90(void); + +typedef struct m455_player { + u8 field0 : 1; + u8 field1 : 1; + u8 field2 : 1; + s16 unk2; + s16 unk4; + s8 unk6; + s8 unk7; + u16 unk8; + u16 unkA; + s32 unkC; + s16 unk10; + s16 unk12; + s16 unk14; + s16 unk16; + s32 unk18; + s32 unk1C; + u32 unk20; + s16 unk24; + s16 unk26; + s16 unk28; + s16 unk2A; + s16 unk2C; + s16 unk2E; + s16 unk30; + Vec unk34[2]; + Vec unk4C; + s16 unk58; + s32 unk5C[4]; +} M455Player; + +s16 lbl_1_data_90 = -1; +s32 lbl_1_data_94 = -1; +s32 lbl_1_data_98 = -1; + + + +void fn_1_478(omObjData *object) +{ + s32 i; + omObjData **playerList; + M455Player *player; + + switch(fn_1_320()) { + case 0: + if(lbl_1_data_98 < 0) { + lbl_1_data_98 = HuAudFXPlay(1985); + } + if(--lbl_1_bss_2C == 0) { + fn_1_310(1); + lbl_1_bss_2C = 120; + } + break; + + case 1: + if(--lbl_1_bss_2C == 0) { + fn_1_310(2); + lbl_1_bss_4 = MGSeqStartCreate(); + } + break; + + case 2: + if(!MGSeqStatGet(lbl_1_bss_4)) { + fn_1_310(3); + } + if(lbl_1_data_94 < 0 && (MGSeqStatGet(lbl_1_bss_4) & 0x10)) { + lbl_1_data_94 = HuAudSeqPlay(60); + } + break; + + case 3: + if(--lbl_1_bss_24 == 0) { + lbl_1_bss_26--; + if(lbl_1_data_90 >= 0) { + MGSeqParamSet(lbl_1_data_90, 1, lbl_1_bss_26); + } + lbl_1_bss_24 = 60; + if(lbl_1_bss_26 == 10) { + lbl_1_data_90 = MGSeqTimerCreate(10); + } + } + if(lbl_1_bss_16 >= 0) { + lbl_1_bss_16--; + } + if(lbl_1_bss_26 == 0 || fn_1_C90()) { + fn_1_310(4); + lbl_1_bss_4 = MGSeqFinishCreate(); + HuAudSeqFadeOut(lbl_1_data_94, 100); + } + break; + + case 4: + if(lbl_1_data_90 >= 0) { + MGSeqParamSet(lbl_1_data_90, 2, -1); + lbl_1_data_90 = -1; + } + if(!MGSeqStatGet(lbl_1_bss_4)) { + fn_1_310(7); + lbl_1_bss_2C = 120; + } + break; + + case 7: + if(--lbl_1_bss_2C == 0) { + fn_1_310(9); + if(lbl_1_bss_30 >= 0) { + HuAudSStreamPlay(1); + playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0); + for(i=0; i<4; i++) { + player = playerList[i]->data; + if(player->unk28 < 0) { + GWPlayerCoinWinSet(i, lbl_1_bss_22+1); + } + } + } else { + HuAudSStreamPlay(4); + for(i=0; i<4; i++) { + GWPlayerCoinWinSet(i, 3); + } + } + lbl_1_bss_2C = 210; + } + break; + + case 9: + if(--lbl_1_bss_2C == 0) { + WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 60); + HuAudFXStop(lbl_1_data_98); + object->func = fn_1_B38; + } + break; + } + if(lbl_1_bss_20) { + if(lbl_1_bss_20 >= 2) { + for(i=0; i<100; i++){ + s32 srcIdx = (frand8()*lbl_1_bss_20) >> 8; + s32 dstIdx = (frand8()*lbl_1_bss_20) >> 8; + s32 temp = lbl_1_bss_18[srcIdx]; + lbl_1_bss_18[srcIdx] = lbl_1_bss_18[dstIdx]; + lbl_1_bss_18[dstIdx] = temp; + } + } + playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0); + for(i=0; idata; + player->unk28 = lbl_1_bss_22; + } + lbl_1_bss_20 = 0; + } + if(omSysExitReq && !WipeStatGet()) { + WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 60); + object->func = fn_1_B38; + } +} + +void fn_1_B38(omObjData *object) +{ + if(WipeStatGet()) { + return; + } + fn_1_C28(); + fn_1_340C(); + MGSeqKillAll(); + HuAudFadeOut(1); + omOvlReturnEx(1, 1); + OSReport("******* M455Exit *********\n"); +} + +void fn_1_D14(omObjData *object); + +void fn_1_B94(Process *objman) +{ + s32 i; + lbl_1_bss_28 = 0; + lbl_1_bss_14 = 3; + omMakeGroupEx(objman, 0, 4); + for(i=0; i<4; i++) { + omAddObjEx(objman, 5, 10, 50, 0, fn_1_D14); + + } +} + +void fn_1_2010(omObjData *object); + +void fn_1_C28(void) +{ + s32 i; + omObjData **playerList; + playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0); + if(playerList == NULL) { + return; + } + for(i=0; i<4; i++) { + fn_1_2010(playerList[i]); + } +} + +s32 fn_1_C90(void) +{ + s32 i; + omObjData **playerList; + playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0); + for(i=0; i<4; i++) { + M455Player *player = playerList[i]->data; + if(!player->field1) { + return 0; + } + } + return 1; +} + +s32 fn_1_3214(void); + +u32 lbl_1_data_E0[5][2] = { + 0x5F0000, 0, + 0x540024, 1, + 0x54001C, 1, + 0x5F0017, 0, + 0x5F0018, 0, +}; + +Vec lbl_1_data_108[4] = { + { -300, 0, -100 }, + { -100, 0, -100 }, + { 100, 0, -100 }, + { 300, 0, -100 }, +}; + +void fn_1_1444(omObjData *object); + +void fn_1_2060(ModelData *arg0, Mtx arg1); + +void fn_1_D14(omObjData *object) +{ + M455Player *player; + s32 charNo; + u32 i; + player = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(M455Player), MEMORY_DEFAULT_NUM); + object->data = player; + memset(player, 0, sizeof(M455Player)); + player->unk2 = lbl_1_bss_28++; + player->unk4 = GWPlayerCfg[player->unk2].pad_idx; + player->unkC = fn_1_3214(); + charNo = GWPlayerCfg[player->unk2].character; + player->unk10 = charNo; + player->unk12 = GWPlayerCfg[player->unk2].diff; + player->unk14 = GWPlayerCfg[player->unk2].group; + object->model[0] = CharModelCreate(charNo, 8); + Hu3DModelShadowSet(object->model[0]); + Hu3DModelLayerSet(object->model[0], 3); + Hu3DModelCameraSet(object->model[0], HU3D_CAM0); + object->model[1] = Hu3DModelCreateFile(0x540002); + Hu3DModelHookSet(object->model[0], "test11_tex_we-itemhook-r", object->model[1]); + Hu3DModelAttrSet(object->model[1], HU3D_MOTATTR_SHAPE_PAUSE|HU3D_MOTATTR_PAUSE); + player->unk1C = 1; + for(i=0; i<5; i++) { + if(lbl_1_data_E0[i][1] == 0) { + object->motion[i] = CharModelMotionCreate(player->unk10, lbl_1_data_E0[i][0]); + } else { + object->motion[i] = CharModelMotionCreate(player->unk10, player->unk10+lbl_1_data_E0[i][0]); + } + } + Hu3DMotionSet(object->model[0], object->motion[player->unk1C]); + Hu3DModelAttrSet(object->model[0], HU3D_MOTATTR_LOOP); + object->trans.x = lbl_1_data_108[player->unk2].x; + object->trans.y = lbl_1_data_108[player->unk2].y; + object->trans.z = lbl_1_data_108[player->unk2].z; + player->unk2A = espEntry(0x54000C, 0x8000, 0); + espDispOff(player->unk2A); + object->model[3] = Hu3DHookFuncCreate(fn_1_2060); + Hu3DModelLayerSet(object->model[3], 3); + Hu3DModelCameraSet(object->model[3], HU3D_CAM0); + Hu3DData[object->model[3]].unk_120 = object; + object->model[4] = Hu3DModelCreateFile(0x54000A); + Hu3DModelLayerSet(object->model[4], 3); + Hu3DModelCameraSet(object->model[4], HU3D_CAM0); + Hu3DModelShadowSet(object->model[4]); + i = Hu3DMotionCreateFile(0x54000B); + Hu3DMotionSet(object->model[4], i); + Hu3DModelAttrSet(object->model[4], HU3D_MOTATTR_LOOP); + Hu3DModelAttrSet(object->model[4], HU3D_MOTATTR_PAUSE); + player->unk4C.x = object->trans.x+(50.0f*((((s32)frand() & 0x1FF)-256.0f)/256.0f)); + player->unk4C.y = -200; + player->unk4C.z = -1500; + Hu3DModelPosSetV(object->model[4], &player->unk4C); + Hu3DModelAttrSet(object->model[4], HU3D_ATTR_DISPOFF); + player->unk34[0].x = object->trans.x; + player->unk34[0].y = 0; + player->unk34[0].z = -500; + player->unk34[1].x = object->trans.x; + player->unk34[1].y = -200; + player->unk34[1].z = -1000; + CharModelDataClose(player->unk10); + object->rot.y = 180; + if(((s32)frand() & 0x1F) < 4-player->unk12) { + player->unk58 = lbl_1_bss_16-(60.0f*(0.05f*(4-player->unk12)))-((frand8()/256.0f)*6.0f); + if(player->unk58 < 0) { + player->unk58 = 0; + } + } else { + player->unk58 = lbl_1_bss_16+(60.0f*(0.1f*(4-player->unk12)))+((frand8()/256.0f)*30.0f)+6.0f; + } + player->unk28 = -1; + object->func = fn_1_1444; +} + +void fn_1_1400(omObjData *object) +{ + M455Player *player = object->data; + if(player->unk58 != 0) { + player->unk58--; + } else { + player->unkA |= PAD_BUTTON_A; + } +} + +float lbl_1_data_154[4] = { + -350, + -170, + 170, + 350 +}; + +float lbl_1_data_164[3] = { + 1.5f, + 1.0f, + 0.5f +}; + +float fn_1_2390(float arg0, float arg1, float arg2); +s32 fn_1_24F0(Vec *arg0, Vec *arg1, float arg2); + +void fn_1_1444(omObjData *object) +{ + M455Player *temp_r31; + s32 temp_r29; + u32 temp_r28; + Vec sp24[3]; + Vec sp18; + Vec spC; + float temp_f31; + + + temp_r31 = object->data; + temp_r29 = temp_r31->unk1C; + temp_r28 = temp_r31->unk20; + object->trans.y = fn_1_687C(); + if(fn_1_320() < 3) { + return; + } + switch(temp_r31->unk16) { + case 0: + if(fn_1_320() == 4 || lbl_1_bss_14 == 0) { + temp_r31->field1 = 1; + temp_r31->unk16 = 2; + espDispOff(temp_r31->unk2A); + return; + } + if(!GWPlayerCfg[temp_r31->unk2].iscom) { + temp_r31->unk6 = HuPadStkX[temp_r31->unk4]; + temp_r31->unk7 = HuPadStkY[temp_r31->unk4]; + temp_r31->unk8 = HuPadBtn[temp_r31->unk4]; + temp_r31->unkA = HuPadBtnDown[temp_r31->unk4]; + } else { + temp_r31->unk8 = temp_r31->unkA = 0; + temp_r31->unk6 = temp_r31->unk7 = 0; + fn_1_1400(object); + } + if(lbl_1_bss_16 == 0) { + if(temp_r31->unkC) { + omVibrate(temp_r31->unk2, 12, 12, 0); + } else { + sp18.x = object->trans.x; + sp18.y = object->trans.y+300; + sp18.z = object->trans.z; + Hu3D3Dto2D(&sp18, HU3D_CAM0, &sp18); + espPosSet(temp_r31->unk2A, sp18.x, sp18.y); + espDispOn(temp_r31->unk2A); + temp_r31->unk30 = 0; + } + temp_r31->unk2C = temp_r31->unk2E = 30; + } + + if(temp_r31->unkA & PAD_BUTTON_A) { + temp_r31->unk16 = 1; + temp_r31->unk24 = temp_r31->unk26 = 90; + temp_r31->unk2C = -1; + if(lbl_1_bss_16 <= 0) { + lbl_1_bss_18[lbl_1_bss_20++] = temp_r31->unk2; + } + Hu3DModelAttrReset(object->model[1], HU3D_MOTATTR_SHAPE_PAUSE|HU3D_MOTATTR_PAUSE); + Hu3DMotionSpeedSet(object->model[1], 1.2f); + Hu3DMotionShapeSpeedSet(object->model[1], 1.2f); + HuAudFXPlay(1986); + + } + temp_r29 = 1; + temp_r28 = HU3D_MOTATTR_LOOP; + break; + + case 1: + temp_r29 = 2; + temp_r28 = HU3D_MOTATTR_NONE; + if(!temp_r31->field0) { + if(temp_r31->unk28 >= 0 && temp_r31->unk28 < 3) { + temp_r31->field0 = 1; + if(temp_r31->unk28 == 0) { + lbl_1_bss_30 = temp_r31->unk2; + } + temp_f31 = lbl_1_data_164[temp_r31->unk28]; + Hu3DModelScaleSet(object->model[4], temp_f31, temp_f31, temp_f31); + Hu3DModelAttrReset(object->model[4], HU3D_ATTR_DISPOFF); + } + } + temp_f31 = 1.0f-((float)temp_r31->unk24/temp_r31->unk26); + sp24[0].x = temp_r31->unk4C.x; + sp24[0].y = temp_r31->unk4C.y; + sp24[0].z = temp_r31->unk4C.z; + sp24[1].x = object->trans.x; + sp24[1].y = object->trans.y+1500; + sp24[1].z = object->trans.z-200; + sp24[2].x = lbl_1_data_154[temp_r31->unk2]; + sp24[2].y = 0; + sp24[2].z = 150; + fn_1_24F0(sp24, &sp18, temp_f31); + VECSubtract(&sp18, &Hu3DData[object->model[4]].pos, &spC); + Hu3DModelRotSet(object->model[4], atan2d(-spC.y, VECMagXZ(&spC)), atan2d(spC.x, spC.z), 0); + Hu3DModelPosSetV(object->model[4], &sp18); + if(sp18.y > 0.0f) { + if(!temp_r31->field2 && temp_r31->field0) { + fn_1_6CB0(&sp18, -1); + fn_1_6698(&sp18, -1, -1, -1); + temp_r31->field2 = 1; + } + } + temp_r31->unk34[0].x = temp_f31*(2.0f*lbl_1_data_154[temp_r31->unk2]); + temp_r31->unk34[0].y = -200.0f+(-400.0f*temp_f31); + temp_r31->unk34[0].z = -500.0f+(-1500.0f*temp_f31); + temp_r31->unk34[1].x = temp_f31*lbl_1_data_154[temp_r31->unk2]; + temp_r31->unk34[1].y = -200.0f+(400.0f*temp_f31); + temp_r31->unk34[1].z = -1000.0f+(750.0f*temp_f31); + if(--temp_r31->unk24 == 0) { + temp_r31->unk16 = 2; + temp_r31->field1 = 1; + if(temp_r31->field0) { + Hu3DModelAttrReset(object->model[4], HU3D_MOTATTR_PAUSE); + Hu3DModelRotSet(object->model[4], 0, 0, 0); + lbl_1_bss_14--; + } + } + break; + + case 2: + if(fn_1_320() == 7) { + temp_r31->unk16 = 3; + Hu3DModelObjPosGet(object->model[0], "test11_tex_we-itemhook-r", &sp18); + CharModelEffectCreate(1, &sp18); + Hu3DModelAttrSet(object->model[1], HU3D_ATTR_DISPOFF); + Hu3DModelAttrSet(object->model[3], HU3D_ATTR_DISPOFF); + } + break; + + case 3: + if(fn_1_320() < 9) { + temp_r29 = 0; + temp_r28 = HU3D_MOTATTR_LOOP; + } else { + object->rot.y = fn_1_2390(object->rot.y, 0, 0.2f); + if(temp_r31->unk2 == lbl_1_bss_30) { + temp_r29 = 3; + temp_r28 = HU3D_MOTATTR_NONE; + } else { + temp_r29 = 4; + temp_r28 = HU3D_MOTATTR_NONE; + } + } + break; + + default: + break; + } + if(temp_r31->unk2C) { + if(temp_r31->unk2C >= 0) { + temp_f31 = (0.5*sind((90.0f*(float)temp_r31->unk2C)/(float)temp_r31->unk2E))+0.5; + espScaleSet(temp_r31->unk2A, temp_f31, temp_f31); + if(--temp_r31->unk2C == 0) { + temp_r31->unk2C = temp_r31->unk2E; + } + temp_r31->unk30++; + } else { + if(temp_r31->unk30 > 30.0f) { + espDispOff(temp_r31->unk2A); + temp_r31->unk2C = 0; + } else { + temp_r31->unk30++; + } + } + } + if(temp_r31->unk16 >= 2 && temp_r31->unk16 <= 3 && temp_r31->field0) { + Hu3DData[object->model[4]].rot.y += 2.0f; + if(0.0f == Hu3DData[object->model[4]].unk_64) { + HuAudFXPlay(1987); + } + } + if ((temp_r29 >= 0 && temp_r29 != temp_r31->unk1C) || temp_r28 != temp_r31->unk20) { + temp_r31->unk1C = temp_r29; + temp_r31->unk20 = temp_r28; + CharModelMotionShiftSet(temp_r31->unk10, object->motion[temp_r31->unk1C], 0, 8, temp_r28); + } +} + +void fn_1_2010(omObjData *object) +{ + M455Player *player = object->data; + if(object->data != NULL) { + HuMemDirectFree(object->data); + object->data = NULL; + } +} + +GXColor lbl_1_data_170 = { 255, 255, 255, 255 }; + +void fn_1_27A0(Vec *arg0, Vec *arg1, float arg2); + +void fn_1_2060(ModelData *arg0, Mtx arg1) +{ + Vec vtxPos[4]; + Mtx mtxHook; + + Vec pos; + Vec itemHookPos; + s32 i; + omObjData *object = arg0->unk_120; + M455Player *player = object->data; + ModelData *modelPuku = &Hu3DData[object->model[4]]; + GXLoadPosMtxImm(arg1, GX_PNMTX0); + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_CLAMP, GX_AF_NONE); + GXSetChanMatColor(GX_COLOR0A0, lbl_1_data_170); + GXSetNumTexGens(0); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP); + GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); + GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0); + GXSetNumTevStages(1); + GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + Hu3DModelObjMtxGet(object->model[0], "test11_tex_we-itemhook-r", mtxHook); + Hu3DModelObjPosGet(object->model[1], "hook", &pos); + MTXMultVec(mtxHook, &pos, &vtxPos[0]); + for(i=0; i<2; i++) { + vtxPos[i+1].x = player->unk34[i].x; + vtxPos[i+1].y = player->unk34[i].y; + vtxPos[i+1].z = player->unk34[i].z; + } + if(player->field0) { + Mtx hookMtx; + Vec hookPos; + Hu3DModelObjMtxGet(object->model[4], "itemhook_C", hookMtx); + hookPos.x = 0; + hookPos.y = -60.000004f; + hookPos.z = 35.0f; + MTXMultVec(hookMtx, &hookPos, &vtxPos[3]); + } else { + vtxPos[3].x = modelPuku->pos.x; + vtxPos[3].y = modelPuku->pos.y; + vtxPos[3].z = modelPuku->pos.z; + } + GXBegin(GX_LINESTRIP, GX_VTXFMT0, 20); + for(i=0; i<20; i++) { + fn_1_27A0(vtxPos, &pos, i/19.0f); + GXPosition3f32(pos.x, pos.y, pos.z); + } + GXEnd(); +} + +float fn_1_2390(float arg0, float arg1, float arg2) +{ + float temp_f31 = fmod(arg1-arg0, 360); + float temp_f30; + if(temp_f31 < 0) { + temp_f31 += 360.0f; + } + if(temp_f31 > 180) { + temp_f31 -= 360.0f; + } + temp_f30 = fmod(arg0+(arg2*temp_f31), 360); + if(temp_f30 < 0) { + temp_f30 += 360.0f; + } + return temp_f30; +} + +float fn_1_2494(float arg0, float arg1, float arg2, float arg3) +{ + float temp_f31 = 1.0f-arg3; + return (arg0*(temp_f31*temp_f31))+((2.0f*temp_f31)*arg3*arg1)+(arg2*(arg3*arg3)); +} + +s32 fn_1_24F0(Vec *arg0, Vec *arg1, float arg2) +{ + arg1->x = fn_1_2494(arg0[0].x, arg0[1].x, arg0[2].x, arg2); + arg1->y = fn_1_2494(arg0[0].y, arg0[1].y, arg0[2].y, arg2); + arg1->z = fn_1_2494(arg0[0].z, arg0[1].z, arg0[2].z, arg2); +} + +float fn_1_26F8(float arg0, float arg1, float arg2, float arg3, float arg4) +{ + float temp_f31 = 1.0f-arg0; + float temp_f30 = temp_f31*temp_f31; + float temp_f29 = temp_f31*temp_f31*temp_f31; + return (arg4 * (arg0 * (arg0 * arg0))) + ((arg3 * (arg0 * (3.0f * temp_f31 * arg0))) + ((temp_f29 * arg1) + (arg2 * (3.0f * temp_f30 * arg0)))); +} + +void fn_1_27A0(Vec *arg0, Vec *arg1, float arg2) +{ + arg1->x = fn_1_26F8(arg2, arg0[0].x, arg0[1].x, arg0[2].x, arg0[3].x); + arg1->y = fn_1_26F8(arg2, arg0[0].y, arg0[1].y, arg0[2].y, arg0[3].y); + arg1->z = fn_1_26F8(arg2, arg0[0].z, arg0[1].z, arg0[2].z, arg0[3].z); +} + +float lbl_1_data_184[2] = {}; + +void fn_1_2AF4(s32 arg0, s32 arg1, float arg2); + +void fn_1_2D44(omObjData *object); + +void fn_1_2A90(Process *objman) +{ + fn_1_2AF4(0, 0, 0); + lbl_1_bss_40 = omAddObjEx(objman, 10, 0, 0, -1, fn_1_2D44); +} + +void fn_1_2AF4(s32 arg0, s32 arg1, float arg2) +{ + CZoom = lbl_1_data_0[arg0].zoom+(arg2*(lbl_1_data_0[arg1].zoom-lbl_1_data_0[arg0].zoom)); + Center.x = lbl_1_data_0[arg0].pos.x+(arg2*(lbl_1_data_0[arg1].pos.x-lbl_1_data_0[arg0].pos.x)); + Center.y = lbl_1_data_0[arg0].pos.y+(arg2*(lbl_1_data_0[arg1].pos.y-lbl_1_data_0[arg0].pos.y)); + Center.z = lbl_1_data_0[arg0].pos.z+(arg2*(lbl_1_data_0[arg1].pos.z-lbl_1_data_0[arg0].pos.z)); + CRot.x = lbl_1_data_0[arg0].rot.x+(arg2*(lbl_1_data_0[arg1].rot.x-lbl_1_data_0[arg0].rot.x)); + CRot.y = lbl_1_data_0[arg0].rot.y+(arg2*(lbl_1_data_0[arg1].rot.y-lbl_1_data_0[arg0].rot.y)); + CRot.z = lbl_1_data_0[arg0].rot.z+(arg2*(lbl_1_data_0[arg1].rot.z-lbl_1_data_0[arg0].rot.z)); +} + +void fn_1_2D44(omObjData *object) +{ + CameraData *camera = &Hu3DCamera[0]; + switch(fn_1_320()) { + case 1: + fn_1_2AF4(0, 1, sind(lbl_1_data_184[0]*90.0f)); + if(lbl_1_data_184[0] < 1.0f) { + lbl_1_data_184[0] += 1.0f/60.0f; + if(lbl_1_data_184[0] > 1.0f) { + lbl_1_data_184[0] = 1.0f; + } + } + break; + + case 6: + fn_1_2AF4(1, 1, 0); + break; + + case 4: + case 5: + case 7: + break; + } +} + +u32 lbl_1_data_18C[4] = { PAD_CHAN0_BIT, PAD_CHAN1_BIT, PAD_CHAN2_BIT, PAD_CHAN3_BIT }; +s32 fn_1_3214(void) +{ + s32 rumble = HuPadRumbleGet(); + s32 i; + for(i=0; i<4; i++) { + if(!GWPlayerCfg[i].iscom) { + if((rumble & lbl_1_data_18C[GWPlayerCfg[i].pad_idx]) == 0) { + return 0; + } + } + } + return GWGameStat.rumble; +} + +float lbl_1_data_19C[] = { 0,355,0,0,0,275,128,950,6,0,0,0,190,0,550 }; \ No newline at end of file