Commit graph

128 commits

Author SHA1 Message Date
toaster
595b3d67d5 Add UC_CHARACTERWINS
Just in case I don't get to do a major pass on adding a ton of extra unlockable conditions later, this is an easy, quick add featuring a stat gamedata and the statistics menu has been tracking for a while.
2023-08-23 18:58:10 +01:00
toaster
e1b7cb66cb Rework the Spray Can system to ACTUALLY be what we want
Instead of being specific to each level, Spray Cans are stored in a list on gamedata that will be stepped along each Spray Can you collect.
They are only assigned to a level on collection - which prevents you from farming the same easy location for every colour in the game.

In addition, this new system is one step short of dehardcoding them entirely. Now only Spray Cans specifically asked for by the existence of UC_SPRAYCAN will be put in the list, and if a secondary parameter is either "Yes" or "True", it will be put at the head of the list. This could technically support custom skincolours one day, but the author of this commit doesn't care to do the last bit of work necessary to make it happen.

There's a slight extra overhead in that skincolor_t now also holds a `cache_spraycan` (renamed from `cachedcan`, which maps had previously)

Currently, there's no safeguard against grabbing it on a custom course - you'll lose the Spray Can as soon as you load a fresh game again - but  I consider that easy to fix (tomorrow) and necessary before merger, because the author of this commit does NOT want complaints on release because we forgot to protect users who keep on losing their skincolors.
2023-08-23 00:46:46 +01:00
toaster
b03c82b8b2 Implement UC_SPRAYCAN condition
Currently impossible to achieve, but will work once I draw the rest of the owl
2023-08-19 15:09:18 +01:00
toaster
1d06637a38 First pass at assigning unique spraycans to level headers
Increments gamedata minor version, be aware
- M_AssignSpraycans
    - Called in M_FinaliseGameData.
    - Attaches a hardcoded set of colours to all race maps in cup order, stopping once we run out.
    - The colours are shuffled, with some "freebies" always at the head of the list.
    - Integrates partial lists pretty well.
    - In DEVELOP builds, I_Errors if it produces corrupted state.
- G_LoadGameData, G_SaveGameData
    - Save & Load is implemented for these assignments
2023-08-19 15:08:55 +01:00
toaster
fb8795c8da M_FinaliseGameData
Creates a central landing point where gamedata loads/creates can be finalised properly.

In addition, gamedata wipes caused by data erase or custom SOC gamedata can no longer be saved in a partway corrupted state if they were to crash midway through.
2023-08-19 14:32:11 +01:00
James R
943086a902 K_TimerInit: disable POSITION in FREE PLAY 2023-08-12 16:38:01 -07:00
toaster
1ec5b74892 Implement SECRET_MEMETAUNTS
Permits "Meme" player taunt voice and "Meme" follower horn options
2023-06-28 19:31:40 +01:00
toaster
4344221252 Merge branch 'master' of https://git.do.srb2.org/KartKrew/Kart into seeecret-colors 2023-06-28 12:48:50 +01:00
toaster
5036719280 Merge branch 'master' of https://git.do.srb2.org/KartKrew/Kart into seeecret-colors
# Conflicts:
#	src/k_menudraw.c
2023-06-26 23:25:47 +01:00
toaster
c9817b957a New unlockable type for watching the Credits from start to finish
Also makes gamedata save/load a little more forward compatible longterm by making a UINT32 bitfield for various once-event flags, with increased minor version
2023-06-26 22:32:47 +01:00
toaster
060c03f011 Ring Racers-specific Evaluation
- Four evaluation modes.
    - Perfect
        - Currently no visual implementation
    - All others have a cool set of visuals
        - Multi-stage animation of a glowing threat and a Star that's Sealed
        - If they're relevant, show the gems you HAVEN'T grabbed
        - Three modes here
            - No gems
                - For Easy mode, asks you to brave a higher difficulty
            - Chaos Emeralds
                - Not all 7 chaos emeralds? Push your rank harder!
            - Super Emeralds
                - Not all 7 super emeralds? Further challenge awaits!
- `useBlackRock` to make evaluation context less specific for custom material is replaced with `useSeal` option
- M_CheckCupEmeralds(difficulty)
    - Returns the Emeralds you have for that difficulty
    - Obviously returns 0 for Easy
    - Makes the method of checking collected Emeralds for cup contexts significantly easier
