Commit graph

1573 commits

Author SHA1 Message Date
toaster
a3640110ae Only permit Spray Cans to be grabbed on base game levels
I would not be so heavy handed against preventing players from grabbing Spray Cans on custom levels, but designing a system that permits unloaded headers to retain their cans is frankly overkill. There are plenty of other ways the same kind of level-scouring play can be experienced on custom levels.
2023-08-23 17:16:07 +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
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
9372f8ff1a Conditionset is UINT16, not UINT8 2023-06-27 23:03:05 +01:00
toaster
65f679c0bc Unloaded cupheader windata tracking
IMPORTANT NOTE - increments gamedata minor version to 3, as it is necessary to backfill windata to prevent losing existing cup records.

This is essentially commit 1482fd5 but for cups.
- All cups currently loaded with nonzero windata are written on gamedata save.
    - This reduces gamedata size for a player who has not unlocked every cup!
- On gamedata load, if a cup is not loaded, store the extra windata on a linked list.
- On cup header creation, check the linked list to see if an associated unloaded cupheader windata exists.
    - If it does, write the record onto the cup structure directly, and delete the "unloaded cupheader" storage struct!
- Then on the NEXT gamedata save, in addition to all loaded cupheaders, it writes the extra windata kept in long term storage in exactly the same format.
2023-05-30 12:21:39 +01:00
toaster
533508d7b0 Level and cup header information: Hashing for referencing by name
Foundational assistive work.
Also guarantees a consistent cup name length in memory, as some places read/wrote 15 bytes, and some places read/wrote 16 bytes. We settle on the latter (including null terminator) for the broadest backwards compatibility.
2023-05-30 12:21:39 +01:00
toaster
1d3b5adfdf "Monitor" parameter for cups
- 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
2023-03-13 16:18:07 +00:00
toaster
8edf099f78 Sal's review: Clear levels on gamedata addition by default
Instead, if you want an exception - in the *same* MainCfg block, set `doClearLevels = False` (or `0`, or `No`)
2022-12-19 21:26:52 +00:00
toaster
117b4c6a7b GAMEDATA MainCfg SOC block adustment
Discussed in DMs
- All other `MainCfg` block properties require a custom gamedata (or be a main file) to be modified
- When a custom gamedata is set, clear all unlockables, conditionsets, and emblems are unconditionally cleared
- You may also Clear Levels only if a custom gamedata is used
2022-12-13 18:20:52 +00:00
toaster
2871ccb4f1 Rewrite level restrictions
Now uses `SECRET_CUP` and `SECRET_MAP` with a stringVar saying the map lump/cup name, instead of `SECRET_NONE` and a levelheader `unlockrequired` property.
2022-12-13 13:45:17 +00:00
toaster
a33d6d9235 Fix level/cup unlocks
- M_MapLocked
    - If a level has a cup, will return true if that cup is locked
    - will return always false in marathon mode (not yet accessible, that'll be another branch's work, but thinking ahead)
- Getting rid of a bunch of index fudging caused by SINT8 rather than UINT8 - we can use MAXUNLOCKABLES as the special invalid value
2022-12-03 17:29:14 +00:00
toaster
d061dd09fd Removing extraemblem_t
- You can now create an unlockable that gives you an emblem only with SECRET_EXTRAEMBLEM.
    - One step above the completely rewardless squares from Kirby Air Ride.
- Added color to `unlockable_t`.
    - Can be used both with user-specified icons (remappable green->color) and with non-SECRET_SKIN default graphics (invincibility full-range remap)
