diff --git a/gdb.exe.stackdump b/gdb.exe.stackdump new file mode 100644 index 00000000..d7357f71 --- /dev/null +++ b/gdb.exe.stackdump @@ -0,0 +1,26 @@ +Exception: STATUS_ACCESS_VIOLATION at rip=005E6C11480 +rax=0000000000000001 rbx=00000001008F5600 rcx=0000000000000000 +rdx=0000000100512B00 rsi=0000000000000000 rdi=0000000000000000 +r8 =0000000000000002 r9 =0000000000000018 r10=0000000100000000 +r11=0000000100518F91 r12=0000000000000000 r13=00000000FFFFC7A0 +r14=00000000FFFFCA18 r15=00000000FFFFCA60 +rbp=0000000180239D70 rsp=00000000FFFFC680 +program=C:\msys64\usr\bin\gdb.exe, pid 10125, thread main +cs=0033 ds=002B es=002B fs=0053 gs=002B ss=002B +Stack trace: +Frame Function Args +00180239D70 005E6C11480 (001008D6FB8, 001008F5600, 00000000000, 00800236BC0) +00180239D70 00100518EB4 (0018013E3AB, 0000000000B, 0018013E3AB, 00000000008) +00180239D70 00100518FB0 (00100580D4F, 00000000006, 00000000008, 00800181D48) +00180239D70 0010060568C (00800235610, 000FFFFCC20, 001005B2E8D, 008002353C0) +00180239D70 001005F0B81 (001005DF3A6, 001005DEA00, 0010092039D, 000000000B0) +00180239D70 0010056D17E (001005DFA1B, 00000000000, 00000000000, 00100BA1220) +00180239D70 0010056D9BC (001008D6FB8, 000FFFFCAA0, 0000000000E, 00000000040) +00180239D70 001006A5F75 (001008D6FB8, 000FFFFCAA0, 00100BBCD88, 000FFFFCA80) +00180239D70 0010059BE9D (00000000000, 00000000000, 001801B5F02, 000FFFFCC20) +000FFFFCCE0 0010059CE6D (0018013E3AB, 00000000001, 00180239780, 0000000000E) +000FFFFCCE0 0010082DCA7 (00180355C78, 00000000000, 00180058D61, 001802EE100) +000FFFFCCE0 0018004AEAA (00000000000, 00000000000, 00000000000, 00000000000) +000FFFFFFF0 00180048846 (00000000000, 00000000000, 00000000000, 00000000000) +000FFFFFFF0 001800488F4 (00000000000, 00000000000, 00000000000, 00000000000) +End of stack trace diff --git a/src/game/behavior_actions.h b/src/game/behavior_actions.h index ba6e99b1..e57974fb 100644 --- a/src/game/behavior_actions.h +++ b/src/game/behavior_actions.h @@ -2,7 +2,7 @@ #define BEHAVIOR_ACTIONS_H void spawn_mist_particles_variable(s32 count, s32 offsetY, f32 size); -void bhv_spawn_star_no_level_exit(u32); +void bhv_spawn_star_no_level_exit(struct Object*,u32); void bhv_star_door_loop_2(void); void spawn_triangle_break_particles(s16 numTris, s16 triModel, f32 triSize, s16 triAnimState); diff --git a/src/game/behaviors/mips.inc.c b/src/game/behaviors/mips.inc.c index a24cecd1..7d21df78 100644 --- a/src/game/behaviors/mips.inc.c +++ b/src/game/behaviors/mips.inc.c @@ -188,7 +188,7 @@ void bhv_mips_act_idle(void) { // Spawn a star if he was just picked up for the first time. if (o->oMipsStarStatus == MIPS_STAR_STATUS_SHOULD_SPAWN_STAR) { - bhv_spawn_star_no_level_exit(o->oBehParams2ndByte + 3); + bhv_spawn_star_no_level_exit(o, o->oBehParams2ndByte + 3); o->oMipsStarStatus = MIPS_STAR_STATUS_ALREADY_SPAWNED_STAR; } } diff --git a/src/game/behaviors/purple_switch.inc.c b/src/game/behaviors/purple_switch.inc.c index 9c210acc..b47b3c0c 100644 --- a/src/game/behaviors/purple_switch.inc.c +++ b/src/game/behaviors/purple_switch.inc.c @@ -7,6 +7,18 @@ */ void bhv_purple_switch_loop(void) { + if (o->oSyncID == 0) { + network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); + } + + u8 anyPlayerOnPlatform = FALSE; + for (int i = 0; i < MAX_PLAYERS; i++) { + if (gMarioState[i].marioObj->platform == o) { + anyPlayerOnPlatform = TRUE; + break; + } + } + UNUSED s32 unused; switch (o->oAction) { /** @@ -19,6 +31,7 @@ void bhv_purple_switch_loop(void) { if (gMarioObject->platform == o && !(gMarioStates->action & MARIO_UNKNOWN_13)) { if (lateral_dist_between_objects(o, gMarioObject) < 127.5) { o->oAction = PURPLE_SWITCH_PRESSED; + network_send_object(o); } } break; @@ -41,7 +54,7 @@ void bhv_purple_switch_loop(void) { */ case PURPLE_SWITCH_TICKING: if (o->oBehParams2ndByte != 0) { - if (o->oBehParams2ndByte == 1 && gMarioObject->platform != o) { + if (o->oBehParams2ndByte == 1 && !anyPlayerOnPlatform) { o->oAction++; } else { if (o->oTimer < 360) { @@ -71,7 +84,7 @@ void bhv_purple_switch_loop(void) { * unpressed state. */ case PURPLE_SWITCH_WAIT_FOR_MARIO_TO_GET_OFF: - if (!cur_obj_is_mario_on_platform()) { + if (!anyPlayerOnPlatform) { o->oAction = PURPLE_SWITCH_UNPRESSED; } break; diff --git a/src/game/behaviors/sparkle_spawn_star.inc.c b/src/game/behaviors/sparkle_spawn_star.inc.c index b6608708..4294a941 100644 --- a/src/game/behaviors/sparkle_spawn_star.inc.c +++ b/src/game/behaviors/sparkle_spawn_star.inc.c @@ -33,9 +33,23 @@ void set_sparkle_spawn_star_hitbox(void) { void set_home_to_mario(void) { f32 sp1C; f32 sp18; - o->oHomeX = gMarioObject->oPosX; - o->oHomeZ = gMarioObject->oPosZ; - o->oHomeY = gMarioObject->oPosY; + u8 parentIsMario = FALSE; + for (int i = 0; i < MAX_PLAYERS; i++) { + if (o->parentObj == gMarioStates[i].marioObj) { + parentIsMario = TRUE; + break; + } + } + if (parentIsMario) { + o->oHomeX = o->parentObj->oPosX; + o->oHomeZ = o->parentObj->oPosZ; + o->oHomeY = o->parentObj->oPosY; + + } else { + o->oHomeX = gMarioObject->oPosX; + o->oHomeZ = gMarioObject->oPosZ; + o->oHomeY = gMarioObject->oPosY; + } o->oHomeY += 250.0f; o->oPosY = o->oHomeY; sp1C = o->oHomeX - o->oPosX; @@ -110,8 +124,8 @@ void bhv_spawned_star_loop(void) { o->oInteractStatus = 0; } -void bhv_spawn_star_no_level_exit(u32 sp20) { - struct Object *sp1C = spawn_object(o, MODEL_STAR, bhvSpawnedStarNoLevelExit); +void bhv_spawn_star_no_level_exit(struct Object* object, u32 sp20) { + struct Object *sp1C = spawn_object(object, MODEL_STAR, bhvSpawnedStarNoLevelExit); sp1C->oBehParams = sp20 << 24; sp1C->oInteractionSubtype = INT_SUBTYPE_NO_EXIT; obj_set_angle(sp1C, 0, 0, 0); diff --git a/src/game/interaction.c b/src/game/interaction.c index aee362c7..df369892 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -760,7 +760,7 @@ u32 interact_coin(struct MarioState *m, UNUSED u32 interactType, struct Object * if (COURSE_IS_MAIN_COURSE(gCurrCourseNum) && m->numCoins - o->oDamageOrCoinValue < 100 && m->numCoins >= 100) { - bhv_spawn_star_no_level_exit(6); + bhv_spawn_star_no_level_exit(m->marioObj, 6); } if (o->oDamageOrCoinValue >= 2) { diff --git a/src/game/mario_misc.c b/src/game/mario_misc.c index 5d12f6da..95d879c7 100644 --- a/src/game/mario_misc.c +++ b/src/game/mario_misc.c @@ -131,15 +131,15 @@ static void toad_message_talking(void) { switch (gCurrentObject->oToadMessageDialogId) { case TOAD_STAR_1_DIALOG: gCurrentObject->oToadMessageDialogId = TOAD_STAR_1_DIALOG_AFTER; - bhv_spawn_star_no_level_exit(0); + bhv_spawn_star_no_level_exit(gMarioStates[0].marioObj, 0); break; case TOAD_STAR_2_DIALOG: gCurrentObject->oToadMessageDialogId = TOAD_STAR_2_DIALOG_AFTER; - bhv_spawn_star_no_level_exit(1); + bhv_spawn_star_no_level_exit(gMarioStates[0].marioObj, 1); break; case TOAD_STAR_3_DIALOG: gCurrentObject->oToadMessageDialogId = TOAD_STAR_3_DIALOG_AFTER; - bhv_spawn_star_no_level_exit(2); + bhv_spawn_star_no_level_exit(gMarioStates[0].marioObj, 2); break; } } diff --git a/src/pc/network/packets/packet_collect_coin.c b/src/pc/network/packets/packet_collect_coin.c index 66d7f80a..25bab034 100644 --- a/src/pc/network/packets/packet_collect_coin.c +++ b/src/pc/network/packets/packet_collect_coin.c @@ -101,7 +101,7 @@ void network_receive_collect_coin(struct Packet* p) { if (COURSE_IS_MAIN_COURSE(gCurrCourseNum) && gMarioStates[0].numCoins - coin->oDamageOrCoinValue < 100 && gMarioStates[0].numCoins >= 100) { - bhv_spawn_star_no_level_exit(6); + bhv_spawn_star_no_level_exit(gMarioStates[1].marioObj, 6); } return; @@ -115,7 +115,7 @@ SANITY_CHECK_COINS:; if (COURSE_IS_MAIN_COURSE(gCurrCourseNum) && oldCoinCount < 100 && gMarioStates[0].numCoins >= 100) { - bhv_spawn_star_no_level_exit(6); + bhv_spawn_star_no_level_exit(gMarioStates[1].marioObj, 6); } }