Commit graph

256 commits

Author SHA1 Message Date
toaster
83acdaa0cf UCRP_HITDRAFTERLOOKBACK
"hit a racer drafting off you while looking back at them"
Self-explanatory set of conditions
Wrote a commented out more compicated check for valid angles between player and target, but lastdraft probably is good enough for these purpses
2023-10-18 02:05:12 +01:00
toaster
a7940684f6 UCRP_WHIPHYUU
Insta-Whip another racer while you yourself are invisible from Hyuudoro, it's shrimple
Also updates the phrasing used for UCRP_TRIPWIREHYUU to match ("afflicted by Hyudoro")
2023-10-18 01:18:34 +01:00
toaster
1c887a7041 UCRP_LANDMINEDUNK: The official parsing is "Land Mine" 2023-10-18 00:45:26 +01:00
toaster
edd3e8bbea UCRP_PODIUMNOCONTINUES
Fires if no continues have been used (as tracked on the Ceremony Ranking screen)
2023-10-18 00:42:59 +01:00
toaster
813ad52b15 Guarantee UCRP_PODIUMxx events only occour ig grandprixinfo.gp is true
Currently podium is GP only, but that won't be forever
2023-10-18 00:42:02 +01:00
toaster
acdb7fd869 UCRP_CHASEDBYSPB
True if the player has PF_RINGLOCK (SPB on the HUD). Probably the cleanest implementation.
Stacks well with "finish in 1st".
2023-10-18 00:10:40 +01:00
toaster
a746c4f33f SPB-related conditions: Make hyphenation consistent 2023-10-18 00:07:30 +01:00
toaster
e9d4cc2f3a UCRP_TRACKHAZARD, UCRP_FAULTED: Use latestlap instead of current lap when determining elegibility 2023-10-17 23:25:26 +01:00
toaster
fa2e54dd13 UCRP_FAULTED
- `Condition1 = Faulted Yes`
    - `FAULT during POSITION`
    - for example, combine with "& finish in 1st"
- `Condition1 = Faulted No`
    - `don't FAULT during POSITION`
2023-10-17 23:21:47 +01:00
toaster
90a65220b2 UCRP_FALLOFF, UCRP_TOUCHOFFROAD, UCRP_TOUCHSNEAKERPANEL, UCRP_RINGDEBT: Only evaluate the "false" case if the player is exiting or has PF_NOCONTEST 2023-10-17 23:20:16 +01:00
toaster
35ca8e6191 UCRP_SPEEDOMETER
Provide a percentage between 100 and 999 inclusive.
Reach that speed on the speedometer at any point during the race to achieve the condition.
2023-10-17 22:53:40 +01:00
toaster
9e1aec4298 UCRP_RETURNMARKTOSENDER
"when cursed with Eggmark, blow up the racer responsible"
Just a simple condition. Either it happens or it doesn't.
MT_SPBEXPLOSION now tracks whether it was made by KITEM_EGGMAN or KITEM_SPB, too!
2023-10-17 22:25:47 +01:00
toaster
3e494a342c UCRP_GACHABOMMISER
Break a target (Prison Egg/UFO) using exactly one Gachabom again and again
Becomes invalid if an Insta-Whip collides with a target, or you throw two at the same time
2023-10-17 21:09:22 +01:00
toaster
01b97cb829 Update UCRP_UFOATTACKMETHOD into UCRP_TARGETATTACKMETHOD
Supports Prison Eggs and Gachabom now as well.
For the original behaviour, combine with the new UCRP_SMASHUFO.
2023-10-17 21:03:20 +01:00
toaster
d11fe78e90 UCRP_UFOATTACKMETHOD
`Condition1 = UfoAttackMethod [type]`
    - "smash a UFO Catcher using only [type]"
        - Combine with `Prefix_SealedStar` or `Prefix_IsMap [special stage stage]`
        - Shows up as "???"
    - Types supported:
        - `Boost` - "boost power" (sneakers)
        - `Whip` - "Insta-Whip"
        - `Banana` - "Bananas"
        - `Orbinaut`- "Orbinauts"
        - `Jawz` - "Jawz"
        - `SPB` - "Self Propelled Bombs"
    - Other types could be added on request, these were just the easy ones

In addition, the prototype for P_MobjWasRemoved was moved to `p_mobj.h`.
It's EXTREMELY important that we're able to safely check mobj pointers anywhere a mobj_t is possible to observe, without including the full `p_local.h`...
2023-10-17 01:07:03 +01:00
toaster
f0d1813752 UCRP_TRACKHAZARD: Optimise implementation to not be 100 booleans
Much like player->availabilities, use a set of bits on UINT8.
2023-10-16 18:04:23 +01:00
toaster
d4e3d8433d UCRP_TRACKHAZARD
A series of 100 booleans on the roundconditions struct, one per possible lap.
Allows for a full suite of track hazard touching conditions - see the following examples.

