EXTREMELY early, but...
- M_InterruptMenuWithChallenges hijacks certain transitions
- Currently only initial profile selection and title screen, but the intercept is low-profile enough to add wherever necessary
- M_GetNextAchievedUnlock gets the first unlock in the listing that has all its conditions achieved but isn't unlocked
- Preliminary Challenges menu
- Currently only ticks between Achieved but not Unlocked unlocks with the above function, no tilegrid yet
A small piece of (STJr/SRB2!1756).
Due to how RR currently handles time attack records and how it WILL handle unlocks, it's not currently feasible to split everything such that you can have two independent gamedata_t... but what's done so far is certainly more sane and less dependent on global variables
Other minor refactors:
- M_UpdateUnlockablesAndExtraEmblems and M_SilentUpdateUnlockablesAndEmblems are now one function with a boolean for loudness
- Unlock prints are currently living in the console, since the cecho stuff was a little broken
Mammoth commit, sorry. I only realised halfway through writing it that SECRET_SKIN was only partially merged.
Ports from 2.2:
- Merge SECRET_SKIN (STJr/SRB2!1474)
- Default skin is now handled by checking all skins for unlock status, and I_Erroring if none are available
- Don't show skin names on game startup, to keep our secrets hidden
- Unlockables now have string variables zallocated.
- For skin names rather than numbers.
- Correctly clean up memory when freeing unlockables and emblems.
Bespoke code:
- For temporary testing. `unlocks.pk3`
- Using this for rapid testing gameboot SOC instead of patch.pk3 because of the intent to turn that into scripts.pk3
- Don't not save gamedata in DEVELOP builds, even if you've used cheats!
- `player->availabilities` is now an array of UINT8
- (MAXSKINS + 7)/8 entries, or 32 bytes.
- Included with XD_ADDPLAYER instead of XD_NAMEANDCOLOR.
- Simplifies a lot of logic with respect to demos, skin changes mid-game, etc.
- Seriously, there's a lot of random places in the code that just iterate over MAXSPLITSCREENPLAYERS and g_localplayers to update availabilities in real time in a way that's not particularly netsafe...
- Lines up with the plan for handling unlocks when returning to menus.
- Was included with XD_ADDBOT, but that actually overruns the netxcmd buffer at first mapload with 7 bots. We might need to consider expanding the size of the netxcmd buffer...
- In demos, can be interpreted as both relative to the original replay and the current skin list depending on boolean context provided to R_SkinUsable.
- Used for SF_IRONMAN (and will crash if all other skins are inaccessible).
- Grand Prix bot randomisation uses the host's unlocks.
- Don't show locked characters on the fancy new character select.
- DXD_JOINDATA for demos
- Replaces the dual-purpose behaviour of DXD_PLAYSTATE
- Contains availabilities
- Handles bot material in a different way
- Forceskin restrictions
- Won't run in demos, because it's assumed recorded DXD_SKIN will handle all the conversions the original match had
- Won't run if K_CanChangeRules says no
- Correctly set `mapvisited` on level visit, even in [fake gasp] MULTIPLAYER/NETGAMES!! 🥹
- Added updating unlockables and extra emblems on `mapvisited` update.
- Currently fails to produce the cecho, but that'll be stripped out entirely in a future commit so I'm not bothered.
Closer to parity with pre-newmenus behaviour.
- Clinical term for server admins, colloquial for SP contexts (GP/modeattacking)
- Won't show up in GP if you're out of lives
- Also fixes lives going negative in K_PlayerLoseLife
The problem here is that the menuactive check I added in the followers branch prevented noFurtherInput from being unset. It now can no longer be set while the menu is closed.
- When selecting follower category, initial follower category is now the category of your last used follower (or None)
- More C/Extra button functionality:
- Profile selection: Toggle between your last used profile and guest
- Follower category: Toggle between category of your last selected follower and None
- Follower: Return to category selection and hover over None (flows seamlessly into above option)
- Fixes defaulting to follower id 0 (previously chao, currently hot robo) when joining a server without going through the menu flow
- No need to store TWO names for a follower, so save a little memory
- Should make it easier to add unlockable followers later
- Followers now have categories, definable in SOC
- New character select step: Follower category
- "None" is a category, just skips straight to Follower None
- Select a category to go to the previous regular follower selection step
- Press the C/Extra button to reset a character select step to its "default"
- Character: Center the character in the engine class (goes from [0,1] to [1,1], etc)
- Character alts: Centers the "primary" alt (prefers Eggman over Eggrobo)
- Skincolor: Centers the character's prefcolour
- Follower category: Centers on the "None" option
- Follower: [CURRENTLY NO BEHAVIOUR]
- Followercolor: Cycles between follower's defaultcolour, "Match", and "Opposite"
It's been used interchangably as "this is a singleplayer gameplay context" and "This is a no cvar changing context". This addition repairs some behaviour which might have been inconsistent between netgame and netreplay.
- Fix allocating only enough for "MAPXX".
- Fix memory leak in M_StartTimeAttack.
- Use va instead of malloc + sprintf, strdup where needed.
Some of these pass gpath to va anyway so that should be
enough room.
- Make timelimitintics handled a bit more like gamespeed, encore, frantic, etc - update on mapload/starttime, not during gameplay
- Use default setting if can't change rules - this is a surprise tool that will help us later
- Have it properly update when adjusting gametype from the menu
- Cleaned up SV_StartSinglePlayerServer to do this
- Remove CV_SAVE to prevent time limit bruh moments
- Use strlcpy instead of strcpy to prevent footguns
- Use fprintf instead of raw fputs
- Enforce consistent MAX_LOGIP (255) length for each component instead of a combination of magic number 255 and MAXSTRINGLENGTH (32!?) depending on where you look
- Fix fun memory leak in waiting
- Avoid pointless strlens
- Menu uses one of three songs (already in music.pk3)
- Cycles between them every time you return to the title screen after starting a map
- Console-accessible. Do what you want
* Instead of doing constant G_MapNumbers when finding the relationship between maps and cups...
* Add a cache of level IDs to cups, to go with the strings.
* Add a cache of the cup pointer to maps, so we don't have to search through all cups to find our map. (done in P_InitMapData)
* Pre-emptive work: G_IsSpecialStage and P_GetNextEmerald now reference cup data instead of a hardcoded ID set.
* Remove a bunch of old stuff from mapheaderinfo_t/associated, and reorder what stays
* Countdowntimer? 💥
* Startrings? 💥
* sstimer/ssspheres? 💥
* forcecharacter? 💥 (distinct from forceskin)
* interscreen? 💥
* sstage_start/end and smpstage_start/end? 💥💥💥💥
* You've been blocked
* G_MapNumber now returns a special NEXTMAP_INVALID if not found, for more consistent reference.
* Incorporate a good chunk of the `edit-headers` branch. Can't clear maps individually because of the new restrictions on sequential mapheaders, but we can add a "disable in vote screen, not even for map hell/archive" flag to a map at some future juncture for equivalent functionality...
- Refactor significantly (now has its own func, `G_GetNextMap`)
- If gametype uses cups, iterate through cups to find the current level, then grab the next valid level
- If not, get the next valid mapheader for your gametype
- SOC `nextmap`/`marathonnext` is not just deprecated but REMOVED
- Hide the NEXTMAP_ constants again, but leave support dummied out for if we have them publically accessible again
- Also get rid of a bunch of OTHER mapheader stuff we're never gonna use
- NiGHTS Grades? NOPE
- Vanilla titlecard patches? NOPE
- Boss music fadeout/replacement? NOPE
- Select Heading? NOPE
- You've been blocked.
- Don't show maps without lumps on the level select list
- this is me being petty, but making it NOTIMEATTACK in SOC instead of TIMEATTACK so we can reconsider the maps with/without them.
Also:
- improved error prints for SOC condition definitions
- improved bounds checking to use `nummapheaders` for iterating over mapheaderinfo
There are still situations that use NUMMAPS like mapvisited, randmapbuffer, etc, which need to be addressed before merger.
- Also adjust cv_currprofile in PR_DeleteProfile, instead of half-heartedly outside
- Make it clearer if you're going to destroy your current profile
- Add an "[In use]" identifier to the menu's visuals
- Was reproducible by spamming back button events during game launch.
- Caused by the way profile data was initialised - D_StartTitle was calling a function with too many side effects.
- In addition, never instantly skip the title screen when the above occours.
- This would be enough to patch over the mentioned bug, but I made sure to solve it properly so it won't break when we touch this again later.
- Take the weird extra mini settings menu out of the Online Host Game sequence
- Make sure to actively use the server variables in Match Race creation
- Hides the Auto options for Encore and Kartspeed on the Match Race menu specifically...
- BUT if you leave it at the default it'll secretly set them to Auto!!!
- Make the menu-only dummykartspeed and dummygpdifficulty cvars also affected by the unlock system.
- Master mode is currently behind SECRET_HARDSPEED, this can be changed later when we're seriously thinking about unlock progression.
- Complete forwardport of changes to cv_kartspeed from 1.4+, since I missed a spot previously.
- Fix an issue where if the last line of an M_StartMessage was the longest, the box width wouldn't account for it. (port from v1)
- Reduce length of some common error messages the Addons menu may produce.
- Add a warning for attempting to run .cfg files, since I absentmindedly overwrote ringconfig.cfg with kartconfig.cfg info while testing...
Search finally works again!
- Now uses a cvar which is copied into static memory to uppercase it, instead of a weird static string uppercased into zone memory.
- You have to scroll to the top of the menu to use it, one entry above the previous first file/folder/"UP...".
- Don't play menu sound if you've reached the end of an un-looping menu.
- Move M_AddonsRefresh out of M_DrawAddons - death to a HORRIBLE hack
- Use it as the tickroutine for the addons menu instead
- Behaves as before, possibly more consistent