2023-06-25 23:49:20 +01:00
toaster
bf5aa4b5d8 M_GetNextAchievedUnlock: Skip over adding Chao Keys if you've already unlocked everything
I considered restricting it even further to "unlock every minor unlock that can be unlocked by a Chao Key", but decided that if you haven't "completed the game" yet, you should still be periodically reminded of it.
2023-06-09 16:46:58 +01:00
toaster
8efd4788e7 enum gdmusic_t
Replaces existing musicflag system, which only had one flag, with a priority system that overrides menu music in general.
Also adds the CHAO KEY FREE DDL WORKING 2023 goofy music for matchesplayed Chao Key generation.
2023-06-07 23:05:19 +01:00
toaster
e162fffecf UC_PASSWORD
Unlockable type that supports entering (case-insensitive) string
2023-06-07 17:46:21 +01:00
toaster
f106d14d69 M_SanitiseChallengeGrid
Attempts to recover Challenge Grids that aren't quite appropriate for the current suite of unlocks.
- If there's multiple small tiles pointing to the same unlock, turn the later ones empty.
- If there's a small tile that SHOULD present on the grid and an empty spot, put the needed tile in that spot.
- Otherwise, regenerate the entire grid.
This will permit us to change the number of unlockables without forcing people to run with the command line param `-resetchallengegrid` to see 'em.
2023-06-07 17:46:21 +01:00
toaster
cc29c23ac6 Fix the width of the pending keys for gamedata to prevent unintentional rollover 2023-05-30 21:09:15 +01:00
toaster
0c7d66791b Expand datatype for Unlockables, emblems (Medals + nonmedals), and Conditions.
Made sure there is more than enough headroom for our current purposes.
It should be easy to double again if necessary now that the datatypes have been increased... but that would be obscene at this point
- 1024 Unlockables and 1024 Conditions (these were always tied together in slots)
- 2048 emblems (Medals + nonmedals). If we ship with ~250 maps this permits 8 Medals per map - which is higher than we intend right now but could easily fill out in patches
2023-05-30 21:08:29 +01:00
toaster
1527471678 Character win records
Track wins per character.
- If you have an existing gamedata of minor version 2 or earlier, attempt to import your last-used profile's wins onto the character you last used on that profile, so you're not starting from nothing. It's not quite accurate, but it's something.
- Much like map headers and cups, these are also tracked in an unloaded_skins_t linked list. That work was done in this commit because gamedata is actually loaded before even base-game characters, which is annoying but at least confirmed it was working quicker.
- TEMPORARY: Your per-character wins are displayed in your latest-log.txt, in lieu of an update to the in-game statistics menu
2023-05-30 12:21:41 +01:00
Sally Coolatta
c486ec19af SECRET_COLOR 2023-04-25 14:19:52 +01:00
toaster
945a00df6e Permit emblem pickups that take on the visage of a Follower
- If Global-type map emblem has GE_FOLLOWER, attempt to take on the appearance of the follower specified by var2.
    - Unlike MT_RANDOMAUDIENCE, this picks whether the object should be floating or hopping based on the specified mode of the source Follower.
    - Always chooses to face the nearest player.
- Rearrange some properties affected by Obj_Audience/audience.c to not conflict with MT_EMBLEM
2023-04-21 15:17:43 +01:00
toaster
66d8d8757e emblem_t: Add var2/stringVar2 2023-04-21 15:09:49 +01:00
AJ Martinez
3012839138 Serverside PWR: Completely rip out profile PWR, add PWR to XD_ADDPLAYER 2023-04-11 19:38:02 +01:00
toaster
8d66b279f8 FREE PLAY: Correct mistaken assumptions.
- Make the check consistent between HUD and Challenge conditions by revolving both around M_NotFreePlay.
    - The HUD appearance checked every individual component of K_CanChangeRules, so just straight up do that here.
    - If the rules can be changed, battleprisons is always FREE PLAY no matter how many players are present (because it can change quickly).
2023-04-03 00:28:38 +01:00
toaster
3e900d7f57 G_DirtyGameData: Dirty bit only applied in I_Error and signal handlers, nowhere else
- Unfortunately, the way this system previously worked, the unlock was given to you for free if you accidentially opened two copies of the game at once.
- Instead, open the file in r+ mode, shimmy along 5 bytes, and write a `true` to be read later.
- Far more memory safe than rewriting the entire gamedata out on crash.

ALSO:
- crashflags has been split into boolean evercrashed and UINT8 musicflags.
    - We don't need to track if the LAST session was a crash, at least not right now.
    - Opens the floor up to other music like Loser Club happening on the Challenges menu.