- `Condition1 = Prefix_IsMap RR_MOTOBUGMOTORWAY
- `Condition1 = TrackHazard No`
- `Condition1 = IsMap RR_MOTOBUGMOTORWAY`
    - "MOTOBUG MOTORWAY: Don't touch any track hazard"
- `Condition1 = Prefix_GrandPrix`
- `Condition1 = IsMap RR_HARDBOILEDSTADIUM`
- `Condition1 = TrackHazard Yes`
- `Condition1 = And`
- `Condition1 = FinishPlace 1`
    - "GRAND PRIX: On HARD-BOILED STADIUM, touch a track hazard every lap & finish in 1st"
- `Condition1 = Prefix IsMap RR_DEATHEGG`
- `Condition1 = Trackhazard No 8`
    - "DEATH EGG ZONE: Don't touch any track hazard on lap 8"
- `Condition1 = Prefix_IsMap RR_SPEEDHIGHWAY
- `Condition1 = TrackHazard No Final`
    - "SPEED HIGHWAY: Don't touch any track hazard on the final lap"
2023-10-16 17:09:12 +01:00
toaster
6b2e0a508d UCRP_RINGS, UCRP_RINGSEXACT
`Rings 10` - "with at least 10 Rings"
`RingsExact -14` - "with exactly -14 Rings"
(`Rings 20` will also be parsed as "with exactly -20 Rings")
2023-10-15 00:17:20 +01:00
toaster
b2aac22856 UCRP_FINISHPERFECT
Complete a perfect round (1st every lap) to get this
2023-10-14 23:21:51 +01:00
toaster
e4a3b85adf UC_UNLOCKPERCENT: Make SECRET_COLOR option actually count Spray Cans, not unlockables directly 2023-10-14 22:36:41 +01:00
toaster
70c0b0503d Ancient Shrine polish
- Change the phrasing from "activate the ancient shrine" to "play a melody for the ancient shrine in"
- Add ~~Morbius~~ Mystic Melody Orb decorations
- A_FireShrink has been fixed to use mapobjectscale (and prevent dividing by 0)
2023-10-14 21:25:03 +01:00
toaster
52674c7bb2 UC_UNLOCKPERCENT
- `UnlockPercent 40 AltMusic` - "Get 40% of alternate music"
- `UnlockPercent 1 Color` - "Get 1% of Spray Cans"
- `UnlockPercent 20 Map` - "Get 20% of Courses"
- `UnlockPercent 55 Cup` - "Get 55% of Cups"
- `UnlockPercent 100` - "Get 100% completion"
    - Provide a percentage and, optionally, an Unlockable type
    - This only works for Unlockable Types where there are expected to be more than one per board
2023-10-14 18:42:27 +01:00
toaster
1c4750a0a2 readcondition: Support non-fragmented parameters that can be used for the Challenge Description directly
- "DescriptionOverride" (new!)
    - Provide a full description in place of the params and this will be used
    - Any conditions that are before it will not be wiped, so you can prefix it if you need to
    - Can be used with any other set of Conditions
        - `Condition1 = DescriptionOverride Complete the sentence: "ring racers (???)"`
- "Password"
    - Now supports passwords that contain spaces
        - `Condition1 = Password race as a ring!`
- "WetPlayer"
    - Now supports liquids that contain spaces
    - HOWEVER, it comes with the following caveats as part of the change:
        - The strictness level must be provided first.
        - You can't leave the strictness out. The previous default behaviour now requires STANDARD to be explicitly written.
        - `Condition1 = WetPlayer Standard Mega Mack` can be used, now.
