From 29cb0935fbc567377b305aebbbc5af66332a90d8 Mon Sep 17 00:00:00 2001 From: MysterD Date: Tue, 8 Sep 2020 09:33:55 -0700 Subject: [PATCH] Fixed glitchy animations on remote when in dialog --- include/types.h | 1 + src/game/behavior_actions.c | 2 -- src/game/behaviors/sparkle_spawn_star.inc.c | 4 ++-- src/game/behaviors/spawn_star.inc.c | 4 ++-- src/game/mario.c | 18 +++++++++--------- src/game/obj_behaviors.c | 2 -- src/pc/network/packets/packet_player.c | 14 ++++++++++++-- 7 files changed, 26 insertions(+), 19 deletions(-) diff --git a/include/types.h b/include/types.h index 9404c97eb..b3afed7f5 100644 --- a/include/types.h +++ b/include/types.h @@ -369,6 +369,7 @@ struct MarioState /*0xCA*/ struct Object* heldByObj; /*????*/ u8 isSnoring; /*????*/ struct Object* bubbleObj; + /*????*/ u8 freeze; }; #define PLAY_MODE_NORMAL 0 diff --git a/src/game/behavior_actions.c b/src/game/behavior_actions.c index deca25d98..7e0f55203 100644 --- a/src/game/behavior_actions.c +++ b/src/game/behavior_actions.c @@ -93,8 +93,6 @@ struct OpenableGrill { const Collision *collision; }; -extern u16 gFreezeMario; - s32 D_8032F0C0[] = { SAVE_FLAG_HAVE_WING_CAP, SAVE_FLAG_HAVE_METAL_CAP, SAVE_FLAG_HAVE_VANISH_CAP }; // Boo Roll diff --git a/src/game/behaviors/sparkle_spawn_star.inc.c b/src/game/behaviors/sparkle_spawn_star.inc.c index 58f15efbb..b66572671 100644 --- a/src/game/behaviors/sparkle_spawn_star.inc.c +++ b/src/game/behaviors/sparkle_spawn_star.inc.c @@ -84,7 +84,7 @@ void bhv_spawned_star_loop(void) { if (o->oTimer == 0) { if (nearest_mario_state_to_object(o) == &gMarioStates[0]) { cutscene_object(CUTSCENE_STAR_SPAWN, o); - gFreezeMario = 1000; + gMarioStates[0].freeze = 200; } //set_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS); //o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP; @@ -126,7 +126,7 @@ void bhv_spawned_star_loop(void) { spawn_object(o, MODEL_NONE, bhvSparkleSpawn); } else if (o->oAction == 2) { if (gCamera->cutscene == 0 && gRecentCutscene == 0) { - gFreezeMario = 0; + gMarioStates[0].freeze = 0; clear_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS); o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP; o->oAction++; diff --git a/src/game/behaviors/spawn_star.inc.c b/src/game/behaviors/spawn_star.inc.c index a36b1126b..151027e4e 100644 --- a/src/game/behaviors/spawn_star.inc.c +++ b/src/game/behaviors/spawn_star.inc.c @@ -47,7 +47,7 @@ void bhv_star_spawn_init(void) { cutscene_object(CUTSCENE_STAR_SPAWN, o); else cutscene_object(CUTSCENE_RED_COIN_STAR_SPAWN, o); - gFreezeMario = 1000; + gMarioStates[0].freeze = 200; } //set_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS); @@ -99,7 +99,7 @@ void bhv_star_spawn_loop(void) { case 3: o->oFaceAngleYaw += 0x800; if (o->oTimer == 20) { - gFreezeMario = 0; + gMarioStates[0].freeze = 0; gObjCutsceneDone = TRUE; clear_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS); o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP; diff --git a/src/game/mario.c b/src/game/mario.c index 290840f25..2f60b35bb 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -47,8 +47,6 @@ #define MAX_HANG_PREVENTION 64 -u16 gFreezeMario = 0; - u32 unused80339F10; s8 filler80339F1C[20]; @@ -1452,7 +1450,7 @@ void update_mario_inputs(struct MarioState *m) { m->particleFlags = 0; if (m->playerIndex == 0) { m->input = 0; } - u8 localIsPaused = (m->playerIndex == 0) && (sCurrPlayMode == PLAY_MODE_PAUSED); + u8 localIsPaused = (m->playerIndex == 0) && (sCurrPlayMode == PLAY_MODE_PAUSED || m->freeze > 0); m->collidedObjInteractTypes = m->marioObj->collidedObjInteractTypes; m->flags &= 0xFFFFFF; @@ -1461,7 +1459,7 @@ void update_mario_inputs(struct MarioState *m) { update_mario_joystick_inputs(m); // prevent any inputs when paused - if ((m->playerIndex == 0) && (sCurrPlayMode == PLAY_MODE_PAUSED)) { + if ((m->playerIndex == 0) && (sCurrPlayMode == PLAY_MODE_PAUSED || m->freeze > 0)) { m->input = 0; m->intendedMag = 0; } @@ -1881,8 +1879,9 @@ s32 execute_mario_action(UNUSED struct Object *o) { // don't update mario when in a cutscene if (gMarioState->playerIndex == 0) { extern s16 gDialogID; - if (gFreezeMario > 0) { gFreezeMario--; } - if (gFreezeMario < 1 && gDialogID != -1) { gFreezeMario = 1; } + if (gMarioState->freeze > 0) { gMarioState->freeze--; } + if (gMarioState->freeze < 2 && gDialogID != -1) { gMarioState->freeze = 2; } + if (gMarioState->freeze < 2 && sCurrPlayMode == PLAY_MODE_PAUSED) { gMarioState->freeze = 2; } } // two-player hack: drop held object if server is holding it @@ -1901,9 +1900,9 @@ s32 execute_mario_action(UNUSED struct Object *o) { // if a loop of actions were found, but there has not been a situation found. while (inLoop) { // don't update mario when in a cutscene - if (gMarioState->playerIndex == 0 && gFreezeMario > 0 && (gMarioState->action & ACT_GROUP_MASK) != ACT_GROUP_CUTSCENE) { + /*if (gMarioState->freeze > 0 && (gMarioState->action & ACT_GROUP_MASK) != ACT_GROUP_CUTSCENE) { break; - } + }*/ // this block can get stuck in an infinite loop due to unexpected circumstances arising from networked players if (prevent_hang(hangPreventionActions, &hangPreventionIndex)) { @@ -1986,6 +1985,8 @@ static void init_single_mario(struct MarioState* m) { struct SpawnInfo* spawnInfo = &gPlayerSpawnInfos[playerIndex]; unused80339F10 = 0; + m->freeze = 0; + m->actionTimer = 0; m->framesSinceA = 0xFF; m->framesSinceB = 0xFF; @@ -2082,7 +2083,6 @@ static void init_single_mario(struct MarioState* m) { } void init_mario(void) { - gFreezeMario = 0; gInsidePainting = false; for (int i = 0; i < MAX_PLAYERS; i++) { diff --git a/src/game/obj_behaviors.c b/src/game/obj_behaviors.c index 59ade4af1..6cc9f1234 100644 --- a/src/game/obj_behaviors.c +++ b/src/game/obj_behaviors.c @@ -47,8 +47,6 @@ #define OBJ_COL_FLAG_NO_Y_VEL (1 << 3) #define OBJ_COL_FLAGS_LANDED (OBJ_COL_FLAG_GROUNDED | OBJ_COL_FLAG_NO_Y_VEL) -extern u16 gFreezeMario; - /** * Current object floor as defined in object_step. */ diff --git a/src/pc/network/packets/packet_player.c b/src/pc/network/packets/packet_player.c index 0c6a11f4e..05d47fd6e 100644 --- a/src/pc/network/packets/packet_player.c +++ b/src/pc/network/packets/packet_player.c @@ -5,6 +5,9 @@ #include "sm64.h" #include "src/audio/external.h" +#define SET_BIT(val, num) ((((u8)(val)) & 0x01) << (num)); +#define GET_BIT(val, num) (((val) >> (num)) & 0x01) + void network_send_player(void) { if (gMarioStates[0].marioObj == NULL) { return; } u32 heldSyncID = (gMarioStates[0].heldObj != NULL) @@ -14,6 +17,8 @@ void network_send_player(void) { ? gMarioStates[0].heldByObj->oSyncID : 0; + u8 customFlags = SET_BIT((gMarioStates[0].freeze > 0), 0); + struct Packet p; packet_init(&p, PACKET_PLAYER, false); packet_write(&p, &gMarioStates[0], sizeof(u32) * 24); @@ -26,7 +31,7 @@ void network_send_player(void) { packet_write(&p, &gMarioStates[0].actionArg, sizeof(u32)); packet_write(&p, &gMarioStates[0].currentRoom, sizeof(s16)); packet_write(&p, &gMarioStates[0].squishTimer, sizeof(u8)); - + packet_write(&p, &customFlags, sizeof(u8)); packet_write(&p, &heldSyncID, sizeof(u32)); packet_write(&p, &heldBySyncID, sizeof(u32)); network_send(&p); @@ -38,10 +43,11 @@ void network_receive_player(struct Packet* p) { // save previous state u32 heldSyncID = 0; u32 heldBySyncID = 0; + u16 playerIndex = gMarioStates[1].playerIndex; + u8 customFlags = 0; u32 oldAction = gMarioStates[1].action; u16 oldActionState = gMarioStates[1].actionState; u16 oldActionArg = gMarioStates[1].actionArg; - u16 playerIndex = gMarioStates[1].playerIndex; u32 oldBehParams = gMarioStates[1].marioObj->oBehParams; // load mario information from packet @@ -55,9 +61,13 @@ void network_receive_player(struct Packet* p) { packet_read(p, &gMarioStates[1].actionArg, sizeof(u32)); packet_read(p, &gMarioStates[1].currentRoom, sizeof(s16)); packet_read(p, &gMarioStates[1].squishTimer, sizeof(u8)); + packet_read(p, &customFlags, sizeof(u8)); packet_read(p, &heldSyncID, sizeof(u32)); packet_read(p, &heldBySyncID, sizeof(u32)); + // read custom flags + gMarioStates[1].freeze = GET_BIT(customFlags, 0); + // reset player index gMarioStates[1].playerIndex = playerIndex; gMarioStates[1].marioObj->oBehParams = oldBehParams;