marioparty4/src/REL/m457Dll/main.c
2025-04-13 04:28:21 +02:00

1691 lines
68 KiB
C
Executable file

#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);
}
}