- Replaced condition type UC_EXTRAEMBLEM with the more general UC_UNLOCKABLE.
- MAXUNLOCKABLES is now == MAXCONDITIONSETS
2022-12-03 14:52:58 +00:00
toaster
6671e181b0 Increase unlockable/conditionset limits
- MAXCONDITIONSETS is UINT8_MAX
- MAXUNLOCKABLES is (MAXCONDITIONSETS-MAXEXTRAEMBLEMS)
Haven't come to a decision yet on whether Extra Emblems should just be made with the Unlockable struct or maintain their distinct status, this commit kicks that can down the road
2022-12-03 11:40:58 +00:00
toaster
6d0637d39d Unlockable skins (in a way friendly to #define MAXSKINS 255)
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.
2022-11-27 22:53:29 +00:00
toaster
8aeaf9738d Major changes to follower selection
- 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"
2022-11-06 22:53:12 +00:00
toaster
c1dbbdf801 Merge branch 'master' of https://git.do.srb2.org/KartKrew/Kart into big-large-map-markers 2022-09-23 17:38:49 +01:00
James R
937e1d10d4 Fix -Wformat 2022-09-22 09:56:50 -07:00
toaster
cb8becb2d3 Enforce maximum length of 63 for map lumpname
Also, in g_demo.c, use SKIPSTRING (instead of READSTRINGN into a discard buffer)
2022-09-22 17:34:02 +01:00
James R
499c61a9f2 Kill SPRITE/SPRITEINFO, SPRITE2INFO SOC headers
Kill it because maintaining three parsers for the same
data is insane.
2022-09-21 12:15:21 -07:00
Sally Coolatta
2fddc9f343 Merge branch 'master' into big-large-map-markers 2022-09-10 16:01:02 -04:00
Sally Coolatta
107622968e Merge branch 'master' into new-menus 2022-08-27 22:36:58 -04:00
Sally Coolatta
f84baf47d5 Fix missing else 2022-06-01 00:40:08 -04:00
Sally Coolatta
4c3f89cdf7 Allow freesloting & editing precipprops
Allows for custom weather types.

In SOC:
```Freeslot
PRECIP_GROOVY

Weather PRECIP_GROOVY
Type = MT_PARTICLE
Effects = PRECIPFX_THUNDER|PRECIPFX_LIGHTNING```

In Lua:
```freeslot("PRECIP_GROOVY")

precipprops[PRECIP_GROOVY] = {
    type = MT_PARTICLE,
    effects = PRECIPFX_THUNDER|PRECIPFX_LIGHTNING
}```

Then in level header, simply set `Weather = PRECIP_GROOVY`.

Other properties are part of the object itself:
- Falling speed is set as the object's speed
- Sound ID is set via the object's SeeSound
- Sound frequency is set by the object's Mass.
2022-05-31 09:03:06 -04:00
toaster
48d451cfef Merge branch 'master' of https://git.do.srb2.org/KartKrew/Kart.git into new-menus
# Conflicts:
#	src/d_ticcmd.h
#	src/deh_soc.c
#	src/deh_soc.h
#	src/deh_tables.c
#	src/dehacked.c
#	src/f_finale.c
#	src/g_game.c
#	src/m_menu.c
2022-05-21 18:57:46 +01:00
James R
36cd517dce Revert wrong replace 1d79eb70c 2022-05-20 17:24:13 -07:00
James R
1d79eb70c1 Replace just a few more instances of SRB2Kart 2022-05-20 17:08:18 -07:00
Sally Coolatta
852e9b8ce9 Rebrand all console / window stuff 2022-05-19 15:10:47 -04:00
toaster
884064049e * Allocate the "MISSING" patch only once, statically, at first boot via missingpat, and prevent it from being freed.
* Rework HU_UpdatePatch to HU_UpdateOrBlankPatch with a "required" boolean.
    * If desired graphic is not present in resources:
        * If required is true, return `missingpat`.
        * If false, return NULL as before (font compatibility).
    * Add an alias with the previous function signature, so you don't need to add a million `true`s everywhere.
* Remove a ton of irrelevant graphics the game attempts to cache only because of code inherited from vanilla SRB2.
* Remove the unused hudinfo system, also inherited from vanilla SRB2.
2022-05-14 14:56:02 +01:00
toaster
73dabaeab6 Merge branch 'master' into new-menus
# Conflicts:
#	src/d_clisrv.c
#	src/deh_soc.c
#	src/lua_baselib.c
#	src/m_cheat.c
#	src/m_menu.h
#	src/y_inter.c
2022-03-29 17:14:38 +01:00
toaster
bf6b9c6fed Remove music slot compatibility
# Conflicts:
#	src/deh_lua.c
#	src/lua_baselib.c
2022-03-18 13:54:03 +00:00
X.organic
0b2783925f Remove some dead code from DEH_LoadDehackedFile
Also fixes a buffer overflow, but said overflow generally got caught by
the stack smashing protector. Still, it's better for SOC files not to be
able to crash the game that easily.
2022-03-18 13:14:37 +00:00
James R
82f4364eb4 pedantic: fix misc leniencies and GNU-isms 2022-02-20 03:28:22 -08:00
toaster
b4af07ffed Merge branch 'master' into new-menus
# Conflicts:
#	src/d_main.c
#	src/dehacked.c
#	src/m_menu.c
#	src/v_video.c
#	src/y_inter.c
2021-10-18 01:18:37 +01:00
Sally Coolatta
de1f67b72a Use strings in the map header for next level, marathon next, thumbnails, minimaps, encoremaps, and tweakmaps 2021-04-09 21:10:46 -04:00
Sally Coolatta
9d7ec0ab8f Merge SRB2 next
Probably doesn't compile yet, but I got rid of all of the conflicts for anyone who wants to take a stab at it.
2021-02-27 05:18:36 -05:00
toaster
a43a762b46 Instead of hacking ticcmd generation, add/modify helper functions acting as intermediaries that add the necessary changes.
* Introducing K_GetKartButtons(player_t), for adding false presses to.
* K_GetForwardMove(player_t) takes kickstarting into account, and is now applied to engine sound generation too.
* BT_REALACCELERATE has been deleted.
2021-02-22 12:21:48 +00:00
toaster
d039b14aa4 Make kickstartaccel a UINT8 instead of an INT32 kartstuff entry. 2021-02-21 18:08:04 +00:00
toaster
08d087c6b5 Acceleration Kickstart, my little hobby project.
It's no secret that holding down a button a lot can fuck with your wrists and fingers. It's too late for me to be damageless, but I can at least create an option to reduce further harm.

This accessibility feature, when enabled (kickstartaccel and kickstartaccel2/3/4 in the console) behaves with the following properties:
* Hold accelerate for 1 second to lock it down.
* Press again to release.
* Short holds/presses do nothing (good for POSITION).
* Continue holding it during the releasing press to re-lock it.
* A small triangular UI element is added next to the speedometer sticker, which displays the current state of the acceleration kickstart for visual feedback. (NO SPLITS SUPPORT YET)

In addition:
* Add PF_ACCELDOWN and PF_BRAKEDOWN, and BT_REALACCELERATE (which ACCELDOWN tracks). Even if this feature never gets merged, BT_REALACCELERATE is required because sneakers and boosters force it on too (extending this is how I implemented it).
* Fix the dehacked playerflag list being out of shape.
* I replaced some existing flags during development of this branch, so their old uses have been whittled away.
2021-02-20 23:10:18 +00:00
X.organic
5e832ece89 Move Dehacked table sanity check to deh_tables.c 2021-02-16 19:46:31 +01:00
James R
44ec94f287 Merge remote-tracking branch 'origin/master' into funny-spikes 2021-02-06 03:00:50 -08:00
James R
caa7fe1b47 Merge branch 'player-new-frames' into 'master'
New player frames: Glancing and death

See merge request KartKrew/Kart!362
2021-02-06 05:57:11 -05:00
James R
f9c6a5e8b5 Drop Funny Spikes when getting stung
DEBTA0-DEBTH0

Instead of dropping rings, drop non collectable spikes!
2021-02-06 02:31:24 -08:00
Sal
053ecf203f Merge branch 'pos-hud-tweaks' into 'master'
Position number uses additive/subtractive

See merge request KartKrew/Kart!361
2021-02-05 17:53:11 -05:00
Sally Coolatta
75dd970adc Beam objects
Place 2 to arbritrarily place the line anywhere. For sprint maps.
2021-02-05 01:58:34 -05:00
Sally Coolatta
e2e342f3f7 Update panim for the new states 2021-02-03 19:29:13 -05:00
Sally Coolatta
480e32d369 Properly add states to the tables...
Mind's been split everywhere tonight
2021-02-03 19:20:27 -05:00
Sal
fe0c9cef65 Merge branch 'lua-karthud-bruh' into 'master'
Lua: Expose p.karthud and p.respawn

See merge request KartKrew/Kart!354
2021-02-03 02:19:27 -05:00
Sally Coolatta
bea2724a86 Glance frames
When someone is about to pass you, you'll take a glance at 'em!
2021-02-03 01:24:00 -05:00
Sally Coolatta
cc2704bc87 Death animation
Art is missing, but functionality is complete.

The kart corpse is also placeable as type 4095. No way to set its color currently, it simply defaults to SKINCOLOR_RED.
2021-02-02 22:36:56 -05:00
Sally Coolatta
4d108930a9 Update position nums to use additive
Looks far more colorful this way! By default it is additive... but like SMK, there is a map header option for subtractive, intended for maps with white roads.
2021-02-02 19:58:07 -05:00