- Adds headers to the list
- Adds indentation
- Doesn't show extra medals if there are none available
- Cleans up some of the undesired duplication in the drawer
- Even if there's only one level in the group, only skip over the mini linear list in a Time Attack mode
- Improves some of the jumpscare of looking into Lost and Found and being blasted to TEST RUN
- Fix lists of one map being wedged against the bottom of the screen
- Precache valid map count
- Revert the blanket exception so Lost and Found won't always have it available
- Won't be considered cheating to go to Test Run on game boot even if not unlocked
- Made the lack of exception for Test Run in Command_Map_f's cheat check more intentional
- Change scale and offsets of map icon to match other unlock types that show a single map
- Show a gametype string
- Fudges GT_VERSUS into GT_SPECIAL just like the menu does
- Shows "Match Race/Online" for a level with no preferred gametype like TEST RUN
- When selecting levels:
- If the gametype uses cups
- and a map has no cup
- and you're not in Grand Prix mode
- show those maps in a quasi-cup called "Lost and Found".
- Implementation details:
- a few == checks for the pointer to `cupheader_t dummy_lostandfound`
- Otherwise most of the apparatus was built as part of prior art!
- Defaults to 1, AKA Sonic 1/2 monitor
- Set to 2 for Sonic 3k monitor
- Supports a range of 1-9 and A-Z
- Permits fine-grained rapid-prototype stretch goal Chaotix monitor stuff later in development
- Fix the case where invalid levelsearch_t were providing values of false instead of NEXTMAP_INVALID
- Fix the case where M_GetFirstLevelInList was not returning NEXTMAP_INVALID for rearching nummapheaders
We had this collective consciousness bigbrain moment in VC together, and it can literally only happen in this branch because unlocks.pk3 is the only main-game asset that needs to change for it
Solves the big problem we had with mixing up Item Capsules and ~~Battle Capsules~~ PRISON EGGS
- SECRET_SKIN:
- Shows the character icon you'd have to pick (Eggman for Eggrobo, etc)
- Shows the Engine Class section of the charsel grid you'd have to pick
- SECRET_FOLLOWER:
- Shows the category icon you'd have to pick (3DB for Whirl, etc)
- SECRET_CUP:
- Shows the position on the cup grid, INCLUDING previous pages
Before unlockable conditions dependent on Engine Class are added, standardise the system.
- enum constant in r_skins.h from A-I + J
- Engine Class J is for SF_IRONMAN
- The Joker in the pack of cards
- Also immediately after I in the alphabet
- It's a Jape that works on multiple levels
- Integrate into K_UpdateEngineSounds
- Ignores Engine Class J
- Show the Engine Class in character select extrainfo mode, even in situations character name would have been the only thing shown
- For P_Ticker()'s calls to M_UpdateUnlockablesAndExtraEmblems
- Do not check non-UCRP_REQUIRESPLAYING conditions
- Controlled by a new `boolean doall` parameter to M_UpdateUnlockablesAndExtraEmblems
- Most other contexts have this as true
- Forced true if update is meant to be silent
- Only check UCRP_REQUIRESPLAYING conditions if a relevant property has been touched
- Controlled by a new `boolean checkthisframe` property on roundcondition_t
- Set in all contexts where roundcondition_t is modified
- Would also be set on lap change, but that case is already covered by the following
- Check all conditions, both UCRP_REQUIRESPLAYING and not, on:
- local player K_HandleLapIncrement
- local player P_DoPlayerExit
- local player P_DoTimeOver
- Controlled by a new `boolean deferredconditioncheck` property on gamedata_t
Fixed in two ways:
- P_LoadExtraVertices is a special construct for extended blockmap types. This is easily resolved with num_orig_vertexes before loading the map.
- Original Doom-style blockmap with ZenNode however also adds additional vertices directly into VERTEXES. These have to simply be ignored by cross-referencing them with linedefs to see if they are used by anything.
Unfortunately this means that K_AdjustWaypointsParameters no longer saves to UDMF converted maps, because it requires sector thinglists, FOFs, and spawned mobjs.
- UCRP_ISDIFFICULTY
- Example: IsDifficulty Hard - "on Hard difficulty"
- Does what it says on the tin
- You can't specify Easy because there is nothing easier than Easy
- Does it based on the GPsetting if in grand prix, or the level setting otherwise
- UCRP_PODIUMCUP
- Example: PodiumCup Ring - "complete RING CUP"
- Example: PodiumCup Barrier Silver - "get Silver or better on BARRIER CUP"
- Example: PodiumCup Goggles S - "get grade S on GOGGLES CUP"
- Basically a monolithic cup completion handler.
- Only happens after rankings begins in Podium ceremony.
- UCRP_PODIUMEMERALD
- Example: PodiumEmerald - "collect the Emerald"
- Get the Emerald to the ceremony and this is yours.
- UCRP_PODIUMPRIZE
- Example: PodiumPrize - "collect the prize"
- LITERALLY identical to PodiumEmerald except the string
- Doing it seperately from PodiumCup means we can't check whether that cup uses an Emerald or another Catcher Prize automagically