diff --git a/src/g_gamedata.cpp b/src/g_gamedata.cpp index bd2939c75..a2f60b92d 100644 --- a/src/g_gamedata.cpp +++ b/src/g_gamedata.cpp @@ -493,7 +493,12 @@ void srb2::load_ng_gamedata() gamedata->tutorialdone = js.milestones.tutorialdone; gamedata->gonerlevel = js.milestones.gonerlevel; gamedata->thisprisoneggpickup = js.prisons.thisprisoneggpickup; + gamedata->prisoneggstothispickup = js.prisons.prisoneggstothispickup; + if (gamedata->prisoneggstothispickup > GDINIT_PRISONSTOPRIZE) + { + gamedata->prisoneggstothispickup = GDINIT_PRISONSTOPRIZE; + } size_t emblems_size = js.emblems.size(); for (size_t i = 0; i < std::min((size_t)MAXEMBLEMS, emblems_size); i++) diff --git a/src/m_cond.c b/src/m_cond.c index 8d7c1f3b4..981e062b0 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -398,6 +398,20 @@ badgrid: gamedata->challengegridwidth = 0; } +static void M_ChallengeGridExtraDataAdjacencyRules(challengegridextradata_t *extradata, UINT16 adjacent) +{ + // Adjacent unlocked tile, permit hint/general key skip. + if (gamedata->unlocked[adjacent] == true) + { + extradata->flags |= CHE_HINT; + } + // Adjacent locked small tile, prevent 10x key skip. + else if (unlockables[adjacent].majorunlock == false) + { + extradata->flags &= ~CHE_ALLCLEAR; + } +} + void M_UpdateChallengeGridExtraData(challengegridextradata_t *extradata) { UINT16 i, j, num, id, tempid, work; @@ -489,14 +503,7 @@ void M_UpdateChallengeGridExtraData(challengegridextradata_t *extradata) } else if (work < MAXUNLOCKABLES) { - if (gamedata->unlocked[work] == true) - { - extradata[id].flags |= CHE_HINT; - } - else - { - extradata[id].flags &= ~CHE_ALLCLEAR; - } + M_ChallengeGridExtraDataAdjacencyRules(extradata+id, work); } } @@ -534,14 +541,7 @@ void M_UpdateChallengeGridExtraData(challengegridextradata_t *extradata) } else if (work < MAXUNLOCKABLES) { - if (gamedata->unlocked[work] == true) - { - extradata[id].flags |= CHE_HINT; - } - else - { - extradata[id].flags &= ~CHE_ALLCLEAR; - } + M_ChallengeGridExtraDataAdjacencyRules(extradata+id, work); } } @@ -566,14 +566,7 @@ void M_UpdateChallengeGridExtraData(challengegridextradata_t *extradata) } else if (work < MAXUNLOCKABLES) { - if (gamedata->unlocked[work] == true) - { - extradata[id].flags |= CHE_HINT; - } - else - { - extradata[id].flags &= ~CHE_ALLCLEAR; - } + M_ChallengeGridExtraDataAdjacencyRules(extradata+id, work); } } @@ -595,14 +588,7 @@ void M_UpdateChallengeGridExtraData(challengegridextradata_t *extradata) } else if (work < MAXUNLOCKABLES) { - if (gamedata->unlocked[work] == true) - { - extradata[id].flags |= CHE_HINT; - } - else - { - extradata[id].flags &= ~CHE_ALLCLEAR; - } + M_ChallengeGridExtraDataAdjacencyRules(extradata+id, work); } } } diff --git a/src/m_cond.h b/src/m_cond.h index b9197f3f0..eccd88f5f 100644 --- a/src/m_cond.h +++ b/src/m_cond.h @@ -302,7 +302,7 @@ typedef enum { #define GDCONVERT_ROUNDSTOKEY 5 #define GDINIT_CHAOKEYS 10 // Start with 10 Chao Keys !! -#define GDINIT_PRISONSTOPRIZE 30 // 30 Prison Eggs to your [Wild Prize] !! +#define GDINIT_PRISONSTOPRIZE 15 // 15 Prison Eggs to your [Wild Prize] !! typedef enum { GDGONER_INIT = 0, diff --git a/src/m_pw.cpp b/src/m_pw.cpp index 71c4a2ed2..d080439ef 100644 --- a/src/m_pw.cpp +++ b/src/m_pw.cpp @@ -535,6 +535,31 @@ void f_difficulty() } } +void f_keys() +{ + INT32 givekeys = 25; + + if (gamedata->chaokeys > (GDMAX_CHAOKEYS - givekeys)) + { + givekeys = GDMAX_CHAOKEYS - gamedata->chaokeys; + } + + if (givekeys > 0) + { + S_StartSound(0, sfx_keygen); + + gamedata->chaokeys += givekeys; + gamedata->chaokeytutorial = true; + + M_StartMessage("Dr. Robotnik's Ring Racers - Deluxe Edition", va("Claimed %d Chao Keys!", givekeys), NULL, MM_NOTHING, NULL, NULL); + G_SaveGameData(); + } + else + { + M_StartMessage("Dr. Robotnik's Ring Racers - Deluxe Edition", "You have the maximum number of Chao Keys!", NULL, MM_NOTHING, NULL, NULL); + } +} + void f_devmode() { INT32 i; @@ -737,4 +762,5 @@ void M_PasswordInit(void) passwords.emplace_back(f_timeattack, "mFu5OB9d6jnc2kth7HE66wJ42F/GHDzSvuciK1Qw++6iGnpBccxcKjpoxgOvD3eIoqR606ruBINuXi23proXHQ=="); passwords.emplace_back(f_encore, "i5u5sIsMs5eITy+LzAXvKm6D9OzOVKhUqSy1mTTV/oUxJX6RPsk8OcyLbNaey9Vc6wXOhz+2+mTXILkIRzvXqA=="); passwords.emplace_back(f_difficulty, "MKjOtEFLkgXf21uiECdBTU6XtbkuFWaGh7i8znKo7JrXXEDrCBJmGwINvPg0T3TLn0zlscLvmC5nve7I+NTrnA=="); + passwords.emplace_back(f_keys, "jgsD6UJ2Xa10QcS2ZDJwcvpd4iia3AXIG8wDDSsHX7kFH5jEXnym45yaNZG9hIKEvBMpVONKR0YTA6JBAQRCvg=="); } diff --git a/src/menus/extras-challenges.c b/src/menus/extras-challenges.c index b27198539..8308fae1c 100644 --- a/src/menus/extras-challenges.c +++ b/src/menus/extras-challenges.c @@ -507,7 +507,7 @@ static void M_ChallengesTutorial(UINT8 option) "to break open Big Challenge tiles.\n" "\n" "You'll also need to unlock\n" - "the surrounding tiles first.\n" + "any surrounding small tiles first.\n" ), NULL, MM_NOTHING, NULL, NULL); gamedata->majorkeyskipattempted = true; break;