* Fixes exosuit console EMP logging and a mech runtime on EMPing. (#56196)
Occupants is a list. Mech EMP logging now correctly outputs the occupants instead of just outputting "/list"
Also when EMPing a mech in testing this PR, I noticed a runtime happening that I've fixed. Untyped for loop where the casting var was never assigned to and thus was always null.
* Fixes exosuit console EMP logging and a mech runtime on EMPing.
Co-authored-by: Timberpoes <silent_insomnia_pp@hotmail.co.uk>
* Fixes vehicles like skateboards and wheelys moving multiple times. (#56070)
So wheelys would have 3 instances of the riding component attached on initialize with a different argument, causing them to move 3 tiles at once instead of 1. Skateboards will have 2 attached and move 2, etc.
* Fixes vehicles like skateboards and wheelys moving multiple times.
Co-authored-by: Kylerace <kylerlumpkin1@gmail.com>
* Fixes removing AIs from mechs (#55986)
Basically the old code attempted to use locate(AI), but the AI in this case is a ref that is supposed to be provided by the card. Since the card is initially empty when removing AIs from the mech, it couldn't find the null in the occupants list and thus failed with a report that there was no AI in the mech.
Now it checks all occupants and makes a list of any AIs it finds, then gives the user the option to pick an AI (though since we don't have any multi-pilot mechs yet the most you can get is one AI, and input with one option just auto-chooses).
* Fixes removing AIs from mechs
Co-authored-by: zxaber <37497534+zxaber@users.noreply.github.com>
* NOTELEPORT errywhere (#55973)
These prevent some cheats or really low effort ways to get to where you really shouldn't be.
Mappers seriously fucking hate jaunting and phasing mechs, as they let you bypass their custom crafted ruins and the like. But it'll also stop more general "you shouldn't be here" stuff.
* NOTELEPORT checks that were atomized out of the medieval shuttle
Co-authored-by: tralezab <40974010+tralezab@users.noreply.github.com>
* Adds proper lazylist support to vehicles. (#55899)
Adds proper lazylist support to a bunch of vehicle code since some of the code either didn't consider that the occupants list could be null or didn't consider that the occupants list could be an empty list.
As a result the simple animal mecha pilots can board mechs again! (The mobs were checking whether the mech had any occupants. The mechs were checking whether the occupants list was falsey.)
Also fixed mechs putting themselves in their own occupants lists when boarded by a simple animal mecha pilot.
* Fixes simple animal mecha pilots
Co-authored-by: TemporalOroboros <TemporalOroboros@gmail.com>
* beep beep honk honk (#55875)
In my riding refactor and the handful of PR's that have come out since, I made some incorrect guesses about how clown cars worked, and as a result caused issues with them. This PR addresses the last issue with them, which was caused by erroneously removing a check to see if someone was actually qualified to drive the clown car (AKA they're a clown in full clown regalia), meaning that anyone in the car could drive it, including the unwilling passengers. That check has been restored, so only clowns can drive again, as intended.
* Fixes non-clowns being able to steer/drive clown cars
Co-authored-by: Ryll Ryll <3589655+Ryll-Ryll@users.noreply.github.com>
* Merry Christmas! Mechs receive damage from Xenos using their actual damage, instead of a hardcoded value (15). (#55736)
* Merry Christmas! Mechs receive damage from Xenos using their actual damage, instead of a hardcoded value (15).
Co-authored-by: KathrinBailey <53862927+KathrinBailey@users.noreply.github.com>
* Fixes clown cars + Fixes mechs not being able to open doors (#55748)
* honk honk
* realized the speedbike and wagon are not sealed
* Fixes clown cars + Fixes mechs not being able to open doors
Co-authored-by: Ryll Ryll <3589655+Ryll-Ryll@users.noreply.github.com>
* Fixes mech equipment being unusable for AIs (#55248)
Adds a signal listener on mechs that listens for middle clicks, and calls a proc that will, in turn, call the normal click proc if the user is an AI.
Middle clicks now pass through params just like left clicks.
* Fixes mech equipment being unusable for AIs
* Add CI-conform #2347 to this.
Co-authored-by: zxaber <37497534+zxaber@users.noreply.github.com>
Co-authored-by: Alex 'Avunia' Takiya <git@takiya.cloud>
* fixes clarke internals access and gives cargo techs working mech internals access (#55463)
fixes clarke only being able to be accessed by scientists instead of cargo, science and engi like ripley
adds cargo mech internal access to cargo techs
* fixes clarke internals access and gives cargo techs working mech internals access
Co-authored-by: Fikou <piotrbryla@onet.pl>
* Refactors Beams to use signals: Revived from 2019 edition! BONUS: Medbeams are also refactored to use signals (#55193)
Huge removal of dead vars, bad timers, and other sloppy jitteriness from beams. They go from checking movement to waiting for a signal.
VARIABLE KILL LIST:
sleep_time: signals baby
finished: signals BAYBEEE
target_oldloc: not only not typecasted as a turf or named as a turf, it was unused. when are we going to use this? the beam starts from the origin!
origin_oldloc: bad name, not typecasted. renamed to originturf
static_beam: how are you an unused variable and still get replaced by signals like really
timing_id: signallllss bbbaaaabbyy
recalculating: you get the drill by now signals baby
base_icon: unused, seemingly replaced by visuals I think
* Refactors Beams to use signals: Revived from 2019 edition! BONUS: Medbeams are also refactored to use signals
Co-authored-by: tralezab <40974010+tralezab@users.noreply.github.com>
* Replace direct poi_list manipulation with element (#55416)
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).
* Replace direct poi_list manipulation with element
Co-authored-by: Jared-Fogle <35135081+Jared-Fogle@users.noreply.github.com>
* pass_flags handling refactor + rewrites a part of projectiles for the n-th time (#54924)
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.)
* pass_flags handling refactor + rewrites a part of projectiles for the n-th time
Co-authored-by: silicons <2003111+silicons@users.noreply.github.com>
* Small do-after refactor (#55172)
This is an alternative to the PR Ryll made, it does some things similar e.g. the default limit of 1 interaction per target for a person, however, it refactors do_afters to support overrides for max interaction counts and unique sources.
For example, stripping uses the item being stripped as the source, allowing you to strip multiple items, but not the same item multiple times.
I've also fixed most other edge-cases this could cause where balance would be affected, but feel free to point out any I might've missed, this'll probably require some longer-term testmerging.
* Small do-after refactor
Co-authored-by: Qustinnus <Floydje123@hotmail.com>
* Mech Ammo now properly respects ammo for custom materials. (#55095)
Mech code now does a basic check for the amount of remaining ammo to adjust the amount of custom materials of an ammo container based on the remaining ammo against the original amount of ammo.
When the ammo runs out, it's hard-set to 2000 iron as that's the value of the sheet of iron that it gets set to by the end.
* Mech Ammo now properly respects ammo for custom materials.
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
* Changes grenade proc names to be more clear (#55181)
Grenades have, for the longest time, used the proc name preprime() to refer to arming a timed grenade so that it will boom in a few seconds, and prime() to refer to the grenade actually going boom (or releasing foam or anything else grenades do when they go off). This was very confusing, so now these two procs are called arm_grenade() and detonate().
* Changes grenade proc names to be more clear
Co-authored-by: Ryll Ryll <3589655+Ryll-Ryll@users.noreply.github.com>
* Feex (#55144)
For whatever reason we hardcoded the health value for drills at 200 brute damage before they can gib. 200 brute damage was picked as it was double the max health of /mob/living/carbon/whatever and double the max health was like, the cap on brute damage when someone is really, really, really, really dead.
Enter simplemobs. Their max health is regularly under 100, which means a hardcoded value of 200 brute damage to trigger gibbing effects is bad. Not that it matters anyway, because simplemobs also brute damage cap at maxHealth instead of maxHealth * 2 so the only simplemobs that could be gibbed by mech drills are those with 200 or more health.
This has been changed. Simplemobs now cap out at maxHealth * 2 damage, in line with all other /mob/living while drill code has been changed to check for maxHealth * 2 when gibbing instead of a hardcoded 200.
* Fixes issue with mecha drills failing to gib most simplemobs.
Co-authored-by: Timberpoes <silent_insomnia_pp@hotmail.co.uk>
* Humans have more complicated body temperatures (#54550)
This changes how carbon/humans stabilize body temperature, and changes how damage and wounds are applied based on temperature.
Humans now have a core body temperature along with body temperature. The core temperature is used for natural stabilization and what viruses like fever and shivers target by raising or lowing the core temperature of the mob.
The standard body temperature still exists and acts exactly the same for most items at this time but is now treated as surface temperature in humans.
Damage from body temperature for humans is now based on the core temperature instead of body temperature now.
Humans will now receive burn wounds when the body (surface) temperature is to high for to long.
This causes you to see alerts for the area temperature before you take damage in most cases improving visibility of dangerous situations.
* Humans have more complicated body temperatures
Co-authored-by: NightRed <nightred@gmail.com>
* Prevents mecha drills from stacking do_afters on the same target. (#55145)
* Feex
* Feex 2.0 Feexlectric Feexaloo
* Whitespace purge
* Prevents mecha drills from stacking do_afters on the same target.
Co-authored-by: Timberpoes <silent_insomnia_pp@hotmail.co.uk>
* Moves grown food to newfood (#55040)
Moves grown food to newfood
Gives trash element support for callbacks for item creation override
* Moves grown food to newfood
Co-authored-by: Qustinnus <Floydje123@hotmail.com>
* minor material_container args/vars refactor and Mk-honk shoes peeve. (#54863)
My original intention was just fixing an issue with the Mk-honk banana shoes but, considering I didn't want to add two new variables to a component with already lot of args and lengthy AddComponent() calls in term of text, I had to merge some TRUE/FALSE variable/args into the breakdown_flags bitfield (now named mat_container_flags) in the process.
* minor material_container args/vars refactor and Mk-honk shoes peeve.
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* Fixing multi-z defying mechas (AGAIN) (#54753)
I already fixed this issue almost a year ago, but the mecha refactor guy managed to revert the fix at the distance of 8 months.
* Fixing multi-z defying mechas (AGAIN)
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* [Ready]New walking and turning sounds for the Ripley Mk. I and II, interaction sounds for the hydraulic clamp (#54523)
* [Ready]New walking and turning sounds for the Ripley Mk. I and II, interaction sounds for the hydraulic clamp
Co-authored-by: InvalidArgument3 <51190031+InvalidArgument3@users.noreply.github.com>
* Ridden vehicles pass bullets, checks for new incapacitation traits for whether or not you fall off (#54376)
Ridden vehicles now pass any objects that normally pass tables. This includes bullets, thrown objects, and probably dwarves?
Ridden vehicles check for the various incapacitation traits instead of just usable hands for whether you fall off. Doesn't fix corpses buckled to these objects but that'll require more work to fix because it's all tied into relay_move.
This doesn't affect any ridden object that doesn't checks for hand availability. Like skateboards and wheelchairs (although how exactly your wheelchair is moving without hands or mechanical parts is beyond me).
* Ridden vehicles pass bullets, checks for new incapacitation traits for whether or not you fall off
Co-authored-by: necromanceranne <40847847+necromanceranne@users.noreply.github.com>
* Various fixes to mechs (#54595)
Vehicle objects now call bumpopen() rather than Bumped() when moving into an airlock, and thus will once again open any door the pilot has access to. Closes#54480
Fixes Ripley MK-I to MK-II conversions destroying equipment.
MK-I to MK-II conversions now sets the MK-II's integrity to be same percentage as the MK-I's integrity. Thus, upgrading a full-health MK-I will no longer result in a damaged MK-II.
Both Ripley types no longer start with an orebox, that function has been moved to the Clarke.
* Various mech fixes
Co-authored-by: zxaber <37497534+zxaber@users.noreply.github.com>
* Mecha follow up 2 edition 2 (#54454)
fixes mech power not using deltatime
fixes a few mech bugs
moved mecha gun logging to attacklog instead of mechalog
* Mecha follow up 2 edition 2
Co-authored-by: TiviPlus <57223640+TiviPlus@users.noreply.github.com>
* Implements timed_action_flags for do_after-like procs (#54409)
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.
* Implements timed_action_flags for do_after-like procs
* Update horror_form.dm
Co-authored-by: Rohesie <rohesie@gmail.com>
Co-authored-by: Azarak <azarak10@gmail.com>
* Vehicle housekeeping (#54455)
Removed redundacies, autodoc, early returns, moved attackby into welder act, made some CamelCase into a snake_case
* Vehicle housekeeping
Co-authored-by: TiviPlus <57223640+TiviPlus@users.noreply.github.com>
* [READY] Fixes being able to use items while inside a mech (#54302)
* [READY] Fixes being able to use items while inside a mech
Co-authored-by: Rohesie <rohesie@gmail.com>
* Converts A && A.B into A?.B (#54342)
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.
* Converts all A && A.B into A?.B
Co-authored-by: ZeWaka <zewakagamer@gmail.com>
* Adds Alloy Materials (#53623)
Adds and implements alloy materials
Takes several materials that were mostly fluff and converts them into actual usable materials.
Messes with material code a bit to make alloys recycle back into their component materials.
Adds the alloy materials to their in-game stacks.
Materials added:
Plasteel
Plastitanium
Plasmaglass
Titaniumglass
Plastitanium Glass
Alien Alloy
Makes plasteel/plastitanium/plasmaglass and the rest able to have separate properties from their component materials. It doesn't make much sense that the materials used to seal off the supermatter chamber from the rest of the station would be prone to exploding when heated.
Allows for further expansion of materials, possibly including actual functional metallurgy and smelting at some point in the very distant future.
(Lemons note: Adds a regeneration component, used for alien alloy)
* Adds Alloy Materials
Co-authored-by: TemporalOroboros <TemporalOroboros@gmail.com>
* Merge pull request #54098 from Timberpoes/dirty-do-after-fix
Minor tweaks and cleanup to mecha drill equipment's action code
* Minor tweaks and cleanup to mecha drill equipment's action code
Co-authored-by: ShizCalev <ShizCalev@users.noreply.github.com>
* Fix some potential sleeps as detected by SpacemanDMM improvements (#54230)
overrides weren't detected by should not sleep, i think i've mostly
fixed that with SpaceManiac/SpacemanDMM#214
Some of these are wacky but overall this pr is harmless
signals shouldnt sleep even in weird 1 in a million situations or due
to other people adding bad code
overrides of changeling can_sting() use alert() and input() and that's
just too fucked for me to fix in this pr
* Fixes some potential sleeps as detected by SpacemanDMM improvements
Co-authored-by: spookydonut <github@spooksoftware.com>
* Yellow slime core nerfs and adjustments. (#54198)
Yellow slime extract can no longer turn into a self-charging yellow slime core. This functionality has been completely removed.
Hypercharged yellow slime cores no longer self-charge.
They now have a capacity of 50,000 (up from their previous 20,000). This is 10,000 more than a bluespace power cell.
Their recharge rate is 2500. This is relatively slow for the power capacity, as hyper and bluespace cells charge at 10% of their capacity respectively and this is 5%.
Motorised wheelchairs have had their power usage reduced to 5% of their previous value since they were basically only usable with rechargable cells before
* Yellow slime core nerfs and adjustments.
* Update special.dm
* Update special.dm
Co-authored-by: Timberpoes <silent_insomnia_pp@hotmail.co.uk>
Co-authored-by: Azarak <azarak10@gmail.com>