Jaunting now keeps track of the last five non-blocked tiles you moved across while in the jaunt. Upon exit, it will attempt to deposit you into the last unblocked tile. Should it run out of tiles to try, you will be returned to your starting location. As such, jaunting mobs can no longer end up inside walls or dense objects. Tables, and anything else with the climbable element, are still allowed.
Added support to /turf/proc/is_blocked_turf() to allow ignoring climbable atoms.
Added the TRAIT_CLIMBABLE trait, applied by the climbable element, to accomplish the above.
* Catch null text sent to to_chat
* Brain traumas no longer send empty to_chat gain strings
* Make to_chat_immediate changes and clean up args list formatting
* Fix empty to_chat message where there is no memo for admins
* Fix additional edge case where there are no messages for the ckey.
Adds cannabis reagent and replaces space drugs with it in cannabis products
Adds space drugs to rainbow weed, which fits its theme and might satisfy the people who miss the effect
Removes lipolicide from cannabis products in favour of the reagent consuming nutrition directly
Cannabis reagent gives you messages describing symptoms of cannabis intoxication, makes you laugh, makes you hungry, has a chance to couchlock you buckled to a chair and put you to sleep lying down
Cannabis no longer references hallucinating, can't be overdosed and has no addiction
Adds Stoned status effect, which is applied by cannabis reagent
Stoned status effect slows you down, gives you bloodshot eyes, makes you clumsy, boosts your mood and gives you the drugged sound environment
Adds "stoned" icon state for Stoned status effect screen alert (sprite shamelessly stolen from the Smoke spell)
Adds BLOODSHOT_EYES trait, which is applied by Stoned status effect
Adds examine eye descriptions for bloodshot eyes and player-chosen red eyes
Adds cannabis movespeed modifier, which is applied by the Stoned status effect
Adds Stoned mood event, which is applied by Stoned status effect and gives the same mood boost as High but doesn't reference tripping
A stomach would literally just ask the species datum how to be hungry and made a bunch of exceptions for ethereals. I mostly just moved code around so that hunger is handled by a persons stomach, thus shrinking the species.dm bloat.
This also makes it so ethereal's charge mechanic is unique to their stomache, instead of this really weird inbetween where just nothing happens and you kinda starve to death. You can stick an ethereal stomach in a human and this will replace their hunger mechanic with the charge mechanic and lets them absorb power from APCs and everything. You can also give ethereals a normal stomach and they'll use the normal hunger mechanics
Stationary gas tanks have been in a terrible place for a long time, this addresses some of the issues with a more balance focused change coming in a second mapping pr after this one.
Stationary gas tanks have been made constructable and act similarly to canisters in that they can be damaged, repaired, and over-pressurized to explode. Additionally, they can be made with any rigid material and their stats depend on that material. A glass tank is going to have far less pressure capability than one made of plasteel.
In terms of gameplay there are two main differences now: Adjacent stationary tanks will merge together both graphically and with their internal storage. Any port on any of the tanks can access this shared storage. Also stationary tanks no longer magically have many times the volume for gas as the tile it's in, instead they have a pressure cap and a normal amount of volume.
Of interest to coders this pr also adds a generic grouping datum that acts similar to how pipe networks work. It maintains a listing of all adjacent objects whose type falls within a specified filter. In this case it's used for the gas tanks to know of every other tank in the group. I'll be looking into spreading it's usage elsewhere where this can replace existing one off systems.
Some (de)construction:
First a glass tank is constructed which is then immediately damaged by the high pressure in the gas storage that is now shared. After repairing it for a moment another metal tank is built.
Implements appropriate signal handlers for /obj/item/proc/attack_secondary() - Secondary item attacks now send signals and signal handlers can now cancel the attack chain, continue it or move to the primary attack chain.
Adds a kneecapping element.
Kneecapping element replaces the item's secondary attack with an aimed attack at the kneecaps under certain circumstances. If these circumstances are not met, the secondary attack chain will continue as normal with the item's normal secondary attack.
Element is incompatible with non-items. Requires the parent item to have a force equal to or greater than WOUND_MINIMUM_DAMAGE. Also requires that the parent can actually get past pre_secondary_attack without the attack chain cancelling. Funnily enough, the Element doesn't require a blunt weapon. If admins add it to sharp or pointy weapons, they get the same aimed attack but with sharp and pointy wounds instead - Because all the Element does is add a hefty wounding modifier.
Kneecapping attacks have a wounding bonus between severe and critical+10 wound thresholds. Without some serious wound protecting armour this all but guarantees a wound of some sort. The attack is directed specifically at a limb and the limb takes the damage.
Requires the attacker to be aiming for either leg zone, which will be targetted specifically. They will than have a 3-second do_mob before executing the attack.
Kneecapping requires the target to either be on the floor, immobilised or buckled to something.
Passing all the checks will cancel the entire attack chain for the Element to handle attacking logic.
This Element has been added to the baseball bat. Any other items that wish to implement its functionality in the future are free to.
Simply puts species IDs into defines ("lizard" turns into #define SPECIES_LIZARD "lizard"). This does not affect any gameplay, and is purely for making sure future code doesn't go all fucked up because someone accidentally misspells something
I only changed code that was spelt correctly, so if there actually is a typo somewhere, it isn't changed
Integrates spider egg clusters into the mob spawners instead of them being their own thing, which cleans up a code a fair bit, and gives players an overview of all available types of clusters in the ghost spawners menu, example image below. This also means players banned from ROLE_ALIEN will not be able to spawn as one, as they are very similiar antagonists in concept and it is probably wiser than using default ROLE_LAVALAND on mob spawners for restriction of this role.
Expanded mob spawners code to accomodate for a situations where spawners are using radials for handling mob choosing, and also for when spawners have special conditions for when they are available (like until eggs are mature, for example).
Mob spawners now support giving their mobs multiple factions membership, instead of being limited to only one.
Spider egg clusters now stop processing when they mature, as there is no need for them to do that anymore by that point.
Cleaned up and updated some spider variant radial info boxes, so players have better idea about each variant individual strengths and weaknesses.
Strips out the existing right click code - Due to the myriad of ways right clicking has been implemented, dedicated signals and procs for right clicking without modifiers are fundamentally incompatible with our system of primary and secondary attacks.
Adds additional signals to attacking code. These signals allow atoms to cancel the attack chain early on secondary attacks, or override the standard procs and not send signals to prevent any undesired behaviour from signal handlers.
Items that used RightClick procs have been converted to attack_hand_secondary.
The slaughter demon, having its own set of snowflake code as poor OOP principles have been applied in UnarmedAttack() procs with lacking calls to parent procs and arbitrary redefinition of behaviour, checks for a right click in its own UnarmedAttack() and performs a bodyslam off that.
Storage components now hijack the secondary attackby stage via signals to handle their opening and closing shortcuts on right click. When you right click a storage component equipped item with an object in your active hand, the object has an opportunity to perform its logic in pre secondary attack code and cancel the attack chain. If it does not cancel the attack chain in pre-attack, then the storage component takes over for attackby and, if possible, opens the relevant inventory and ends the attack chain.
The forensic scanner is a proof-of-concept of this working in action. With its scan logic moved from afterattack code to pre attack code for right clicking, right clicking with the scanner will now perform a scan where previously one was impossible. Left clicking still does what it always does - Scans at the very end of the attack chain.
The logic still isn't perfect - For example, you still can't attack containers in melee even in combat mode (you'll either open them or put your weapon into them regardless of which option you choose) - But this is a better setup overall which allows for items to at least override this behaviour in pre-attack if needed.
Adds the airlock shell. The circuit has full control over the airlock.
Refactors USB code to be easier to use for less experienced coders.
Implements USB cables for the binary valve to be able to open/close the valve.
Adds a private channel for radios that only lets circuits with the same owner's ID to interact with it.
Adds the multiplexer circuit component - en.wikipedia.org/wiki/Multiplexer
Circuit components can now be directly inserted into shells rather than having to take the integrated circuit out.
Special information can be accessed from components now through the "Info" button besides the eject button on a component.
This PR converts cow-tipping and medibot-tipping into a component, /datum/component/tippable. Cows and medibots now use the tippable component to control their tipping behaviors.
This PR also goes through a few atom_attack_hand signals and makes them all send the same arguments.
* Makes turfs persist signals
* Splits connect_loc up into two elements, one for stuff that wishes to connect on behalf of something, and one for stuff that just wants to connect normally. Connecting on behalf of someone has a significant amount of overhead, so let's do this to keep things clear
* Converts all uses of connect_loc over to the new patterns
* Adds some comments, actually makes turfs persist signals
* There's no need to detach connect loc anymore, since all it does is unregister signals. Unregisters a signal from formorly decal'd turfs, and makes the changeturf signal persistance stuff actually work
* bro fuck documentation
* Changes from a var to a proc, prevents admemems and idiots
* Extra detail on why we do the copy post qdel
Enter(), Entered(), Exit() and Exited() all passed the old loc forward, but everything except a single a case cared about the direction of the movement more than about the specific source.
Since moving multi-tile objects will have multiple sources of movement but a single direction, this change makes it easier to track their movement.
Cleaned up a lot of code around and made proc inputs compatible.
I'll add opacity support for multi-tile objects in a different PR after this is merged, as this has grown large enough and I don't want to compromise the reviewability.
Tested this locally and as expected it didn't impair movement nor produced any runtimes.
When something gets hit by multiple projectiles whose names end in "s", an extra "s" gets added to pluralize them. Sadly \s doesn't add the es, so I've made a proc with the other conjugation methods and used it for projectiles.
Does a bit of a logic re-write on the cargo gauntlets and their strong_pull component.
Cargo gauntlets themselves have been converted to use signals for equipping and unequipping.
Their component reference has been changed to a weakref so if the component is ever Destroy()ed for any reason outside of the gauntlets it doesn't hard del.
The strong_pull component now registers signals with parent in RegisterWithParent() instead of Init() and removing the strong grip is no longer a SIGNAL_HANDLER proc. It is now called by the signal handler for no longer pulling things and in Destroy(). This stops instances where pulling things and removing the gloves didn't remove the pull effect appropriately.
Suspenders were already basically given a greyscale sprite by me in the past, this converts them to GAGS allowing custom recolors of them through existing code already in place.
I noticed that various nonhuman body features can't be changed using genetics. I corrected this by adding a block to character genomes allowing you to edit features in the DNA console.
This PR adds a new machine; the ectoscopic sniffer, to the robotics lab on each map.
The sniffer is small desktop machine used for detecting paranormal activity, it displays a green flash and a chime every time it is touched(as in attacked) by a ghost.
It has a single wire inside, when this wire is pulsed, it triggers the animation and chime, as if touched by a ghost, maybe some enterprising crewmember can use this to their advantage. When this wire is cut, the device won't trigger, no matter how many spooks or haunts touch it.
---
This PR is above all fun.
Of course, it can be used as the author of the previous PR intended; to alert the roboticists of souls willing to occupy a positronic brain.
Clever spacemen will always figure out how to use this kind of device for more creative parascientifc research.
It is still limited by its low bitrate and the very low quality of the information as compared to something like ghost court, since a single malevolent spirit is able to feed the living bullshit.
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Adds set_density()
Fixes one instance of a duplicate density assignment on an object.
Comments two hacky usages of density which will have to forgo using the setter for now.
Lets us append code to the event of density changing.
Pretty sure this is leading up to some multitile object thing -Lemon
* Initial commit
* Sprites, finishing work
* More ways to detach from circuitboards
* Clear TODOs, give bots a button
* Fix qdel loop
* Designs
* It's the bots that have them
* Grammar fix
* Feedback for connecting to circuit directly
* Add USB cable design to basic circuitry
* Better naming
* Feedback
* Fix for new code
* COMSIG_CIRCUIT_ADD_COMPONENT_MANUALLY
* span procs
Converts most spans into span procs. Mostly used regex for this and sorted out any compile time errors afterwards so there could be some bugs.
Was initially going to do defines, but ninja said to make it into a proc, and if there's any overhead, they can easily be changed to defines.
Makes it easier to control the formatting and prevents typos when creating spans as it'll runtime if you misspell instead of silently failing.
Reduces the code you need to write when writing spans, as you don't need to close the span as that's automatically handled by the proc.
(Note from Lemon: This should be converted to defines once we update the minimum version to 514. Didn't do it now because byond pain and such)
Wrapping paper has been put through GAGS. You can set the base color and ribbon color with right click, then apply it to a package.
Co-authored-by: coiax <yellowbounder@gmail.com>
* Auto doc'd much of grown botany food and plant traits and renamed a buncha variables and parameters to match modern contribution guidelines.
* Cleaned up a good bit of plant gene code left over from the prior refactor and modernized some of it.
All plant effects that were once unique to a plant are now un-graftable, un-mutatable, un-shearable plant traits - called IMMUTABLE traits.
The ultimate goal of this PR was to make all of the hidden, arcane traits that are spread through botany's various plants and add a way to figure out they exist in game. Take omega-weed, for example, which has a maximum volume of 420 units.
What does this mean for the enterprising botanist?
In most cases, all the plants should act the same way. None of the immutable traits are graftable from any of the plants, they cannot be sheared off of the plant, and they cannot be mutated randomly from strange seeds or high instability mutations.
Though, in refactoring these traits, two things have been fixed: Novaflower's on hit and Deathnettle's on hit now proc again. If you aren't aware, Novaflowers apply firestacks and Deathnettles paralyze on hit. They've been in an unreachable code segment for a few years now and i'm not sure if they should be "fixed" or not, since I think they don't need any buffs.
A few other things have changed:
* Liquid Contents can no longer be applied to plants with Hypodermic Prickles, and visa-versa. They already didn't work together, but this means you need to go through an extra step to make LC-deathnettles.
* Killer Tomatos no longer have liquid contents. Didn't really make sense, anyways.
I made one hell of a whoopsie with dog AI, letting dogs fetch and pick up and carry around things that are absolutely not meant to be carryable, basically anything that isn't anchored. This restricts their carrying ability to items.
Fixes: #59202
Adds new signal - COMSIG_MOB_EQUIPPED_ITEM. Signal sent at the same time COMSIG_ITEM_EQUIPPED is and allows something to Register for every time a mob equips an item. Replaced a process() in /datum/quirk/badback with signals relating to this. Holds a weakref to any backpack it has registered signals with for use in its own remove() proc.
Removes snowflake code in /datum/quirk/light_step - This quirk no longer uses GetComponent to directly modify a component. Instead, the same code has been shifted into the component itself, which now checks for TRAIT_LIGHT_STEP and mods the volume and range accordingly.
Refactors quirk code in general - Quirks no longer do major logic in New() and no longer qdel themselves in New(). You now fully instantiate a quirk assigned to a var, then call /datum/quirk/proc/add_to_holder(). Various scenarios that shouldn't happen now get handled in this proc and calling code can cleanup properly. Quirks "support" having no quirk_holder - Since their default state is no quirk_holder until the quirk is added to a holder, and similarly quirks can be removed from a holder as well. Destroying a quirk with a quirk_holder will remove it from the quirk_holder properly. qdeling a quirk_holder will clean up any quirks attached to them.
Rethinks processing quirks - Quirks no longer all process automatically. The new logic changes mean their previous need to process() just to check if their quirk_holder had been QDELETED so they didn't become runtime factories has been removed by the refactored code. The few quirks that still process require processing_quirk = TRUE which will start them processing when added to a quirk_holder and stop processing on removal. This means there should be some many hundred fewer quirks process()ing 24/7 every shift.
Subtypes item quirks - A number of quirks are designed to give items to the player. There's code duplication and varying implementation issues, so item quirks have their own subtype with a proc and some vars to handle this. Quirks will no longer fail to give items at all (some quirks actually explictly qdel'd the items they give if the user had no free hands or slots) and will drop items on the floor in the worst-case scenario. Players will always get the opportunity to see messages related to item quirks as these are in a code path that, when the quirk is first added to a new mob, will either output immediately if the mob has a client, or wait for the mob to have a client otherwise.
"Roundstart quirks" paradigm removed - Quirks now have a path to add unique effects that aren't replicated if the quirk is transferred from one mob to another - add_unique(). Item spawning and other similar one-shot logic is done here. This means that adding a quirk to a mob will trigger the one-time effects. Transferring it between mobs (for example, slimepeople changing bodies or swapping a golem shell) will not. roundstart_quirks var renamed to just quirks since it genuinely is just a list of quirks the mob has from any source - Whether roundstart, admin or transferred.
Family Heirloom quirk - Heirloom is now a weakref.
Nyctophobia quirk - No longer process()es, now Registers COMSIG_MOVABLE_MOVED. Every footstep in the dark will slow you back to walking.
Reality Dissociation Syndrome quirk - No longer snowflakes behaviour for mindbreaker toxin on process. Now mindbreaker toxin has the anti-hallucination functionality built into its already existing HAS_TRAIT(M, TRAIT_INSANITY) check in on_mob_life.
Tongue Tied quirk - Now uses .getorganslot(ORGAN_SLOT_TONGUE) to find the tongue instead of locate() in internal_organs
Obsessed antag - Thanks to the Family Heirloom quirk now holding a weakref to the heirloom item itself, this antag type will no longer get the steal heirloom objective if the heirloom doesn't exist (ie. the weakref is null or fails to resolve, meaning the item has been destroyed)
Various quirks that were impossible to remove before are now removable - Examples being light step (which no longer directly modifies the footstep component) and bad back.
In addition, adds some extra documentation overall and improves compliance with code requirements in a number of procs (but certainly not all).
Probably various other little changes here and there to make the above all mesh together.
This standardizes how values are read from the json for greyscale layers so that error handling can check for some additional things:
No extra keys in the json that are unknown
No missing keys that a layer needs to work
Values are the expected type for that key
A variety of error messages have been added for various ways the json can be malformed and should hopefully provide good feedback for anyone working with greyscale configurations.
This PR fixes a case where Cayenne's sprite was flickering an error sign when carrying a disk and correctly assigns icon state names to JSON gags files for carp mouth and wirecutters as per newest standards to prevent further issues with them in the future.
credit to zewaka for the idea of using underlays
turns the lighting object movables that were unnecessary and increased maptick into a datum which then applies and removes an underlay in update(). also applies a lot of general lighting clean ups (mostly using as anything in loops and fixing single letter var names).
multiz is a little different by necessity, now only the bottom turf's lighting matters in the brightness of the top turf unlike master where the bottom turf's lighting object is hidden from the vis_contents of the top turf. there are still some kinks to iron out here though, since currently objects suspended in openspace (like tram platforms) look bad and glass floors look bad too
only thing i have left to do is make multiz work (well)
UPDATE: multiz now appears the same as far as i can tell, its possible there are other situations in which its different but datum mats work and it automatically updates if the turf below changes. now i just need to make the system less finnicky if at all possible (and possibly merge managed_turf_vis_content with managed_overlays maybe?)
new update: its basically equivalent to normal multiz as far as i can tell (visually at least, in the circumstances ive tested so far)
NEW NEW UPDATE: turfs no longer have the VIS_HIDE vis_flag and multiz works without stacking the lighting from the floor below! so this shouldnt have any overt drawbacks to master anymore
1 needless movable per tile is terrible for maptick. this is probably a larger improvement than my emissive blocker change in terms of maptick. im guessing we'd get around 0.6 average maptick per player after this where currently we get 0.85 or so
Edit: according to lemon, sybil reached 0.71 maptick per person when tm'd with this
if this is a big enough improvement i might finally be able to get rid of the Gone discord avatar
The aims of this commit are threefold:
- To introduce lizard culture (based upon Common Core) in a tangible way.
- Give some more variety of techniques and recipes to the chef and bartender.
- To give some flavour (metaphorically and literally).
🆑 Inept, Coiax, AdipemDragon, YakumoChen
add: The release of the new cookbook, "Tiziran Cooking: a Taste of the Homeworld" has brought Lizard food to the masses! Try out some new treats, like Moonfish, Nectar Larvae, and perhaps even Headcheese at the kitchen today!
add: To coincide with the new popularity of Lizard cuisine, Nanotrasen now stocks seeds for Korta Nuts, a common ingredient in lizard cooking, in the Megaseed vendors. Botanists, you know what to do.
add: A few Tiziran fish are also available for you aquaculture lovers out there. They all like saltwater!
add: A few new snacks are also now available at the station's snack vendors, for those of you too lazy to visit the kitchen.
/🆑
Co-authored-by: coiax <yellowbounder@gmail.com>
This PR fixes a case where slip mood debuff was not triggering at all due to the simple fact that the mood component was not listening for the mob slip signal, so the relevant on_slip proc was never called and therefore mood debuff was never given.
Fixes#59570
Sourced from #59118 and a cursed project I'll pr later, This pr contains a lot of harddel fixes for stuff that pops up after a player interacts with something. I'm not gonna list them all here because there's something like 60 130, check the commit log if you're curious
Oh and I moved ref tracking screaming to a separate define, and made some optimizations to the thing in general. I think that's it, this pr is a bit of a frankenstine
* Makes durathread strangling show up on examine
* Better and grammatically accurate feedback
* more grammar fixes
* Makes it work on jaws of life as well
* Make it check tool behavior as well
* Fixes some compile errors
* Makes the *me and *custom use local variables for message storage
* Automatic changelog compile [ci skip]
* Documents emotes.dm, fixes(?) emote swapping, brings up the code to modern standards, hopefully.
* Whoops, now it should compile.
* More documentation.
Co-authored-by: Changelogs <action@github.com>
* Add component and element templates
* Convert compoinent and element templates to markdown files
* Change element example in template to stateless
* Replace element example with gong moving sound
Adds a 5-second cooldown for the audio of clapping and laughing when they are done voluntarily. Also adds the new audio_cooldown var for emotes to set new audio cooldowns.
This fixes the problem of the keybind conflict message being shown over and over again until you manually save your preferences with correct keybinds + resetting to classic keys works now
You had to manually save your prefs because the code didn't save the new unbound keys to the prefs file
Classic mode was broken because the emote hotkeys didn't have classic_keys set to Unbound by default
New hotkeys are now actually set to Unbound if no default key is set
This was broken for emote hotkeys because classic_keys = list("Unbound") was missing for them
It was also broken because the code assumed conflicting keys if some Unbound key already existed ...
The code also used classic key defaults even if you had hotkey mode enabled thats fixed now too