Add COMPLETE_SAVE_FILE config define

This commit is contained in:
Arceveti
2021-11-08 22:50:50 -08:00
parent 88a3dd76da
commit b5cb9dbddd
8 changed files with 92 additions and 44 deletions

View File

@@ -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(),

View File

@@ -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

View File

@@ -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();

View File

@@ -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;

View File

@@ -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--;
}
}

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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 {