#include "dolphin/pad.h" #include "game/audio.h" #include "game/chrman.h" #include "game/data.h" #include "game/esprite.h" #include "game/gamework_data.h" #include "game/hsfdraw.h" #include "game/hsfman.h" #include "game/hsfmotion.h" #include "game/minigame_seq.h" #include "game/object.h" #include "game/objsub.h" #include "game/pad.h" #include "game/printfunc.h" #include "game/process.h" #include "game/sprite.h" #include "game/window.h" #include "game/wipe.h" #include "string.h" #include "ext_math.h" #include "version.h" extern s32 rand8(void); #define MSM_SE_BOWSER_LAUGH 0x3A #define MSM_SE_BOWSER_HOWL 0x3E #define MSM_SE_KOOPA_KID_DROP 0x5B #define MSM_SE_PLAYER_DROP 0x33D #define MSM_SE_WIND 0x6D7 #define MSM_SE_INVINCIBILITY 0x7E6 #define MSM_MUS_BACKGROUND 0x4D #define MODEL_ID_PLAYER_PLAYER 0 #define MODEL_ID_GAME_SKY 0 #define MODEL_ID_GAME_RING 1 #define MODEL_ID_GAME_MUSHROOM 2 #define MODEL_ID_GAME_INVINCE_SHINING 3 #define MODEL_ID_GAME_INVINCE_SPARKS 4 #define MODEL_ID_GAME_KOOPA_KID 5 #define MODEL_ID_GAME_WAR_FAN 6 #define CHARACTER_BOWSER -1 #define PAD_IDX_COM -1 #define PLAYER_STATE_INITIAL_ADVANCE 2 // TODO is this right? #define PLAYER_STATE_FALLING 16 #define PREV_TRIG_L 0 #define PREV_TRIG_R 1 typedef struct PlayerData { /* 0x00 */ s32 group; /* 0x04 */ s32 player; /* 0x08 */ s32 character; /* 0x0C */ s32 padIdx; /* 0x10 */ s32 diff; /* 0x14 */ s32 state; /* 0x18 */ s32 unk18; /* 0x1C */ s32 invinceTime; /* 0x20 */ s32 unk20; /* 0x24 */ s32 unk24; /* 0x28 */ s32 unk28; /* 0x2C */ s32 unk2C; /* 0x30 */ s32 stamina; /* 0x34 */ s32 unk34; /* 0x38 */ s32 prevTrig; /* 0x3C */ s32 unk3C; /* 0x40 */ s32 unk40; /* 0x44 */ s32 unk44; /* 0x48 */ float unk48; /* 0x4C */ s32 unk4C; } PlayerData; // Size 0x50 typedef struct StructBss78 { /* 0x00 */ s32 unk00; /* 0x04 */ float unk04[3]; } StructBss78; // Size 0x10 typedef struct StructData28C { /* 0x00 */ s32 unk00; /* 0x04 */ s32 unk04; /* 0x08 */ float unk08; /* 0x0C */ float unk0C; /* 0x10 */ float unk10; /* 0x14 */ float unk14; } StructData28C; // Size 0x18 typedef struct SparkData { /* 0x00 */ float scale; /* 0x04 */ float xOffset; /* 0x08 */ float yOffset; } SparkData; // Size 0x0C static void M457Exit(omObjData *object); static StructBss78 lbl_1_bss_78[5]; static omObjData *mainObj; static omObjData *omViewObj; static omObjData *playerObj[2]; static omObjData *gameObj; static s32 lbl_1_bss_60; static s32 gameState; static char lbl_1_bss_58[4]; // unused static s32 lbl_1_bss_54; static s32 lbl_1_bss_50; static Process *objman; static s32 lightId; static s32 lbl_1_bss_44; static s32 lbl_1_bss_40; static s32 lbl_1_bss_3C; static char lbl_1_bss_38[4]; // unused static float lbl_1_bss_34; static float lbl_1_bss_30; static float lbl_1_bss_2C; static float lbl_1_bss_28; static s32 lbl_1_bss_24; static s32 lbl_1_bss_20; static s32 lbl_1_bss_1C; static s32 lbl_1_bss_18; static BOOL againstBrowserF; static s32 m457MesEndF; static char lbl_1_bss_8[8]; // unused static s32 lbl_1_bss_4; static char lbl_1_bss_0[4]; // unused s32 sprDataNumTbl[] = { DATA_MAKE_NUM(DATADIR_M457, 23), DATA_MAKE_NUM(DATADIR_M457, 22), DATA_MAKE_NUM(DATADIR_M457, 24), DATA_MAKE_NUM(DATADIR_M457, 24), DATA_MAKE_NUM(DATADIR_M457, 24), DATA_MAKE_NUM(DATADIR_M457, 24), DATA_MAKE_NUM(DATADIR_M457, 24), DATA_MAKE_NUM(DATADIR_MGCONST, 0), DATA_MAKE_NUM(DATADIR_M457, 23), DATA_MAKE_NUM(DATADIR_M457, 22), DATA_MAKE_NUM(DATADIR_M457, 24), DATA_MAKE_NUM(DATADIR_M457, 24), DATA_MAKE_NUM(DATADIR_M457, 24), DATA_MAKE_NUM(DATADIR_M457, 24), DATA_MAKE_NUM(DATADIR_M457, 24), DATA_MAKE_NUM(DATADIR_MGCONST, 0), DATA_MAKE_NUM(DATADIR_M457, 27), DATA_MAKE_NUM(DATADIR_M457, 28), DATA_MAKE_NUM(DATADIR_M457, 25), DATA_MAKE_NUM(DATADIR_M457, 25), DATA_MAKE_NUM(DATADIR_M457, 25), DATA_MAKE_NUM(DATADIR_M457, 25), DATA_MAKE_NUM(DATADIR_M457, 25) }; s32 sprIdTbl[23] = { 0 }; s32 lbl_1_data_B8[] = { DATA_MAKE_NUM(DATADIR_MARIOMOT, 0), DATA_MAKE_NUM(DATADIR_MARIOMOT, 5), DATA_MAKE_NUM(DATADIR_MARIOMOT, 6), DATA_MAKE_NUM(DATADIR_MARIOMOT, 112), DATA_MAKE_NUM(DATADIR_MARIOMOT, 111), DATA_MAKE_NUM(DATADIR_M457, 8), DATA_MAKE_NUM(DATADIR_M457, 0), DATA_MAKE_NUM(DATADIR_MARIOMOT, 12), DATA_MAKE_NUM(DATADIR_MARIOMOT, 13), DATA_MAKE_NUM(DATADIR_MARIOMOT, 21), DATA_MAKE_NUM(DATADIR_MARIOMOT, 23), DATA_MAKE_NUM(DATADIR_MARIOMOT, 24) }; u32 lbl_1_data_E8[] = { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }; u32 lbl_1_data_118[] = { DATA_MAKE_NUM(DATADIR_BKOOPA, 8), DATA_MAKE_NUM(DATADIR_BKOOPA, 10), 0, DATA_MAKE_NUM(DATADIR_M457, 31), DATA_MAKE_NUM(DATADIR_M457, 32), DATA_MAKE_NUM(DATADIR_M457, 33), DATA_MAKE_NUM(DATADIR_M457, 34), DATA_MAKE_NUM(DATADIR_M457, 35), DATA_MAKE_NUM(DATADIR_M457, 36), DATA_MAKE_NUM(DATADIR_M457, 37), DATA_MAKE_NUM(DATADIR_M457, 29), DATA_MAKE_NUM(DATADIR_M457, 30) }; u8 lbl_1_data_148[12] = { 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1 }; s32 lbl_1_data_154[12] = { 8, 0, 0, 8, 5, 8, 4, 2, 2, 8, 8, 8 }; s32 lbl_1_data_184[12] = { 0 }; float lbl_1_data_1B4[9][3] = { { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 20.0f, 60.0f, 20.0f }, { 20.0f, 70.0f, 20.0f }, { 20.0f, 20.0f, 20.0f }, { 50.0f, -70.0f, 0.0f }, { 20.0f, 60.0f, 20.0f }, { 100.0f, 0.0f, 50.0f }, { -70.0f, -70.0f, -70.0f } }; SparkData sparkDataTbl[9] = { { 1.5f, 45.0f, 270.0f }, { 1.7f, 45.0f, 270.0f }, { 1.8f, 45.0f, 270.0f }, { 1.6f, 45.0f, 270.0f }, { 1.7f, 5.0f, 270.0f }, { 2.0f, -85.0f, 295.0f }, { 1.8f, 45.0f, 270.0f }, { 2.0f, 40.0f, 330.0f }, { 2.25f, -30.0f, 300.0f } }; StructData28C lbl_1_data_28C = { 0 }; s16 lbl_1_data_2A4 = -1; s16 lbl_1_data_2A6 = -1; s32 backgroundMusNo = -1; s32 windSeNo = -1; s16 lbl_1_data_2B0 = -1; s32 invincibilitySeNo = -1; s32 lbl_1_data_2B8 = 10 * REFRESH_RATE; static void CameraPrintDebug(void) { Center.x += 10.0 * (((HuPadBtn[0] & PAD_BUTTON_RIGHT) != 0) - ((HuPadBtn[0] & PAD_BUTTON_LEFT) != 0)); Center.z -= 10.0 * (((HuPadBtn[0] & PAD_BUTTON_UP) != 0) - ((HuPadBtn[0] & PAD_BUTTON_DOWN) != 0)); Center.y += 10.0 * (((HuPadBtn[0] & PAD_BUTTON_Y) != 0) - ((HuPadBtn[0] & PAD_BUTTON_X) != 0)); CZoom += 25.0 * (((HuPadBtn[0] & PAD_BUTTON_X) != 0) - ((HuPadBtn[0] & PAD_BUTTON_Y) != 0)); CRot.y += HuPadSubStkX[0] / 16.0; CRot.x += HuPadSubStkY[0] / -16.0; print8(64, 392, 1.0f, "%f,%f,%f", Center.x, Center.y, Center.z); print8(64, 408, 1.0f, "%f,%f,%f", CRot.x, CRot.y, CRot.z); print8(64, 424, 1.0f, "%f", CZoom); } static void M457PlayerExec(omObjData *object) { PlayerData *playerData = object->data; PlayerData *opponentData = playerObj[1 - object->work[0]]->data; float unused = 0.0f; float unused2 = 0.0f; float unused3 = 0.0f; s32 unused4 = 0; s16 var_r29 = -1; s16 var_r26 = -1; s16 var_r22 = -1; BOOL aPressedF = (playerData->padIdx == PAD_IDX_COM) ? 0 : ((HuPadBtnDown[playerData->padIdx] & PAD_BUTTON_A) > 0); BOOL rPressedF = (playerData->padIdx == PAD_IDX_COM) ? 0 : ((HuPadBtnDown[playerData->padIdx] & PAD_TRIGGER_R) > 0); BOOL lPressedF = (playerData->padIdx == PAD_IDX_COM) ? 0 : ((HuPadBtnDown[playerData->padIdx] & PAD_TRIGGER_L) > 0); s32 i; if (playerData->padIdx == PAD_IDX_COM) { playerData->unk3C--; if (playerData->unk3C <= 0) { if (playerData->state == 1) { aPressedF = TRUE; } else { rPressedF = lPressedF = TRUE; } if (playerData->state >= 8 || (playerData->state >= 3 && playerData->unk18 >= 10)) { switch (playerData->diff) { case 0: playerData->unk3C = rand8() % 14 + 4 + (playerData->state != 8 ? 28 - playerData->unk18 : 0); break; case 1: playerData->unk3C = rand8() % 9 + 4 + (playerData->state != 8 ? 28 - playerData->unk18 : 0); break; case 2: playerData->unk3C = rand8() % 10 + 12 + ((playerData->state != 8 && playerData->unk18 >= 9 && playerData->unk18 <= 13) ? 13 - playerData->unk18 : 0); break; case 3: playerData->unk3C = rand8() % 5 + 4 + ((playerData->state != 8 && playerData->unk18 >= 2 && playerData->unk18 <= 17) ? 17 - playerData->unk18 : 0); if (opponentData->invinceTime > 0 || playerData->state == 7) { // don't waste stamina lPressedF = rPressedF = 0; } break; } } } } if (playerData->prevTrig == PREV_TRIG_L) { lPressedF = FALSE; } if (playerData->prevTrig == PREV_TRIG_R) { rPressedF = FALSE; } if (playerData->unk20 > 0) { aPressedF = FALSE; playerData->unk20--; } else if (aPressedF) { playerData->unk20 = 20; } if (playerData->unk24 > 0) { lPressedF = FALSE; playerData->unk24--; } else if (lPressedF) { playerData->unk24 = 6; } if (playerData->unk28 > 0) { rPressedF = FALSE; playerData->unk28--; } else if (rPressedF) { playerData->unk28 = 6; } if (gameState == 1008 && playerData->state >= 8 && playerData->state <= 14) { s32 prevStamina = playerData->stamina; if (lPressedF) { playerData->stamina -= 7; } if (rPressedF) { playerData->stamina -= 7; } if (prevStamina > 0 && playerData->stamina <= 0) { // cap at -1 playerData->stamina = -1; playerData->unk4C = 1; } } if (lbl_1_bss_20 == 0 && gameState == 1008 && playerData->state >= 7 && playerData->state <= 14 && (lPressedF || rPressedF)) { playerData->prevTrig = lPressedF ? PREV_TRIG_L : rPressedF ? PREV_TRIG_R : PREV_TRIG_L; } if (playerData->group == 0) { playerObj[0]->trans.x -= playerData->unk48; playerObj[1]->trans.x -= opponentData->unk48; } switch (gameState) { case 1001: if (lbl_1_bss_60 == 0) { Hu3DModelAttrReset(object->model[MODEL_ID_PLAYER_PLAYER], HU3D_ATTR_DISPOFF); } if (lbl_1_bss_60 <= 30) { if (playerData->character == CHARACTER_BOWSER) { Hu3DMotionTimeSet(object->model[MODEL_ID_PLAYER_PLAYER], 138.0f); } object->trans.y = 2400.0 * (1.0 - lbl_1_bss_60 / 30.0); } if (playerData->character != CHARACTER_BOWSER && lbl_1_bss_60 == 30) { var_r29 = 2; } if (lbl_1_bss_60 == 40 && playerData->character != CHARACTER_BOWSER) { var_r29 = 0; } if (lbl_1_bss_60 == 45 && playerData->character == CHARACTER_BOWSER) { var_r29 = 0; Hu3DMotionShiftSet(object->model[MODEL_ID_PLAYER_PLAYER], object->motion[var_r29], lbl_1_data_184[var_r29], 35.0f, HU3D_MOTATTR_LOOP); playerData->unk40 = var_r29; } if (lbl_1_bss_60 == 30) { lbl_1_data_28C.unk04 += 50; } if (lbl_1_bss_60 == 30) { HuAudFXPlay(MSM_SE_PLAYER_DROP); } break; case 1005: if (lbl_1_bss_60 == 0) { var_r29 = 3; } if (lbl_1_bss_60 == (s32)((21.0f / 18) * REFRESH_RATE)) { var_r29 = 4; } break; case 1006: if (lbl_1_bss_60 == 5) { var_r29 = 5; } break; case 1010: if (lbl_1_bss_44 == playerData->group && lbl_1_bss_60 >= 15) { if (lbl_1_bss_60 == 15) { playerData->state = 0; playerData->unk18 = 0; if (playerData->character == CHARACTER_BOWSER) { HuAudFXPlay(MSM_SE_BOWSER_LAUGH); } } var_r29 = 10; if (object->rot.y > 180.0f) { object->rot.y -= 360.0f; } object->rot.y *= 0.9; } if (lbl_1_bss_44 == 2 && lbl_1_bss_60 >= 15) { if (lbl_1_bss_60 == 15) { playerData->state = 0; playerData->unk18 = 0; } var_r29 = 11; if (object->rot.y > 180.0f) { object->rot.y -= 360.0f; } object->rot.y *= 0.9; } break; } playerData->unk18 += (playerData->unk18 < 0x10000); if (playerData->state == 3 || playerData->state == 5) { if (playerData->unk18 == 1 && lbl_1_data_2B0 != -1) { HuWinExCleanup(lbl_1_data_2B0); lbl_1_data_2B0 = -1; } if ((playerData->state == 3 && playerData->unk18 == 23) || (playerData->state == 5 && playerData->unk18 == 15)) { float spFC[2]; HuWinMesMaxSizeGet(1, spFC, MAKE_MESSID(48, 35)); if (lbl_1_data_2B0 == -1) { lbl_1_data_2B0 = HuWinCreate(-10000.0f, 400.0f, spFC[0], spFC[1], 1); } HuWinBGTPLvlSet(lbl_1_data_2B0, 0.0f); HuWinMesSpeedSet(lbl_1_data_2B0, 0); HuWinMesSet(lbl_1_data_2B0, MAKE_MESSID(48, 35)); } } switch (playerData->state) { case 0: if (gameState == 1008) { playerData->state = 1; playerData->unk18 = 0; } break; case 1: if (playerData->unk18 == 1 && playerData->padIdx == PAD_IDX_COM) { switch (playerData->diff) { case 0: playerData->unk3C = rand8() % 5 + 15; break; case 1: playerData->unk3C = rand8() % 5 + 12; break; case 2: playerData->unk3C = rand8() % 5 + 10; break; case 3: playerData->unk3C = rand8() % 4 + 9; break; } } // initial advance if (aPressedF) { playerData->state = PLAYER_STATE_INITIAL_ADVANCE; playerData->unk18 = 0; var_r29 = 6; object->trans.x += (playerData->group == 0) ? ((rand8() % 2) * 2 - 1) : 0; } break; case PLAYER_STATE_INITIAL_ADVANCE: object->trans.x += 8.695652f * (playerData->group == 0 ? 1 : -1); break; case 3: object->trans.x += 4.347826f * (playerData->group == 0 ? 1 : -1); if (playerData->unk18 >= 23) { playerData->state = 8; playerData->unk18 = 0; var_r29 = 4; } break; case 4: if (playerData->unk18 == 1) { var_r29 = 7; } object->trans.x += -4.347826f * (playerData->group == 0 ? 1 : -1); if (playerData->unk18 >= 23) { playerData->state = 8; playerData->unk18 = 0; var_r29 = 4; } break; case 5: object->trans.x += 8.695652f * (playerData->group == 0 ? 1 : -1); if (playerData->unk18 >= 15) { playerData->state = 8; playerData->unk18 = 0; var_r29 = 4; } break; case 6: if (playerData->unk18 == 1) { var_r29 = 8; } object->trans.x += -8.695652f * (playerData->group == 0 ? 1 : -1); if (playerData->unk18 >= 7) { playerData->state = 8; playerData->unk18 = 0; var_r26 = 7; var_r29 = 4; } if (playerData->unk18 >= 15) { playerData->state = 8; playerData->unk18 = 0; } break; case 8: if (playerData->stamina == 0) { var_r26 = 0; playerData->state = 7; playerData->unk18 = 1; playerData->unk34 = 0; } else { if (!lPressedF && !rPressedF) { break; } playerData->state = 9; playerData->unk18 = 0; var_r26 = 3; var_r22 = (playerData->prevTrig == PREV_TRIG_L ? 0 : 11) + 5; var_r29 = 6; if (lbl_1_bss_20 == 1) { playerData->prevTrig = lPressedF ? PREV_TRIG_L : rPressedF ? PREV_TRIG_R : PREV_TRIG_L; } break; } /* fallthrough */ case 7: if (playerData->unk18 == 1) { s32 noStaminaSeIdTbl[] = { 0x12A, 0x16A, 0x1AA, 0x1EA, 0x22A, 0x26A, 0x2AA, 0x2EA, 0x03B }; HuAudFXPlay(noStaminaSeIdTbl[playerData->character == CHARACTER_BOWSER ? 8 : playerData->character]); var_r29 = 9; playerData->unk4C = 0; } if (playerData->stamina > 0) { playerData->state = 8; playerData->unk18 = 0; var_r29 = 4; } break; case 9: object->trans.x += 8.695652f * (playerData->group == 0 ? 1 : -1); if (playerData->unk18 >= 23) { playerData->state = 8; playerData->unk18 = 0; var_r29 = 4; } break; case 12: if (playerData->unk18 == 7) { var_r26 = 0; var_r22 = 7; var_r29 = 7; } if (playerData->unk18 == 15) { var_r26 = 5; var_r29 = 4; } if (playerData->unk18 >= 20) { playerData->state = 8; playerData->unk18 = 0; var_r29 = 4; } break; case 10: object->trans.x += 4.347826f * (playerData->group == 0 ? 1 : -1); if (playerData->unk18 >= 23) { playerData->state = 8; playerData->unk18 = 0; var_r29 = 4; } break; case 11: object->trans.x += -4.347826f * (playerData->group == 0 ? 1 : -1); if (playerData->unk18 == 1) { var_r29 = 7; } if (playerData->unk18 >= 23) { playerData->state = 8; playerData->unk18 = 0; var_r29 = 4; } break; case 13: object->trans.x += 8.695652f * (playerData->group == 0 ? 1 : -1); if (playerData->unk18 >= 23) { playerData->state = 8; playerData->unk18 = 0; var_r29 = 4; } break; case 14: object->trans.x += -8.695652f * (playerData->group == 0 ? 1 : -1); if (playerData->unk18 == 1) { var_r29 = 8; } if (playerData->unk18 == 11) { var_r26 = 11; var_r29 = 4; } if (playerData->unk18 >= 23) { playerData->state = 8; playerData->unk18 = 0; } if (playerData->unk34 < 8) { playerData->unk34 = 8; } break; case 15: if (playerData->unk18 == 1 && playerData->invinceTime > 4) { playerData->invinceTime = 4; } if (playerData->unk18 == 1 && lbl_1_data_2B0 != -1) { HuWinExCleanup(lbl_1_data_2B0); lbl_1_data_2B0 = -1; } if (playerData->unk18 == 7) { var_r29 = 4; var_r26 = 20; } if (playerData->unk18 == REFRESH_RATE) { lbl_1_bss_44 = playerData->group; playerData->invinceTime = 0; } break; case PLAYER_STATE_FALLING: // make the player fall down in the correct direction object->trans.x += -39.130432f * (playerData->group == 0 ? 1 : -1); object->trans.y += 39.130432f; if (playerData->unk18 == 1) { s32 fallSeIdTbl[] = { 0x123, 0x163, 0x1A3, 0x1E3, 0x223, 0x263, 0x2A3, 0x2E3, 0x03C }; HuAudFXPlay(fallSeIdTbl[playerData->character == CHARACTER_BOWSER ? 8 : playerData->character]); var_r29 = 8; var_r26 = 0; var_r22 = 6; } object->rot.z = (playerData->group == 0) ? -20 : 20; break; case 17: if (playerData->unk18 == 1 && playerData->invinceTime > 4) { playerData->invinceTime = 4; } if (playerData->unk18 == 1 && lbl_1_data_2B0 != -1) { HuWinExCleanup(lbl_1_data_2B0); lbl_1_data_2B0 = -1; } if (playerData->unk18 == 7) { var_r29 = 0; var_r26 = 10; } if (playerData->unk18 >= 7 && playerData->unk18 < 17) { object->trans.x += (playerData->group == 0 ? -1 : 1) * 2; } if (playerData->unk18 == REFRESH_RATE) { lbl_1_bss_44 = 2; playerData->invinceTime = 0; } break; } switch (playerData->state) { case 12: if (playerData->group == 0) { break; } /* fallthrough */ case 3: case 5: case 10: case 13: { Vec sp104; s32 temp_r21; char *var_r18; s32 temp_r19 = Hu3DMotionTimeGet(object->model[MODEL_ID_PLAYER_PLAYER]); if ((opponentData->state != 4 && opponentData->state != 6) || opponentData->unk18 != 1) { if ((temp_r19 + 1) % 11 != 0 || (playerData->state == 12 && temp_r19 + 1 > 11)) { break; } } temp_r21 = ((temp_r19 + 1) / 11 - 1) % 2; { char sp1D8[][50] = { "g000mN-itemhook_R", "g000mN-itemhook_L" }; if (playerData->character != CHARACTER_BOWSER) { var_r18 = CharModelHookNameGet(playerData->character, 1, (temp_r21 % 2 == 0) ? 0 : 1); } else { var_r18 = (temp_r21 % 2 == 0) ? sp1D8[0] : sp1D8[1]; } } Hu3DModelObjPosGet(object->model[MODEL_ID_PLAYER_PLAYER], var_r18, &sp104); Hu3DModelPosSet(gameObj->model[temp_r21 + 7], sp104.x + (playerData->group == 0 ? 1 : -1) * 50, sp104.y, 75.0f + sp104.z); Hu3DMotionTimeSet(gameObj->model[temp_r21 + 7], 2.0f); Hu3DModelAttrReset(gameObj->model[temp_r21 + 7], 1); if (lbl_1_bss_78[playerData->character == CHARACTER_BOWSER ? 1 : 0].unk00 < 3) { lbl_1_bss_78[playerData->character == CHARACTER_BOWSER ? 1 : 0] .unk04[lbl_1_bss_78[playerData->character == CHARACTER_BOWSER ? 1 : 0].unk00] = 0.0f; lbl_1_bss_78[playerData->character == CHARACTER_BOWSER ? 1 : 0].unk00++; } // bounds check if (fabs(playerObj[1 - playerData->group]->trans.x) >= 800.0 && (opponentData->state == 11 || opponentData->state == 14)) { playerData->state = 15; opponentData->state = PLAYER_STATE_FALLING; playerData->unk18 = opponentData->unk18 = 0; if (lbl_1_bss_78[4].unk00 < 3) { lbl_1_bss_78[4].unk04[lbl_1_bss_78[4].unk00] = 0.0f; lbl_1_bss_78[4].unk00++; } if (backgroundMusNo != -1) { HuAudSeqFadeOut(backgroundMusNo, 100); backgroundMusNo = -1; } } } break; } playerData->unk34++; if (playerData->state != PLAYER_STATE_FALLING && playerData->state != 15 && playerData->state != 17 && gameState == 1008 && playerData->unk34 >= 30 && (playerData->unk34 - 30) % 30 == 0) { // regen stamina playerData->stamina += (playerData->unk4C == 0 || playerData->state == 7) ? 10 : 0; } // apply invincibility to stamina and cap it playerData->stamina = (playerData->invinceTime > 0 || playerData->stamina >= 100) ? 100 : (playerData->stamina < 0) ? 0 : playerData->stamina; for (i = 0; i < 5; i++) { float scale = (playerData->stamina >= i * 20 + 20) ? 1.0 : (playerData->stamina <= i * 20) ? 0.0 : (playerData->stamina - i * 20) / 20.0; espScaleSet(sprIdTbl[i + (playerData->group == 0 ? 2 : 10)], scale, scale); if (playerData->invinceTime > 0) { // stamina bar mushroom start positions/offsets s32 posXTbl[] = { 106, 469 }; s32 posYTbl[] = { 78, 78 }; s32 ofsXTbl[] = { 0, 0, -33, -9, 15, 39, 63, -68, 0, 0, -33, -9, 15, 39, 63, -68 }; // second half is unused s32 ofsYTbl[] = { 0, 0, -1, -1, -1, -1, -1, -2, 0, 0, -1, -1, -1, -1, -1, -2 }; // make the mushrooms in the stamina bar glow espPosSet(sprIdTbl[i + 18], posXTbl[playerData->group] + ofsXTbl[i + 2], posYTbl[playerData->group] + ofsYTbl[i + 2]); espScaleSet(sprIdTbl[i + 18], (playerData->invinceTime % 4 == 0) ? 1.1 : 1.0, (playerData->invinceTime % 4 == 0) ? 1.1 : 1.0); espTPLvlSet(sprIdTbl[i + 18], (playerData->invinceTime % 4 < 2) ? 1.0 : (var_r22 % 4 == 2) ? 0.5 : 0.0); espDispOn(sprIdTbl[i + 18]); } else if (opponentData->invinceTime == 0) { espDispOff(sprIdTbl[i + 18]); } } if (playerData->invinceTime > 0) { s32 sp20 = (playerData->character != CHARACTER_BOWSER) ? playerData->character : 8; // make the player shine Hu3DModelPosSet(gameObj->model[MODEL_ID_GAME_INVINCE_SHINING], object->trans.x + sparkDataTbl[sp20].xOffset * (playerData->group == 0 ? 1 : -1), object->trans.y + sparkDataTbl[sp20].yOffset, 150.0f + object->trans.z); Hu3DModelScaleSet(gameObj->model[MODEL_ID_GAME_INVINCE_SHINING], 0.75 * sparkDataTbl[sp20].scale, 0.75 * sparkDataTbl[sp20].scale, 0.75 * sparkDataTbl[sp20].scale); Hu3DModelAttrReset(gameObj->model[MODEL_ID_GAME_INVINCE_SHINING], 1); Hu3DModelAttrSet(gameObj->model[MODEL_ID_GAME_INVINCE_SHINING], HU3D_ATTR_ZCMP_OFF); // add sparks Hu3DModelPosSet(gameObj->model[MODEL_ID_GAME_INVINCE_SPARKS], object->trans.x + sparkDataTbl[sp20].xOffset * (playerData->group == 0 ? 1 : -1), object->trans.y + sparkDataTbl[sp20].yOffset, 150.0f + object->trans.z); Hu3DModelScaleSet(gameObj->model[MODEL_ID_GAME_INVINCE_SPARKS], 0.75 * sparkDataTbl[sp20].scale, 0.75 * sparkDataTbl[sp20].scale, 0.75 * sparkDataTbl[sp20].scale); Hu3DModelAttrReset(gameObj->model[MODEL_ID_GAME_INVINCE_SPARKS], 1); Hu3DModelAttrSet(gameObj->model[MODEL_ID_GAME_INVINCE_SPARKS], HU3D_ATTR_ZCMP_OFF); playerData->invinceTime--; if (playerData->invinceTime == 0) { HuAudFXStop(invincibilitySeNo); } } else if (opponentData->invinceTime == 0) { Hu3DModelAttrSet(gameObj->model[MODEL_ID_GAME_INVINCE_SHINING], HU3D_ATTR_DISPOFF); Hu3DModelAttrSet(gameObj->model[MODEL_ID_GAME_INVINCE_SPARKS], HU3D_ATTR_DISPOFF); } if (playerData->unk44 >= 0) { var_r29 = playerData->unk44; } if (var_r29 >= 0 && var_r29 != playerData->unk40) { if (var_r26 == 0) { Hu3DMotionSet(object->model[MODEL_ID_PLAYER_PLAYER], object->motion[var_r29]); Hu3DMotionTimeSet(object->model[MODEL_ID_PLAYER_PLAYER], (var_r22 == -1) ? 0 : var_r22); } else { Hu3DMotionShiftSet(object->model[MODEL_ID_PLAYER_PLAYER], object->motion[var_r29], (var_r22 != -1) ? var_r22 : lbl_1_data_184[var_r29], (var_r26 != -1) ? var_r26 : lbl_1_data_154[var_r29], lbl_1_data_148[var_r29] ? HU3D_MOTATTR_NONE : HU3D_MOTATTR_LOOP); } playerData->unk40 = var_r29; } if (playerData->group == 1) { ModelData *playerModel = &Hu3DData[object->model[MODEL_ID_PLAYER_PLAYER]]; } } s32 lbl_1_data_33C = -1; float lbl_1_data_340 = 3500.0f; float lbl_1_data_344 = 100.0f; float lbl_1_data_348 = -59.0f; static void M457GameExec(omObjData *object) { PlayerData *sp158[2]; omObjData *sp150[2]; PlayerData *sp148[2]; s32 sp140[2]; omObjData *playerObjLocal[2]; PlayerData *playerData[2]; ModelData *temp_r24; ModelData *temp_r27; ModelData *mushroomModel; ModelData *temp_r29; float spAC; float spA8; float spA4; float temp_f20; float var_f19; float temp_f24; float temp_f23; float temp_f22; float var_f21; float temp_f27; float temp_f26; float temp_f25; float temp_f28; float temp_f29; float var_f31; s32 invinciblePlayerId; s32 var_r26; s32 var_r25; s32 var_r22; s32 var_r21; s32 var_r20; s32 var_r19; s32 i; for (i = 0; i < 2; i++) { sp158[i] = playerObj[i]->data; } lbl_1_bss_4++; switch (gameState) { case 1003: temp_f27 = 1800.0 * (1.0 - lbl_1_bss_60 / 30.0); temp_f27 = (temp_f27 < 0.0f) ? 0.0f : temp_f27; Hu3DModelPosSet(gameObj->model[MODEL_ID_GAME_KOOPA_KID], 0.0f, temp_f27, 0.0f); Hu3DModelAttrReset(gameObj->model[MODEL_ID_GAME_KOOPA_KID], HU3D_ATTR_DISPOFF); if (lbl_1_bss_60 == 31) { HuAudFXPlay(MSM_SE_KOOPA_KID_DROP); } if (lbl_1_bss_60 >= 31 && lbl_1_bss_60 <= 38) { temp_f24 = 1.0 - (lbl_1_bss_60 - 31) / 7.0; Hu3DModelRotSet(object->model[MODEL_ID_GAME_KOOPA_KID], 25.0 * (temp_f24 * 0.5 + temp_f24 * temp_f24 * 0.5), 0.0f, 0.0f); } break; case 1002: if (lbl_1_bss_60 == 0) { lbl_1_bss_3C = 0; } if (lbl_1_bss_60 == (VERSION_NTSC ? 20 : 15)) { espAttrReset(sprIdTbl[16], HUSPR_ATTR_DISPOFF); } if ((lbl_1_bss_60 >= (VERSION_NTSC ? 20 : 15) && lbl_1_bss_60 <= REFRESH_RATE - 10) || (lbl_1_bss_60 >= 3 * REFRESH_RATE && lbl_1_bss_60 <= (s32)(3.5 * REFRESH_RATE))) { spAC = (lbl_1_bss_60 <= 120) ? (lbl_1_bss_60 - (VERSION_NTSC ? 20 : 15)) / (0.5 * REFRESH_RATE) : (1.0 - (lbl_1_bss_60 - 3 * REFRESH_RATE) / (0.5 * REFRESH_RATE)); espTPLvlSet(sprIdTbl[16], spAC); } if (lbl_1_bss_60 == (s32)(3.5 * REFRESH_RATE)) { espAttrSet(sprIdTbl[16], HUSPR_ATTR_DISPOFF); } break; case 1006: if (lbl_1_bss_60 == 0) { Hu3DMotionSet(object->model[MODEL_ID_GAME_KOOPA_KID], object->motion[2]); Hu3DModelAttrReset(object->model[MODEL_ID_GAME_KOOPA_KID], HU3D_MOTATTR_LOOP); } if (lbl_1_bss_60 == 15) { Hu3DModelAttrSet(object->model[MODEL_ID_GAME_KOOPA_KID], HU3D_MOTATTR_PAUSE); } break; case 1008: if (lbl_1_bss_60 == 1) { Hu3DModelAttrReset(object->model[MODEL_ID_GAME_KOOPA_KID], HU3D_MOTATTR_PAUSE); for (i = 0; i < 16; i++) { espDispOn(sprIdTbl[i]); } } #if VERSION_NTSC if (lbl_1_bss_60 <= 25) { temp_f28 = lbl_1_bss_60 / 25.0; temp_f26 = 1.0f - (1.0f - temp_f28) * (1.0f - temp_f28) * (1.0f - temp_f28); temp_f26 = 0.25 + 1.375 * temp_f26; temp_f23 = 1.0f - (1.0f - temp_f28) * (1.0f - temp_f28); temp_f23 = 2.0f * (1.0f - temp_f28); espAttrReset(sprIdTbl[17], HU3D_ATTR_SHADOW); #if VERSION_ENG espScaleSet(sprIdTbl[17], 0.85 * temp_f26, 0.85 * temp_f26); #else espScaleSet(sprIdTbl[17], temp_f26, temp_f26); #endif espTPLvlSet(sprIdTbl[17], (temp_f23 > 1.0f) ? 1.0f : temp_f23); } else { espAttrSet(sprIdTbl[17], HUSPR_ATTR_DISPOFF); } #endif for (i = 0; i < 2; i++) { sp150[i] = playerObj[i]; sp148[i] = playerObj[i]->data; } for (i = 0; i < 2; i++) { sp140[i] = (sp148[1 - i]->invinceTime > 0) ? 2 : (sp148[i]->state == 8) ? 2 : (sp148[i]->state == 1) ? 1 : (sp148[i]->state == 9) ? (sp148[i]->unk18 >= 0 ? 3 : 2) : (sp148[i]->state == 2) ? 4 : (sp148[i]->state == 7) ? 0 : -1; } if (sp140[0] >= 0 && sp140[1] >= 0 && fabs(sp150[0]->trans.x - sp150[1]->trans.x) < 300.0) { sp150[0]->trans.x = (sp148[0]->invinceTime > 0) ? sp150[0]->trans.x : (sp148[1]->invinceTime > 0) ? (sp150[1]->trans.x - 300.0f) : ((sp150[0]->trans.x + sp150[1]->trans.x) / 2.0 - 150.0); sp150[0]->trans.x = (sp150[0]->trans.x >= 650.0) ? 650.0 : (sp150[0]->trans.x <= -950.0) ? -950.0 : sp150[0]->trans.x; sp150[1]->trans.x = sp150[0]->trans.x + 300.0f; if (sp140[0] >= 3 || sp140[1] >= 3) { var_r26 = (sp140[0] >= 3) ? 0 : 1; var_r25 = 1 - var_r26; switch (sp140[var_r25]) { case 4: if (sp150[var_r26]->trans.x * (var_r26 == 0 ? 1 : -1) < sp150[var_r25]->trans.x * (var_r25 == 0 ? 1 : -1)) { var_r26 = 1 - var_r26; var_r25 = 1 - var_r25; } sp148[var_r26]->state = 3; sp148[var_r25]->state = 4; break; case 1: sp148[var_r26]->state = 5; sp148[var_r25]->state = 6; break; case 3: sp148[var_r26]->state = 12; sp148[var_r25]->state = 12; break; case 2: sp148[var_r26]->state = 10; sp148[var_r25]->state = 11; break; case 0: sp148[var_r26]->state = 13; sp148[var_r25]->state = 14; break; } sp148[0]->unk18 = sp148[1]->unk18 = 0; } } /* fallthrough */ case 1009: if (gameState != 1008 && lbl_1_bss_40 == 0) { break; } for (i = 0; i < 2; i++) { playerObjLocal[i] = playerObj[i]; playerData[i] = playerObj[i]->data; } switch (lbl_1_bss_18) { case 0: if (lbl_1_bss_40 == 0 && lbl_1_bss_18 == 0 && (playerObjLocal[0]->trans.x > -150.0f || playerObjLocal[1]->trans.x < 150.0f)) { lbl_1_bss_18 = (-playerObjLocal[0]->trans.x < playerObjLocal[1]->trans.x ? 1 : 2); Hu3DModelPosSet(gameObj->model[9], 0.0f, 100.0f, 0.0f); Hu3DMotionTimeSet(gameObj->model[9], 0.0f); Hu3DModelAttrReset(gameObj->model[9], HU3D_ATTR_DISPOFF); if (lbl_1_bss_78[4].unk00 < 3) { lbl_1_bss_78[4].unk04[lbl_1_bss_78[4].unk00] = 0.0f; lbl_1_bss_78[4].unk00++; } } if (lbl_1_bss_18 == 0) { break; } /* fallthrough */ case 1: case 2: temp_r27 = &Hu3DData[object->model[MODEL_ID_GAME_KOOPA_KID]]; temp_r27->rot.y += (lbl_1_bss_18 == 1 ? 18 : -18); temp_r27->rot.z = (lbl_1_bss_18 == 1 ? -20 : 20); temp_r27->pos.x += 5.130000000000001 * (lbl_1_bss_18 == 1 ? 1 : -1); temp_r27->pos.y += 47.0; temp_r27->pos.z += -20.0f; if (temp_r27->pos.y > 1800.0f) { lbl_1_bss_18 += 2; } break; } switch (lbl_1_bss_1C) { case 0: case 2: lbl_1_data_2B8 -= (lbl_1_bss_18 >= 3 && playerData[0]->state < 16 && playerData[1]->state < 16); if (lbl_1_data_2B8 != 0) { break; } Hu3DModelAttrReset(object->model[MODEL_ID_GAME_MUSHROOM], HU3D_ATTR_DISPOFF); Hu3DModelPosSet(object->model[MODEL_ID_GAME_MUSHROOM], (lbl_1_bss_1C == 0) ? 0.0 : (2.0 * ((rand8() % 256) / 255.0 - 0.5) * 400.0), 1500.0f, 0.0f); lbl_1_bss_1C = 1; /* fallthrough */ case 1: mushroomModel = &Hu3DData[object->model[MODEL_ID_GAME_MUSHROOM]]; // descend mushroom mushroomModel->pos.y -= 10.0f; if (mushroomModel->pos.y <= 225.0f) { float playerDistsToMushroom[] = { 100000000.0f, 100000000.0f }; // make sure it doesn't fall through the ring mushroomModel->pos.y = (mushroomModel->pos.y < 100.0f) ? 100.0f : mushroomModel->pos.y; for (i = 0; i < 2; i++) { if (fabs(playerObjLocal[i]->trans.x + (i == 0 ? 40 : -40) - mushroomModel->pos.x) < 180.0) { playerDistsToMushroom[i] = fabs(playerObjLocal[i]->trans.x + (i == 0 ? 40 : -40) - mushroomModel->pos.x); } } if (playerDistsToMushroom[0] != playerDistsToMushroom[1]) { invinciblePlayerId = (playerDistsToMushroom[0] < playerDistsToMushroom[1]) ? 0 : 1; Hu3DModelAttrSet(object->model[MODEL_ID_GAME_MUSHROOM], HU3D_ATTR_DISPOFF); lbl_1_bss_1C = 2; lbl_1_data_2B8 = 10 * REFRESH_RATE; playerData[invinciblePlayerId]->invinceTime = 5 * REFRESH_RATE; playerData[invinciblePlayerId]->unk4C = 0; if (lbl_1_bss_78[3].unk00 < 3) { lbl_1_bss_78[3].unk04[lbl_1_bss_78[3].unk00] = 0.0f; lbl_1_bss_78[3].unk00++; } invincibilitySeNo = HuAudFXPlay(MSM_SE_INVINCIBILITY); } } if (playerData[0]->state >= 16 || playerData[1]->state >= 16 || lbl_1_bss_40 != 0) { lbl_1_bss_1C = 3; lbl_1_data_2B8 = 0; } if (lbl_1_bss_1C == 1) { break; } /* fallthrough */ case 3: lbl_1_data_2B8++; if (lbl_1_data_2B8 < REFRESH_RATE && lbl_1_data_2B8 % 2 == 0) { Hu3DModelAttrReset(object->model[MODEL_ID_GAME_MUSHROOM], HU3D_ATTR_DISPOFF); } else { Hu3DModelAttrSet(object->model[MODEL_ID_GAME_MUSHROOM], HU3D_ATTR_DISPOFF); } break; } break; } switch (gameState) { case 1009: if (lbl_1_bss_40 == 0) { if (lbl_1_bss_60 <= 30) { Hu3DModelPosSet(gameObj->model[MODEL_ID_GAME_KOOPA_KID], 0.0f, (30 - lbl_1_bss_60) * 50 * 0.94, 0.0f); Hu3DModelRotSet(gameObj->model[MODEL_ID_GAME_KOOPA_KID], 0.0f, 0.0f, lbl_1_bss_18 == 3 ? -20 : 20); Hu3DModelAttrReset(gameObj->model[MODEL_ID_GAME_KOOPA_KID], HU3D_ATTR_DISPOFF); } if (lbl_1_bss_60 == 30) { Hu3DMotionSet(object->model[MODEL_ID_GAME_KOOPA_KID], object->motion[0]); Hu3DModelAttrReset(object->model[MODEL_ID_GAME_KOOPA_KID], HU3D_MOTATTR_LOOP); } if (lbl_1_bss_60 == 30) { HuAudFXPlay(MSM_SE_KOOPA_KID_DROP); } if (lbl_1_bss_60 >= 30 && lbl_1_bss_60 <= 37) { temp_f22 = 1.0 - (lbl_1_bss_60 - 30) / 7.0; Hu3DModelRotSet(object->model[MODEL_ID_GAME_KOOPA_KID], 25.0 * (temp_f22 * 0.5 + temp_f22 * temp_f22 * 0.5), 0.0f, 0.0f); } } else if (lbl_1_bss_18 == 0) { Hu3DMotionSet(gameObj->model[MODEL_ID_GAME_KOOPA_KID], object->motion[0]); Hu3DModelAttrReset(gameObj->model[MODEL_ID_GAME_KOOPA_KID], HU3D_MOTATTR_LOOP); } break; case 1010: if (lbl_1_bss_40 == 0) { if (lbl_1_bss_60 == 1) { Hu3DMotionSet(object->model[MODEL_ID_GAME_KOOPA_KID], object->motion[3]); Hu3DModelAttrReset(object->model[MODEL_ID_GAME_KOOPA_KID], HU3D_MOTATTR_LOOP); } temp_r24 = &Hu3DData[object->model[MODEL_ID_GAME_KOOPA_KID]]; temp_f20 = (playerObj[lbl_1_bss_44]->trans.x < 0.0f) ? -90 : 90; temp_r24->rot.y = temp_f20 + 0.8 * (temp_r24->rot.y - temp_f20); } break; } var_r22 = lbl_1_data_33C; { float sp160[][6] = { { 3500.0f, 0.0f, 100.0f, 0.0f, -59.0f, 0.0f }, { 3200.0f, 0.0f, 100.0f, 0.0f, -30.0f, 0.0f }, { 2100.0f, 0.0f, 200.0f, 0.0f, -30.0f, 0.0f }, { 2000.0f, 0.0f, 200.0f, 0.0f, -30.0f, 0.0f }, { 800.0f, 0.0f, 200.0f, 0.0f, -89.0f, 0.0f }, { 1800.0f, 0.0f, 200.0f, 0.0f, -30.0f, 0.0f } }; if (lbl_1_bss_44 != -1 && lbl_1_bss_40 == 0) { sp160[2][1] = playerObj[lbl_1_bss_44]->trans.x; } if (lbl_1_data_33C == -1) { lbl_1_data_33C = 0; lbl_1_bss_24 = 1; lbl_1_bss_28 = 1.0f; } if (lbl_1_data_33C == 0) { lbl_1_data_33C = 1; lbl_1_bss_24 = 1; lbl_1_bss_28 = 0.5f; } if (gameState == 1010 && lbl_1_bss_44 != 2 && lbl_1_bss_60 >= 15 && lbl_1_data_33C == 1) { lbl_1_data_33C = 2; lbl_1_bss_24 = 0; lbl_1_bss_28 = 0.0f; } if (var_r22 != lbl_1_data_33C && var_r22 != -1) { lbl_1_data_340 = CZoom; lbl_1_data_344 = Center.y; lbl_1_bss_30 = Center.z; lbl_1_data_348 = CRot.x; lbl_1_bss_34 = CRot.y; } if (lbl_1_bss_28 <= 1.0f) { if (lbl_1_bss_24 == 0) { lbl_1_bss_28 = 1.0 - 0.95 * (1.0f - lbl_1_bss_28); var_f31 = lbl_1_bss_28; } else { lbl_1_bss_28 += 0.008333333333333333; lbl_1_bss_28 = (lbl_1_bss_28 > 1.0f) ? 1.0f : lbl_1_bss_28; var_f31 = 0.5 + -0.5 * cosd(180.0f * lbl_1_bss_28); } lbl_1_bss_28 = (lbl_1_bss_28 > 1.0f) ? 1.0f : lbl_1_bss_28; CZoom = var_f31 * sp160[lbl_1_data_33C][0] + lbl_1_data_340 * (1.0f - var_f31); Center.x = var_f31 * sp160[lbl_1_data_33C][1] + lbl_1_bss_2C * (1.0f - var_f31); Center.y = var_f31 * sp160[lbl_1_data_33C][2] + lbl_1_data_344 * (1.0f - var_f31); Center.z = var_f31 * sp160[lbl_1_data_33C][3] + lbl_1_bss_30 * (1.0f - var_f31); CRot.x = var_f31 * sp160[lbl_1_data_33C][4] + lbl_1_data_348 * (1.0f - var_f31); CRot.y = var_f31 * sp160[lbl_1_data_33C][5] + lbl_1_bss_34 * (1.0f - var_f31); } } if (gameState == 1001) { var_f21 = 0.0f; temp_f25 = 0.0f; if (lbl_1_data_28C.unk00 % 2 >= 0) { lbl_1_data_28C.unk08 = lbl_1_data_28C.unk10; lbl_1_data_28C.unk0C = lbl_1_data_28C.unk14; do { lbl_1_data_28C.unk10 = 2.0 * (rand8() / 255.0) - 1.0; lbl_1_data_28C.unk14 = 2.0 * (rand8() / 255.0) - 1.0; lbl_1_data_28C.unk10 = 0.0f; temp_f29 = (lbl_1_data_28C.unk10 - lbl_1_data_28C.unk08) * (lbl_1_data_28C.unk10 - lbl_1_data_28C.unk08) + (lbl_1_data_28C.unk14 - lbl_1_data_28C.unk0C) * (lbl_1_data_28C.unk14 - lbl_1_data_28C.unk0C); } while (sqrtf(temp_f29) < 0.75); } var_f21 = lbl_1_data_28C.unk08; temp_f25 = lbl_1_data_28C.unk0C; var_f21 *= lbl_1_data_28C.unk04 * 2; temp_f25 *= lbl_1_data_28C.unk04 * 2; lbl_1_data_28C.unk00 = !lbl_1_data_28C.unk00; lbl_1_data_28C.unk04 = (lbl_1_data_28C.unk04 > 24) ? 23 : (lbl_1_data_28C.unk04 - 1 > 0) ? (lbl_1_data_28C.unk04 - 1) : 0; Center.x = 0.0f; Center.y = 100.0f + temp_f25; } if (gameState >= 1008) { for (i = 0; i < 2; i++) { temp_r29 = &Hu3DData[playerObj[i]->model[MODEL_ID_PLAYER_PLAYER]]; var_r21 = (sp158[i]->character != CHARACTER_BOWSER) ? sp158[i]->character : 8; var_r20 = (temp_r29->unk_08 == playerObj[i]->motion[4]) ? 0 : (temp_r29->unk_08 == playerObj[i]->motion[6]) ? 1 : (temp_r29->unk_08 == playerObj[i]->motion[7]) ? 2 : -1; var_r19 = (temp_r29->unk_0C == playerObj[i]->motion[4]) ? 0 : (temp_r29->unk_0C == playerObj[i]->motion[6]) ? 1 : (temp_r29->unk_0C == playerObj[i]->motion[7]) ? 2 : -1; spA8 = (var_r20 == -1) ? 0.0f : lbl_1_data_1B4[var_r21][var_r20]; spA4 = (var_r19 == -1) ? 0.0f : lbl_1_data_1B4[var_r21][var_r19]; var_f19 = (temp_r29->unk_0C == -1) ? 0.0f : (temp_r29->unk_80 == 0.0f) ? 1.0f : (temp_r29->unk_7C / temp_r29->unk_80); sp158[i]->unk48 = (i == 0 ? 1 : -1) * (spA8 * (1.0f - var_f19) + spA4 * var_f19); playerObj[i]->trans.x += sp158[i]->unk48; Hu3DModelPosSet(playerObj[i]->model[MODEL_ID_PLAYER_PLAYER], playerObj[i]->trans.x, playerObj[i]->trans.y, playerObj[i]->trans.z); } } } static void WrestleMesMain(void) { PlayerData *playerData[2]; s16 unk; s16 window; s32 i; unk = 0; for (i = 0; i < 2; i++) { playerData[i] = playerObj[i]->data; } HuWinComKeyWait(PAD_BUTTON_A, PAD_BUTTON_A, PAD_BUTTON_A, PAD_BUTTON_A, REFRESH_RATE); HuWinComKeyReset(); window = HuWinExCreateStyled(36.0f, 344.0f, 504, 96, 6, 0); HuWinBGTPLvlSet(window, 0.8f); HuWinMesSpeedSet(window, 1); HuWinExAnimIn(window); HuWinDisablePlayerSet(window, 0xF & ((playerData[0]->padIdx != PAD_IDX_COM) ? ~(1 << playerData[0]->padIdx) : 0xF) & ((playerData[1]->padIdx != PAD_IDX_COM) ? ~(1 << playerData[1]->padIdx) : 0xF)); HuWinMesSet(window, MAKE_MESSID(48, 31)); if ((playerData[0]->padIdx == PAD_IDX_COM || playerData[0]->character == CHARACTER_BOWSER) && (playerData[1]->padIdx == PAD_IDX_COM || playerData[1]->character == CHARACTER_BOWSER)) { HuWinComKeyWait(PAD_BUTTON_A, PAD_BUTTON_A, PAD_BUTTON_A, PAD_BUTTON_A, VERSION_JP ? 48 : REFRESH_RATE); HuWinComKeyWait(PAD_BUTTON_A, PAD_BUTTON_A, PAD_BUTTON_A, PAD_BUTTON_A, VERSION_JP ? 90 : REFRESH_RATE); HuWinComKeyWait(PAD_BUTTON_A, PAD_BUTTON_A, PAD_BUTTON_A, PAD_BUTTON_A, VERSION_JP ? 72 : REFRESH_RATE); } HuWinMesWait(window); HuWinExAnimOut(window); HuWinExCleanup(window); m457MesEndF = 0; HuPrcEnd(); } static void ShoveMesMain(void) { float var_f31; s16 temp_r31; WindowData *temp_r30; PlayerData *spC[2]; #if VERSION_PAL float var_f30; double var_f29; double var_f28; float sp14[2]; float spC_2[2]; WindowData *var_r29; #endif s32 var_r28; s16 sp8; s32 var_r26; s32 i; sp8 = 0; for (i = 0; i < 2; i++) { spC[i] = playerObj[i]->data; } HuWinComKeyWait(PAD_BUTTON_A, PAD_BUTTON_A, PAD_BUTTON_A, PAD_BUTTON_A, REFRESH_RATE); HuWinComKeyReset(); #if VERSION_NTSC temp_r31 = HuWinCreate(215.0f, 100.0f, 130, 37, 1); #else HuWinMesMaxSizeGet(1, sp14, MAKE_MESSID(48, 32)); temp_r31 = HuWinCreate(-10000.0f, 100.0f, sp14[0], 0x25, 1); #endif HuSprColorSet(winData[temp_r31].group, 0, 0xFF, 0xFF, 0xCC); HuWinBGTPLvlSet(temp_r31, 0.9f); temp_r30 = &winData[temp_r31]; #if VERSION_PAL var_f29 = temp_r30->pos_x; #endif temp_r30->mess_color = 0; temp_r30->mess_shadow_color = 9; temp_r30->attr |= 0x80; for (var_r28 = 15, var_f31 = 0.0f; var_r28 != 0; var_r28--, var_f31 += 2.0f / 30) { HuWinScaleSet(temp_r31, 1.0f, 1.0 * (1.0f - (1.0f - var_f31) * (1.0f - var_f31))); #if VERSION_NTSC HuWinPosSet(temp_r31, 215.0f, 100.0 + 37.0 * (1.0f - (1.0f - var_f31) * (1.0f - var_f31)) / -4.0); #else HuWinPosSet(temp_r31, var_f29, 100.0 + 37.0 * (1.0f - (1.0f - var_f31) * (1.0f - var_f31)) / -4.0); #endif HuPrcVSleep(); } HuWinScaleSet(temp_r31, 1.0f, 1.0f); HuWinMesSet(temp_r31, MAKE_MESSID(48, 32)); HuPrcSleep(REFRESH_RATE); HuWinExAnimOut(temp_r31); HuWinExCleanup(temp_r31); #if VERSION_PAL temp_r31 = 0; #endif m457MesEndF = 0; #if VERSION_PAL while (gameState != 1008) { HuPrcVSleep(); } HuWinMesMaxSizeGet(1, spC_2, MAKE_MESSID(48, 33)); temp_r31 = HuWinCreate(-10000.0f, 100.0f, spC_2[0], spC_2[1], 1); HuSprColorSet(winData[temp_r31].group, 0, 0xFF, 0xFF, 0xCC); HuWinBGTPLvlSet(temp_r31, 0.9f); var_r29 = &winData[temp_r31]; var_f28 = var_r29->pos_x; var_r29->mess_color = 0; var_r29->mess_shadow_color = 9; var_r29->attr |= 0x80; for (var_r26 = 5, var_f30 = 0.0f; var_r26 != 0; var_r26--, var_f30 += 0.2f) { HuWinScaleSet(temp_r31, 1.0f, (double)(1.0f - ((1.0f - var_f30) * (1.0f - var_f30)))); HuWinPosSet(temp_r31, var_f28, 100.0 + (((double)spC_2[1] * (1.0f - ((1.0f - var_f30) * (1.0f - var_f30)))) / -4.0)); HuPrcVSleep(); } HuWinScaleSet(temp_r31, 1.0f, 1.0f); HuWinMesSet(temp_r31, MAKE_MESSID(48, 33)); HuWinMesSpeedSet(temp_r31, 0); HuPrcSleep(0x32); HuWinExAnimOut(temp_r31); HuWinExCleanup(temp_r31); temp_r31 = 0; #endif HuPrcEnd(); } static void M457Main(omObjData *object) { PlayerData *playerData[2]; float spC[2]; s32 sp8; s32 i; for (i = 0; i < 5; i++) { s32 shoveSeIdTbl[] = { 0x7E1, 0x7E2, 0x7E3, 0x7E4, 0x7E5 }; if (lbl_1_bss_78[i].unk00 > 3) { lbl_1_bss_78[i].unk00 = 3; } if (lbl_1_bss_78[i].unk00 > 0) { sp8 = HuAudFXPlay(shoveSeIdTbl[i]); lbl_1_bss_78[i].unk00--; } } for (i = 0; i < 2; i++) { playerData[i] = playerObj[i]->data; } if (omSysExitReq != 0 && WipeStatGet() == 0) { WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 60); object->func = M457Exit; } switch (gameState) { case 1000: if (WipeStatGet() == 0) { gameState++; lbl_1_bss_60 = 0; } break; case 1001: lbl_1_bss_60++; if (lbl_1_bss_60 == 60) { gameState = (againstBrowserF ? 1002 : 1003); lbl_1_bss_60 = 0; } break; case 1002: lbl_1_bss_60++; if (lbl_1_bss_60 > (s32)(3.5 * REFRESH_RATE)) { gameState++; lbl_1_bss_60 = 0; } break; case 1003: lbl_1_bss_60++; if (lbl_1_bss_60 == 60) { gameState = (againstBrowserF ? 1004 : 1005); lbl_1_bss_60 = 0; } break; case 1004: if (lbl_1_bss_60 == 0) { HuPrcChildCreate(WrestleMesMain, 100, 0x2000, 0, HuPrcCurrentGet()); m457MesEndF = 1; lbl_1_bss_60++; } else if (m457MesEndF == 0) { lbl_1_bss_60++; if (playerData[0]->state == 0) { gameState++; lbl_1_bss_60 = 0; } } break; case 1005: lbl_1_bss_60++; if (lbl_1_bss_60 == (VERSION_NTSC ? 180 : 128)) { gameState++; lbl_1_bss_60 = 0; } break; case 1006: if (lbl_1_bss_60 == 0) { HuWinMesMaxSizeGet(1, spC, MAKE_MESSID(48, 34)); lbl_1_data_2B0 = HuWinCreate(-10000.0f, 400.0f, spC[0], spC[1], 1); HuWinBGTPLvlSet(lbl_1_data_2B0, 0.0f); HuWinMesSpeedSet(lbl_1_data_2B0, 0); HuWinMesSet(lbl_1_data_2B0, MAKE_MESSID(48, 34)); HuPrcChildCreate(ShoveMesMain, 100, 0x2000, 0, HuPrcCurrentGet()); m457MesEndF = 1; lbl_1_bss_60++; } else if (m457MesEndF == 0) { lbl_1_bss_60++; if (playerData[0]->state == 0) { gameState++; lbl_1_bss_60 = rand8() * (REFRESH_RATE / 2) % 5 + REFRESH_RATE; } } else { lbl_1_bss_60++; } break; case 1007: lbl_1_bss_60 -= 1; if (lbl_1_bss_60 <= 0) { gameState++; lbl_1_bss_60 = 0; #if VERSION_NTSC HuAudFXPlay(MSM_SE_BOWSER_HOWL); #endif } break; case 1008: lbl_1_bss_60++; if (lbl_1_bss_44 != -1) { gameState = 1009; lbl_1_bss_60 = 0; break; } if (lbl_1_data_2A6 == -1 && lbl_1_bss_60 >= 270 * REFRESH_RATE && playerData[0]->state < 16 && playerData[1]->state < 16) { lbl_1_data_2A6 = MGSeqTimerCreate(30); } if (lbl_1_data_2A6 == -1) { break; } if (playerData[0]->state < 16 && playerData[1]->state < 16) { MGSeqParamSet(lbl_1_data_2A6, 1, (301 * REFRESH_RATE - 1 - lbl_1_bss_60) / REFRESH_RATE); if (lbl_1_bss_60 > 300 * REFRESH_RATE) { MGSeqParamSet(lbl_1_data_2A6, 2, -1); lbl_1_data_2A6 = -1; } } if (lbl_1_bss_60 > 300 * REFRESH_RATE && playerData[0]->state < 16 && playerData[1]->state < 16) { gameState = 1009; lbl_1_bss_60 = 0; lbl_1_bss_40 = 1; playerData[0]->state = playerData[1]->state = 17; playerData[0]->unk18 = playerData[1]->unk18 = 0; MGSeqFinishCreate(); if (backgroundMusNo != -1) { HuAudSeqFadeOut(backgroundMusNo, 100); backgroundMusNo = -1; } } break; case 1009: if (lbl_1_bss_60 == 1 && lbl_1_data_2A6 != -1) { MGSeqParamSet(lbl_1_data_2A6, 2, -1); lbl_1_data_2A6 = -1; } lbl_1_bss_60++; if (lbl_1_bss_60 >= 2 * REFRESH_RATE) { gameState++; lbl_1_bss_60 = 0; } break; case 1010: lbl_1_bss_60++; if (lbl_1_bss_60 == 15) { if (lbl_1_bss_44 != 2) { if (playerData[lbl_1_bss_44]->character != CHARACTER_BOWSER) { HuAudSStreamPlay(1); } else { HuAudSStreamPlay(3); } if (againstBrowserF) { if (lbl_1_bss_44 == 0) { _SetFlag(FLAG_ID_MAKE(1, 7)); } } else { GWPlayerCoinWinSet(playerData[lbl_1_bss_44]->player, 10); } } else if (lbl_1_bss_44 == 2) { HuAudSStreamPlay(4); } } if ((VERSION_NTSC ? 225.0f : 190.0f) < lbl_1_bss_60) { if (windSeNo != -1) { HuAudFXStop(windSeNo); windSeNo = -1; } lbl_1_data_2A4 = -1; WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 60); object->func = M457Exit; } break; } } static void M457GameSetup(omObjData *object) { s32 i; for (i = 0; i < 2; i++) { PlayerData *playerData[2]; playerData[i] = playerObj[i]->data; } object->model[MODEL_ID_GAME_KOOPA_KID] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_BKOOPA, 14)); Hu3DModelAttrSet(object->model[MODEL_ID_GAME_KOOPA_KID], HU3D_MOTATTR_LOOP); object->model[MODEL_ID_GAME_WAR_FAN] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M457, 38)); Hu3DModelAttrSet(object->model[MODEL_ID_GAME_WAR_FAN], HU3D_MOTATTR_LOOP); Hu3DModelHookSet(object->model[MODEL_ID_GAME_KOOPA_KID], "g007m0-itemhook_r", object->model[MODEL_ID_GAME_WAR_FAN]); Hu3DModelPosSet(object->model[MODEL_ID_GAME_KOOPA_KID], 0.0f, 0.0f, 0.0f); Hu3DModelRotSet(object->model[MODEL_ID_GAME_KOOPA_KID], 15.0f, 0.0f, 0.0f); object->motion[0] = Hu3DJointMotionFile(object->model[MODEL_ID_GAME_KOOPA_KID], DATA_MAKE_NUM(DATADIR_M457, 39)); object->motion[1] = Hu3DJointMotionFile(object->model[MODEL_ID_GAME_KOOPA_KID], DATA_MAKE_NUM(DATADIR_M457, 40)); object->motion[2] = Hu3DJointMotionFile(object->model[MODEL_ID_GAME_KOOPA_KID], DATA_MAKE_NUM(DATADIR_M457, 41)); object->motion[3] = Hu3DJointMotionFile(object->model[MODEL_ID_GAME_KOOPA_KID], DATA_MAKE_NUM(DATADIR_M457, 42)); Hu3DMotionSet(object->model[MODEL_ID_GAME_KOOPA_KID], object->motion[0]); Hu3DModelLayerSet(object->model[MODEL_ID_GAME_WAR_FAN], 2); Hu3DModelLayerSet(object->model[MODEL_ID_GAME_KOOPA_KID], 2); Hu3DModelAttrSet(object->model[MODEL_ID_GAME_KOOPA_KID], HU3D_ATTR_DISPOFF); Hu3DModelShadowSet(object->model[MODEL_ID_GAME_WAR_FAN]); Hu3DModelShadowSet(object->model[MODEL_ID_GAME_KOOPA_KID]); object->model[MODEL_ID_GAME_SKY] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M457, 16)); Hu3DModelAttrSet(object->model[MODEL_ID_GAME_SKY], HU3D_MOTATTR_LOOP); Hu3DMotionSpeedSet(object->model[MODEL_ID_GAME_SKY], 0.1f); Hu3DModelLayerSet(object->model[MODEL_ID_GAME_SKY], 1); object->model[MODEL_ID_GAME_RING] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M457, 17)); Hu3DModelAttrSet(object->model[MODEL_ID_GAME_RING], HU3D_MOTATTR_LOOP); Hu3DModelShadowMapSet(object->model[MODEL_ID_GAME_RING]); Hu3DModelLayerSet(object->model[MODEL_ID_GAME_RING], 1); Hu3DModelScaleSet(object->model[MODEL_ID_GAME_RING], 1.0f, 1.0f, 1.0f); object->model[MODEL_ID_GAME_MUSHROOM] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M457, 21)); Hu3DModelAttrSet(object->model[MODEL_ID_GAME_MUSHROOM], HU3D_MOTATTR_LOOP); Hu3DModelAttrSet(object->model[MODEL_ID_GAME_MUSHROOM], HU3D_ATTR_DISPOFF); Hu3DModelLayerSet(object->model[MODEL_ID_GAME_MUSHROOM], 2); object->model[MODEL_ID_GAME_INVINCE_SHINING] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M457, 19)); Hu3DModelAttrSet(object->model[MODEL_ID_GAME_INVINCE_SHINING], HU3D_MOTATTR_LOOP); Hu3DModelAttrSet(object->model[MODEL_ID_GAME_INVINCE_SHINING], HU3D_ATTR_DISPOFF); Hu3DModelLayerSet(object->model[MODEL_ID_GAME_INVINCE_SHINING], 2); object->model[MODEL_ID_GAME_INVINCE_SPARKS] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M457, 20)); Hu3DModelAttrSet(object->model[MODEL_ID_GAME_INVINCE_SPARKS], HU3D_MOTATTR_LOOP); Hu3DModelAttrSet(object->model[MODEL_ID_GAME_INVINCE_SPARKS], HU3D_ATTR_DISPOFF); Hu3DModelLayerSet(object->model[MODEL_ID_GAME_INVINCE_SPARKS], 4); for (i = 0; i < 3; i++) { object->model[i + 7] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M457, 18)); Hu3DModelLayerSet(object->model[i + 7], 4); Hu3DModelAttrSet(object->model[i + 7], HU3D_ATTR_DISPOFF); } for (i = 0; i < 16; i++) { s32 sp10[] = { 106, 469 }; s32 sp8[] = { 78, 78 }; s32 sp60[] = { 0, 0, -33, -9, 15, 39, 63, -68, 0, 0, -33, -9, 15, 39, 63, -68 }; s32 sp20[] = { 0, 0, -1, -1, -1, -1, -1, -2, 0, 0, -1, -1, -1, -1, -1, -2 }; if (sprDataNumTbl[i] == DATA_MAKE_NUM(DATADIR_MGCONST, 0)) { PlayerData *player = playerObj[i == 7 ? 0 : 1]->data; sprIdTbl[i] = espEntry((player->character == CHARACTER_BOWSER) ? DATA_MAKE_NUM(DATADIR_M457, 26) : (sprDataNumTbl[i] + player->character), 0, 0); } else { sprIdTbl[i] = espEntry(sprDataNumTbl[i], 0, 0); } espDrawNoSet(sprIdTbl[i], 0); espDispOff(sprIdTbl[i]); espAttrSet(sprIdTbl[i], HUSPR_ATTR_NOANIM); espBankSet(sprIdTbl[i], 0); espPriSet(sprIdTbl[i], 128 - i); espPosSet(sprIdTbl[i], sp60[i] + sp10[i < 8 ? 0 : 1], sp20[i] + sp8[i < 8 ? 0 : 1]); if ((i >= 8 ? i - 8 : i) != 0) { (void)1; // Required to match. } else { espTPLvlSet(sprIdTbl[i], 0.5f); espColorSet(sprIdTbl[i], 0, 0, 0); } } for (i = 16; i < 23; i++) { s32 temp_r28 = i - 16; s32 spFC[23] = { 288, 288 }; s32 spA0[23] = { 240, 240 }; sprIdTbl[i] = espEntry(sprDataNumTbl[i], 0, 0); espDrawNoSet(sprIdTbl[i], 0); espAttrSet(sprIdTbl[i], HUSPR_ATTR_NOANIM | HUSPR_ATTR_DISPOFF); espBankSet(sprIdTbl[i], 0); espPriSet(sprIdTbl[i], 128 - i); espPosSet(sprIdTbl[i], spFC[temp_r28], spA0[temp_r28]); espTPLvlSet(sprIdTbl[i], 1.0f); } object->func = M457GameExec; } static void M457PlayerSetup(omObjData *object) { s32 opponentPlayerGroup; PlayerData *playerData; PlayerData *opponentData; s32 i; playerData = object->data; opponentData = playerObj[1 - object->work[0]]->data; memset(playerData, 0, sizeof(*playerData)); playerData->group = object->work[0]; playerData->player = (GWPlayerCfg[0].group == playerData->group) ? 0 : (GWPlayerCfg[1].group == playerData->group) ? 1 : (GWPlayerCfg[2].group == playerData->group) ? 2 : (GWPlayerCfg[3].group == playerData->group) ? 3 : 4; opponentPlayerGroup = (GWPlayerCfg[0].group == 1 - playerData->group) ? 0 : (GWPlayerCfg[1].group == 1 - playerData->group) ? 1 : (GWPlayerCfg[2].group == 1 - playerData->group) ? 2 : (GWPlayerCfg[3].group == 1 - playerData->group) ? 3 : 4; if (playerData->player == 4) { OSReport("m457:wrong player group\n"); playerData->player = playerData->group; } if (playerData->group == 1 && againstBrowserF) { playerData->character = -1; playerData->padIdx = PAD_IDX_COM; playerData->player = -1; playerData->diff = 1; } else { playerData->character = GWPlayerCfg[playerData->player].character; playerData->padIdx = (playerData->character == CHARACTER_BOWSER || GWPlayerCfg[playerData->player].iscom) ? PAD_IDX_COM : GWPlayerCfg[playerData->player].pad_idx; playerData->diff = (playerData->padIdx != PAD_IDX_COM) ? 0 : GWPlayerCfg[playerData->player].diff; } playerData->state = 0; playerData->stamina = 100; playerData->unk34 = 0; playerData->prevTrig = -1; playerData->unk2C = -1; playerData->unk3C = 10000; playerData->unk40 = 1; playerData->unk44 = -1; if (playerData->character != CHARACTER_BOWSER) { object->model[MODEL_ID_PLAYER_PLAYER] = CharModelCreate(playerData->character, 1); } else { object->model[MODEL_ID_PLAYER_PLAYER] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_BKOOPA, 7)); } omSetTra(object, 0.0f, playerData->group == 0 ? 0 : 300, 0.0f); if (playerData->character != CHARACTER_BOWSER) { omSetSca(object, 2.5f, 2.5f, 2.5f); } else { omSetSca(object, 2.0f, 2.0f, 2.0f); } for (i = 0; i < 12; i++) { if (playerData->character != CHARACTER_BOWSER) { object->motion[i] = CharModelMotionCreate(playerData->character, lbl_1_data_B8[i] + (lbl_1_data_E8[i] != 0 ? playerData->character : 0)); } else if (lbl_1_data_118[i] != 0) { object->motion[i] = Hu3DJointMotionFile(object->model[MODEL_ID_PLAYER_PLAYER], lbl_1_data_118[i]); } } Hu3DMotionSet(object->model[MODEL_ID_PLAYER_PLAYER], object->motion[playerData->unk40]); Hu3DMotionTimeSet(object->model[MODEL_ID_PLAYER_PLAYER], 10.0f); Hu3DModelAttrReset(object->model[MODEL_ID_PLAYER_PLAYER], HU3D_MOTATTR_LOOP); Hu3DModelShadowSet(object->model[MODEL_ID_PLAYER_PLAYER]); Hu3DModelAttrSet(object->model[MODEL_ID_PLAYER_PLAYER], HU3D_ATTR_DISPOFF); Hu3DModelLayerSet(object->model[MODEL_ID_PLAYER_PLAYER], 3); CharModelLayerSetAll2(4); object->rot.y = playerData->group * 180 + 90; object->trans.x = (playerData->group == 0 ? -1 : 1) * 300; object->func = M457PlayerExec; } static void M457Setup(omObjData *object) { gameState = 1000; lbl_1_bss_60 = 0; lbl_1_bss_54 = 0; lbl_1_bss_50 = 0; if (backgroundMusNo == -1) { backgroundMusNo = HuAudSeqPlay(MSM_MUS_BACKGROUND); } windSeNo = HuAudFXPlay(MSM_SE_WIND); WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 60); object->func = M457Main; } void ObjectSetup(void) { omObjData *object; s32 i; OSReport("******* M457 ObjectSetup *********\n"); objman = omInitObjMan(600, 0x2000); omGameSysInit(objman); Hu3DCameraCreate(1); Hu3DCameraPerspectiveSet(1, 30.0f, 20.0f, 25000.0f, 1.2f); Hu3DCameraViewportSet(1, 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 1.0f); CZoom = 3200.0f; Center.x = 0.0f; Center.y = 0.0f; Center.z = -100.0f; CRot.x = -30.0f; CRot.y = 0.0f; CRot.z = 0.0f; { Vec pos = { 0.0f, 0.0f, 0.0f }; Vec destination = { 0.25f, -0.75f, -0.45f }; GXColor color = { 0xFF, 0xFF, 0xFF, 0xFF }; lightId = Hu3DGLightCreateV(&pos, &destination, &color); } Hu3DGLightStaticSet(lightId, 1); Hu3DGLightInfinitytSet(lightId); { Vec camPos; Vec camUp; Vec camTarget; camPos.x = 0.0f; camPos.y = 10000.0f; camPos.z = 0.0f; camUp.x = 0.0f; camUp.y = 1.0f; camUp.z = 0.0f; camTarget.x = 0.0f; camTarget.y = 0.0f; camTarget.z = 0.5f; Hu3DShadowCreate(12.0f, 9000.0f, 10010.0f); Hu3DShadowTPLvlSet(0.625f); Hu3DShadowPosSet(&camPos, &camUp, &camTarget); } Hu3DShadowSizeSet(224); lbl_1_data_2A4 = -1; lbl_1_bss_44 = -1; againstBrowserF = _CheckFlag(FLAG_ID_MAKE(1, 0)) != 0; HuWinInit(1); gameObj = omAddObjEx(objman, 101, 10, 4, 1, M457GameSetup); for (i = 0; i < 2; i++) { object = playerObj[i] = omAddObjEx(objman, 100, 1, 12, 0, M457PlayerSetup); object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(PlayerData), MEMORY_DEFAULT_NUM); object->work[0] = i; } omViewObj = omAddObjEx(objman, 0x7FDA, 0, 0, -1, omOutView); mainObj = omAddObjEx(objman, 103, 0, 0, -1, M457Setup); } static void M457Exit(omObjData *object) { PlayerData *playerData; s32 i; if (WipeStatGet() == 0) { for (i = 0; i < 2; i++) { playerData = playerObj[i]->data; } if (lbl_1_data_2A4 >= 0) { MGSeqKill(lbl_1_data_2A4); } MGSeqKillAll(); HuAudAllStop(); omOvlReturnEx(1, 1); } }