Mobjs got their own thinker list after all, and disappearing thinkers are automatically purged from their lists and sent to the limbo list.
So it's safe to assume all thinkers inside the mobj list must be mobjs.
Signed-off-by: Nev3r <apophycens@gmail.com>
Set up a main thinker list and a polyobject mover list to test things up. Works so far, networking as well.
Signed-off-by: Nev3r <apophycens@gmail.com>
* Flickies can be in-place with just one flag (MF_GRENADEBOUNCE)
* Flickies can now hop whether orbiting, aimless, or in-place
* Removed ability to customize movedir for orbit; will always be random
* Removed ability to customize gravity sink for aimless flying flickies
* Misc: Use P_SetTarget to set actor->tracer for flicky center
* Default hitbox height is 80
* Drone Thing parameter sets height to multiples of 32
* Player aligns by default to bottom+24 of hitbox (offsetted)
* `MTF_OBJECTSPECIAL` aligns player to hitbox top
* `MTF_EXTRA` aligns to hitbox center
* `MTF_OBJECTSPECIAL|MTF_EXTRA` aligns to real bottom of hitbox
* Goalpost and sparkle Z alignment is changed to reflect configurableness
* New entries: NIGHTSDRONE_MAN, NIGHTSDRONE_SPARKLING
* NIGHTSGOAL renamed to NIGHTSDRONE_GOAL
* MT_NIGHTSDRONE repurposed as an invisble, no-gravity hitbox
* Old attraction is still used for non-NiGHTS players due to a momentum bug. The old way is good enough to sidestep the bug.
* Thanks Inuyasha (KS) for original code 🐶
* Changed default movement to attraction, vs. aimless
* Flickies spawned from this will always have the FLICKY_CENTER mobj as its target
* Use P_IsFlickyCenter to identify FLICKY_CENTER mobjs versus players
* FLICKY_CENTER mobj tracer points to the spawned Flicky
* Thanks toaster for the original code~~
* Flames fall with flameholders.
* New modification to teleport cheat: -sp <val> <val> allows instantaneous jump to any starpost in the map, including spawnpoints as starpost index 0!
* Also, -ang <val> and -aim <val>, which can be combined with -nop to pivot on the spot.
* Bomb sphere! Paraloopable hazard. Replaces MT_SPECIALSPIKEBALL.
* Blueberry bushes, both normal and Xmas, from patch.dta.
* BSZ tulips, also from patch.dta!
* Frozen Hillside badniks - Penguinator and Pophat.
* Frozen Hillside ice decoration!
* Fixed some big bugs with the DSZ light beams.
* Made multi-mare special stages work, in a troll way - the Chaos Emerald disappears in a puff of smoke, and the Spinbobert laughter sound plays... >:3c
* Reverted the mobjtype number changes from the source SOC/Lua, which we can do later when doing a final pass of the levels.
* State optimisation.
* Serious cruft-removal of the NiGHTS drone thinker.
* Fix the issues where the player wouldn't curl into jump in waterslides or dropping off rope-hangs.
* Tweak NiGHTS player flashing.
* Add text colour support to the titlecard font.
* Use that to make the PRESS SPIN\nMID-JUMP thing when you get all Chaos Emeralds use the titlecard font for readability.
* Fix the GOT ALL EMERALDS page not lasting the correct, extended amount of time.
* Fix that thing where flying mid-spin didn't enact autobrake.
* Modify graymap a little on Sryder's suggestion.
* [COMPLETELY UNRELATED] fix that thing where the addons menu will fail on files/paths with spaces in [/COMPLETELY UNRELATED]
OLD SPECIAL STAGES:
* Spheres in old special stages instead of rings!
* Individual timers in old special stages instead of a global one!
* Old special stages use a variant of the NiGHTS HUD now!
* Special stage damage in old special stages loses 5 seconds of time instead of 10 rings/spheres!
* All damage gained through old special stages is converted to special stage damage! As a consequence, the special spikeball has no need to be special anymore.
* Made emerald gaining function be based on special stage number rather than gained emeralds!
* Consistency with...
NiGHTS SPECIAL STAGES:
* Spheres now flash in bonus time. https://cdn.discordapp.com/attachments/400761370800422922/452590553100713984/srb20032.gif
* Sphere and ring mapthingnums are now less fucked up in 'em. (Rings are 300, same as usual, while Spheres are now 1706 replacing NiGHTS Wings.)
SPECIAL STAGES IN GENERAL:
* useNightsSS is now dead. Each individual special stage is now assessed for NiGHTS-mode behaviour based on maptol & TOL_NIGHTS.
* CRAWLA HONCHO\n CAN NOW BE\n SUPER CRAWLA HONCHO end tally modification now also includes a mini-tutorial on turning super. https://cdn.discordapp.com/attachments/400761370800422922/452844894113759233/srb20036.gif
* SONIC GOT A CHAOS EMERALD? https://cdn.discordapp.com/attachments/400761370800422922/452623869497573386/srb20034.gif
NiGHTS NON-SPECIAL STAGES:
* Colour Chips and Star Chips! Replaces Spheres and Rings of NiGHTS Special Stages.
* Colour Chips turn yellow in bonus time.
* Ideya!
* Its own "drowning" music!
* All of the object types for Dream Hill.
* GIF: https://cdn.discordapp.com/attachments/400761370800422922/452844894113759233/srb20036.gif
RANDOM BS:
* Turn super with the spin button instead of the jump button!
* Followmobj now correctly set with P_SetTarget instead of pointer assignment.
* Emerald hunt uses new sprites!
* Made unlock noise different from emblem gain noise! (It's the CRAWLA HONCHO CAN NOW TURN yadda yadda sound from S3K now.)
* Better Robo Hood arrows.
* Shield break animation for Egg Guard. (Temporary state slot so I don't have to compile from scratch until I do something more complicated later.)
* Suspicious Facestabber Statue animates a little before bursting open.
* Fix Facestabber radius.
* Fix some stuff in Flicky functions that could be overwritten in Lua call actions by mistake.
* Facestabber statues now have fun breaking effects.
* Fake coronas for candles and prickets.
* hnext and hprev are properly dealt with in MobjThinker if P_MobjIsRemoved.
* Facestabber statues, of both the suspicious and non-suspicious kind.
* New object type for the end of grabbable chains.
* I moved my compilation .bat file to my Releases folder, so it should .gitignore .bat's.
* Random extra stuff.
* Blue diagonal springs, because that gap is very, very odd.
* Improved A_SpawnFreshCopy.
* Tweaked P_LookForEnemies for consistency's sake. (Previously, it was impossible to make a spring that could neither be homing-attacked or attraction-shotted.)
* Behaves a bit differently to the one in DSZres.pk3.
* Can now punch DSZ mines!
* Also has mapthingnum 126 instead of 610.
* Some other mapthingnum changes.
* DSZ2 stalagmite is now 1009, formerly 999.
* Big DSZ gargoyle is now 1011, formerly 1009.
* Make the MF_PAIN stuff ONLY depend on mass, using the bottom 8 bits for the type and the custom sound in the upper ones.
* A bunch of cleanup of random other stuff, including an unused Deton state and an unused Jetty type's sprite.
* Add damagetype to P_RadiusAttack (optinteger in lua, A_Explode var1).
* Removed the prevention of MF_BOSS objects from getting P_RadiusAttacked. This was a holdover from DooM (I checked) - a way to prevent the Cyberdemon from gibbing itself when firing point blank into a wall, and also a way to make it and the Spider Mastermind harder.
* Enemies are solid to other enemies movement-wise now.
* (Fun little aside - if you remove MF_SOLID from a monitor, it now behaves like they did in Sonic Adventure (poppable by colliding with, not just attacking).
* Fixed Metal Sonic battle conflict in MF_PAIN/mass not picked up earlier.
* Miscellaneous tiny code tweaks.
* Made Facestabbers take two hits and have associated pain/death animations. No other changes, just wanted to make sure THIS was done.
* Move Bubblebuzz-related stuff to go alongside the secret badniks and etc.
* MF2_INVERTAIMABLE. Inverts whether P_LookForEnemies can get at; replaces a hardcoded thingy.
* MF2_FRET application and removal.
* Flashing when flag present.
* Bounce player back on successful damaging.
* Add their spawnhealth to the chain.
* Reduce code duplication in P_TouchSpecialThing.
* Play with Crawla Commander a little bit as a test of its power.
* MF_PAIN and MF_MISSILE now support setting damagetype via their Mass parameter. The two existing conflicts - the fuse setting for the grenade weapon ring and the Cybrakdemon napalm bomb - had these moved to other free parameters.
* A_ConnectToGround is EXTREMELY useful for palmtrees and stuff.
* Some other, relatively hacky A_ functions.
* (Unrelated) Remove the need for a "Mario block mode" for the token by making it natively compatible.
* Spikes and their time-offsetting via that Lua script sphere made. Also allow for wallspikes to do it via their angle/360.
* Again, tweak the spawning code to take maximum advantage of these gains.
* Fix potential crashes with MT_NULL mace/chain types supplied.
* #ifdef out the height-clipping code. It needs more TLC than I can give it right now, and the existing behaviour is less obviously broken (sadly enough).
* Fix chainmace points, which were apparently broken without anyone realising.
* Completely rework how mace/chainbars are spawned to reduce the number of matrix multiplications required EVEN FURTHER!
* Reimplement the maceretry solidity stuff (effect 4).
* Flip the mminlength stuff so that existing dev maps don't break badly.
* Fix hacky chainbar grabbing.
* Tweak height of tinychain a smidge.
* Fix ability to turn chains (still disabled by default, just at least want the option...)
* Replace max speed setting with a "minimum chainlink distance" setting - if greater than zero, that many chains will not be spawned from the center outwards. Doesn't affect the head of the chain at all, since otherwise what's the point? :V
* Handle all chain objects as a hnext/hprev chain.
* When removing mobjs with hnext/hprev, "repair the chain" (make the h links meet).
* Fix hidden slings, which I accidentially broke when I revamped maces the first time.
* Kill MF2_MACEROTATE. Not needed for anything anymore.
* P_MaceRotate now available to Lua to make up for it.
* Related: Made modifying hnext/hprev using Lua safer, so it keeps the reference counts in play.
This prevents a mobj of NUMMOBJTYPES from being created and potentially crashing the game. Really, this happens only if you start messing with the mapthings of respawning items like rings/weapons/etc in the first place via Lua.
* Make the NiGHTS link text pulse, like in the original game!
* Fix going from NiGHTS special stage as Smiles to a normal level losing your followitem.
"movebob" lets you determine the strength of movement bobbing (does not
affect landing delta, that's technically not movement bobbing :p),
values range from 0.0 to 4.0. viewheight is now relative to
player->height.
* cv_useranalog is now hidden from the menu.
* Directionchar now attempts to face the camera direction when you're standing still, and handles a few other states with more decorum.
* Tailsbot is now slightly more capable of keeping up with Sonic.
* pflags rearranged/adjusted, combining a few non-simulstaneous ones and turning PF_NIGHTSFALL into CR_NIGHTSFALL.
* [unrelated to branch] all ground-impact based abilities now happen more consistently with quicksand.
NiGHTS Paraloop-special emblems
Implemented the two NiGHTS Emblem types in the TUDD via var modifications to ET_GLOBAL!
* GE_NIGHTSPULL (for it to chase you once paralooped) - Sun emblem
* GE_NIGHTSITEM (for hidden until paralooped) - Moon emblem
* Combined means that you essentially have to loop it twice.
Also, revamped NIGHTSITEM to suck a little less (and have more compatibility with MT_EMBLEM).
Check out root/!LatestSRB2Files/srb2win_branch_nightsemblems.exe with the latest patch.dta, along with root/toaster/nightstest.soc for a sample in GFZS.
See merge request !94
* Fix an issue where everyone being game overed except for one person, and then kicking that one person, meant the game over trigger was never met.
* Fix an issue where the spectator text could be overridden with a count of the number of remaining players to complete the level.
* Fixed a few glitches with spinning. (Unrelated to the branch, but exposed through new_coop testing.)
* Improve the code for busting vertical spikes.
* Improve the frame arrangement for vertical spikes' spriteset. (Requires new patch.dta)
* Make all spikes consistently do damage with DMG_SPIKE.
* (unrelated) renamed "flame stomp" to "elemental stomp" in P_HitDeathMessages
* Support for MF_PAPERCOLLISION tmhitthing in P_SlideMove.
* Knockback for wallspikes is much more consistent.
* Optimised away a FixedDiv call when determining the slopetype of a line.
* Changed the position of the wallspike base slightly.
* Made it so NOTHING can step up onto the player outside of other players, essentially killing a bunch of springs-launch-with-players style bugs. (I was able to recreate that issue with the wallspikes until I added this, which is why I did it in this branch.)
Or rather, I killed anything to do with the old background orb, renamed all "EMMY" stuff to "TOKEN", and of course adjusted the new S_TOKEN accordingly
* Hide the individual lives on the tab menu whenever they're irrelevant.
* Make co-op spectators appear on the tab menu.
* Hide one frame of spectatorhood stuff in splitscreen.
* Fix joining netgames whilst in a special stage not giving the startinglives.
* Make monitors that don't appear to do anything play the failure sound.
* Only make players flash if they're REspawning, rather than spawning into a fresh level - unless it's a NiGHTS level, in which case never.
NEW COOP BASED:
* Add "Infinite" option to cv_cooplives, inspired by SUBARASHII. Lives still exist, but are hidden from the player's view, and are prevented from falling below 1 at any cost. As a result, made the variable CV_CHEAT.
OTHER MULTIPLAYER BASED (semi-related):
* Made cv_autobalance an on/off switch which determines the allowed difference based on the number of people in the server, instead of a weird and opaque number from 0-4.
MENU BASED (not related):
* Add horizontal arrows to menu options which respond to the arrow keys.
* Make the menu arrows bob.
* Switch out the seperate arrows for combination arrows on the joystick menus.
* Minor cvar description tweaks.
****
* MF2_MACEROTATE. Apply to any object. Replaces the indiscriminate spamming of A_MaceRotate each tic.
****
* Mace point mapthings have been slightly modified.
- MTF_AMBUSH: bigger luke theory (has no effect on custom mace, different effect on spring mace)
- MTF_OBJECTFLIP: flips the objects, but nothing else - just so it doesn't look out of place in gravflip sections
- MTF_OBJECTSPECIAL: keeps it from attempting to play swinging sounds
- angle: tag of controlling linedef
- parameter: number of "spokes" minus one - for example, a parameter of 2 results in 3 equidistant maces rotating around the same point.
****
* Mace linedefs have been significantly revamped.
- line dx: number of chain links
- line dy: speed (in FU)
- frontside floor height: Pitch (in degrees; how much it "tilts" over - Yaw influences the axis it's tilting on)
- frontside ceiling height: Yaw (in degrees; rotation of entire thing on xy plane)
- frontside x offset: Phase (in degrees; how far it is through the rotation cycle)
- frontside y offset: Max speed (in FU; if less than speed, set to speed*2)
- backside floor height: Pinch (in degrees; 0 if no backside; essentially makes rotation conical instead of wheel-like)
- backside ceiling height: Roll (in degrees; 0 if no backside; rotates on the axis of the spinning - identical to Phase for spinning maces, but useful for rotating swinging maces as opposed to just offsetting them)
- backside x offset: Number of "antispokes" (0 if no backside; makes that many spokes not exist so you can put another mace/chain type in there instead; for combo mace/chain instead turns them into chains directly)
- backside y offset: Width (in number of extra chains per side; 0 if no backside; creates a "skiprope" arrangement)
----
- ML_NOCLIMB: for chains and chain-mace combos, allow for player control of yaw through strafe keys
- ML_EFFECT1: replacing the seperate mapthings, this makes a mace type swing instead of spin.
- ML_EFFECT2: for all spokes of the mace wheel ending in maces, make the chains out of the mace type (inverted for firebars)
- ML_EFFECT3: spawn a bonus mace type at the center(s) of rotation
- ML_EFFECT4: don't clip inside ground
****
* Mapthing 1104 represents both spinning and swinging maces from prior versions of SRB2.
* Mapthing 1105 has gone from being a swinging mace variant to a combination of chains and maces in a single unit, provided the number of "spokes" is greater than one.
* Mapthing 1105 has gone from being a swinging chain variant to a vertical spring-on-a-ball-on-a-chain. Yellow by default, apply MTF_AMBUSH to turn into a red spring.
* Mapthing 1107 represents both spinning and swinging chains from prior versions of SRB2.
* Mapthing 1108 is completely untouched except to port over 2.1's functionality to the new backend.
* Mapthing 1109 is a Mario castle-level style firebar. This inverts the functionality of ML_EFFECT2 on the tagged linedef.
* Mapthing 1110 is a free slot should we want to implement another type of base-game mace.
* Mapthing 1111 is a custom mace. Use the linedef's frontside texture slots to identify a macetype mobjtype, then use the backside texture slots to identify a linktype mobjtype (defaults to MT_NULL if no backside).
****
Whooh. Requires new patch.dta for sprites.
"MapThingSpawn" hook for Lua
A hook for adding special stuff to mobjs spawned via a map thing on level load, like special features depending on the map thing's flags, angle, z position, extrainfo, or anything else I didn't think of.
**Function syntax:**
`functionname(mobj, mapthing)`
where `mobj` is the spawned mobj (type mobj_t obviously), and `mapthing` is its corresponding map thing (type mapthing_t also obviously). Note that `mapthing.mobj` will not yet be set to `mobj` at this point (it's set afterwards, provided you don't remove the mobj or something stupid).
Returning `true` overrides features in place for existing mobj types (currently not all existing features are overridden, I may change this; see the source code for what IS overridable for now), returning `false` runs them as normal.
**Hook syntax:**
`addHook("MapThingSpawn", functionname, MT_OBJECTTYPE)`
where `MT_OBJECTTYPE` is the object type to apply the hooked function for. As usual, if this argument is omitted or set to MT_NULL, the function runs for all object types.
**Test resources and where to find them:**
* srb2win-mapthingspawn.exe, my folder on the FTP - test exe, obviously
* luatest-mapthingspawn.lua, same place - a simple Lua script that changes the scale of MT_GFZFLOWER1 (the orange flower) based on the map thing's angle (0 degrees is normal, 90 degrees is 2x bigger, 180 is 3x bigger, 270 is 4x, etc etc)
See merge request !83
* Make swinging (as opposed to spinning) maces play the activesound at the peak of their speed.
* Decouple the tilt of all maces from the angle.
* Improve DBG_GAMELOGIC message.
* Refactor.
Fixes with respect to sector special touching and slopes
Some important stuff.
* SF_TRIGGERSPECIAL_TOUCH now actually works. Previously, it abandoned the loop early if ANY bounding sector didn't have that sector flag, which it likely didn't - only checking one extra sector's worth of FOFs. Also, the teleport handling there is more robust, and actually bails out if you teleport, instead of just awkwardly continuing through the loop.
* SF_TRIGGERSPECIAL_TOUCH now works for each time thinkers, too.
* Fixed a bug with being able to go under lava because P_CheckSolidLava doesn't take slopes into account.
* Also, P_CanRunOnWater supports slopes now too.
* Quicksand supports slopes and reverse gravity now.
* Space Countdown supports slopes now.
Also, an experiment behind a #define which currently isn't turned on:
* UNDER A #define, "SECTORSPECIALSAFTERTHINK", WHICH IS CURRENTLY TURNED OFF, BUT I WILL WANT TO TURN ON IN INTERNAL: Moved sector touch handling to P_PlayerAfterThinker (from P_PlayerThinker before movement). Allows for being able to trigger moving slope sectors that are going down, most specifically lava (didn't matter in RVZS in 2.1 because you could clip through the sides and go underneath the lava, causing damage - a sloped testwad version of that prevented going underneath.) Also fixes one-frame standing on deathpits before you die. Basically means sector triggers effectively happen one tic earlier, since it's after movement.
See merge request !131
* Fixed oversight where late joiners may not actually get lives.
* Fixed oversight where zero-livers could spawn in.
* Reinstated flashing because a crawla walked onto one of the spawnpoints and we immediately got a game over.
* Rejiggered the overlay drawer so the printing was consistent between normal spectatorship and game overness.
* Gave lifedistribution a "Sharing" option to go along with its previous individual and stealing options.
* Made the game over graphic and music only happen if everyone's out of lives if you're sharing or stealing lives.
* Fixed a bug where game over wouldn't come to fruition because it kept on happening each tic of the countdown2.
* Made spectator stuff display in Co-op splitscreen.
* Make sure that a life theft always takes you from 0 (or less) lives to 1 life.
* Fix a bracket level typo that meant new Co-op style respawning was being done for all gametypes.
Needs a bunch of changes to HUD rendering, especially in splitscreen, which doesn't try to show spectator stuff whatsoever. Also, if you're the player whose respawn determines when the map reloads, you'll see the spectator text during the front half of the fade. Unless, of course, it's 2-player mode.
Missiles 'n slopes
Fixed that thing where missiles like sliding up slopes for some reason.
This isn't a 1:1 fix compared to non-slopes - missiles still like stepping up over the borders of sloped sectors and will continue going as long as they never touch that ground again, whereas they can never step up on flat ones - but this fixes the most egregrious issue.
See merge request !181
* GE_NIGHTSPULL (for it to chase you once paralooped) - Sun emblem
* GE_NIGHTSITEM (for hidden until paralooped) - Moon emblem
Combined means that you essentially have to loop it twice.
Also, revamped NIGHTSITEM to suck a little less (and have more compatibility with MT_EMBLEM).
Level specials setup stuff
Some changes to level setup, largely inconsequential for gameplay but maybe helpful for Lua scripting:
* gravity, weather, and some other internal variables are set to their defaults before loading things, so their values from a previous level don't affect mobj spawning potentially
* Tag lists are also initialised before loading things, so that tag-based search functions (such as P_FindSpecialLineFromTag) can be used internally for the maces and particle generator. This should probably extend to Lua as well
* the level header "forcecharacter" no longer recognises "255" as "None" anymore. This is because it no longer takes skin numbers (as of whenever that change was added... version 2.0?), and level headers are auto-cleared when edited anyway.
See merge request !88
New User Experiences - Menus, Closed Captioning, and other non-substantial tweaks
Hello! I'm going to words.
* Menu stuff!
* Scrolling menus when there's lots of options instead of doing lots of nestling!
* Video Options, Server Options, and Screenshot Options have been updated to take advantage of this.
* Headings are prettier in general to match the level platter's headers!
* Expose a bunch of stuff Mystic wanted exposed, without iundating the player!
* Little arrows!
* Better, clearer control menus!
* I know this is probably related to the above, but whatever.
* Very organised with lots of renaming and magical clarifying context headings!
* Killed the analog-only Camera L/R keys in favour of merging them with the regular turn keys in that context!
* Also little arrows!
* Statistics!
* One page instead of two, loses a lot less info than you'd expect!
* The benefit of having them on one page is greater than the loss of being able to individually discern which of your Score/Time/Rings is incomplete.
* ALSO also little arrows!
* Secrets checklist!
* Scrolls vertically!
* Allows for autogeneration of conditions based off conditionset, which allows for names of required levels to be hidden if you haven't played them yet!
* Still allows overriding condition string per traditional checklist.
* This allows us to show every secret's condition without letting it be spoiled or overflowing the everything.
* Also ALSO also little arrows!
* Closed captioning!
* Console command "closedcaptioning on/off".
* Shows stuff in the bottom right hand corner of the screen.
* sfxinfo[sfx_name].caption = "Butt.".
* S_StartMusicCaption(string, tics, optional player) allows for a caption to play without being anchored to a specific sound.
* Color Profile!
* Using only the best in advanced cube-based majyks.
* cv_gamma now goes from -15 to +5!
* cv_saturation - from 0 to 10!
* A new menu for modifying the hue, saturation and gamma of specific corners of the cube (RYGCBM) independently of the master options!
* Screenshots/Video Mode now supports turning on/off circumstantial color profile alterations (cv_screenshot_colorprofile).
* Spring cleaning!
* cv_allcaps is dead.
* Sudden death and old match scoring (25 points for shield damage as the only change??) is dead
* A few things are taken off the menu because they're not that relevant to have.
* cv_competitionboxes now applies to race as well.
* Failed teleports go nuh-uh.
* Question mark boxes don't have doomednums anymore, so they can't be placed in singleplayer and used to get free lives by playing with the tv_extralife etc stuff.
* Other tidbits!
* HUD offsets are tweaked to give one digit less space to score and one digit more space each to time and rings to match up the right edges.
* Emerald tokens show up on the level complete screen and are loaded into a coin slot at the end of the tally.
* Speaking of Emerald tokens, they now give score all the time, and continues instead of 50 rings when you have all Emeralds.
* Moved Race HUD down, and made it go bing bing bing BONG.
* V_DrawCroppedPatch now properly handles topdeltas.
* Minor tweak to GFZ3 eggmobile's pinch to be more lenient.
* Hudnames for skins now replace full stops with katakana dots. We could make it replace a different character instead if we really wanted to, but I figure this matches what is desired.
Check out ```<root>/!LatestSRB2Files/srb2win_branch_deeznux.exe``` to try it out.
See merge request !91
A less memetic message: On permission of Mystic, rejiggered a few things such that Race uses cv_competitionboxes, allowing the menu to be nicer.
Also:
* disabled the doomednum for ? boxes
* made A_MixUp play sfx_lose if you're in a gametype that can't use it
* Removed the all-teleporters option from cv_competitionboxes. It could just be done by tweaking the random monitor toggles, anyways.
This means setting the skybox view angle is no longer stupid, objectplace no longer breaks skyboxes, and Lua-defined skybox mobjs can actually set a Z position more easily now.
* Lock on targets bob now, and are used for CA_HOMINGTHOK and SH_ATTRACT as well.
* Flag stuff is now animated like it was designed to be but which was kinda messed up.
* Cork sounds.
* P_SpawnLockOn(player_t player, mobj_t lockon, statenum_t state) for Lua.
* Added homing/firing CA2_GUNSLINGER stuff at egg guard shields.
* Fixed homing stuff wrt egg guard shields and sea egg balloons.
* Fixed attract orb goin' gold when doing a CA_HOMINGTHOK homing ability.
* Fixed positioning of player during homing attack.
* Cleaned up lockon spawn code.
*P_LookForEnemies is now side-effect-less and only provides a pointer to the found mobj
*player-jumping is dead, long live PF_STARTJUMP
*per Mystic's request, CA2_GUNSLINGER has a targeting icon. It also has a more restricted vertical aiming range.
*mobj for this is in the game as requested
*fast teetering animation flag
*general code cleanup
* CA2_MELEE/CA_TWINSPIN combination abilities (ground hit, somersalt) disabled.
* Enabled movement controls whilst using CA2_MELEE in the air.
* CA2_GUNSLINGER no longer requires charging. In exchange, it involves a cooldown in which you can't move.
* CA2_GUNSLINGER lock-on distance improved, and aiming allowance reduced to compensate.
* Lots of cleanup/gravflip allowances for homing/targeting code.
* Unrelated: Flickies now properly face the direction they're supposed to when getting knocked out of the egg capsule.
* Unrelated: Thok trail fades like spindash trail now.
* Unrelated: Using CA_HOMINGATTACK when nowhere near an enemy uncurls you.
* Mildly hacky proof of concept! Will de-hack later.
* Charge up your ability!
* You can only damage others if it's at full power.
* Fires directly at enemies/bosses when at full power. Does NOT aim at players.
* Fixed a major hack from when I SPR2ised NiGHTS by spawning in a null object.
* Made P_LookForEnemies better in preperation for the future.
* Changed some defaulting characteristics of P_GetMobjSprite2.
* Fixed CA_DOUBLEJUMP potentially counting as a float.
* Killed some extremely small boolean functions and replaced them with #defines.
* Melee now has a proper weightiness to it with a landing frame.
* If you have twinspin too, do a somersalt when running and hitting the melee button.
* If you have melee, go into the melee landing frame when twinspinning into the ground.
* PF_NIGHTSMODE is now CR_NIGHTSMODE as part of player->powers[pw_carry]. This is because it's mutually exclusive to every other "carry" type.
* PF_SUPERREADY is dead because it literally just checked for all 7 emeralds and 50 rings. That's it. You couldn't even appreciably alter its presence with Lua. That logic has been placed back in P_SuperReady.
Lua more stuff
More new Lua features and fixes:
* Most Lua functions that deal with stuff that exists only in levels now should spout Lua errors instead of crashing the game if you try to use them outside of levels. Likewise, accessing any of the tables that contain level-only stuff (players, sectors, lines, etc etc) spouts Lua errors too outside of levels.
* `userdataType(variable)` now exists: this function simply returns the type of the userdata variable given as a string (e.g. `userdataType(players[0])` returns "player_t", `userdataType(sectors[0])` returns "sector_t"). This also includes "minor" userdata types for array members of other userdata types, such as .powers of player_t variables or .lines of sector_t variables (which would give the strings "player_t.powers" and "sector_t.lines" respectively).
* The Lua hook "MobjMoveBlocked" now exists: functions for this hook are called whenever a mobj attempts to move horizontally but is blocked by a wall or solid mobj (or whatever else can cause P_TryMove to return false, assuming it doesn't remove the mobj). In theory this hook could be very useful for behaviour such as sliding or bouncing off walls without the need of flags like MF_SLIDEME or MF_BOUNCE etc. Format for use is just like most generic mobj hooks: `addHook("MobjMoveBlocked", functionname, MT_OBJECTTYPE)`, where `functionname` is a function that takes a single mobj_t argument.
See MonsterIestyn/lua-more-stuff on the FTP for a test exe (srb2win-lua-more-stuff.exe) and some test scripts for the above changes.
See merge request !67
* Speaking of, actively enforced not being able to be Super and NiGHTS at the same time.
* Also on that note - SPR2_TRNS is now the NiGHTS transformation. The Super transformation is (FF_SPR2SUPER|SPR2_TRNS).
* SPR2_NPAN is now SPR2_NSTN, since it matches Super Sonic's stun animation rather than the pain animation.
* Fixed a bunch of things where Super float was handled badly with 2AM brain.
* Fixed the R_ProjectSprite error going out of spr2names' bounds.
* Fixed order of FF's in dehackéd.
* Fixed that thing where Super Sonic was blue for 1 tic after transformation, and the life icon was a blue Super Sonic.
* Super sprites are now deliniated via an additional S_SUPER lump between S_START and S_END. Above are normal sprites, below are super sprites. Handled internally via FF_SPR2SUPER.
* Sprite2 numbers are now appropriately limited for the data type that stores them.
* SPR2_SPIN is now SPR2_ROLL, SPR2_DASH is now SPR2_SPIN and SPR2_PEEL is now SPR2_DASH. Makes more sense, right?
Slopewall transfer
As @Nev3r wants. Go along a slope, hit a wall? LAUNCH! Well, I mean. He wants it slightly less weak. I have already made it less weak than P_SlopeLaunch.
Also also I made the trail that goes behind the player when they're rolling take into account vertical momentum as well as horizontal, so that being launched directly up didn't leave you trailless.
Test with <root>/!LatestSRB2Files/srb2win_branch_transfer.exe and <root>/Nev3r/ACZMaster.wad (roll down slope directly in front of you).
See merge request !66
Revamps of several dated linedef type effects
Felt like being productive so made some things I hate suck less.
Linedef type 7 (flat alignment) now works as follows.
* Linedef angle (from v1 to v2) is flat angle.
* Origin of flat is manipulated to match v1's coordinates - unless ML_NOKNUX is flagged, in which case uses frontside x and y offsets as flat offsets instead.
* ML_NOSONIC prevents changing floor.
* ML_NOTAILS prevents changing ceiling.
* Both of the above flags at once prints a warning.
* (THZ and probably a few other maps need updating.)
Linedef type 540 (friction) now works as follows.
* Controlled by x offset instead of length - offset of -100 is maximum iciness, offset of +483(!!!) is the maximum sludginess BUT things are scaled such that +100 is about the maximum sludginess any reasonable human being would want in a level, 0 is ORIG_FRICTION)
* Not reliant on a sector special to function (can be applied solely by tag to in-map sectors or solid FOF control sectors)
* Uses less memory, perform less calculations, and not bug out objects which just happen to use movefactor for something
* PHYSICS CHANGE: Low friction surfaces actively impede your acceleration (and make your animation speeds faster to give off that Looney Tunes out-of-control effect)
* (ACZ and Frozen Hillside needs updating.)
Sector types 1 and 3 in section 3 no longer do anything.
Linedef type 3 (zoom tube) now works as follows.
* Abs of frontside x offset is speed in units of FRACUNIT/8.
* Abs of frontside y offset is waypoint sequence number.
* Effect 4 flag rotates the player to match the waypoint direction (same as before).
* (ERZ needs updating.)
Linedef type 11 (rope hang) now works as follows.
* Abs of frontside x offset is speed in units of FRACUNIT/8.
* Abs of frontside y offset is waypoint sequence number.
* Effect 1 flag makes rope transfer one-way. (same as before)
* No climb flag makes rope static. (same as before)
* (ACZ and maybe ERZ need updating.)
Linedef type 258 (laser) is almost the same as before, but has altered functionality.
* Its flashing is less obnoxious. (56.25% to 68.75% instead of 100% to 0%, at half the speed)
Linedef type 14 (Bustable block parameters) is new, and works as follows.
* Tagged to the control sector of a block that is likely to be busted (via executor or collision, doesn't matter)
* Concatenation of frontside textures is MT_ object type to spawn, defaults to MT_ROCKCRUMBLE1 if not present
* Sound played when being busted is object type's activesound
* Frontside x offset is spacing (in fracunits) of spawned particles, defaults to 32<<FRACBITS
* Frontside y offset is the fuse of spawned particles in tics, defaults to 3*TICRATE, if set to -1 fuse is not set
* Effect 1 flag makes particles "fly out" horizontally and vertically from the center of the FOF
Sector types 7 through 15 in section 3 no longer do anything.
Linedef type 250 (Mario Block) is almost the same as before, but has new functionality and is slightly different in another way.
* No Climb flag turns it into a brick block (set on Custom FOF via presence of FF_SHATTERBOTTOM - busts when hit from the bottom, player hits their head/fist/whatever, no more upwards momentum)
* Effect 1 flag makes it an invisible block (set on Custom FOF via absence of (FF_SOLID|FF_RENDERALL|FF_CUTLEVEL) - intangible from every side except the bottom. Becomes visible and tangible when it's hit once)
* Only updates side textures when moving down or stationary, not whilst moving up - more fidelity to the source material, less processing on the CPU, everyone wins.
* If FOF master linedef has a backside, then: [If there's items in it the FOF's flats are set to that of the backside sector's ceiling, otherwise the floor.] Otherwise, no flat change.
Linedef type 4 (Speed Pad parameters) now works as follows.
* Frontside x offset is speed in fracunits.
* Effect 4 flag doesn't center the player. (same as before)
* Effect 5 flag sends them off in rolling frames.
* Frontside upper texture is sound to play on launch, defaults to sfx_spdpad when not given
Sector type 6 in section 3 no longer does anything.
Object type 757 is changed as follows, and no longer works on its own - see Linedef type 15 for more details.
* Tag via its angle field
* Number of objects to spawn per tic around it via its z field, if zero then just spawn at center
* Is flipped if given MTF_OBJECTFLIP.
* (ERZ and Seraphic Skylands - if we use that map - needs updating)
Linedef type 15 (Fan particle spawner parameters) is new, and works as follows.
* Tag is tag of object(s!)
* Object type set via concatenation of frontside textures, MT_PARTICLE is default
* The length of the linedef is the radius the particle is spawned out (zeroed if z field is 0)
* Frontside x offset is speed upwards
* Frontside y offset is number of degrees to turn each tic (zeroed if z field is 0)
* Frontside floor and ceiling heights are the heights in which the particle is bound through some fun mathematics
A_ParticleSpawn is changed, too.
* Object type is now changed through actor->threshold instead of var1 to support Linedef type 15.
Test executable uploaded at /toaster/srb2win_branch_flatalignment.exe on the ftp.
Test file uploaded at /toaster/flatalignment.wad on the ftp.
Breaks compatibility with 2.1 so put in internal.
See merge request !29
* Made the name of P_PrepareSlopeToWallTransfer (now P_GetWallTransferMomz) make sense.
* Bugfixed the case where you couldn't reliably guess the angle of the wall you just hit.
* Seriously reworked a lot of stuff behind the scenes, thanks to Red's comments.
* More consistent behaviour.
* Launching power is now scaled to the slope's angle relative to the wall you hit, so no massive launches when you hit the side of a steep slope.
* The code is a lot messier and the function name doesn't make any sense any more, so I need to clean that up in the morning.
* Need to figure out how to prevent tiny launches that uncurl you when spindashing up against walls.
* Spindashing trails now takes into account vertical momentum as well as horizontal - it was stupid not seeing your spintrail just because you weren't moving very fast horizontally!
No exe uploaded because it's almost 2am.
GFZ3 Unfuckening
Some tweaks to the GFZ3 Eggmobile's behaviour to make it less frustrating for old and new players alike.
* GFZ3 Eggmobile's laser won't change its angle when you move left and right anymore.
* Changed because its ability to move quickly was extremely punishing for new players (see ProJared's youtube video on the matter).
* http://gfycat.com/PassionateUnknownAgama (the twitching on the third laser has been fixed since this was recorded)
* GFZ3 Eggmobile will, when too far away from the ground and moving upwards, slow itself down vertically.
* This was punishing and annoying for both old and new players alike.
* http://gfycat.com/CornyLeftDungbeetle (old values - the typical settling height is slightly lower now)
See merge request !42
Hardcoded VAda Flickies
Many thanks to MI for his help, even if he has sinful opinions on what the collection of creatures should be called. ;P
* Flickies are now handled via A_FlickySpawn instead of hardcoded in P_KillMobj, so there can be mobjtypes with MF_ENEMY which don't create flickies, or other mechanisms which can much easier.
* Added map header "FlickyList" (aka "AnimalList") parameter, which can either be set to:
* A species (eg: "Rabbit" or "Bluebird", amongst 17 currently supported types in dehacked.c table FLICKYTYPES - including the seed from Sonic CD, which isn't limited to 'soniccd on' in the console now)
* Any valid mobjtype that isn't MT_NULL (eg: "MT_FLICKY_GHOST")
* A comma-seperated list of either of the above, up to 64 entries long (eg: "Cow,MT_FLICKY_SPIDER,Chicken")
* "All" - sets behind-the-scenes stuff to use every 'normal' type of flicky in FLICKYTYPES (a distinction which can be utilised to hide secret level flickies where they wouldn't be appropriate for the main game)
* "Demo" - sets behind-the-scenes stuff to use the five flickies closest to the species used in the game's long history.
* "None" - prevents any flickies from spawning.
"Demo" is functionally the default value if you don't include a FlickyList parameter in the header at all.
Of note, a bunch of functions are now created:
* A_FlickySpawn - spawns flicky.
* A_FlickyAim - aims for area near target, but not directly on them - turns around when hitting wall
* A_FlickyFly - flies/swims around target (calls A_FlickyAim)
* A_FlickySoar - hacky alternate fly (calls A_FlickyAim)
* A_FlickyCoast - slowing down before going off again
* A_FlickyHop - fracunit-scale precision for A_BunnyHop
* A_FlickyFlounder - A_FlickyHop with randomisation
* A_FlickyCheck - State-setter for falling, or being on-ground
* A_FlickyHeightCheck - State-setter for falling, or being below a certain height relative to target
* A_FlickyFlutter - A_FlickyCheck, but with a slow fall/movement (calls A_FlickyCheck and A_FlickyAim)
I don't need to enumerate the object types and states that have been added, do I?
Oh yeah, I also made it so get_mobjtype's failure value was MT_NULL and prohibited SOC from editing the properties of it to compensate.
IN ADDITION: Killed "soniccd" console command, since it made things more complicated and honestly being able to specify Sonic CD seeds in the level header is a better option.
See merge request !60
One Eggscalibur fix
Use mobj->watertop instead of mobj->spawnpoint->z. CEZ3 is far from fixed in multiplayer, but this is still one less thing to worry about.
See merge request !148
* MT_EXPLODE's anims partially FF_ANIMATE'd.
* A_FlickySpawn turned into a wrapper for internal function that does what A_FlickySpawn did but returns a pointer to the spawned flicky.
Spindash dust
Charging a spindash kicks up dust, we all know this feature was dying to get in at some point. Bubble and flame forms of spin dust are included from FSonic, for underwater and elemental respectively.
Oh, and as a bonus I reorganised the spindash/spinning/other ability2 stuff code to look a bit neater and more organised.
New resources:
* MT_SPINDUST - the object
* S_SPINDUST1 to 4 - the normal form's states
* S_SPINDUST_BUBBLE1 to 4 - the bubble form's states
* S_SPINDUST_FIRE1 to 4 - the bubble form's states
* SPR_DUST - the normal form's sprite set (uses frames A to D, just pinch FSonic's sprites really)
* SPR_FPRT - the flame form's sprite set (frame A only)
SF_NOSPINDASHDUST disables spindash dust for a character
See merge request !52
Sprite2 changes
Some stuff!
* Lua access to sprite2.
* Introducing new Lua-exclusive function, P_IsValidSprite2(mo, spr2). Basically just a wrapper for (((skin_t *)mobj->skin)->sprites[spr2].numframes > 0), useful for creating custom sprite2 defaulting functions since hooking into P_GetMobjSprite2 wouldn't be worth it.
* FF_ANIMATE support for sprite2s. The var2 of the state works identically to normal FF_ANIMATE, but var1 is completely disregarded - it just runs all of the frames available to that one sprite2 animation set.
* As a result, a bunch of states which were either not previously animatable or had animated at constant speed now get animation without state changes.
* P_SetMobjState now supports sprite2 defaulting like P_SetPlayerMobjState does.
See merge request !51
Damage control + Match rebalancing
This is two branches in one since while I was working on damage-control's changes months back, I felt it was best Match rebalancing was merged in here too (thanks JTE for helping me do so).
Changes from damage-control:
* `player->health` (formerly the "HUD copy" of `player->mo->health`) is now `player->rings`, and is also now the player's actual ring count.
* `player->mo->health` (formerly rings + 1) is now always 1 when alive, regardless of ring count; if player with rings is damaged, this is untouched.
* P_RingDamage now includes ring spilling code.
* P_ShieldDamage now has a damagetype argument, allowing me to remove the last MT_NULL hack left in from the pre-damagetype days that I forgot about.
* The old "switch-to-seestate" enemy damaging behavior in P_DamageMobj has been removed. This was a Doom left-over and doesn't really affect SRB2's enemies anyway - see, Doom enemies had a random chance of using seestate or painstate, SRB2 enemies always use painstate.
* Other minor efforts to reorganise damaging code and have it make more sense, but otherwise nothing that should affect gameplay in general.
Changes from match-rebalancing:
* New weapon/ammo dropping behavior: if you have the weapon panel + ammo, you drop the panel (but not the ammo); if you don't, you just drop the ammo.
* New Match ammo consumption: Weapon rings can now be fired with no rings at double the ammo cost.
* New emerald behaviour: collecting all 7 emeralds no longer turns you super (read: Match super is dead now) but instead steal points from enemies and gives you and teammates invincibility + sneakers
* Tails ringslinger buff: Any character with CA_FLY will now throw rings 1.5x as fast.
See merge request !28
* All Lua-originated sprite2 settings are now forced through P_GetMobjSprite2. Makes sense because of SPR2_JUMP, which none of the main characters have sprites for yet all use.
* Cleaned up P_GetMobjSprite2 to not set irrelevant, otherwise-unused variable.