From c0fa190bb9286623363bf5f07883115f711a6d04 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Sat, 18 Sep 2021 18:55:08 -0700 Subject: [PATCH 1/4] Add ground turn circle fix --- include/config.h | 2 ++ src/game/mario_actions_moving.c | 37 ++++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/include/config.h b/include/config.h index 1b419b38..0809f625 100644 --- a/include/config.h +++ b/include/config.h @@ -76,6 +76,8 @@ #define HANGING_SPEED 12.f // Makes Mario face the direction of the analog stick directly while hanging from a ceiling, without doing "semicircles" #define TIGHTER_HANGING_CONTROLS +// Fixes Mario's turn radius by making it dependent on forward speed. +#define FIX_GROUND_TURN_RADIUS // Makes Mario turn around instantly when moving on the ground //#define SUPER_RESPONSIVE_CONTROLS // Disables fall damage diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index a24f05dd..b95f4f66 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -434,6 +434,11 @@ s32 update_decelerating_speed(struct MarioState *m) { return stopped; } +s32 analog_stick_held_back(struct MarioState *m) { + s16 intendedDYaw = m->intendedYaw - m->faceAngle[1]; + return intendedDYaw < -0x471C || intendedDYaw > 0x471C; +} + void update_walking_speed(struct MarioState *m) { f32 maxTargetSpeed; f32 targetSpeed; @@ -461,9 +466,30 @@ void update_walking_speed(struct MarioState *m) { if (m->forwardVel > 48.0f) { m->forwardVel = 48.0f; } - -#ifdef SUPER_RESPONSIVE_CONTROLS - m->faceAngle[1] = m->intendedYaw; + +#ifdef FIX_GROUND_TURN_RADIUS + if ((m->forwardVel < 0.0f) && (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX)) { + m->faceAngle[1] += 0x8000; + m->forwardVel *= -1.0f; + } + if (analog_stick_held_back(m) && (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX)) { + set_mario_action(m, ACT_TURNING_AROUND, 0); + if (m->forwardVel < 10.0f) { + m->faceAngle[1] = m->intendedYaw; + } + } else { + s16 turnRange = (0xFFF - (m->forwardVel * 0x20)); + if (turnRange < 0x800) { + turnRange = 0x800; + set_mario_action(m, ACT_TURNING_AROUND, 0); + } else if (turnRange > 0xFFF) { + turnRange = 0xFFF; + } + m->faceAngle[1] = + m->intendedYaw - approach_s32((s16)(m->intendedYaw - m->faceAngle[1]), 0, 0x800, 0x800); + } +#elif SUPER_RESPONSIVE_CONTROLS + m->faceAngle[1] = m->intendedYaw; #else m->faceAngle[1] = m->intendedYaw - approach_s32((s16)(m->intendedYaw - m->faceAngle[1]), 0, 0x800, 0x800); @@ -484,11 +510,6 @@ s32 should_begin_sliding(struct MarioState *m) { return FALSE; } -s32 analog_stick_held_back(struct MarioState *m) { - s16 intendedDYaw = m->intendedYaw - m->faceAngle[1]; - return intendedDYaw < -0x471C || intendedDYaw > 0x471C; -} - s32 check_ground_dive_or_punch(struct MarioState *m) { UNUSED s32 unused; From 1d052879b8b7cb953380683705f5390afc36a7b5 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Sat, 18 Sep 2021 19:31:25 -0700 Subject: [PATCH 2/4] More objects use OBJ_FLAG_UCODE_LARGE --- data/behavior_data.c | 108 ++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 69 deletions(-) diff --git a/data/behavior_data.c b/data/behavior_data.c index 4f8f5a05..b5a473ce 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -399,7 +399,7 @@ const BehaviorScript bhvPurpleParticle[] = { const BehaviorScript bhvGiantPole[] = { BEGIN(OBJ_LIST_POLELIKE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_INT(oInteractType, INTERACT_POLE), SET_HITBOX(/*Radius*/ 80, /*Height*/ 2100), SET_HOME(), @@ -698,7 +698,7 @@ const BehaviorScript bhvUnused05A8[] = { const BehaviorScript bhvRotatingPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST)), SET_HOME(), BEGIN_LOOP(), CALL_NATIVE(bhv_rotating_platform_loop), @@ -708,7 +708,7 @@ const BehaviorScript bhvRotatingPlatform[] = { const BehaviorScript bhvTower[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(wf_seg7_collision_tower), SET_FLOAT(oCollisionDistance, 3000), SET_FLOAT(oDrawingDistance, 20000), @@ -748,7 +748,7 @@ const BehaviorScript bhvWfBreakableWallLeft[] = { const BehaviorScript bhvKickableBoard[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(wf_seg7_collision_kickable_board), SET_HITBOX(/*Radius*/ 100, /*Height*/ 1200), SET_HURTBOX(/*Radius*/ 1, /*Height*/ 1), @@ -1210,7 +1210,7 @@ const BehaviorScript bhvRrElevatorPlatform[] = { const BehaviorScript bhvHmcElevatorPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(hmc_seg7_collision_elevator), SET_HOME(), CALL_NATIVE(bhv_elevator_init), @@ -1286,7 +1286,6 @@ const BehaviorScript bhvMistCircParticleSpawner[] = { }; const BehaviorScript bhvDirtParticleSpawner[] = { - BEGIN(OBJ_LIST_DEFAULT), BEGIN(OBJ_LIST_DEFAULT), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), CALL_NATIVE(bhv_ground_sand_init), @@ -1380,7 +1379,7 @@ const BehaviorScript bhvUkikiCage[] = { const BehaviorScript bhvBitfsSinkingPlatforms[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(bitfs_seg7_collision_sinking_platform), SET_HOME(), BEGIN_LOOP(), @@ -1427,7 +1426,7 @@ const BehaviorScript bhvBitfsTiltingInvertedPyramid[] = { const BehaviorScript bhvSquishablePlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(bitfs_seg7_collision_squishable_platform), SET_FLOAT(oCollisionDistance, 10000), CALL_NATIVE(bhv_platform_normals_init), @@ -1544,7 +1543,7 @@ const BehaviorScript bhvBlackSmokeMario[] = { BEGIN(OBJ_LIST_UNIMPORTANT), OR_INT(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), BILLBOARD(), - SET_INT(oAnimState, 4), + SET_INT(oAnimState, 4), //! burn_smoke_geo has no GEO_SWITCH_ANIM_STATE. SET_FLOAT(oGraphYOffset, 50), BEGIN_REPEAT(8), CALL_NATIVE(bhv_black_smoke_mario_loop), @@ -1776,7 +1775,7 @@ const BehaviorScript bhvHeaveHo[] = { SET_OBJ_PHYSICS(/*Wall hitbox radius*/ 200, /*Gravity*/ -400, /*Bounciness*/ -50, /*Drag strength*/ 1000, /*Friction*/ 1000, /*Buoyancy*/ 600, /*Unused*/ 0, 0), SPAWN_OBJ(/*Model*/ MODEL_NONE, /*Behavior*/ bhvHeaveHoThrowMario), SET_INT(oInteractType, INTERACT_GRABBABLE), - SET_INT(oInteractionSubtype, INT_SUBTYPE_NOT_GRABBABLE | INT_SUBTYPE_GRABS_MARIO), + SET_INT(oInteractionSubtype, (INT_SUBTYPE_NOT_GRABBABLE | INT_SUBTYPE_GRABS_MARIO)), SET_HITBOX(/*Radius*/ 120, /*Height*/ 100), SET_HOME(), SET_INT(oIntangibleTimer, 0), @@ -2003,7 +2002,7 @@ const BehaviorScript bhvBowserFlameSpawn[] = { const BehaviorScript bhvTiltingBowserLavaPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(bowser_2_seg7_collision_tilting_platform), SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oCollisionDistance, 20000), @@ -2017,7 +2016,7 @@ const BehaviorScript bhvTiltingBowserLavaPlatform[] = { const BehaviorScript bhvFallingBowserPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST | OBJ_FLAG_UCODE_LARGE)), SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oCollisionDistance, 20000), SET_HOME(), @@ -2190,7 +2189,7 @@ const BehaviorScript bhvWaterLevelPillar[] = { const BehaviorScript bhvDddWarp[] = { BEGIN(OBJ_LIST_SURFACE), - OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), + OR_INT(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), SET_FLOAT(oCollisionDistance, 30000), BEGIN_LOOP(), CALL_NATIVE(bhv_ddd_warp_loop), @@ -2348,7 +2347,7 @@ const BehaviorScript bhvVolcanoFlames[] = { const BehaviorScript bhvLllRotatingHexagonalRing[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(lll_seg7_collision_rotating_platform), BEGIN_LOOP(), CALL_NATIVE(bhv_lll_rotating_hexagonal_ring_loop), @@ -2358,7 +2357,7 @@ const BehaviorScript bhvLllRotatingHexagonalRing[] = { const BehaviorScript bhvLllSinkingRectangularPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(lll_seg7_collision_slow_tilting_platform), SET_FLOAT(oCollisionDistance, 2000), SET_HOME(), @@ -2370,7 +2369,7 @@ const BehaviorScript bhvLllSinkingRectangularPlatform[] = { const BehaviorScript bhvLllSinkingSquarePlatforms[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(lll_seg7_collision_sinking_pyramids), ADD_FLOAT(oPosY, 5), SET_FLOAT(oCollisionDistance, 2000), @@ -2462,7 +2461,7 @@ const BehaviorScript bhvLllHexagonalMesh[] = { const BehaviorScript bhvLllBowserPuzzlePiece[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST)), LOAD_COLLISION_DATA(lll_seg7_collision_puzzle_piece), SET_HOME(), SET_FLOAT(oCollisionDistance, 3000), @@ -2707,7 +2706,7 @@ const BehaviorScript bhvJrbSlidingBox[] = { const BehaviorScript bhvShipPart3[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_HOME(), BEGIN_LOOP(), CALL_NATIVE(bhv_ship_part_3_loop), @@ -2716,7 +2715,7 @@ const BehaviorScript bhvShipPart3[] = { const BehaviorScript bhvInSunkenShip3[] = { BEGIN(OBJ_LIST_SURFACE), - OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(jrb_seg7_collision_in_sunken_ship_3), SET_HOME(), SET_FLOAT(oCollisionDistance, 4000), @@ -2763,7 +2762,7 @@ const BehaviorScript bhvInSunkenShip2[] = { BEGIN(OBJ_LIST_SURFACE), LOAD_COLLISION_DATA(jrb_seg7_collision_in_sunken_ship_2), // Sunken ship - common: - OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_FLOAT(oCollisionDistance, 4000), CALL(bhvSunkenShipSetRotation), BEGIN_LOOP(), @@ -3154,7 +3153,7 @@ UNUSED static const BehaviorScript unused_1[] = { const BehaviorScript bhvStaticObject[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), BREAK(), }; @@ -3310,11 +3309,9 @@ const BehaviorScript bhvWaterDroplet[] = { const BehaviorScript bhvWaterDropletSplash[] = { BEGIN(OBJ_LIST_DEFAULT), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), -#ifndef VERSION_JP SET_INT(oFaceAnglePitch, 0), SET_INT(oFaceAngleYaw, 0), SET_INT(oFaceAngleRoll, 0), -#endif CALL_NATIVE(bhv_water_droplet_splash_init), ADD_FLOAT(oPosY, 5), SET_INT(oAnimState, -1), @@ -3328,16 +3325,9 @@ const BehaviorScript bhvWaterDropletSplash[] = { const BehaviorScript bhvBubbleSplash[] = { BEGIN(OBJ_LIST_DEFAULT), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), -#ifdef VERSION_JP - SET_FLOAT(oFaceAnglePitch, 0), - SET_FLOAT(oFaceAngleYaw, 0), - SET_FLOAT(oFaceAngleRoll, 0), -#endif -#ifndef VERSION_JP SET_INT(oFaceAnglePitch, 0), SET_INT(oFaceAngleYaw, 0), SET_INT(oFaceAngleRoll, 0), -#endif SET_INT(oAnimState, -1), CALL_NATIVE(bhv_bubble_splash_init), BEGIN_REPEAT(6), @@ -3350,18 +3340,9 @@ const BehaviorScript bhvBubbleSplash[] = { const BehaviorScript bhvIdleWaterWave[] = { BEGIN(OBJ_LIST_DEFAULT), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), -#ifdef VERSION_JP - SET_FLOAT(oFaceAnglePitch, 0), - SET_FLOAT(oFaceAngleYaw, 0), - SET_FLOAT(oFaceAngleRoll, 0), -#endif -#ifndef VERSION_JP SET_INT(oFaceAnglePitch, 0), SET_INT(oFaceAngleYaw, 0), SET_INT(oFaceAngleRoll, 0), -#endif - SET_INT(oAnimState, -1), - ADD_INT(oAnimState, 1), BEGIN_LOOP(), CALL_NATIVE(bhv_idle_water_wave_loop), ADD_INT(oAnimState, 1), @@ -3377,16 +3358,9 @@ const BehaviorScript bhvIdleWaterWave[] = { const BehaviorScript bhvObjectWaterSplash[] = { BEGIN(OBJ_LIST_UNIMPORTANT), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), -#ifdef VERSION_JP - SET_FLOAT(oFaceAnglePitch, 0), - SET_FLOAT(oFaceAngleYaw, 0), - SET_FLOAT(oFaceAngleRoll, 0), -#endif -#ifndef VERSION_JP SET_INT(oFaceAnglePitch, 0), SET_INT(oFaceAngleYaw, 0), SET_INT(oFaceAngleRoll, 0), -#endif SET_INT(oAnimState, -1), BEGIN_REPEAT(6), ADD_INT(oAnimState, 1), @@ -3437,9 +3411,9 @@ const BehaviorScript bhvWaveTrail[] = { OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), PARENT_BIT_CLEAR(oActiveParticleFlags, ACTIVE_PARTICLE_WAVE_TRAIL), // Wave trail - common: - SET_FLOAT(oFaceAnglePitch, 0), - SET_FLOAT(oFaceAngleYaw, 0), - SET_FLOAT(oFaceAngleRoll, 0), + SET_INT(oFaceAnglePitch, 0), + SET_INT(oFaceAngleYaw, 0), + SET_INT(oFaceAngleRoll, 0), SET_INT(oAnimState, -1), BEGIN_REPEAT(8), ADD_INT(oAnimState, 1), @@ -3463,7 +3437,7 @@ const BehaviorScript bhvTinyStrongWindParticle[] = { // Strong wind particles generated by the Snowman and Fwoosh that blow Mario back and knock his cap off. const BehaviorScript bhvStrongWindParticle[] = { - BEGIN(OBJ_LIST_POLELIKE), + BEGIN(OBJ_LIST_POLELIKE), //? OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), BILLBOARD(), BEGIN_LOOP(), @@ -3613,7 +3587,7 @@ const BehaviorScript bhvRandomAnimatedTexture[] = { const BehaviorScript bhvYellowBackgroundInMenu[] = { BEGIN(OBJ_LIST_LEVEL), - OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), CALL_NATIVE(beh_yellow_background_menu_init), BEGIN_LOOP(), SET_INT(oIntangibleTimer, 0), @@ -3963,12 +3937,10 @@ const BehaviorScript bhvObjectBubble[] = { const BehaviorScript bhvObjectWaterWave[] = { BEGIN(OBJ_LIST_UNIMPORTANT), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), - SET_FLOAT(oFaceAnglePitch, 0), - SET_FLOAT(oFaceAngleYaw, 0), - SET_FLOAT(oFaceAngleRoll, 0), - SET_INT(oAnimState, -1), + SET_INT(oFaceAnglePitch, 0), + SET_INT(oFaceAngleYaw, 0), + SET_INT(oFaceAngleRoll, 0), CALL_NATIVE(bhv_object_water_wave_init), - ADD_INT(oAnimState, 1), DELAY(6), BEGIN_LOOP(), CALL_NATIVE(bhv_object_water_wave_loop), @@ -4367,7 +4339,7 @@ const BehaviorScript bhvThiBowlingBallSpawner[] = { const BehaviorScript bhvRrCruiserWing[] = { BEGIN(OBJ_LIST_DEFAULT), - OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), CALL_NATIVE(bhv_rr_cruiser_wing_init), BEGIN_LOOP(), CALL_NATIVE(bhv_rr_cruiser_wing_loop), @@ -4398,7 +4370,7 @@ const BehaviorScript bhvSslMovingPyramidWall[] = { const BehaviorScript bhvPyramidElevator[] = { BEGIN(OBJ_LIST_SURFACE), - OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(ssl_seg7_collision_pyramid_elevator), SET_HOME(), SET_FLOAT(oCollisionDistance, 20000), @@ -4420,7 +4392,7 @@ const BehaviorScript bhvPyramidElevatorTrajectoryMarkerBall[] = { const BehaviorScript bhvPyramidTop[] = { BEGIN(OBJ_LIST_SURFACE), - OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(ssl_seg7_collision_pyramid_top), SET_HOME(), SET_FLOAT(oCollisionDistance, 20000), @@ -4676,7 +4648,7 @@ const BehaviorScript bhvHiddenStarTrigger[] = { const BehaviorScript bhvTtmRollingLog[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(ttm_seg7_collision_pitoune_2), SET_HOME(), SET_FLOAT(oCollisionDistance, 2000), @@ -4700,7 +4672,7 @@ const BehaviorScript bhvLllVolcanoFallingTrap[] = { const BehaviorScript bhvLllRollingLog[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(lll_seg7_collision_pitoune), SET_HOME(), SET_FLOAT(oCollisionDistance, 2000), @@ -5238,7 +5210,7 @@ const BehaviorScript bhvWoodenPost[] = { const BehaviorScript bhvChainChompGate[] = { BEGIN(OBJ_LIST_SURFACE), LOAD_COLLISION_DATA(bob_seg7_collision_chain_chomp_gate), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), CALL_NATIVE(bhv_chain_chomp_gate_init), BEGIN_LOOP(), CALL_NATIVE(bhv_chain_chomp_gate_update), @@ -5431,7 +5403,7 @@ const BehaviorScript bhvWaterBombSpawner[] = { const BehaviorScript bhvWaterBomb[] = { BEGIN(OBJ_LIST_GENACTOR), - OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), + OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), SET_OBJ_PHYSICS(/*Wall hitbox radius*/ 120, /*Gravity*/ -400, /*Bounciness*/ 0, /*Drag strength*/ 1000, /*Friction*/ 1000, /*Buoyancy*/ 200, /*Unused*/ 0, 0), BEGIN_LOOP(), CALL_NATIVE(bhv_water_bomb_update), @@ -5543,7 +5515,7 @@ const BehaviorScript bhvTTCElevator[] = { const BehaviorScript bhvTTC2DRotator[] = { BEGIN(OBJ_LIST_SURFACE), LOAD_COLLISION_DATA(ttc_seg7_collision_clock_main_rotation), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_FLOAT(oCollisionDistance, 1800), CALL_NATIVE(bhv_ttc_2d_rotator_init), BEGIN_LOOP(), @@ -5605,7 +5577,7 @@ const BehaviorScript bhvSlidingPlatform2[] = { const BehaviorScript bhvOctagonalPlatformRotating[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), CALL_NATIVE(bhv_rotating_octagonal_plat_init), BEGIN_LOOP(), CALL_NATIVE(bhv_rotating_octagonal_plat_loop), @@ -5985,7 +5957,7 @@ const BehaviorScript bhvSkeeterWave[] = { const BehaviorScript bhvSwingPlatform[] = { BEGIN(OBJ_LIST_SURFACE), LOAD_COLLISION_DATA(rr_seg7_collision_pendulum), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_FLOAT(oCollisionDistance, 2000), CALL_NATIVE(bhv_swing_platform_init), BEGIN_LOOP(), @@ -6070,7 +6042,7 @@ const BehaviorScript bhvBeginningLakitu[] = { OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), LOAD_ANIMATIONS(oAnimations, lakitu_seg6_anims_060058F8), ANIMATE(0), - SET_FLOAT(oOpacity, 0), + SET_INT(oOpacity, 0), BEGIN_LOOP(), CALL_NATIVE(bhv_intro_lakitu_loop), END_LOOP(), @@ -6113,5 +6085,3 @@ const BehaviorScript bhvIntroScene[] = { CALL_NATIVE(bhv_intro_scene_loop), END_LOOP(), }; - - From de0d09500c48ce2ec2a85773b342f9b3d011d189 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Sun, 19 Sep 2021 00:29:16 -0700 Subject: [PATCH 3/4] More OBJ_FLAG_UCODE_LARGE usage --- data/behavior_data.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/data/behavior_data.c b/data/behavior_data.c index b5a473ce..fe9cde10 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -698,7 +698,7 @@ const BehaviorScript bhvUnused05A8[] = { const BehaviorScript bhvRotatingPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST)), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST | OBJ_FLAG_UCODE_LARGE)), SET_HOME(), BEGIN_LOOP(), CALL_NATIVE(bhv_rotating_platform_loop), @@ -778,7 +778,7 @@ const BehaviorScript bhvRotatingCounterClockwise[] = { const BehaviorScript bhvWfRotatingWoodenPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(wf_seg7_collision_clocklike_rotation), BEGIN_LOOP(), CALL_NATIVE(bhv_wf_rotating_wooden_platform_loop), @@ -1390,7 +1390,7 @@ const BehaviorScript bhvBitfsSinkingPlatforms[] = { const BehaviorScript bhvBitfsSinkingCagePlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(bitfs_seg7_collision_sinking_cage_platform), SET_HOME(), SPAWN_CHILD(/*Model*/ MODEL_BITFS_BLUE_POLE, /*Behavior*/ bhvDddMovingPole), @@ -1402,7 +1402,7 @@ const BehaviorScript bhvBitfsSinkingCagePlatform[] = { const BehaviorScript bhvDddMovingPole[] = { BEGIN(OBJ_LIST_POLELIKE), - OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), + OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_INT(oInteractType, INTERACT_POLE), SET_HITBOX(/*Radius*/ 80, /*Height*/ 710), SET_INT(oIntangibleTimer, 0), @@ -2461,7 +2461,7 @@ const BehaviorScript bhvLllHexagonalMesh[] = { const BehaviorScript bhvLllBowserPuzzlePiece[] = { BEGIN(OBJ_LIST_SURFACE), - OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(lll_seg7_collision_puzzle_piece), SET_HOME(), SET_FLOAT(oCollisionDistance, 3000), @@ -4240,7 +4240,7 @@ const BehaviorScript bhvLargeBomp[] = { const BehaviorScript bhvWfSlidingPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(wf_seg7_collision_sliding_brick_platform), CALL_NATIVE(bhv_wf_sliding_platform_init), BEGIN_LOOP(), @@ -4854,7 +4854,7 @@ const BehaviorScript bhvSnowMoundSpawn[] = { const BehaviorScript bhvWdwSquareFloatingPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(wdw_seg7_collision_square_floating_platform), SET_FLOAT(oFloatingPlatformUnkFC, 64), SET_HOME(), @@ -4866,7 +4866,7 @@ const BehaviorScript bhvWdwSquareFloatingPlatform[] = { const BehaviorScript bhvWdwRectangularFloatingPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(wdw_seg7_collision_rect_floating_platform), SET_FLOAT(oFloatingPlatformUnkFC, 64), SET_HOME(), @@ -4878,7 +4878,7 @@ const BehaviorScript bhvWdwRectangularFloatingPlatform[] = { const BehaviorScript bhvJrbFloatingPlatform[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_COLLISION_DATA(jrb_seg7_collision_floating_platform), SET_FLOAT(oFloatingPlatformUnkFC, 64), SET_HOME(), @@ -5421,7 +5421,7 @@ const BehaviorScript bhvWaterBombShadow[] = { const BehaviorScript bhvTTCRotatingSolid[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_HOME(), SET_FLOAT(oCollisionDistance, 450), CALL_NATIVE(bhv_ttc_rotating_solid_init), @@ -5566,7 +5566,7 @@ const BehaviorScript bhvMrBlizzardSnowball[] = { const BehaviorScript bhvSlidingPlatform2[] = { BEGIN(OBJ_LIST_SURFACE), - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), SET_HOME(), CALL_NATIVE(bhv_sliding_plat_2_init), BEGIN_LOOP(), From cd34c5fff778e0c00e865f191a6c2bce3a415e05 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Sun, 19 Sep 2021 13:57:13 +0100 Subject: [PATCH 4/4] Crash screen now has multiple pages Can be moved with L and R --- src/game/crash_screen.c | 187 ++++++++++++++++++++++++++-------------- src/game/game_init.c | 7 +- 2 files changed, 126 insertions(+), 68 deletions(-) diff --git a/src/game/crash_screen.c b/src/game/crash_screen.c index d2b274b8..5fd4749b 100644 --- a/src/game/crash_screen.c +++ b/src/game/crash_screen.c @@ -6,11 +6,19 @@ #include "types.h" #include "puppyprint.h" #include "audio/external.h" +#include "game_init.h" +#include "main.h" #include "sm64.h" #include "printf.h" +enum crashPages { + PAGE_STACK, + PAGE_LOG, + PAGE_COUNT +}; + u8 gCrashScreenCharToGlyph[128] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, -1, -1, 43, -1, -1, 37, 38, -1, 42, @@ -24,6 +32,9 @@ u32 gCrashScreenFont[7 * 9 + 1] = { #include "textures/crash_custom/crash_screen_font.ia1.inc.c" }; +u8 crashPage = 0; +u8 updateBuffer = TRUE; + char *gCauseDesc[18] = { "Interrupt", @@ -73,7 +84,7 @@ void crash_screen_draw_rect(s32 x, s32 y, s32 w, s32 h) { for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { // 0xe738 = 0b1110011100111000 - *ptr = ((*ptr & 0xe738) >> 2) | 1; + *ptr = ((*ptr & 0xE738) >> 2) | 1; ptr++; } ptr += gCrashScreen.width - w; @@ -95,7 +106,7 @@ void crash_screen_draw_glyph(s32 x, s32 y, s32 glyph) { rowMask = *data++; for (j = 0; j < 6; j++) { - *ptr++ = (bit & rowMask) ? 0xffff : 1; + *ptr++ = (bit & rowMask) ? 0xFFFF : 1; bit >>= 1; } ptr += gCrashScreen.width - 6; @@ -150,8 +161,8 @@ void crash_screen_print_float_reg(s32 x, s32 y, s32 regNum, void *addr) { s32 exponent; bits = *(u32 *) addr; - exponent = ((bits & 0x7f800000U) >> 0x17) - 0x7f; - if ((exponent >= -0x7e && exponent <= 0x7f) || bits == 0) { + exponent = ((bits & 0x7f800000U) >> 0x17) - 0x7F; + if ((exponent >= -0x7E && exponent <= 0x7F) || bits == 0) { crash_screen_print(x, y, "F%02d:%.3e", regNum, *(f32 *) addr); } else { crash_screen_print(x, y, "F%02d:---------", regNum); @@ -173,49 +184,24 @@ void crash_screen_print_fpcsr(u32 fpcsr) { } } -void draw_crash_screen(OSThread *thread) { - s16 cause; +void draw_crash_stack(OSThread *thread, s32 cause) +{ __OSThreadContext *tc = &thread->context; - cause = (tc->cause >> 2) & 0x1f; - if (cause == 23) // EXC_WATCH - { - cause = 16; - } - if (cause == 31) // EXC_VCED - { - cause = 17; - } - - osWritebackDCacheAll(); - crash_screen_sleep(500); crash_screen_draw_rect(25, 20, 270, 25); crash_screen_print(30, 25, "THREAD:%d (%s)", thread->id, gCauseDesc[cause]); -#if !PUPPYPRINT_DEBUG crash_screen_print(30, 35, "PC:%08XH SR:%08XH VA:%08XH", tc->pc, tc->sr, tc->badvaddr); -#else - crash_screen_print(30, 35, "PC:%08XH SR:%08XH RA:%08XH", tc->pc, tc->sr, (u32) tc->ra); -#endif + osWritebackDCacheAll(); crash_screen_draw_rect(25, 45, 270, 185); -#if !PUPPYPRINT_DEBUG - crash_screen_print(30, 50, "AT:%08XH V0:%08XH V1:%08XH", (u32) tc->at, (u32) tc->v0, - (u32) tc->v1); - crash_screen_print(30, 60, "A0:%08XH A1:%08XH A2:%08XH", (u32) tc->a0, (u32) tc->a1, - (u32) tc->a2); - crash_screen_print(30, 70, "A3:%08XH T0:%08XH T1:%08XH", (u32) tc->a3, (u32) tc->t0, - (u32) tc->t1); - crash_screen_print(30, 80, "T2:%08XH T3:%08XH T4:%08XH", (u32) tc->t2, (u32) tc->t3, - (u32) tc->t4); - crash_screen_print(30, 90, "T5:%08XH T6:%08XH T7:%08XH", (u32) tc->t5, (u32) tc->t6, - (u32) tc->t7); - crash_screen_print(30, 100, "S0:%08XH S1:%08XH S2:%08XH", (u32) tc->s0, (u32) tc->s1, - (u32) tc->s2); - crash_screen_print(30, 110, "S3:%08XH S4:%08XH S5:%08XH", (u32) tc->s3, (u32) tc->s4, - (u32) tc->s5); - crash_screen_print(30, 120, "S6:%08XH S7:%08XH T8:%08XH", (u32) tc->s6, (u32) tc->s7, - (u32) tc->t8); - crash_screen_print(30, 130, "T9:%08XH GP:%08XH SP:%08XH", (u32) tc->t9, (u32) tc->gp, - (u32) tc->sp); + crash_screen_print(30, 50, "AT:%08XH V0:%08XH V1:%08XH", (u32) tc->at, (u32) tc->v0, (u32) tc->v1); + crash_screen_print(30, 60, "A0:%08XH A1:%08XH A2:%08XH", (u32) tc->a0, (u32) tc->a1, (u32) tc->a2); + crash_screen_print(30, 70, "A3:%08XH T0:%08XH T1:%08XH", (u32) tc->a3, (u32) tc->t0, (u32) tc->t1); + crash_screen_print(30, 80, "T2:%08XH T3:%08XH T4:%08XH", (u32) tc->t2, (u32) tc->t3, (u32) tc->t4); + crash_screen_print(30, 90, "T5:%08XH T6:%08XH T7:%08XH", (u32) tc->t5, (u32) tc->t6, (u32) tc->t7); + crash_screen_print(30, 100, "S0:%08XH S1:%08XH S2:%08XH", (u32) tc->s0, (u32) tc->s1, (u32) tc->s2); + crash_screen_print(30, 110, "S3:%08XH S4:%08XH S5:%08XH", (u32) tc->s3, (u32) tc->s4, (u32) tc->s5); + crash_screen_print(30, 120, "S6:%08XH S7:%08XH T8:%08XH", (u32) tc->s6, (u32) tc->s7, (u32) tc->t8); + crash_screen_print(30, 130, "T9:%08XH GP:%08XH SP:%08XH", (u32) tc->t9, (u32) tc->gp, (u32) tc->sp); crash_screen_print(30, 140, "S8:%08XH RA:%08XH", (u32) tc->s8, (u32) tc->ra); crash_screen_print_fpcsr(tc->fpcsr); @@ -236,18 +222,75 @@ void draw_crash_screen(OSThread *thread) { crash_screen_print_float_reg(120, 210, 26, &tc->fp26.f.f_even); crash_screen_print_float_reg(210, 210, 28, &tc->fp28.f.f_even); crash_screen_print_float_reg(30, 220, 30, &tc->fp30.f.f_even); -#else +} + +void draw_crash_log(OSThread *thread, s32 cause) +{ +#if PUPPYPRINT_DEBUG s32 i; -#define LINE_HEIGHT 60 + ((LOG_BUFFER_SIZE-1)*10) + + crash_screen_draw_rect(25, 20, 270, 210); + osWritebackDCacheAll(); +#define LINE_HEIGHT 25 + ((LOG_BUFFER_SIZE-1)*10) for (i = 0; i < LOG_BUFFER_SIZE; i++) { crash_screen_print(30, (LINE_HEIGHT)-(i*10), consoleLogTable[i]); } #undef LINE_HEIGHT #endif - osWritebackDCacheAll(); - osViBlack(FALSE); - osViSwapBuffer(gCrashScreen.framebuffer); +} + + +void draw_crash_screen(OSThread *thread) +{ + s32 cause; + __OSThreadContext *tc = &thread->context; + + cause = (tc->cause >> 2) & 0x1F; + if (cause == 23) // EXC_WATCH + { + cause = 16; + } + if (cause == 31) // EXC_VCED + { + cause = 17; + } + + if (gPlayer1Controller->buttonPressed & R_TRIG) + { + crashPage++; + updateBuffer = TRUE; + } + if (gPlayer1Controller->buttonPressed & L_TRIG || gPlayer1Controller->buttonPressed & Z_TRIG) + { + crashPage--; + updateBuffer = TRUE; + } + +#if !PUPPYPRINT_DEBUG + if (crashPage == PAGE_LOG) + crashPage++; +#endif + + if (crashPage >= PAGE_COUNT) + crashPage = 0; + if (crashPage == 255) + crashPage = PAGE_COUNT-1; + + if (updateBuffer) + { + crash_screen_print(15, 10, "Page:%d L/Z: Left R: Right", crashPage); + switch (crashPage) + { + case PAGE_STACK: draw_crash_stack(thread, cause); break; + case PAGE_LOG: draw_crash_log(thread, cause); break; + } + + osWritebackDCacheAll(); + osViBlack(FALSE); + osViSwapBuffer(gCrashScreen.framebuffer); + updateBuffer = FALSE; + } } OSThread *get_crashed_thread(void) { @@ -267,6 +310,7 @@ OSThread *get_crashed_thread(void) { extern u16 sRenderedFramebuffer; extern void audio_signal_game_loop_tick(void); extern void stop_sounds_in_continuous_banks(void); +extern void read_controller_inputs(s32 threadID); extern struct SequenceQueueItem sBackgroundMusicQueue[6]; void thread2_crash_screen(UNUSED void *arg) { @@ -275,34 +319,47 @@ void thread2_crash_screen(UNUSED void *arg) { osSetEventMesg(OS_EVENT_CPU_BREAK, &gCrashScreen.mesgQueue, (OSMesg) 1); osSetEventMesg(OS_EVENT_FAULT, &gCrashScreen.mesgQueue, (OSMesg) 2); - do { -#if PUPPYPRINT_DEBUG - OSTime first = osGetTime(); -#endif - osRecvMesg(&gCrashScreen.mesgQueue, &mesg, 1); - thread = get_crashed_thread(); - gCrashScreen.framebuffer = (u16 *) gFrameBuffers[sRenderedFramebuffer]; -#if PUPPYPRINT_DEBUG - profiler_update(faultTime, first); -#endif - } while (thread == NULL); + goto finished; + reset: gCrashScreen.thread.priority = 15; stop_sounds_in_continuous_banks(); stop_background_music(sBackgroundMusicQueue[0].seqId); audio_signal_game_loop_tick(); - draw_crash_screen(thread); + crash_screen_sleep(200); play_sound(SOUND_MARIO_WAAAOOOW, gGlobalSoundSource); audio_signal_game_loop_tick(); - for (;;) { + crash_screen_sleep(200); + finished: + while (TRUE) + { +#if PUPPYPRINT_DEBUG + OSTime first = osGetTime(); +#endif + if (thread == NULL) + { + osRecvMesg(&gCrashScreen.mesgQueue, &mesg, 1); + thread = get_crashed_thread(); + gCrashScreen.framebuffer = (u16 *) gFrameBuffers[sRenderedFramebuffer]; + if (thread) + goto reset; + } + else + { + if (gControllerBits) { +#if ENABLE_RUMBLE + block_until_rumble_pak_free(); +#endif + osContStartReadData(&gSIEventMesgQueue); + } + read_controller_inputs(2); + draw_crash_screen(thread); + } +#if PUPPYPRINT_DEBUG + profiler_update(faultTime, first); +#endif } } -void crash_screen_set_framebuffer(u16 *framebuffer, u16 width, u16 height) { - gCrashScreen.framebuffer = framebuffer; - gCrashScreen.width = width; - gCrashScreen.height = height; -} - void crash_screen_init(void) { gCrashScreen.framebuffer = (u16 *) gFrameBuffers[sRenderedFramebuffer]; gCrashScreen.width = SCREEN_WIDTH; diff --git a/src/game/game_init.c b/src/game/game_init.c index 4817f1fb..a5916bfa 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -577,12 +577,13 @@ void run_demo_inputs(void) { /** * Update the controller struct with available inputs if present. */ -void read_controller_inputs(void) { +void read_controller_inputs(s32 threadID) { s32 i; // If any controllers are plugged in, update the controller information. if (gControllerBits) { - osRecvMesg(&gSIEventMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK); + if (threadID == 5) + osRecvMesg(&gSIEventMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK); osContGetReadData(&gControllerPads[0]); #if ENABLE_RUMBLE release_rumble_pak_control(); @@ -765,7 +766,7 @@ void thread5_game_loop(UNUSED void *arg) { audio_game_loop_tick(); select_gfx_pool(); - read_controller_inputs(); + read_controller_inputs(5); addr = level_script_execute(addr); #if PUPPYPRINT_DEBUG == 0 && defined(VISUAL_DEBUG) debug_box_input();