diff --git a/data/behavior_data.c b/data/behavior_data.c index 4b27c52da..cdb2792c4 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -901,6 +901,7 @@ const BehaviorScript bhvCoinFormationSpawnedCoin[] = { BEGIN(OBJ_LIST_LEVEL), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), BILLBOARD(), + CALL_NATIVE(bhv_init_room), BEGIN_LOOP(), CALL_NATIVE(bhv_coin_formation_spawned_coin_loop), END_LOOP(), @@ -1983,7 +1984,7 @@ const BehaviorScript bhvTiltingBowserLavaPlatform[] = { LOAD_COLLISION_DATA(bowser_2_seg7_collision_tilting_platform), SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oCollisionDistance, 20000), - SET_INT(oFaceAngleYaw, 0), + SET_INT(oFaceAngleYaw, 0x0), SET_HOME(), BEGIN_LOOP(), CALL_NATIVE(cur_obj_rotate_face_angle_using_vel), @@ -3220,9 +3221,9 @@ const BehaviorScript bhvWaterDroplet[] = { const BehaviorScript bhvWaterDropletSplash[] = { BEGIN(OBJ_LIST_UNIMPORTANT), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), - SET_INT(oFaceAnglePitch, 0), - SET_INT(oFaceAngleYaw, 0), - SET_INT(oFaceAngleRoll, 0), + SET_INT(oFaceAnglePitch, 0x0), + SET_INT(oFaceAngleYaw, 0x0), + SET_INT(oFaceAngleRoll, 0x0), CALL_NATIVE(bhv_water_droplet_splash_init), ADD_FLOAT(oPosY, 5), SET_INT(oAnimState, OBJ_ANIM_STATE_INIT_ANIM), @@ -3236,9 +3237,9 @@ const BehaviorScript bhvWaterDropletSplash[] = { const BehaviorScript bhvBubbleSplash[] = { BEGIN(OBJ_LIST_UNIMPORTANT), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), - SET_INT(oFaceAnglePitch, 0), - SET_INT(oFaceAngleYaw, 0), - SET_INT(oFaceAngleRoll, 0), + SET_INT(oFaceAnglePitch, 0x0), + SET_INT(oFaceAngleYaw, 0x0), + SET_INT(oFaceAngleRoll, 0x0), SET_INT(oAnimState, OBJ_ANIM_STATE_INIT_ANIM), CALL_NATIVE(bhv_bubble_splash_init), BEGIN_REPEAT(6), @@ -3251,9 +3252,9 @@ const BehaviorScript bhvBubbleSplash[] = { const BehaviorScript bhvIdleWaterWave[] = { BEGIN(OBJ_LIST_DEFAULT), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), - SET_INT(oFaceAnglePitch, 0), - SET_INT(oFaceAngleYaw, 0), - SET_INT(oFaceAngleRoll, 0), + SET_INT(oFaceAnglePitch, 0x0), + SET_INT(oFaceAngleYaw, 0x0), + SET_INT(oFaceAngleRoll, 0x0), BEGIN_LOOP(), CALL_NATIVE(bhv_idle_water_wave_loop), ADD_INT(oAnimState, 1), @@ -3268,9 +3269,9 @@ const BehaviorScript bhvIdleWaterWave[] = { const BehaviorScript bhvObjectWaterSplash[] = { BEGIN(OBJ_LIST_UNIMPORTANT), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), - SET_INT(oFaceAnglePitch, 0), - SET_INT(oFaceAngleYaw, 0), - SET_INT(oFaceAngleRoll, 0), + SET_INT(oFaceAnglePitch, 0x0), + SET_INT(oFaceAngleYaw, 0x0), + SET_INT(oFaceAngleRoll, 0x0), SET_INT(oAnimState, OBJ_ANIM_STATE_INIT_ANIM), BEGIN_REPEAT(6), ADD_INT(oAnimState, 1), @@ -3320,9 +3321,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_INT(oFaceAnglePitch, 0), - SET_INT(oFaceAngleYaw, 0), - SET_INT(oFaceAngleRoll, 0), + SET_INT(oFaceAnglePitch, 0x0), + SET_INT(oFaceAngleYaw, 0x0), + SET_INT(oFaceAngleRoll, 0x0), SET_INT(oAnimState, OBJ_ANIM_STATE_INIT_ANIM), BEGIN_REPEAT(8), ADD_INT(oAnimState, 1), @@ -3823,9 +3824,9 @@ const BehaviorScript bhvObjectBubble[] = { const BehaviorScript bhvObjectWaterWave[] = { BEGIN(OBJ_LIST_UNIMPORTANT), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), - SET_INT(oFaceAnglePitch, 0), - SET_INT(oFaceAngleYaw, 0), - SET_INT(oFaceAngleRoll, 0), + SET_INT(oFaceAnglePitch, 0x0), + SET_INT(oFaceAngleYaw, 0x0), + SET_INT(oFaceAngleRoll, 0x0), CALL_NATIVE(bhv_object_water_wave_init), DELAY(6), BEGIN_LOOP(), @@ -5621,7 +5622,7 @@ const BehaviorScript bhvFlyingBookend[] = { LOAD_ANIMATIONS(oAnimations, bookend_seg5_anims_05002540), ANIMATE(FLYING_BOOKEND_ANIM_SPAWN), SET_OBJ_PHYSICS(/*Wall hitbox radius*/ 60, /*Gravity*/ 0, /*Bounciness*/ -50, /*Drag strength*/ 1000, /*Friction*/ 1000, /*Buoyancy*/ 200, /*Unused*/ 0, 0), - SET_INT(oMoveFlags, 0), + SET_INT(oMoveFlags, OBJ_MOVE_NONE), SCALE(/*Unused*/ 0, /*Field*/ 70), CALL_NATIVE(bhv_init_room), BEGIN_LOOP(), diff --git a/include/config/config_debug.h b/include/config/config_debug.h index 44a1076ef..16d50a28c 100644 --- a/include/config/config_debug.h +++ b/include/config/config_debug.h @@ -43,6 +43,10 @@ // Open all courses and doors. Used for debugging purposes to unlock all content. #define UNLOCK_ALL +// Same as above, but also reads all save file flags as complete. +// This will not overwrite existing save file data unless you save over it. +//#define COMPLETE_SAVE_FILE + // Removes the limit on FPS //#define UNLOCK_FPS @@ -51,6 +55,10 @@ // -- Compatibility safeguards. Don't mess with these unless you know what you're doing. -- +#ifdef COMPLETE_SAVE_FILE +#define UNLOCK_ALL +#endif // COMPLETE_SAVE_FILE + #ifdef DEBUG_ALL #define DEBUG_LEVEL_SELECT #define ENABLE_DEBUG_FREE_MOVE @@ -58,6 +66,7 @@ #define PUPPYPRINT_DEBUG 1 #define VISUAL_DEBUG #define UNLOCK_ALL +#define COMPLETE_SAVE_FILE #endif // DEBUG_ALL #ifdef DISABLE_ALL @@ -71,5 +80,6 @@ #undef PUPPYPRINT_DEBUG_CYCLES #undef VISUAL_DEBUG #undef UNLOCK_ALL +#undef COMPLETE_SAVE_FILE #undef DEBUG_FORCE_CRASH_ON_BOOT #endif // DISABLE_ALL diff --git a/src/game/behaviors/coin.inc.c b/src/game/behaviors/coin.inc.c index 5129e377d..32ead316e 100644 --- a/src/game/behaviors/coin.inc.c +++ b/src/game/behaviors/coin.inc.c @@ -140,7 +140,6 @@ void bhv_coin_formation_spawned_coin_loop(void) { if (o->oTimer == 0) { cur_obj_set_behavior(bhvYellowCoin); obj_set_hitbox(o, &sYellowCoinHitbox); - bhv_init_room(); if (o->oCoinSnapToGround) { o->oPosY += 300.0f; cur_obj_update_floor_height(); diff --git a/src/game/behaviors/exclamation_box.inc.c b/src/game/behaviors/exclamation_box.inc.c index bad98caff..6533f091c 100644 --- a/src/game/behaviors/exclamation_box.inc.c +++ b/src/game/behaviors/exclamation_box.inc.c @@ -46,7 +46,7 @@ void bhv_rotating_exclamation_mark_loop(void) { } void exclamation_box_act_init(void) { - if (o->oBehParams2ndByte < 3) { + if (o->oBehParams2ndByte < EXCLAMATION_BOX_BP_KOOPA_SHELL) { o->oAnimState = o->oBehParams2ndByte; if ((save_file_get_flags() & sCapSaveFlags[o->oBehParams2ndByte]) || GET_BPARAM1(o->oBehParams) != 0x00) { o->oAction = EXCLAMATION_BOX_ACT_ACTIVE; diff --git a/src/game/behaviors/spiny.inc.c b/src/game/behaviors/spiny.inc.c index bfb80c546..26029d939 100644 --- a/src/game/behaviors/spiny.inc.c +++ b/src/game/behaviors/spiny.inc.c @@ -73,13 +73,12 @@ static void spiny_act_walk(void) { o->oSpinyTurningAwayFromWall = obj_resolve_collisions_and_turn(o->oSpinyTargetYaw, 0x80); } else { - if (!(o->oSpinyTurningAwayFromWall = - obj_bounce_off_walls_edges_objects(&o->oSpinyTargetYaw))) { + if (!(o->oSpinyTurningAwayFromWall = obj_bounce_off_walls_edges_objects(&o->oSpinyTargetYaw))) { // Walk and occasionally randomly change direction if (o->oSpinyTimeUntilTurn != 0) { o->oSpinyTimeUntilTurn--; } else { - o->oSpinyTargetYaw = o->oMoveAngleYaw + (s16) random_sign() * 0x2000; + o->oSpinyTargetYaw = (o->oMoveAngleYaw + ((s16) random_sign() * 0x2000)); o->oSpinyTimeUntilTurn = random_linear_offset(100, 100); } } @@ -98,7 +97,7 @@ static void spiny_act_walk(void) { // When attacked by mario, lessen the knockback o->oAction = SPINY_ACT_WALK; o->oForwardVel *= 0.1f; - o->oVelY *= 0.7f; + o->oVelY *= 0.7f; o->oMoveFlags = 0; // weird flex but okay @@ -118,8 +117,8 @@ static void spiny_act_held_by_lakitu(void) { o->oGraphYOffset = 15.0f; cur_obj_init_animation_with_sound(0); - o->oParentRelativePosX = -50.0f; - o->oParentRelativePosY = 35.0f; + o->oParentRelativePosX = -50.0f; + o->oParentRelativePosY = 35.0f; o->oParentRelativePosZ = -100.0f; if (o->parentObj->prevObj == NULL) { @@ -127,8 +126,7 @@ static void spiny_act_held_by_lakitu(void) { o->oMoveAngleYaw = o->parentObj->oFaceAngleYaw; // Move more quickly if the lakitu is moving forward - o->oForwardVel = - o->parentObj->oForwardVel * coss(o->oMoveAngleYaw - o->parentObj->oMoveAngleYaw) + 10.0f; + o->oForwardVel = ((o->parentObj->oForwardVel * coss(o->oMoveAngleYaw - o->parentObj->oMoveAngleYaw)) + 10.0f); o->oVelY = 30.0f; o->oMoveFlags = 0; // you do you, spiny @@ -161,7 +159,7 @@ static void spiny_act_thrown_by_lakitu(void) { cur_obj_move_standard(-78); - if (obj_check_attacks(&sSpinyHitbox, o->oAction) != 0 && o->parentObj != o) { + if ((obj_check_attacks(&sSpinyHitbox, o->oAction) != 0) && (o->parentObj != o)) { o->parentObj->oEnemyLakituNumSpinies--; } } diff --git a/src/game/behaviors/ukiki.inc.c b/src/game/behaviors/ukiki.inc.c index d56932950..91165dab1 100644 --- a/src/game/behaviors/ukiki.inc.c +++ b/src/game/behaviors/ukiki.inc.c @@ -464,7 +464,8 @@ void ukiki_free_loop(void) { cur_obj_update_floor_and_walls(); cur_obj_call_action_function(sUkikiActions); - if (o->oAction == UKIKI_ACT_GO_TO_CAGE || o->oAction == UKIKI_ACT_RETURN_HOME) { + if ((o->oAction == UKIKI_ACT_GO_TO_CAGE) + || (o->oAction == UKIKI_ACT_RETURN_HOME)) { steepSlopeAngleDegrees = -88; } else { steepSlopeAngleDegrees = -20; diff --git a/src/game/save_file.c b/src/game/save_file.c index 8cd166156..305a094b5 100644 --- a/src/game/save_file.c +++ b/src/game/save_file.c @@ -540,6 +540,10 @@ u32 save_file_get_max_coin_score(s32 courseIndex) { return ((maxScoreFileNum << 16) + MAX(maxCoinScore, 0)); } +#ifdef COMPLETE_SAVE_FILE +s32 save_file_get_course_star_count(UNUSED s32 fileIndex, UNUSED s32 courseIndex) { + return 7; +#else s32 save_file_get_course_star_count(s32 fileIndex, s32 courseIndex) { s32 i; s32 count = 0; @@ -552,6 +556,7 @@ s32 save_file_get_course_star_count(s32 fileIndex, s32 courseIndex) { } } return count; +#endif } s32 save_file_get_total_star_count(s32 fileIndex, s32 minCourse, s32 maxCourse) { @@ -578,26 +583,49 @@ void save_file_clear_flags(u32 flags) { } u32 save_file_get_flags(void) { +#ifdef COMPLETE_SAVE_FILE + return (SAVE_FLAG_FILE_EXISTS | + SAVE_FLAG_HAVE_WING_CAP | + SAVE_FLAG_HAVE_METAL_CAP | + SAVE_FLAG_HAVE_VANISH_CAP | + SAVE_FLAG_UNLOCKED_BASEMENT_DOOR | + SAVE_FLAG_UNLOCKED_UPSTAIRS_DOOR | + SAVE_FLAG_DDD_MOVED_BACK | + SAVE_FLAG_MOAT_DRAINED | + SAVE_FLAG_UNLOCKED_PSS_DOOR | + SAVE_FLAG_UNLOCKED_WF_DOOR | + SAVE_FLAG_UNLOCKED_CCM_DOOR | + SAVE_FLAG_UNLOCKED_JRB_DOOR | + SAVE_FLAG_UNLOCKED_BITDW_DOOR | + SAVE_FLAG_UNLOCKED_BITFS_DOOR | + SAVE_FLAG_UNLOCKED_50_STAR_DOOR | + SAVE_FLAG_COLLECTED_TOAD_STAR_1 | + SAVE_FLAG_COLLECTED_TOAD_STAR_2 | + SAVE_FLAG_COLLECTED_TOAD_STAR_3 | + SAVE_FLAG_COLLECTED_MIPS_STAR_1 | + SAVE_FLAG_COLLECTED_MIPS_STAR_2); +#else if ((gCurrCreditsEntry != NULL) || (gCurrDemoInput != NULL)) { return 0; } return gSaveBuffer.files[gCurrSaveFileNum - 1][0].flags; +#endif } /** * Return the bitset of obtained stars in the specified course. * If course is COURSE_NONE, return the bitset of obtained castle secret stars. */ +#ifdef COMPLETE_SAVE_FILE +u32 save_file_get_star_flags(UNUSED s32 fileIndex, UNUSED s32 courseIndex) { + return 0x7F; +#else u32 save_file_get_star_flags(s32 fileIndex, s32 courseIndex) { - u32 starFlags; - if (courseIndex == COURSE_NUM_TO_INDEX(COURSE_NONE)) { - starFlags = SAVE_FLAG_TO_STAR_FLAG(gSaveBuffer.files[fileIndex][0].flags); - } else { - starFlags = (gSaveBuffer.files[fileIndex][0].courseStars[courseIndex] & 0x7F); + return SAVE_FLAG_TO_STAR_FLAG(gSaveBuffer.files[fileIndex][0].flags); } - - return starFlags; + return (gSaveBuffer.files[fileIndex][0].courseStars[courseIndex] & 0x7F); +#endif } /** @@ -615,15 +643,24 @@ void save_file_set_star_flags(s32 fileIndex, s32 courseIndex, u32 starFlags) { gSaveFileModified = TRUE; } +#ifdef COMPLETE_SAVE_FILE +s32 save_file_get_course_coin_score(UNUSED s32 fileIndex, UNUSED s32 courseIndex) { + return MAX_NUM_COINS; +#else s32 save_file_get_course_coin_score(s32 fileIndex, s32 courseIndex) { return gSaveBuffer.files[fileIndex][0].courseCoinScores[courseIndex]; +#endif } /** * Return TRUE if the cannon is unlocked in the current course. */ s32 save_file_is_cannon_unlocked(void) { +#ifdef UNLOCK_ALL + return TRUE; +#else return ((gSaveBuffer.files[gCurrSaveFileNum - 1][0].courseStars[gCurrCourseNum] & COURSE_FLAG_CANNON_UNLOCKED) != 0); +#endif } /** @@ -631,7 +668,7 @@ s32 save_file_is_cannon_unlocked(void) { */ void save_file_set_cannon_unlocked(void) { gSaveBuffer.files[gCurrSaveFileNum - 1][0].courseStars[gCurrCourseNum] |= COURSE_FLAG_CANNON_UNLOCKED; - gSaveBuffer.files[gCurrSaveFileNum - 1][0].flags |= SAVE_FLAG_FILE_EXISTS; + gSaveBuffer.files[gCurrSaveFileNum - 1][0].flags |= SAVE_FLAG_FILE_EXISTS; gSaveFileModified = TRUE; } @@ -669,9 +706,9 @@ s32 save_file_get_cap_pos(Vec3s capPos) { #ifdef SAVE_NUM_LIVES void save_file_set_num_lives(s8 numLives) { struct SaveFile *saveFile = &gSaveBuffer.files[gCurrSaveFileNum - 1][0]; - saveFile->numLives = numLives; - saveFile->flags |= SAVE_FLAG_FILE_EXISTS; - gSaveFileModified = TRUE; + saveFile->numLives = numLives; + saveFile->flags |= SAVE_FLAG_FILE_EXISTS; + gSaveFileModified = TRUE; } s32 save_file_get_num_lives(void) { diff --git a/src/game/save_file.h b/src/game/save_file.h index 17b56c793..6733981f4 100644 --- a/src/game/save_file.h +++ b/src/game/save_file.h @@ -108,7 +108,9 @@ extern u8 gCurrCourseStarFlags; extern u8 gSpecialTripleJump; extern s8 gLevelToCourseNumTable[]; -#define COURSE_FLAG_CANNON_UNLOCKED /* 0x00000080 */ (1 << 7) +enum CourseFlags { + COURSE_FLAG_CANNON_UNLOCKED = (1 << 7), /* 0x00000080 */ +}; // game progress flags enum SaveProgressFlags {