2023-03-17 14:42:06 +00:00
toaster
3ead0d09c4 Jartha review: Issues with activation and comments of UCRP_WETPLAYER and UCRP_FALLOFF 2023-03-17 13:00:17 +00:00
toaster
7f3836f916 Chao Key changes
- Chao Keys are now UINT16 instead of UINT8
- The maximum number of Chao Keys is now 9999, which is the largest number of 9s that can fit in a UINT16
- Used keys no longer count towards your total
Will mildly corrupt gamedatas made with previous conditions-cascading builds, but only in a way that gives you extra keys than you've earned.
2023-03-15 14:49:22 +00:00
toaster
2d7ef00e29 Discoveries while self-reviewing during description creation
- Rename "FinishAllPrisons" and correct text to refer to Prisons
- Do not hint at greater speeds for UCRP_ISDIFFICULTY
2023-03-14 20:59:51 +00:00
toaster
db1b3dd7c9 GDCONVERT_ROUNDSTOKEY: Make 20 in DEVELOP builds instead of 4, for a closer-to-realistic progression 2023-03-14 11:31:09 +00:00
toaster
425f260914 Never consider TEST RUN locked
- Repairs access to TEST RUN cup
- We want to make it an unlockable later, so...
- M_MapLocked data types corrected
2023-03-12 20:41:00 +00:00
toaster
241475155b Rename "Break the Capsules" to "Prison Break"
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
2023-03-12 20:17:46 +00:00
toaster
84e807cfa0 UCRP_ISENGINECLASS
Checks for the player's character's engine class
As before, A-I and J are valid classes
2023-03-12 15:55:14 +00:00
toaster
01f6eb71f5 Optimisation: reduce the number of calls to M_CheckUnlockConditions
- 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
2023-03-12 13:52:28 +00:00
toaster
5a9281ecfb Three new UCRP's
- 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
2023-03-11 23:56:58 +00:00
toaster
6129d810cc UC_ALLCHAOS, UC_ALLSUPER, and UC_ALLEMERALDS
Measures whether you have all 7 Chaos Emeralds, 7 Super Emeralds, or 14 Emeralds
- Hidden if you haven't entered a special stage yet
- Checks all cups and all relevant difficulties outside of GS_LEVEL
    - You can specify a difficulty of Normal, Hard, or Master
2023-03-10 22:50:08 +00:00
toaster
b3aa2520bc gamedata->everseenspecial
Record whether you've ever successfully entered a special stage
Used for conditions which were previously checking for whether you'd completed a special stage - which I think is a bit too restrictive for someone figuring out what next to lab
2023-03-10 22:43:06 +00:00
toaster
fea235d8a7 UC_REPLAY
Save a replay after finishing a round.
Basically another tutorial unlock condition like UC_ADDON
2023-03-10 21:44:48 +00:00
toaster
8b437d5a32 Minimum viable product of Chao Keys condition bypass
- Start with 3, per Sakurai's prior art.
- Earn them per certain number of rounds
    - DEVELOP builds: once every 4 rounds
    - Release builds: once every 50 rounds
    - Has an internal cap based on the maximum number of unlockables supported.
        - Possible future work could adjust this to restrict based on the maximum number of unlockables unlocks.pk3 actually has set.
