Should resolve the crash which for some reason doesn't have an issue to reference here
Also, for `debugprisoncd On`:
- Extensive debug logging
- Disable the "if all achieved, still force a pre-existing CD" behaviour
- The list is empty if you've achieved every Prison CD and then restart the game, so it wasn't consistent at always making something. Without that kind of reliability I think it's more important for it to just be a fastforward
- `EncoreMusic` on mapheader
- Supports up to 3 alt musics, as with every other type
- Do not vape/nightcoreify if provided
- To avoid complicating the Alt Music logic too much, uses "side B" of the same Prison Egg CD
- That is to say, if there are 2 encore tracks and 3 normal tracks, the second Encore track will only play if you've gotten the CD associated with the second normal track
I haven't actually tested it *with* any Encore music, but I've triplechecked literally everywhere to make sure it didn't break standard play
- Most R_SkinAvailable calls should be returning index into demo.skinlist (same numerical value as when demo was recorded), for demo sync
- A handful of general things permit exception for this
- Expose `replaynumskins` (calculated as `(demo.playback ? demo.numskins : numskins)`) to Lua
- There's *always* more that can be done for this, but this is the minimum spec that can at least be somewhat stable
- Remove CV_NOSHOWHELP, so the config file can load
- Do not stealth set the cvar, so it is not dependent on
order of operations of config loading and challenge
loading
- If emerald not yet collected on that cup, pick the first uncollected emerald, then get the cup's CUPCACHE_SPECIAL with that ID to pick the stage
- Already collected emeralds retain their swappage across gamedata saves
- Returns to normal order if you get all 7 OR Special Mode is unlocked (chao key? debug? password in modded games? sky's the limit)
- Pops up a Message from the Stars telling you the gems have been returned to their natural place
- Add-ons will always use their dedicated sealed star, since it's unordered material
If it weren't so last minute I could have a better solution for GP Backups, but right now what I've gone for is it always trusts whatever G_GPCupIntoRoundQueue does AS LONG AS THE COURSE ISN'T THE ONE YOU'RE RELOADING INTO. If it IS, then it checks to see if it's exactly what's been saved, and complains (with the generic error message, unfortunately) if it isn't.
- M_MapLocked uses netgame state, so too easy to get Test Run early (resolves#859)
- Major iteration of unlockable structs and related, so may also confer a performance benefit
All courses are restricted in Match Race/Time Attack/Online if not visited in GP UNLESS:
- It is the first Race Course of a Cup
- Course has "NoVisitNeeded = True`
- The Controls Tutorial and Test Run are the only two stages that will need this
The above replaces:
- A lot of restricted courses having to be marked with `FinishNeeded = True`
- Hidden Palace
- Sealed Stars 1-14
- Once Special Mode is unlocked, it will now be possible to practice Sealed Stars before rematching them in GP
- Almost all Tutorial-specific behaviour, since it was heinously hacky
HOWEVER, `FinishNeeded = True` was left in specifically for future releases, and I reserve the right to use it on Adventure Example again before launch.
- describe as "course hazard", not "track hazard", to match updated player-facing lingo
- Add rudimentary handling to allow achievement in Prison Break, Versus
- More dialogue
- Restrict access to your choices based on your progress through the Goner Setup.
- Save progress through the setup to gamedata
- Resets to beginning when Challenges is cleared
- Passwords
- Only permit the password entry in like the first two seconds
- Preemptively disarms potentially annoying people in stream chats
- Make wrongwarp also quit the game on exit instead of returning to the title screen
- Add GDQ cheats
- `savetheanimals`
- `savetheframes`
- Both do practically the same thing, with slightly modified dialogue.
- Skips all of the normal dialogue.
- Performing a social experiment on anyone who might stream this game at a charity event. :)
- Fixes for UC_ALLCUPRECORDS
- Actually use the capped difficulty variable
- For the "every Cup" case, don't permit modded Cups to affect the result
- M_CheckCupEmeralds (referenced for the above)
- Also do not permit modded Cups to affect the result
New condition for tracking multiple cups' windata.
`Condition1 = AllCupRecords RR_Egg Bronze`
- All cups up to Egg Cup must be completed at Bronze or better
`Condition1 = AllCupRecords`
- All cups in the game must be completed
`Condition1 = AllCupRecords All Any Master`
- All cups in the game must be completed on Master mode`
- Controlled by M_CupSecondRowLocked
- Looks for any Cup with associated unlockable that's on the second row
- Cached on load for both relevant menus - Cupgrid and Challenges
- Custom cups will be stretched out onto more pages
- Side incentive of unlocking more material: Less annoying interactions with custom material
- Pages with nothing unlocked are completely skipped over
Also moves a bunch of minor things which previously used magic numbers to the CUPMENU_COLUMNS/CUPMENU_ROWS defines, for sanity
Track ENTERING the challenge, instead of when you fail it
Allows for system-level ironclad prevention against multiple tutorial challenge runs on the same gamedata
- Go to a MainCfg-specified map on its guessed gametype
- `TutorialChallengeMap = RR_ZonedCity`
- Some unique settings
- K_CanChangeRules() == false
- If GTR_CIRCUIT, make it Hard Speed
- If GTR_BUMPERS, die in one hit
- If GTR_BOTS, make them all difficulty 13 of the default bot skin
- No Medals or Spray Cans during the Tutorial Challenge
- Complete the stage in 1st place or don't bother at all
- Has the "Give up" menu option available, but no "Try Again"
- Condition for successfully completing the Tutorial Skip
- `Condition1 = TutorialSkip`
Related bugfixes:
- Correctly wipe skipstats when returning to the Title/menus
- Typing of `ultimatemode` (hey this isn't accessible by anything right now I wonder)
If you're hypothetically gating a Character behind 100% of Characters unlocked... that'll never come true!
To that end, allow a fudge value to be specified.
It's added to the unlock count before comparing it against the percentage.