2023-10-13 16:25:05 +01:00
toaster
f8de2cfc83 UC_PRISONEGGCD
Gamedata minor version was updated again.
(God this was a weirdly big amount of work and it's not even polished.)
- Condition1 = PrisonEggCD [Level that has to be unlocked]
- Approximately every 30 Prison Eggs destroyed, you get a shot at a Prison Egg Drop.
    - The only Prison Egg Drop implemented right now is an Alt Music CD.
    - Your [Wild Prize] is guaranteed to be selected only from conditions associated with levels that are unlocked!
- Only spawns in Grand Prix Bonus Rounds, for netsync and game design.
- The number is fuzzed. If you start the level with 0 Prison Eggs to destroy, it selects a random number of Prisons in the level to bust.
- If you miss the pickup (such as into a deathpit), you'll get another shot in the immediate next Bonus Round you play.

Also:
- The number of Chao Keys you start your gamedata with is now part of the header file, not buried in the wiping function.
- Removed the ACTUAL last object definition vestiges of the Emerald Hunt gamemode.
2023-10-12 21:12:08 +01:00
toaster
71a95b3096 M_BuildConditionTitle: Support menuttl
Example for menuttl "Controls":
- For Tutorial levels, show "The Controls Tutorial"
- Otherwise, show "CONTROLS" (allcaps)
2023-10-11 17:24:50 +01:00
toaster
2cc796a042 M_AssignSprayCans: Don't handle the prepended cans in reverse order
Was messing around with part-duplicating this code for Prison Egg CDs, and realised a corruption/overwriting bug if you had more freebie Spray Cans than the standard ones.
2023-10-11 16:11:14 +01:00
toaster
d784f6ad4a SECRET_ALTMUSIC
Restricts a map's alt music, in order of music definition.
Supports out-of-order discoveries!
2023-10-08 21:22:58 +01:00
toaster
8fd809f8b1 M_PrecacheLevelLocks(void): Implement a SECOND level of cacheing for Map and Cup unlocks
Determining whether a map or cup is unlocked or not is now linear-time.
- Attempted to cache SECRET_SKIN et al as well, but skins are loaded after unlocks... oh well.
- Was staring down the barrel of a triple-nested loop for implementing SECRET_ALTMUSIC, so did this first to set good precedent.
2023-10-08 18:25:20 +01:00
toaster
ce3b6e304b Add UC_MAPMYSTICMELODY
If you activate an Ancient Shrine on that level, the condition triggers and the Challenge is achieved.
2023-10-06 22:32:43 +01:00
toaster
14b6c0f275 M_GetConditionString: Do not add a suffix for UC_MAPENCORE - that condition already has a guaranteed prefix saying the same thing. 2023-10-06 18:50:20 +01:00
toaster
b937b1a7bc Add UCRP_MAKERETIRE
- `Condition1 = MakeRetire Eggrobo`
- Fires when:
    - Not a cooperative context
    - You've finished in good standing
    - Another player has both
        - PF_NOCONTEST
        - The skin specified in the condition
Also makes rivalname-handling for K_InitGrandPrixBots `const char *`, since the author of this commit had to reference that code.
2023-10-05 14:36:00 +01:00
toaster
764141946d M_GetConditionString cleanup
- Remove pointless "BUILDCONDITIONTITLE" macro for M_BuildConditionTitle
- Replace simple R_SkinUsable checks with M_GetConditionCharacter
    - Supports knowing a character's name via them being the Rival for a currently unlocked character, if that Challenge doesn't require them unlocked to interact
2023-10-05 14:23:46 +01:00
toaster
911588a5fe Challenges Tutorial messages
Currently exists for:
- Generating a Chao Key
- Attempting to use a Chao Key on a Major Challenge
    - Only shows after Generating a Chao Key just so it doesn't fire before you know what's going on
Text is preliminary
2023-09-29 00:25:51 +01:00
toaster
33dfb697bf M_UpdateChallengeGridExtraData: Slight optimisation in initial setup 2023-09-27 16:02:28 +01:00
toaster
b33597e225 Beginnings of system for using Chao Keys on large tiles
- M_UpdateChallengeGridExtraData: Register whether major unlock tiles have had every surrounding Challenge cleared (CHE_ALLCLEAR)
- M_DrawChallengeTile: For locked tiles with CHE_ALLCLEAR, show a little dot (temporary drawer)
2023-09-27 16:02:28 +01:00
toaster
29c3943366 M_AssignSpraycans: Forgot to remove an irrelevant check, now should update if new Spray Can conditions are added 2023-08-24 21:38:17 +01:00
toaster
6d5770ff5a M_AssignSpraycans: Fix off-by-one in shuffled prepended colours causing crashes
The prepended colour list passed to M_Shuffle_UINT16 was off by one, leading to possible pollution of the region with an uninitialised value.

For some reason, some people's machines guarantee clean stack memory on game startup, while other people's do not. This is why some people were crashing on Spray Can list generation and some weren't.

The stack memory was DEFINITELY not clean by the time you could navigate to the gamedata clear menu, which is why that was crashing without fail.
2023-08-24 21:33:06 +01:00
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
b9a6f7362b M_UpdateConditionSetsPending: Fix invalid character names returning the entire loop early 2023-08-23 18:54:28 +01:00
toaster
53549bfa2d M_Shuffle_UINT16: Fix to not rule out half of all possible Spray Can orders 2023-08-23 17:08:06 +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
d19e98beb8 Proper-Nounify the Spray Cans on the Challenges descriptions 2023-08-19 21:33:49 +01:00
toaster
78850c48b2 Disable some testing prints 2023-08-19 17:16:36 +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
b669f8484f Realname for Cups
Permits prefixing them like maps AND giving them spaces instead of underscores, fixing the "RECYCLE_A" issue.
2023-08-10 00:28:17 +01:00
toaster
9e4e996a5e V_ScaledWordWrap API changes
- The function is back to producing zone-allocated memory copies, like its precursor V_WordWrap
    - The author of this commit got rid of that dependency originally because it seemed like a fair part of the API, and meant static buffers could be used in certain circumstances, but it was necessary to revert for the following change.
- Newlines can now be inserted mid-word, treating the width provided as ironclad except in the case of single characters wider than the region.
    - This will be necessary for future work with the in-game chat.
    - Reserves 8 characters at first, then Z_Reallocs double that every time it runs out.
2023-07-12 09:00:30 +01:00
toaster
277f7c51a3 V_ScaledWordWrap
Moves WordWrap to the font/V_GetFontSpecification system.

Much healthier long-term for our purposes, including the possibility of changing fonts for various contexts freely.
2023-07-12 09:00:29 +01:00