Replaces GLOB.poi_list |= src and GLOB.poi_list -= src with an element that handles it directly.
More consistent code, especially when a lot of code couldn't decide how to add/remove (some |=, some -=, some .Remove, etc).
Adds a MAPTEXT macro that wraps the given text in the maptext class, the thing we use for Runechat to make it so you can actually read it. Everything that sets maptext now uses this.
Yeah uhh this'll probably need testmerging even after it's done because yeah it's a bit big.
If y'all want me to atomize this into two PRs (pass flags vs projectiles) tell me please. Pass flags would have to go in first though, in that case, as new projectile hit handling will rely on pass_flags_self.
Pass flags:
Pass flags handling now uses an atom variable named pass_flags_self.
If any of these match a pass_flag on a thing trying to pass through, it's allowed through by default.
This makes overriding CanAllowThrough unnecessary for the majority of things. I've however not removed overrides for very.. weird cases, like plastic flaps which uses a prob(60) for letting PASSGLASS things through for god knows why.
LETPASSTHROW is now on pass_flags_self
Projectiles:
Not finalized yet, need to do something to make the system I have in mind have less unneeded overhead + snowflake
Basically, for piercing/phasing/otherwise projectiles that go through things instead of hitting the first dense object, I have them use pass_flags flags for two new variables, projectile_phasing and projectile_piercing. Anything with pass_flags_self in the former gets phased through entirely. Anything in the latter gets hit, and the projectile then goes through. on_hit will also register a piercing hit vs a normal hit (so things like missiles can only explode on a normal hit or otherwise, instead of exploding multiple times. Not needed as missiles qdel(src) right now but it's nice to have for the future).
I still need to decide what to do for hit handling proper, as Bump() is still preferred due to it not being as high-overhead as something like scanning on Moved(). I'm thinking I'll make Moved() only scan for cases where it needs to hit a non-dense object - a prone human the user clicked on, anything special like that. Don't know the exact specifics yet, which is why this is still WIP.
Projectiles now use check_pierce() to determine if it goes through something and hits it, doesn't hit it, or doesn't go through something at all (should delete self after hitting). Will likely make an on_pierce proc to be called post-piercing something so you can have !fun! things like projectiles that go down in damage after piercing something. This will likely deprecate the process_hit proc, or at least make it less awful.
scan_for_hit() is now used to attempt to hit something and will return whether the projectile got deleted or not. It will delete the projectile if the projectile does hit something and fails to pierce through it.
scan_moved_turf() (WIP) will be used for handling moving onto a turf.
permutated has been renamed to impacted. Ricocheting projectiles get it reset, allowing projectiles to pierce and potentially hit something again if it goes back around.
A new unit test has been added checking for projectiles with movement type of PHASING. This is because PHASING completely causes projectiles to break down as projectiles mainly sense collisions through Bump. The small boost in performance from using PHASING instead of having all pass flags active/overriding check_pierce is in my opinion not worth the extra snowflake in scan_moved_turf() I'd have to do to deal with having to check for hits manually rather than Bump()ing things.
Movement types
UNSTOPPABLE renamed to PHASING to better describe what it is, going through and crossing everything but not actually bumping.
Why It's Good For The Game
Better pass flags handling allows for less proc overrides, bitflag checks are far less expensive in general.
Fixes penetrating projectiles like sniper penetrators
This system also allows for better handling of piercing projectiles (see above) without too much snowflake code, as you'd only need to modify on_pierce() if you needed to do special handling like dampening damage per target pierced, and otherwise you could just use the standardized system and just set pass flags to what's needed. If you really need a projectile that pierces almost everything, override check_pierce(), which is still going to be easier than what was done before (even with snowflake handling of UNSTOPPABLE flag process_hit() was extremely ugly, now we don't rely on movement types at all.)
Jack and Style figured out that sound environments can be cancelled by setting some settings in Echo. By default audio has no reverb, but if a sound environment is selected in playsound_local it will become a reverb sound.
This makes every room sound a bit different. The only caveat is is that if you move into another room, Already playing sounds will transition into the new environment, which sounds odd.
Co-authored-by: Aleksej Komarov <stylemistake@gmail.com>
/obj/effect/ex_act had several different re-definitions to make it a noop. The original definition would randomly delete it, which is bad news when a lot of /obj/effects are just that--effects, that shouldn't be blown up.
The ones that actually do want to be blown up (like decals) already have their own implementations. The one in place was never ran, and nobody had problems with it.
Makes Morphs and Swarmers have their own part of the orbit menu, like other visible antagonists. Given pretty much every other ghost-obvious antagonist is, it's more of an oversight that you couldn't.
Someone changed /obj/screen/alert to be /atom/movable/screen/alert and it caused this problem.
Also fixes the issue with void storm breaking if someone dies and gets revived.
Adds a new set of nanite protocol programs as a researchable Bepis tech.
Protocol programs are programs that are mutually exclusive within their time, so remember that only one of the following can be active at once in the same host.
Hive Protocol: Makes nanites use space more efficiently, increasing maximum volume by 250 (500 -> 750)
Zip Protocol: Makes nanites use a compression routine when not in use, increasing maximum volume by 500 (500 -> 1000) but consuming 0.2 nanites per tick to perform the zipping/unzipping
Free-Range Protocol: Makes nanite use looser storage routines, reducing the maximum volume by 250 (500 -> 250) but gaining 0.5 nanite replication rate
S.L.O.P. (Safety Level Override Protocol): Removes nanite storage safety measures, allowing them to reach up to 2000 volume. However, when the volume surpasses the maximum recommended volume (500) the host will start to suffer from side effects, manifesting in slow organ damage. The more the nanite volume approaches the physical limit, the more harmful it becomes.
Replaced the Tinker Nanite Replication Protocol with the Pyramid Protocol, which gives an extra 1.2 regeneration rate, but only while the nanites are at 80% volume or above.
Renamed the Offline Production Protocol to Eclipse Protocol.
Chain detonation now uses dyn_explosion(), at a rate of 1 power per 50 nanite volume. The power level should be similar to how it was for normal nanite volumes, but it should scale more linearly when going above the limit with the new programs.
If nanite volume is suddenly significantly higher than the maximum allowed (likely caused by deleting an active storage protocol) the extra nanites will be forcefully expelled from the host's body, which can range from minor oozing, to vomiting puddles of nanites, to nanites rapidly bursting from eyes, ears, and skin pores.
Despite how it looks, this process causes no lasting damage, since it's a security feature made to prevent acute nanite poisoning.
Added some comments on a few nanite functions.
Refactored vomit code to make it a bit more customizable. The toxic arg (supposedly used to choose an alternate vomit icon, but in fact not functional) is now vomit_type, and purge (which determined vomit would remove 10% of reagents or 67% of reagents) is now purge_ratio, which accepts custom values. Made the refactor mostly to allow a 0% ratio, but it can be handy in other future uses.
Adds extra content to Bepis research, giving a little more reason to invest money into it.
Creates more options to customize a previously rigid parameter in nanites, maximum nanite volume. This opens up strategies that involve storing up large amounts of nanites for special occasions, or viceversa reducing the maximum rate to get more constant replication rate to sustain continued programs.
About The Pull Request
Fixes the cursed heart being unable to track targets in containers.
Fixes the shitcode that was reality_smash_tracker, now it is only responsible for generating influences.
closes#53583closes#52554
Changelog
🆑
fix: fixes the cursed heart being unable to track people inside containers.
fix: fixes influence vision getting broken by replacing someone's eyes.
/🆑
The PR aims to allow advanced tool users to be defined by traits rather than a hardcoded proc.
Also necessary for the CanUseTopic refactor I'm working on, which will be PRed separately for atomization purposes.
This PR also fixes an inconsistency with can_hold_items (since monkeys can actually hold items).
* Automatic changelog compile [ci skip]
* Automatic changelog compile [ci skip]
* Revert "Automatic changelog compile [ci skip]"
This reverts commit 48a63defa644ec9826ee5eb1736e5158d2a636d4.
* Revert "Automatic changelog compile [ci skip]"
This reverts commit cb68f4988edd9d841c4203eecee2067a49ce75c5.
* Revert "Revert "Automatic changelog compile [ci skip]""
This reverts commit e6e1f1ef53ee6611c334efcae6ca7c102edaf351.
* Revert "Revert "Automatic changelog compile [ci skip]""
This reverts commit 1782210527b9819772c0781122bec35b7979bf7d.
* Update changelog.html
* Automatic changelog compile [ci skip]
* Automatic changelog compile [ci skip]
* Move suit_initialization into better location
* Clean up cost check
* Clean up net using
* Clean up Ninja Star
* Clean Up Ninja Stealth
* Clean Up Sword Recall
* Move the event file
* Re-Merge the Changes
* Get your ninja code out of my human.dm
* Move the event into events folder and clean it up
* Can the old space ninja antagonist file
* Roll in the shiny new bad boy
* Get rid of actions/ninja.dm and move its info into respective ability files
* Update one_click_antag with new ninja
* Move proc out of ninja code into proper location
* Update the dme properly this time
* Update code/modules/ninja/suit/ninja_equipment_actions/ninja_suit_initialisation.dm
Co-authored-by: Fikou <piotrbryla@onet.pl>
* Update code/modules/ninja/suit/gloves.dm
Co-authored-by: Fikou <piotrbryla@onet.pl>
* Update the antagonist file
* Update ninjaDrainAct
* Re-Add MGS Voice Lines
* Up the Katana Damage Back Up to 30
* Attempting a Risky Manuever
* Adjusting some numbers to fit the delta time PR
* Fix Var Names and do a return ..()
* Remove Unused Defines, Update qdels to QDEL_NULLs
* Update code/modules/antagonists/space_ninja/space_ninja.dm
Co-authored-by: Rohesie <rohesie@gmail.com>
* Update code/modules/antagonists/space_ninja/space_ninja.dm
Co-authored-by: Rohesie <rohesie@gmail.com>
* Update code/modules/events/space_ninja.dm
Co-authored-by: Rohesie <rohesie@gmail.com>
* Update code/modules/ninja/energy_katana.dm
Co-authored-by: Rohesie <rohesie@gmail.com>
* Update code/modules/ninja/ninja_explosive.dm
Co-authored-by: Rohesie <rohesie@gmail.com>
* Update code/modules/ninja/suit/ninja_equipment_actions/energy_net_nets.dm
Co-authored-by: Rohesie <rohesie@gmail.com>
* Remove Unnecessary Condition Checks
* I'll show you what A stands for!
* Turn some things into defines
* Remove is_ninja()
* Gives the SN roles on Antag Gain, not on event spawn
* Clean up mind/key code to be efficient and modern
* Have Deactivated Suit Gloves use default black sprite
* Add the new clothing sprites
* Add new inventory sprites for alternate sprites
* Get Rid of These Again
* Re-add suit changes
* Implement all the suggestions for the antag file
* And then everything else
* Updating the Weight for purpose of testmerge
* Balance Updates
* Update the Objective Definitions
* Remove Now Unreachable Cyborg Interaction Code
* Get That Shit Out of My Forest
* Re-Add Cowl Wearing Sprite
* Re-Add Cowl Inventory Sprite
* Adapt to the new thing?.thing changes
* Re-add New Katana Inhand Sprites
* Re-Add glove's shock but have it do knockdown instead
* Get rid of the these stupid changelog changes
* Update sounds
* Re-add New Mask Sprite
* Re-update katana inventory sprite
* Revert Event Weight
* Update code/modules/ninja/suit/ninja_equipment_actions/energy_net_nets.dm
Co-authored-by: girl <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com>
* Re-Add Dynamic Ninja
* Revert Changelog thing
* Update Mob Sprites
* Add files via upload
Co-authored-by: Changelogs <action@github.com>
Co-authored-by: Fikou <piotrbryla@onet.pl>
Co-authored-by: Rohesie <rohesie@gmail.com>
Co-authored-by: girl <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com>
* Really revert commit
* Now Undo the simple change
* Undo My Stupid yet again
* Undo my stupid yet again
* No
* And for the last time
* Update Networked Fibers
* Early Return
* Dummy
The attack chain is a bit of a mess, and the introduction of signals hasn't helped in simplifying it.
In order to take a step into untangling this, I re-ordered the attack signals to no longer be by source type and instead to be grouped more modularly, as they are all members of the attack chain and function similarly. They all share the trait of potentially ending the attack chain via a return, but had several different names for it. I joined it into one.
Additionally, fixed a tk bug reported by @Timberpoes by adding a signal return check at the base of /mob/proc/RangedAttack
Lastly, removed the async call of /datum/mutation/human/telekinesis/proc/on_ranged_attack, which was added as a lazy patch to appease the linter complaining about a sleep on a signal handler (namely in /obj/singularity/attack_tk). Fixed the problem using timers.
Also cleaned some code here and there.
imo; the ss13 audio-scape is quite barren, you can only hear most things if you can see them, which in my opinion doesn't make much sense. This changes that so you can hear further away, but falloff is much higher, so in reality you will only hear things relatively quietly when they're out of sight.
This PR increases the hearing distance of most sound by 9, excluding sounds such as antag items that are meant to be used stealthily
This PR also replaces Byond's inbuilt falloff system with something I made, (And thanks to potato for helping me throw together a formula for it). This fall-off system makes sound fall off more naturally, with sounds being full volume within a certain range, and then softly falling off until they are completely quiet. This makes for a smoother transition between "This sound is full volume" and "I dont hear this sound".
Co-authored-by: ff <ff>
Originally I wanted to fix an issue where the `get_up()` `do_after()` would ignore the callback checks, because it was `uninterruptible`, so that made me refactor these procs to allow for higher granularity on checks and standardize behavior a bit more.
There's more work to be done for them, but one thing at a time.
* Removes the `uninterruptible` check in favor of the more granular `timed_action_flags`
* Cleans code on the `do_atom`, `do_after_mob`, `do_mob` and `do_after` procs to standardize them a little better.
Heretic can no longer give you both hijack AND die a glorius death objective.
Protection objective was broken for some time, it always suceeded. It should be fixed now.
So essentially there was discussion already here (https://tgstation13.org/phpBB/viewtopic.php?f=33&t=27620) about how hijack is one of the few objectives on Manuel that you can murderbone with, which is mildly at odds with the intention of the server.
Personally, I think hijack is just straight up terrible regardless of what server you're on. The way it functions is dreadful. Nobody must be aboard the shuttle in any part of the shuttle at all. This means you have people hiding in the walls or hiding in some invisible corner of the shuttle, cucking you of the hijack. For the most part, the only way to actually hijack the shuttle is to render it completely inhospitable or destroying it utterly save for, maybe, one square. The one you are standing on.
It's absurd. So, I knew kev made a pretty honest attempt at reworking hijack. And it works pretty well. It doesn't necessarily solve the problem of hijackers being mandatory mass shooters, but it goes some ways to improving the objective in a more interesting fashion, and allows for the discussion around the objective to be a little more open ended for the sake of the higher roleplay servers without actually detracting from the lower roleplay servers at all. If anything, this should improve the experience of being that gamer to stage a hijacking all the more interesting and about robustness, and less of hide-and-go-seek.
Implements the ?. operator, replacing code like A && A.B with A?.B
BYOND Ref:
When reading A?.B, it's equivalent to A && A.B except that A is only evaluated once, even if it's a complex expression like a proc call.