- Use on the Challenges screen to bust open small tiles with hints (or the very first tile, if you haven't unlocked anything yet).
    - Will do a funny shake if you try anything else.
- Interrupts menu flow just like getting an unlock.
    - The matches you've played will tick upwards, giving you keys as they loop over.
2023-03-09 22:33:10 +00:00
toaster
4802f96249 UCRP_TRIGGER: Convert to roundconditions_t
- Previously was extern scope UINT32 for all players, but this permits one player in a netgame taking a secret path while others don't.
- Attempted to make user-specifiable string, but while I can undo the effects of strtok for the condition, I cannot undo the effects of strupr - so it's disabled for now until we come up with a more robust and hopefully direct system.
- Also removed some old SRB2-originated assumptions that you couldn't unlock anything in multiplayer from the unlocktrigger system.
2023-03-07 00:03:41 +00:00
toaster
baeb48ca1f roundconditions_t - State tracking for events which occour mid-match and don't stay that way
- Exists on every player struct to simplify writes, but A) not netsynced and B) only checked for local players
- Updated in the relevant locations - no centralised ticking at the moment
- Has a number of new associated conditions that require playing (UCRP's).
    - The following require [True/False] as supplementary information.
        - FallOff
        - TouchOffroad
        - TouchSneakerPanel
        - RingDebt
    - The following have no supplementary information because they're universally a specific achievement.
        - TripwireHyuu
        - SPBNeuter
        - LandmineDunk
        - HitMidair
    - The following has specific requirements that can be set.
        - WetPlayer [name of fluid]
             - Append "Strict" to forbid even skimming the surface of the map's fluid.
2023-03-06 22:31:35 +00:00
toaster
a355445592 condition_t: Make pendingstring into stringvar in anticipation of second, less angry application 2023-03-06 20:11:45 +00:00
toaster
87b80a62f2 SPB Attack: Integrate into conditions-cascading affairs
- 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
2023-03-05 20:48:31 +00:00
toaster
0f715454fa Merge branch 'master' of https://git.do.srb2.org/KartKrew/Kart into conditions-cascading 2023-03-05 19:51:48 +00:00
toaster
b005649d71 Copyright notices update regarding the author of this commit
- For cross-file consistency in the author of this commit's name and username
- To note that the author of this commit performed significant work on code that would eventually be compiled into r_skins.c on several occasions since 2016 up to the present day
- To catch work performed by the author of this commit in 2023
2023-03-05 18:13:39 +00:00
toaster
1ae5df651d UC_ADDON
- If you add a file (and you've unlocked Addons on non-DEVELOP builds) this gets achieved
- Also, Custom # of Rounds Played conditions will show "Custom" only if Addons are loaded
2023-03-04 21:36:58 +00:00
toaster
e994b920c6 gamedata->roundsplayed: Split into multiple roughly-gametype-aligned categories
- Race, Capsule, Battle, Special, Custom
- All categories can now be used for Rounds Played condition
- UCRP_SEALEDSTAR now hides if you haven't beaten a single Sealed Star yet
In addition, introduce M_ClearStats
- As more statistics get added, clearing them manually in G_LoadGameData and M_EraseDataResponse is just going to get annoying
- Change around the options on the Erase Data screen to
    - Make it clear that erasing all game data won't clear your Profiles
    - Add an option to clear stats by themselves, rather than only permitting via complete gamedata wipe
    - Move to the "Challenges" terminology over SRB2's "Secrets" terminology
- Move some entries that were previously handled in M_ClearSecrets into M_ClearStats
2023-03-04 20:09:29 +00:00
toaster
eeb6e40909 Add totalrings to gamedata
- Added to Statistics screen
- Caps at "999,999,999+".
- Controls UC_TOTALRINGS condition
- Improve description for UC_MATCHESPLAYED condition
    - Says "Rounds" now
- Improve Statistics text for playtime
    - Dynamically changes visible units of time (seconds, minutes, hours, days.......)
2023-03-03 22:35:28 +00:00
AJ Martinez
6173ca47aa SPB Attack: emblems/medals preliminary 2023-03-03 12:15:00 -08:00
toaster
06bde8b40e M_CheckCondition, conditiontype_t, etc: More fine-grained control over your condition string
- UCRP_PREFIX_ISMAP: a prefix version of UCRP_ISMAP
    - The condition string for UC_EMBLEM has been updated to match other relevant prefixes.
- UC_COMMA: a second string-relevance-only condition, for inserting a comma where only a human could find it natural
2023-03-03 15:40:10 +00:00
toaster
53ce2e4287 Gamedata-related changes + Crash tracking
- Combine multiple adjacent saves
    - Generally could happen during game ticking, combined via gamedata->deferredstate
    - DEFINITELY happened in splitscreen PWR handling, adjust those loops directly
- Write "dirty" state via gamedata->crashflags on everything except safe, intentful unloads
    - Add UC_CRASH, which unlocks dependent on the above "dirty" state being present at gamedata load
    - We can use this for something more useful and less funny later.
- Play "O_LOSERC" on the menu, starting with the Challenges screen, if a UC_CRASH condition has been met.
2023-03-03 13:38:31 +00:00
toaster
5b11179213 A start on in-level empheral conditions
- M_UpdateUnlockablesAndExtraEmblems: If Playing() and GS_LEVEL, call a bunch of funny conditions for every non-spectator splitscreen player.
    - Called every tick in P_Ticker. May be foolish. May duplicate effort. Worth extra attention later.
- Add a bunch of stacking-together UCRP_REQUIRESPLAYING condition types.
    - A collection of PREFIXes
        - Grand Prix
        - Bonus Round
        - Time Attack
        - Break The Capsules
        - Sealed Star
    - A collection of specific prerequisites
        - Current map is [map value]
        - Character is [character string that gets parsed after skin load]
            - M_UpdateConditionSetsPending(), because SOC is bad and loaded before skins
    - A collection of win conditions (TODO: these still work in FREE PLAY)
        - Finish in good standing
        - Break all the capsules
        - No Contest
        - Finish at least [place]
        - Finish at [place] exactly
        - Finish at [time, tics]
        - Finish at [time, tics] exactly
        - Finish with at least [time, tics] left (GTR_TIMELIMIT only)
    - An AND to concatenate them together (literally just for text adjustment)
2023-03-02 23:02:42 +00:00