For mappers:
How to add glider triggers:
	- Create a FoF.
		-- The FoF sector needs to have sector special 64 (Trigger Line Ex. (Anywhere in Sector)).
		-- The FoF linedef needs to be intangible. Linedefs 220 - 224 should work for this purpose.
		-- Within the FoF control sector, another linedef needs to be of type 443 (Call Lua Function).
			The front side upper and middle textures should have PARAGLID and ENABLE respectively. https://files.catbox.moe/yfr8e6.png
		-- Within the FoF control sector, another linedef needs to be 301 (Each Time). This is so the trigger always works with every player.
		-- Make sure the Each Time linedef and the control sector share the same tag.
	This should result in players getting paragliders, so long as they're in the air and within the intangible FoF.

	PARAGLID ENABLE and PARAGLID OPTIONS settings:
		[13] No Knuckles flag: Deploys the player immediately.
		[12] No Tails flag:	Prevents the player from letting go of their paraglider.
		Frontside X Offset:	Allows to set a delay before the player can let go of their paraglider.

How to add glider removers:
	The setup is the same as described with glider triggers, but instead of using PARAGLID ENABLE, you use PARAGLID REMOVE.
	This removes paragliders immediately to prevent cheesing and plays a unique sound ("S3KD2S").
	The sound can be changed by setting the linedef's backside texture to a sound name, e.g. "S3KBA".

How to set glider settings on the go through triggers:
	The setup is the same as described with glider triggers, but instead of using PARAGLID ENABLE, you use PARAGLID OPTIONS.
	This allows to change previously-set settings on PARAGLID ENABLE triggers without having to have players redeploy.
	For example, you can make a section that disallows players from letting go, and then use this trigger to allow letting go in a safe area. 
	In addition, like glider removers, it plays a unique sound ("S224"), that can be changed by setting the linedef's backside texture to a sound name. 

Check the example map for examples on how to put triggers in levels, and see how they work and behave with Kart's existing mechanics.

For scripters:
-- Files --
`GliderLogic` has the cvars, cmds, and the paraglider and paraglider-adjacent logic (button presses, game visuals, etc).
`GliderMobjsActions` has the visual code related to the paraglider mobj.
`GliderLinedefs` has the `PARAGLID` `ENABLE/REMOVE/OPTIONS` linedef code.
`GliderHelpers` has helper functions used throughout the code.
`GliderHUD` controls the tidbits of the paraglider HUD.
`GliderConfig` has the config loader.

-- Variables --
Here, playerMo = player.mo

State Control:
	playerMo.willParaglide (int):
		Timer that increases until it reaches PG_STARTWINGTIMER. When done,
		this variable will be set to zero, while playerMo.paragliding will be set to true. 

	playerMo.paragliding (bool):
		When set to true, the paragliding logic is enabled for this player.

Gameplay:
	playerMo.letGoGliderTimer (int):
		Timer used when a player is holding Brake (or overcharging with Acrobatics) while
		paragliding, increasing by one per tic up until LETGOGLIDERTIMER (which is TICRATE).

	playerMo.allowedToLetGoOfGlider (bool):
		Controls if players can hold brake to let go of the glider.
		It will be true if it's the case, false otherwise.

	playerMo.ticsUntilLettingGoOfGlider (tic_t):
		Controls when a player will be able to let go of the paraglider through the set delay.
		This will be leveltime + delay set, and the actual leveltime will be compared to,
		in order to know this.

	playerMo.springInfluence (int):
		Timer that ticks up during the spring state, used when we want to enable gliding logic again.
		When it reaches SPRINGINFLUENCETIMER, and the player falls down, this is set to zero.
		It will also be set to zero if a spring is touched. 

	playerMo.storedGlideMomz (fixed_t):
		The momentum stored while paragliding, often obtained by going down or using an item.

	playerMo.targetFallRt (fixed_t):
		The fall speed value of the player while paragliding.

	playerMo.startFallVel (fixed_t):
		When a paraglider is deployed, this stores the player's initial momz
		they had before the deploy to be applied during the paraglider physics.

	playerMo.glideFinBuffer (tic_t):
		Dictates "coyote time" - for how long the player can be on the ground
		with a paraglider before the paraglider goes away.
		Capped to PG_COYOTETIMETICS (5 tics)

Controls:
	playerMo.glideVerticalMovement (fixed_t):
		It directs if the vertical movement should be upwards or
		downwards. Capped to FRACUNIT and -FRACUNIT by logic.

	player.invertParaglider (int):
		Handles vertical input.
		It will be 1 for normal controls, and -1 for inverted controls.

Internals:
	playerMo.paraglideMobj (mobj_t):
		Points to the player's paraglider mobj.

	player.holdingItemBTN (bool):
		Checks if the player is holding the item button.

Visuals and Sounds:
	playerMo.visonlyStoredStates (int):
		Indicates the visual status of the paraglider afterimages.
		From -1 (none) to 2 (highest possible).

	playerMo.wooshSoundCD (int):
		A cooldown that gets set when the player moves up with enough momentum.
		It initiates the "woosh" sound when the player goes up.

-- Functions --
jglider.isMobjValidPlayer(mobj_t):
	Simple check to know if the player and their mobj is valid.

jglider.FindSoundByName(string):
	Tries to find an sfx_ constant by name.

jglider.GetSoundOrFreeslotFromString(string):
	Uses FindSoundByName -- if it returns nil, then the sound name
	is freeslotted and this reference is passed by the function.

jglider.spawnParagliderWithStartup(mobj_t, boolean (useDefaults))
	Designed to be used for player mobjs.
	Spawns a paraglider on the player with the associated
	paraglider startup.
	Set useDefaults to true to have the function set
	allowedToLetGoOfGlider and ticUntilLettingGoOfGlider to
	default values. (This is normally what you might want for
	interop, if needed.)

jglider.createParaglider(mobj_t):
	Designed to be used for player mobjs.
	Creates a paraglider to mobj_t's position, mimicking various of its properties.

jglider.initParaglider(mobj_t):
	Opens up the glider with the corresponding logic.
	Depending on the logic, playerMo.paragliding will need to be set to true.

jglider.resetGliderStuff(mobj_t):
	Designed to be used for player mobjs.
	Resets various paraglider-related variables.
	Used when a player falls down or gets hit.

jglider.resetGliderValues(mobj_t):
	Designed to be used for player mobjs.
	Resets paraglider-related variables.
	Internally used on deploy and when the paraglider
	is let go.

jglider.createDeadGlider(mobj_t):
	Designed to be used for player mobjs.
	Creates a "dead" glider when the player falls down or gets hit.

jglider.getTurnRateGlider(player_t):
	Returns the turn rate of the player's glider, based on their weight stat.

jglider.lerp(fixed_t num, fixed_t denum, fixed_t minimum, fixed_t maximum):
	Lerp function utilized internally to ease vertical momentum.

jglider.createRocketSneakers(mobj_t)
	Internal function used to create Rocket Sneakers in midair.