- Now actually from the relevant GP difficulty's Cupgrid, instead of the top-level Play choice
- Permits a much cleaner M_StartCup, combining two of the previously four copypasted, slightly modified level startup regions (which could be further combined for sanity's sake, but would take a LITTLE more work right now than I have in me)
- Shows a funny exclamation mark from Sonic Rush on the relevant cup on the grid
- Selected by default when loading the menu, if appropriate
Immense 25-file diff, so spun off into its own branch.
- Improved appearance
- Not just a big block of text on a blue background
- Well, OK, the main part is, but some stuff has been spun out into its own fields
- Title text
- Text and button prompt for Yes/No or OK
- Slides with pow on and off the screen
- Disabled MM_EVENTHANDLER, which has always been dog but got considerably worse after newmenus to the point nothing's using it anymore
- Required in order to reduce the reliance on FUNCPTRCAST, which prevents Eidolon from compiling some stuff because it's not valid C++
Preperatory work for the next feature on my agenda.
- No longer independently allocated.
- This was a byproduct of the previous NUMMAPS-based implementation. It's just cleaner to have it live directly on the mapheader_t, no caveats about it.
- Now contains mapvisited bitflag array.
- Now all to-gamedata properties on a mapheader's struct are grouped together.
- I was of two minds about it, but decided that this would have cleaner guarantees for compartmentalisation, saving, and loading.
- They can still be wiped independently (G_ClearRecords for time/lap and M_ClearSecrets for mapvisited).
- 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
- 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!
- 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
- All `cv_dummyspbattack`-related material is now gated with the assistance of SECRET_SPBATTACK.
- SPB_ATTACK
- Add UC_MAPSPBATTACK condition.
- Both this and emblems with MV_SPBATTACK have the string "SPB ATTACK: Conquer [LEVEL NAME]", compared to the regular round completion conditions having "Finish a round on [LEVEL NAME]".
- If SPBATTACK is not unlocked, shows ???: Conquer [LEVEL NAME] instead
- Splits M_SetupDifficultyOptions out of M_SetupDifficultySelect.
- Permits Encore to be handled on Difficulty menu if unlocked after a Match Race.
- Fixes an issue where the in-game Pause menu could be accessed in the menu
- The prevMenu that was set was overriden with in-game Pause.
- The assumption made - that the levelsearch/levellist struct would not be touched - is pretty transparently violated.
- I made it go back to the Difficulty select instead of fixing the issue because:
- Match Race is more dependent on the rules you configure for that particular round
- This mode of play will be modified in future to not be literally offline MP with things like voting, but instead return to the menu
- It was easier relative to the amount of work to properly restore (this is the biggest reason)
- firstlen was in units of raw UINT8 address (pre-multiplied by sizeof(cupheader_t*)) to permit being used in Z_Realloc. However, it was being added onto the cupgrid.builtgrid pointer BEFORE it was cast into UINT8* for memset, leading to an offset, when considered in terms of UINT8 address.
- Z_Realloc2 is always guaranteed to memset any appended memory so this wasn't even required
If Playing(), does nothing.
- If NULL, cycle between Cascade Cave as is traditional.
- If ".", stop music. (will one day be used for sound test)
- Any other case, call S_ChangeMusicInternal on the string directly
Notable menu sets:
- All Extra menus, excepting the Replay Hut, use "EXTRAS"
- Replay Hut uses "REPLAY"
- All online menus use "NETMD2".
- I know we wanted to do something with switching between "NETMDE" and "NETMD2". I would prefer a more consistent API for transferring song position across between tracks be implemented before implementing this.
- Known bug: Music restarts when exiting from failed connection screen
- Known bug: Music goes back to Cascade Cave when selecting "GO" for server creation
- Wontfix as we want that button to go directly to the voting screen, which we can do in a voting revamp branch
- Data Erase, Profile Erase: "SHWDN2"
- Not in the spec but I think it's both funny and a valuable tell for the most "dangerous" menu to play with.
- Also shifts the background to SKINCOLOR_BLACK
- restoreMenu, M_SpecificMenuRestore
- From any Cup Select, Level Select, or Time Attack context (including non-net replay playback), return to the relevant "core menu"
- From any server OR server connection failure, return to the Online EGGA CHANNEL top-level menu
- From netreplay, head to replay hut without incorrect gamestate/fade cope
- Interruption for Challenges unlock sequence now happens on all menu returns, not just post-titlescreen
- M_StartControlPanel
- Integrate with above
- Handle menu re-initialisation properly under more contexts
- D_ClearState
- Split out from D_StartTitle
- Can be used alongside M_StartControlPanel to restore menu state from any play session in a way just as reliable as D_StartTitle was
Initialises Time Attack menu
- Check for replay file's existence before showing related options
- Parity with pre-newmenus behaviour
- Replay/guest-save functionality not yet (re)implemented
- Handles mutli-gametype timeattack level select listings more thoroughly
- src/menu contains files for each menu's definitions.
- src/menu/transient contains menus which are reused in
many places or are separate from Main Menu entirely.
File names ending in "-1" are menus which contain
a submenu. The suffix is added so that the parent menu
sorts before all its children in directory lists.
It's also done so Tab completion doesn't stop such that
a hyphen (-) would need to be typed.
For example (this is how I auto complete file names):
"ex" <TAB> completes to "extras" because the choices are
"extras.c" or "extras-addons.c" etc. Now you need to reach
away from the home row of a keyboard to type a "-" in
order to complete any of the submenu file names.
VS
"ex" <TAB> completes to "extras-". You only need to reach
to type a "1" for one menu. There may be more than one
submenu and submenu names start with letters, which are
closer to the home row.