This is how it worked at some point, I couldn't find what messed it up.
This makes sense, and kills the very odd strategy of starting any surgery on yourself in order to make yourself completely immune from people trying to attack you with scalpels, energy swords, knifes, glass shards, and in fact, any sharp item.
Also, this kills ai monkeys being able to preform surgery on people out of raw monkey spite. Surgery should also probably require IS_ADVANCED_TOOL_USER, but that's a PR for a different day.
A feature originally intended to make it clear to others when a player was being controlled by an AI, made no sense as soon as monkeys became a human subtype 2 years ago. This is solved by the implementation of a non-player species var, which can be applied to monkeys to suppress this text, without also then creating the cationic examine line as long as they have an AI controller.
* Unit tests range suck
Ok so we currently rely on some undefined behavior in energy_ball code
Namely, the range() family will return turfs in least/greatest get_dist
This is VERY useful for optimizing the tesla, but it's also undefined,
and lummy could change it any day now.
So let's at least unit test it so if it breaks we can remove it
* they want to see broken icons
* they wanna see the depowered sprites instead...
* kill unused broken chem master icons
* we're getting smarter as we go boys
* Update chem_master.dm
About The Pull Request
Fixes#69483#69432 broke reagent transfer.
image
As we can see above, we've gone from removing reagents 100% of the time, to removing reagents only when methods is truthy and thus they get added to r_to_send. methods is not always truthy. Infact, more often than not it's NULL.
As a result, common reagent transfer methods just broke, duplicating reagents.
Sometimes this has interesting consequences, like in reagent reactions: https://tgstation13.org/parsed-logs/terry/data/logs/2022/08/26/round-189263/game.txt
image
This is what my search bar looked like highlighting the 1000+ explosions.
image
This adds a unit test to make sure reagent transfer actually works, then fixes the bug by caching reagents to be removed and removing them in a batch later on.
Why It's Good For The Game
Infinitely looping explosions tend to be loud and obnoxious. This kills the player. This also kills the server.
Unit tests are cool because my test is an absolute unit and I'm in awe at the size of that lad.
Changelog
cl
fix: Fixes reagent transfer not properly emptying the source of reagents when transferring to a target.
/cl
* Massively optimizes the manifest_inject() proc by relaying the creation of the Security Records pictures to be on-demand
* Implements the change in the Security records and improves the photo's resolution as well
* Implements the change in the Medical records and improves the photo's resolution as well
* Updates the usage of the photos in human code
* Actually makes AI holograms still work with this new change
* Makes the appearance_holder a static variable, to avoid having to re-instanciate it all the time
* Uses the mutable_appearance instead of a static atom/movable/screen
* Less static atom/movable/screen stuff in the AI code too
* Removes my funny comment :(
* Removes some redundant null checks
* Updates the documentation for get_flat_human_icon() and get_flat_existing_human_icon()
* Removes get_id_photo() as it's no longer used
This PR was originally just going to be a re-factor of brig doors to be based on status displays, as a big chunk of their code was duplicating the exact same appearance, but then I realized "Cell 1" would have marqueed for being 6 characters and ended up doing the second half of the status display overhaul I meant to do a while back.
So firstly:
Yes, brig doors are now subtypes of status displays.
The main improvement out of that refactor, other than a lot of code trimming, is that the on-screen timer updates its readout as you set it, which looks nice.
Also handled various states in a more consistent way in some edge cases.
The timer now also displays the cell's actual name instead of the internal ID on the top line.
Now for status displays:
Long ago, I wanted the marquee to be continuous but the math required knowing the actual measured text width, though without a user that is impossible.
I recently realized the scope of the text usable on status displays (no formatting, or icons) is so narrow, I can cheat it like crazy into a small lookup table and a looping function.
No, this method can't possibly extend to runetext.
So now the marquees loop seemlessly without any gaps! In fact behind the scenes they loop the very first pixel possible, and still done as a one-and-done animate() sequence as before. (click the preview below if you want to see it smoother)
Status displays are now a bit more colorful and have gapless marquee text.
Brig door timers were massively refactored behind the scenes. Door control should still work as before but be mindful.
Removes /turf/open/burn proc. This removal will cause the parent proc to get called when it gets called on an open turf, without the hotspot check.
Lemon notes:
This does actually change a lot, but I want it anyway
It was initially like this because only hotspots could be a source of melting. when I changed that with my linda refactor, I kept the no hotspot requirement because it A: was close to the same behavior, and B: in theory meant less excited group rebuilds.
I have since decided that rebuilds like that especially in the context of hotspots are ok.
Adds the capability of fishing in chasms.
Chasms contain Chasm Chrabs, which are cute little crustaceans you can eat or put in an aquarium.
More importantly, chasms contain everything which has ever fallen into a chasm.
Falling into a chasm is no longer instant permanent round removal... as long as someone is willing to do some fishing, which means your chances of return haven't necessarily increased that much.
Potential rescuers (or people lamenting about how they dropped their necropolis chest into a hole) should also beware, chasm crabs are actually young Lobstrosities and there's a rare but not insubstantial chance that you'll fish one of them up instead, which won't make it very happy.
If you somehow come back to life inside a chasm (generally only likely by being a changeling or some admin interference, but perhaps you have some kind of implant which does it) you'll climb back out again, so holes are no longer a way of disposing of a changeling for good. You think The Thing would be defeated if you threw it down a hole?
Ethereals can't manage this because falling into a chasm causes too much damage and they simply smash on the way down.
add: You can now fish in chasms, and might manage to catch things that careless miners have dropped in there.
add: If your pole is long enough to reach into a deep hole, you might catch crabs.
balance: Changelings can climb out of chasms if you throw them into one.
imageadd: An icon of a nice little crab, who will grow up into something less nice.
add: You can craft fishing equipment from various lavaland materials, so that Ashwalkers can fish up dead miners before you.
add: You can sometimes find worms while digging up tiles, if appropriate for that material.
Fixes starnge reagent, and possibly other chems too
* remove_reagent() was being called before expose_multiple() was, which meant people were being exposed to chemcials that had 0 volume in them, something that was needed for something like strange reagent to work.
* Lets shades snowflake be able to use cult comms
* Cult shades have their hands blocked while in a shard, which makes them completely useless when put in someone's bag. Sorta like a pAI, they should be able to contact for help when the person who has them is in trouble.
* accidentally put it on the wrong action
* Fixes runtime with bookshelves loading.
- If a bookshelf is maploaded after the library subsystem is instantiated, it runtimes due to shelves_to_load being null, and no books are loaded. So, if a bookcase is maploaded after SSinit is done initializing, just load the shelf in init.
* Needs to be asyncronous.
* Adds a unique ID to the ticket machine in an icebox ruin, preventing it from getting mixed up with the HoP's.
* Adds more text on examining ticket machines and the tickets from them, allowing people to know what position in queue they are.
* Tickets now properly display their number, and is named after their position in queue.
* Adds more user alerts to certain actions around the ticket machine, such as when there are no more people in queue.
About The Pull Request
This is my fourth food expansion PR, adding and changing quite a few things.
This PR will:
Add 7 different types of salads
Add a new ingredient supply beacon box called 'Salads', which includes ingredients used for the salad recipes
Give cherry jelly its own container, and allow jelly to be ordered from the produce console
Make cherry jelly actually nourish you when consumed
Add paçoca, a Brazilian peanut candy requested by @GuillaumePrata
Add mashed potatoes
Add shepherds pie
Add Cullen skink
Fixes#69415
This adds a trait to the cult ghost so they no longer need to breath and thus are immune to gas effects.
Why It's Good For The Game
Ghosts don't need to breath.
* Revert "Fixes Fucked Job Requirement Displays (#69368)" and Revert "Converts Job Hour Requirements System To HOURS Define (#68856)"
This reverts commit 6f2354e694 and 5b77361d39.
* Fixes Molotovs by not making them splash from parent's ``throw_impact()``, handled instead by ``smash()``, after we do our Molotov-related activities.
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
The first step (after validation) of throwing an object is to place it on the ground.
Placing a "mob holder" object on the ground causes it to release the held mob and delete itself.
A runtime would then occur as you tried to throw something which just deleted itself.
I overrode on_thrown on /obj/item/clothing/head/mob_holder so that it calls release instead of dropItemToGround and returns the held mob instead of the item.
The result is that you can now walk around with a backpack full of mice and throw them at people, just like in real life.
Moves singulo and supermatter dmis into obj/engine, renamed from obj/tesla_engine
Moves Halloween, Christmas, and misc holiday items to obj/holiday
Moves lollipops to obj/food
Moves crates, closets, and storage to obj/storage
Moves assemblies to obj/assemblies
Renames decals.dmi to signs.dmi ...because they're signs and not decals
Moves statues, cutouts, instruments, art supplies, and crayons to obj/art
Moves balloons, plushes, toys, cards, dice, the hourglass, and TCG to obj/toys
Moves guns, swords, shields to obj/weapons
* Allows Brig Subtypes To Be Usable for Departmental Orders
Hey there,
I saw an odd thing on IceBox the other day, where they couldn't deliver the departmental order crate because they were trying to open it in `/area/station/security/brig/upper` and not `/area/station/security/brig`. When they went down a z-level and opened it in the correct area, it worked perfectly fine. However, I think it's a bit obtuse, and this sort of thing might only get worse as multi-z maps become more dominant. So, let's apply a code solution by making the areas list read off typesof for the department_delivery_areas for security crates.
* typesof didn't actually work, we go explicit now
Hey there,
I was code-diving looking, and apparently we have these nifty pencil analogues. However, they used a decisecond time define instead of the nice SECONDS macro, which is not nifty. Let's fix that real fast.
* preparations for self-referential list conversion
* additional changes for the auxlua 1.1.1 update
* fixed a type in `SS13.await`
* bumps auxlua to 1.2.0
* bumps auxlua to 1.2.1