I was calling get_ranged_target_turf which doesn't handle the corners of
the map very well,
As I was already using locate(), it now just gets the turf offset in the
same proc.
Ghosts can now jump to either the target of the shot, or the place the
shot actually hit. (In the event the target was on the other side of the
ship)
<img width="1008" height="77" alt="image"
src="https://github.com/user-attachments/assets/a295ba84-d479-4b4b-9197-1bb136882c83"
/>
On one fateful day when I was playing security I spotted an Idris unit
wearing a white coat. It was all great and good until it turned and the
white changed from white to an ugly grey. This could not stand, someone
should do something with that awful sprite.
Then I remembered I'm a spriter, so here we go.
> - imageadd: "Resprited Idris Unit coats. Brown Idris Unit coats are
now teal."
NEW sprites on the top, old (current) on the bottom.
<details>
<summary>Black Idris Unit coats: </summary>
<img width="2048" height="1024" alt="black coats"
src="https://github.com/user-attachments/assets/1afb2d20-93c4-46fd-a800-13ef20631e74"
/>
</details>
<details>
<summary>White Idris Unit coats: </summary>
<img width="2048" height="1024" alt="white coats"
src="https://github.com/user-attachments/assets/ddbe6c03-42f3-49bd-b780-82344161f969"
/>
</details>
Brown Idris Unit coats were redone to be teal to comply with the Idris
palette.
<details>
<summary>Teal Idris Unit coats: </summary>
<img width="2048" height="1024" alt="teal coats"
src="https://github.com/user-attachments/assets/fb1b3824-9bf0-44ff-a519-a92497590eee"
/>
</details>
<hr>
This is how the coats looked at the time this PR was posted.
<details>
<summary>First iteration black Idris Unit coats: </summary>
<img width="3072" height="1536" alt="black Idris unit coat"
src="https://github.com/user-attachments/assets/2f4ad7d8-617f-4ef9-aef0-618b690abdb1"
/>
</details>
<details>
<summary>First iteration white Idris Unit coats: </summary>
<img width="3072" height="1536" alt="white Idris unit coat"
src="https://github.com/user-attachments/assets/37b06fb7-a6bd-4577-a372-91892ae6f518"
/>
</details>
<details>
<summary>First iteration teal Idris Unit coats: </summary>
<img width="3072" height="1536" alt="teal Idris unit coat"
src="https://github.com/user-attachments/assets/d739db17-dc0a-4083-935f-d6651e65c5b0"
/>
</details>
<hr>
This PR is NOT related to me making an IPC whitelist application. Trust
me.
Have an Idris day!
Part 3 of the Mob Destroy Refactor, this time going through the entire
list of every ref stored up to a mob/human, and (attempting) to verify
and cleanup every possible circular ref. This PR also fixes some
mistakes made with cleaning up UI elements, namely that tgui's really
don't like it when you qdel them, and screen objects also weren't always
clearing their own references if Qdel'ed directly. There were several
niche situations too where circle refs might be retained by a mob. I
also found an issue where static lights were only cleaned up on
/atom/movable/ but actually existed farther up the chain on /atom. I
don't know if any /atoms that aren't /atom/movable ever get static
lights, but the fact that they can be needs to be correctly accounted
for.
I can't possibly have gotten all of them, but this is every single one I
could find after 3 hours of work.
Rewrites Saycode and Langchat to add support for multiple languages in
one message, including audible emotes.
<img width="1139" height="338" alt="image"
src="https://github.com/user-attachments/assets/25e26932-7a6e-4c54-ab74-56fffb92ecad"
/>
Here's some samples to explain how to mix languages.
<img width="422" height="26" alt="image"
src="https://github.com/user-attachments/assets/e1b176cc-8625-4dc9-83c8-a053d3f310e6"
/>
`Languages ,2 can be mixed ,3 like this.`
<img width="540" height="21" alt="image"
src="https://github.com/user-attachments/assets/19156c67-4670-4d7a-84d7-26e527de2676"
/>
`!explains, ,2Emotes work too. ,0The text will get auto-quoted.`
<img width="592" height="18" alt="image"
src="https://github.com/user-attachments/assets/cfc31c5c-2383-41c8-82be-b36836339321"
/>
`,3Most languages ,0can be ,2mixed ,1arbitrarily, ,3any number of
,0times.`
<img width="636" height="20" alt="image"
src="https://github.com/user-attachments/assets/388b4f9d-192a-4374-ac31-bbd4e4e5dfe4"
/>
`,2Emotes. ,eAnd he nods. ,3They don't have to come first anymore.`
There are some exceptions. The exceptions are currently anything with
any of the flags `SIGNLANG`, `HIVEMIND`, `PRESSUREPROOF`,
`KNOWONLYHEAR`. Exceptions work the same as current languages do: they
must be the first language in the message. If so, they prevent switching
into any other language mid-message; if they're not first, they just
wont trigger.
They're exceptions currently because there's not really a clean way that
I or the people I asked for help on this one to make them look nice.
`SIGNLANG` for example doesn't scramble text, it shows it's own `
gestures a lengthy message.` text for those that don't understand. Could
we just replace every instance of sign language with that if somebody
doesn't understand? Probably. It would look pretty awful though. e.g.
`Alina Eskelinen says, "Hello." Alina Eskelinen gestures a short
message.`
This definitely needs testmerging because it more or less rewrites the
entire pipeline surrounding `say`. The `say` code itself had to be
rewritten to support the multiple languages, as well as all the existing
plumbing for listeners receiving messages. In return though, it's
significantly more straightforward and hopefully by extension easier for
people to add to in the future.
Primarily, instead of having four different `hear_say`, `hear_radio`,
`hear_sleep`, etc., routes for messages to come through, every single
audible message is received by `hear_message`, which is responsible for
figuring out how clear the message is (is the radio damaged? is it a
whisper we're eavesdropping on?), who needs to receive it in their
chatbox, formatting it correctly for each listener, and finally if any
npc or object within range needs to react to it in some way, like a
parrot or a mech.
changelog:
- rscadd: "Adds code-switching: you can now speak in multiple languages
in the same message."
- rscadd: "Adds audible emotes to the language list. They can be
triggered with ,e."
- rscdel: "Removes SSrunechat."
- refactor: "Rewrote langchat in order to support multiple languages and
partial comprehension."
- refactor: "Rewrote a vast majority of all saycode and the code
responsible for displaying saytext to clients."
- bugfix: "Sleeping mobs are no longer able to understand all
languages."
- bugfix: "Langchat now correctly shows the appropriate comprehension
for all viewers rather than all viewers sharing the comprehension of the
last viewer."
- bugfix: "Languages which are supposed to be invisible when not
understood no longer appear as scrambled overhead text."
Forgive me whoever has to review this. Biggest areas that have room for
error is stuff like a borer inside someone's head, and Dionae stuff. Old
langchat had odd exceptions for those and I was forced to rewrite it
entirely, but I think I got it all back to how it was working before.
Stickers can no longer be attached to disposal machinery or conveyors,
to prevent further issues with throwing them there.
The disposal outlet sprite was set to face the wrong direction when
expelling items, for two of its directions. This was fixed.
The disposal UI constantly reopening itself was fixed.
And a set of disposal systems were added to runtime for easier
debugging.
<img width="344" height="385" alt="image"
src="https://github.com/user-attachments/assets/ff93f3e9-bfa7-480c-9d6b-c501b02ca51a"
/>
Every time you print an item in the protolathe or circuit printer, it
scrolls back up to the top.
Printing multiple items is hell, especially as there is no bulk print
option.
This makes the UI only update if there isn't enough material to finish a
print.
This isn't the ideal solution, because the Material Amount doesn't
update unless you click the R&D console again.
<img width="318" height="99" alt="image"
src="https://github.com/user-attachments/assets/02e07ae6-b9ad-4538-af80-3a11b8778459"
/>
However the material amount doesn't even give a readout of what the
materials are, so this value is useless anyway.
Also means buttons won't be greyed out as the material to print them
runs out, but this is fine because if you press a button without enough
material to print it, the UI will immediately update and grey it out.
This does scroll you up to the top, but it's much better than having it
happen EVERY time.
Best solution would be to update it to TGUI, but I just tried that and
gave up almost immediately. So this is a stopgap.
This PR fixes the intent-based lights and emissives on silicons
(borgs/drones). It also adds an emissive to the combat shielding robot
module, since it seems logical for that module to have it, and adds a
slight emissive to robots in emergency power mode to differentiate
between the out-of-power and disabled states.
Due to issues with tables in particular, a drone's emissives will be
disabled when it hides to prevent through-table emissive displays.
Robots with various states below:
Top: dead/out of power
Bottom: normal/hidden drone/unhidden drone/milborg with shield
<img width="391" height="149" alt="image"
src="https://github.com/user-attachments/assets/87da7210-4670-4fc2-8d4a-b53f1f2aec49"
/>
The early return caused the tray to lose the harvest status without
giving anything. This fixes that.
Who thought it was a good idea to split the harvest status from the
plant it is harvested from?
changes:
- balance: "Makes constructs immune to pain damage. It used to deal
damage at 1/2 value."
I watched a cult juggernaut get two shot by stinger grenades, these are
PVP mobs, they shouldn't take pain as damage.
Adds a Ceres Lance beret, armor, and new uniform in preparation for
future CL events.
Also modifies the Ceres Lance crate to contain these items and carry a
more diverse weapon mix for merc rounds and ease of spawning during
event rounds..
---------
Signed-off-by: TheStryker <thestryker289@gmail.com>
Co-authored-by: Kano <89972582+kano-dot@users.noreply.github.com>
The education age restriction now applies to tajara and unathi as well.
The max skill level was supposed to be unlocked in educated skills, but
was being accidentally locked to only the skill level the education
gave. This meant someone uneducated could sometimes get even higher
skill than an educated person, by spending skill points.
The three combat skill ranks were reduced to trained level as their max.
It was not possible for players to get higher before, and 3 was already
the baseline. If a professional is ever implemented for antags or
similar, it can be set back again then.
Doctor of Pharmacy was reduced to only need 25 years old, due to both
the description and that the pharmacist job has that age requirement
too.
fixes https://github.com/Aurorastation/Aurora.3/issues/22376
fixes https://github.com/Aurorastation/Aurora.3/issues/22286
fixes https://github.com/Aurorastation/Aurora.3/issues/22232 kinda. It
was already fixed, but more fixing on restrictions also reported on it.
fixes https://github.com/Aurorastation/Aurora.3/issues/22610
changes:
- bugfix: "Restores the Modular Computer access cable header button for
connecting to IPCs and machinery."
- bugfix: "Fixes display issues in the Robotics interface's
<collapsible> elements."
- bugfix: "Fixes in-chat feedback text provided by the Cyborg Analyzer
(organ name and status now both inline)."
- bugfix: "Crew Manifest PDA app now filters out off-ship personnel."
- bugfix: "Fixes Autolathe TGUI appending search- and category- filtered
recipes instead of recomputing the list with those filters."
- bugfix: "Fixes runtime when ghost opens dedicated camera console UI."
- code_imp: "Update some defs referencing 'supply' department to
'operations'."
- refactor: "Standardizes all interface search bars to use the native
'SearchBar' component."
- refactor: "AtmosAlarmControl interface now correctly auto-sorts alarms
by alert status."
Added an on_hit signal, instead of using the target in post_fire.
This fixes cheesing upgrades by standing behind a wall and shooting at a
target you will never hit.
Moved improvement cap from a define, onto the base object.
This fixes some components continuing to eat improvement potential, even
when they are fully upgraded.
Fixes Ions dealing damage in addition to EMPing their target. Also
reduced the max number of shots when an Ion emitter is fitted.
Fills in a lot of the blanks in the area icon states on the Horizon with
new sprites. Looks neater in SDMM.
Adds a new exterior/no_shields area, which is exclusively used for the
wings and around the starboard thrusters, around which shields will not
generate. This is pulled off in what I hope is a non-demanding way. This
is used to resolve that funny issue with starboard propulsion's wide
arcing shield, and to force shields on D3 to be taut to the walls.
The regular exterior area is retained wherever we want there to be
shields around EVA catwalks.
<img width="1080" height="1080" alt="image"
src="https://github.com/user-attachments/assets/4826b32f-34e2-44ab-b0be-f9fee9622fc8"
/>
<img width="1056" height="896" alt="image"
src="https://github.com/user-attachments/assets/cde72fa6-41eb-4c2a-b843-9959359ca505"
/>
changes:
- bugfix: "Fixes LateJoin and Manifest interfaces not displaying
department colors by creating a shared component for both interfaces to
use."
- bugfix: "Fixes the Manifest interface not displaying colors for crew
status."
- bugfix: "Fixes status composer not allowing AIs to view TGUIs."
- bugfix: "Fixes inline icons in alt-click atom viewer."
- bugfix: "Fixes PDA light toggle icon not appearing."
- bugfix: "Fixes autolathe category view not filtering items."
---------
Signed-off-by: Batrachophreno <Batrochophreno@gmail.com>
Re-creation of https://github.com/Aurorastation/Aurora.3/pull/21046 to
skip merge conflict hell. Brings us modern TGUI.
**ALTERNATE TITLE: TGUI HELLSCAPE PR
ABANDON ALL HOPE YE WHO ENTER HERE**
- [x] Migrate build tools (javascript -> typescript, bun for package
management).
- [x] Upgrade all TGUI dependencies and associated root files to
TG-congruent versions (axios, babel, dompurify, eslint, highlight,
marked, prettier, sass, source-map, stacktrace-parser, typescript).
- [x] InfernoJS -> React migrations
- [x] React cleanup and polish (migrate all remaining .js files to
appropriate .ts or .tsx filetype, all remaining hooks, linting, error
corrections, etc.)
- [ ] Test all remaining TGUI interfaces
This was kind of a harsh mechanic to surprise players with, and turns
out it doesn't feel that great to tell them "Surprise your skill points
don't matter here". So this PR tweaks the "Empathy Penalty" from
Mindblanker and PsiProtect pills to 'only' cut the morale modifier from
those skills in half, rather than fully negating it.
This fixes a math error that caused sufficiently high firearms skill to
wrap back around to less accurate guns. The fix is pretty simple, if the
calculated dispersion (in degrees) is a negative number, it instead
becomes 0. The dispersion math downstream of this effectively treats
dispersion as a magnitude, meaning -15 degrees of dispersion was the
same thing as 15 degrees, when the intended interaction was "Having -15
degrees of dispersion offsets the penalty from less accurate guns".
Makes ship combat significantly more destructive (and a bit deadlier),
especially with non-explosive projectiles.
**Additions:**
- A shell that penetrates a solid (dense) structure will cause spalling.
This spall does 2-30 damage, depending on range and has a high embed
chance. These embedded chunks are large enough to be ripped out by hand.
(But you probably shouldn't). The pilot's suit has 30 ballistic armor,
so a prepared bridge crew can survive a lot of spall.
- Adds a gun that shoots any ship weapon that admins can spawn. Useful
for testing, or for adminbus where they don't want to have to spawn a
whole overmap ship.
- Made several structures destructible, vending machines, computer
frames, grilles (these were just bugged) and watertanks (and their
children). These structures could just block infinite shots and were
common enough to serve as effective armor for the horizon. These now
spawn shrapnel (of their material if it's set), in addition to sheets of
steel when destroyed.
- Added support for negative maim chance. This allows chosen projectiles
to be prevented from decapitating. No more accidentally gibbing the
bridge crew's heads. (Unless they get hit with something really really
big).
**Balance:**
- All non-explosive anti ship rounds got significant buffs. Typically
2-3x Anti-Material numbers.
- Armour piercing anti-ship rounds got massively increased penetration
stats. Typically 4-8 from 1-2.
- Doors now get destroyed in less hits, if they are hit by anti-material
projectiles. Hits to destroy -= Antimaterial / 2
- Francisca frag shells now shoot less fragments but deal more damage.
394 projectiles for every shot was a bit laggy, now it's only 280.
**Shields:**
Shields now take more power. 13-14 megawatts for a 10 strength shield.
Just inside the ship's generation capacity with both the INDRA and
Supermatter running.
Instead of deleting any projectile they are hit by, shields now have
different failure modes.
- Firstly, a piercing projectile has it's penetration reduced by the
shield strength. Eg A shot that would go through 10 walls, only
penetrates 4 after going through a 6 strength shield.
- Secondly, a projectile has it's damage multiplied by 1 - shield
strength / 10, then has shield strength subtracted from it's damage. Eg.
A damage 100 projectile, hitting a 5 strength shield, has it's damaged
reduced to 50, (100 * 0.5), then to 45. (50-5)
- Thirdly, an explosive projectile (that does not penetrate per the
first step) does not explode, but instead deals it's full damage to the
shield.
Hits to the shield now also damage the field itself, not just the shield
tile. As such, a very big hit on the shield can bring the whole thing
down, requiring an engineer to reset it.
Shields can now be upgraded with research components. Additionally,
shield generators can now support more than one capacitor. The
roundstart capacitor on the Horizon is only good enough to support a 6
strength shield.
The upgrades increase efficiency, strength loss over time and charge
speed.
**Overmap Targetting**
Previously, shells would spawn within 20 tiles of their target and aim
directly forwards. This was bugged for shots with burst, which would
instead all aim inwards and mostly miss. This is the reason the Grauwolf
(in addition to the explosion bug below) and Fransisca felt so useless,
only one of every shell in a burst would hit.
Shots now spawn at the map edge, based on the orientation of the
projectile and ship. Diagonals are now accounted for.
Shots are then aimed directly at the target selected on the console,
with 3 degrees of dispersion.
**Bugfixes:**
- Fixes lots of explosions that didn't pass a turf to the explosions
subsystem. This caused the explosion not to happen if the thing hit got
qdeled before the subsystem could get the turf to spawn the explosion
on.
- Embedded shrapnel no longer gets the initial projectile name, this
prevents it getting named shrapnelshrapnel.
- Fixes a bunch of projectile piercing bugs, mostly with grilles and
windows. Shots now go past window frames without hitting them.
- Fixes shields not having a click delay when attacked.
---------
Signed-off-by: FenodyreeAv <fenodyree.av@gmail.com>
Co-authored-by: Matt Atlas <mattiathebest2000@hotmail.it>
A continuation of https://github.com/Aurorastation/Aurora.3/pull/22354
with permission from the original author.
The primary changes between the two are more things being visible with
no skill as well as some changes to how arterial bleedings are shown.
Also a custom pain message if you touch yourself somewhere that hurts,
like with broken bones.
Original PR description:
> This PR provides a relatively simple first implementation for the
Anatomy skill, which I have intended to be more broadly useful for any
character, beyond just medical characters. The first use of Anatomy
skill is for when examining your own injuries, your ranks in the skill
determine both the time it takes to self-examine, as well as the quality
of the information provided. Previously the injury check was
instantaneous, now it takes 5 seconds to perform at its baseline, and
all the way down to 1.25 seconds at maximum rank in the skill.
>
> No ranks in Anatomy:
> <img width="368" height="198" alt="image"
src="https://github.com/user-attachments/assets/4aeff600-caf2-4bcb-9b58-a1ce236d8405"
/>
> High ranks in Anatomy:
> <img width="621" height="216" alt="image"
src="https://github.com/user-attachments/assets/807f0a2a-14b1-4c59-97b0-b2d5aa0f7268"
/>
---------
Signed-off-by: VMSolidus <evilexecutive@gmail.com>
Signed-off-by: Casper3667 <8396443+Casper3667@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
Co-authored-by: Matt Atlas <mattiathebest2000@hotmail.it>
Fixes the easy stuff from: #22545
The only real balance change, dropped improvement per variable by 50%.
Should have been like this from the start, but I mistakenly assumed no
one would even reach close to the cap.
Makes repairs with welders go through .use_tool, fixes not needing
welding goggles and adds nice sparky visuals.
Much more robust handling of improvable variables, negatives don't break
improvement assignment now.
Fixes improvement cap, missed a *100 to convert from decimal to
percentage.
Fixes improvement potential being assigned to things that couldn't be
upgraded.
Fixes the Gatling mod upgrading fire delay (pretty useless on something
with a 3 second warmup)
Fixes the weapon analyzer print out showing completely incorrect
numbers.
Fixes the weapon analyzer eating your combitool and being
indestructible.
Gives some more feedback on why things can and can't be upgraded.
format_emote has to come first, otherwise it will re-encode the markup
into literals. however, the langchat_message does not want to have
format_emote called on it. ergo, we have to either process the markup
twice, once for each path, or we have to accept that one of the two will
not support bold/italics. the perf from doing it twice is completely
inconsequential
<img width="299" height="150" alt="image"
src="https://github.com/user-attachments/assets/4a34a0ae-6895-4275-be53-586820fd5b7d"
/>
- bugfix: "Saved chat logs are now written with the correct text/html
file type."
- bugfix: "Emote markup like *bold* and /italics/ once again renders in
chat instead of showing literal tags."
Refactoring the entire destroy proc path from Mob Human all the way down
to Atom while trying to find the causes for the damn mob human hard
deletes. This PR comprehensively reorganizes every single stray
snowflake var used by /atom/ all the way to /mob/living/carbon/human,
and makes sure that every var that COULD store a reference, is now
cleared during the entirety of the Mob Destroy() parent hierarchy.
This may very well be the end of the lag war.
In total, I've hunted down and cleared 39 hanging references between
/atom and /mob/living/carbon/human
---------
Signed-off-by: VMSolidus <evilexecutive@gmail.com>
fixes#22289
- bugfix: "Colour chips in character setup are correctly coloured
again."
this only worked previously because byond's ie version was so old it
didn't care, afaik
also the circles in the loadout i just didnt get a picture
<img width="336" height="304" alt="image"
src="https://github.com/user-attachments/assets/f43912d6-22eb-452a-bac1-fff100a2f7b0"
/>
Adds clothing item versions of some existing shirts that were previously
only in the undershirt selection next to underwear.
Mostly graphic t-shirts.
Also adds a cropped tank top, modified from the existing tank top.
* Please describe the intent of your changes in a clear fashion.
The `handle_rejection()` proc in `code/modules/organs/organ.dm` was
attempting to access `owner.dna.b_type` without first verifying that
`owner` or `owner.dna` were non-null. This could happen if an organ's
`process()` chain continued to tick after the organ had been detached
from its mob, leading to a runtime error.
This change adds an early return guard `if(!owner || !owner.dna) return`
at the beginning of the `handle_rejection()` proc. This prevents the
null dereference and aligns the proc's behavior with similar checks
found in `handle_germ_effects()`.
* Please make sure that, in the case of mapping changes, you include
images of these changes in the PR's description.
* Please make sure to mark your PR as wip or review required by making a
comment with !wip or !review required
* If you include sprites/sounds/... (assets) that you have not created
yourself specify the license and original author below.
* Ensure that you also credit them in the appropriate location /
changelog as specified in the contributor guidelines
### Asset Licenses
The following assets that **have not** been created by myself are
included in this PR:
| Path | Original Author | License |
| --- | --- | --- |
| icons/example.dmi | ExamplePerson (Example Station) | CC0 |
Fixes SERVER-PROD-CN
---------
Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
* Please describe the intent of your changes in a clear fashion.
This PR fixes a runtime error: "Cannot execute null.update move icon().:
proc name: handle stamina".
The root cause was identified as a missing null check for
`hud_used.move_intent` within the `handle_stamina` proc in
`code/modules/mob/living/carbon/human/life.dm`.
Specifically, at line 1598, the condition `if (client)` was
insufficient. While a client might be present, the `hud_used` object or
its `move_intent` property could be null during certain states (e.g.,
HUD initialization or teardown).
The fix involves adding `&& hud_used && hud_used.move_intent` to the
`if` condition, ensuring that `update_move_icon()` is only called when
`hud_used.move_intent` is a valid object. This aligns with defensive
programming patterns used elsewhere in the codebase for similar HUD
element access.
* Please make sure that, in the case of mapping changes, you include
images of these changes in the PR's description.
(No mapping changes in this PR)
* Please make sure to mark your PR as wip or review required by making a
comment with !wip or !review required
* If you include sprites/sounds/... (assets) that you have not created
yourself specify the license and original author below.
* Ensure that you also credit them in the appropriate location /
changelog as specified in the contributor guidelines
### Asset Licenses
The following assets that **have not** been created by myself are
included in this PR:
| Path | Original Author | License |
| --- | --- | --- |
| icons/example.dmi | ExamplePerson (Example Station) | CC0 |
(No new assets are included in this PR)
Fixes SERVER-PROD-GK
---------
Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
Various fixes and cleanups for hardsuits following the rework.
changes:
- bugfix: "Adds additional safety checks to hardsuit deployment logic to
better handle boot checks."
- bugfix: "Hardsuit Health Analyzer module works again."
- rscadd: "Adds 'Retract All Parts' verb for hardsuits."
- rscdel: "Removes Vitals Scanner module; hardsuits which had this
module by default have had it replaced with the Health Analzyer module."
- rscdel: "Removes hardsuit Maneuvering Jets onmob sprites."
This is based on requests from the taj lore team. A future PR will do
more for the sensitive hearing as well, but the PR was growing by quite
a lot so it was best to split it up.
New:
- Tajaran eyes can now extend their vision by 3 tiles while they stand
still.
- Taj can hear people whispering and talking into radios from 1 tiles
further away, if they are listening intently.
Bugfixes:
- Flashbangs no longer fuck taj up as much unless they got intent listen
active.
- The message for autakh farseer eyes no longer gives the wrong message
if it is disabled by moving.
Balance & Change:
- Taj have new heights. Before it was 150 to 190 cm
- Hharar: 145-180
- M'sai: 155-175
- Zhan: 160-195
- The brute mod have been adjusted on tajara
- Zhan: 10% -> 5%
- Hharar: 20% -> 10%
- M'sai: 30% -> 15%
Backend stuff:
- Action buttons were changed to accept lists, so multiple actions can
be given to a single item.
So in the effort to make it so badges display on belts, I have gazed
upon the ever so slightly better looking investigator badge and wondered
why aren't all security badges like that. So now they are like that.
Also they display on belts now.
From the changelog:
> - imageadd: "Tweaked the sprites for security badge accessories and
added belt sprites for them."
The change (left is what is being changed to right, which is what is
contained in the PR):
<img width="2048" height="1024" alt="badges and things (just badges)"
src="https://github.com/user-attachments/assets/fd0925dd-f094-47d8-afc2-1ab54ed8420c"
/>
* Please describe the intent of your changes in a clear fashion.
This PR addresses a server crash caused by an invalid icon state being
requested for certain plants, specifically those with spreading traits
like biomass vines.
**Root Cause:**
The `refresh_icon()` proc for `/obj/effect/plant` was directly
decrementing the instance variable `max_growth` based on fringe
conditions (`spread_distance` and `at_fringe`). This meant that
`max_growth` could become negative over multiple processing ticks. When
`seed.get_icon()` was subsequently called with a negative growth stage
(e.g., -2), it constructed an invalid icon state string (e.g.,
`biomass--2`), leading to a crash.
**Solution:**
To prevent `max_growth` from being permanently altered, a local variable
`effective_max` is now used within `refresh_icon()`. This local variable
is initialized with the current `max_growth` and then decremented based
on the fringe conditions. The `growth` calculation and subsequent icon
state generation now use `effective_max`, ensuring that the persistent
`max_growth` variable remains stable and positive, thus preventing the
generation of invalid negative icon states.
* Please make sure that, in the case of mapping changes, you include
images of these changes in the PR's description.
* Please make sure to mark your PR as wip or review required by making a
comment with !wip or !review required
* If you include sprites/sounds/... (assets) that you have not created
yourself specify the license and original author below.
* Ensure that you also credit them in the appropriate location /
changelog as specified in the contributor guidelines
### Asset Licenses
The following assets that **have not** been created by myself are
included in this PR:
| Path | Original Author | License |
| --- | --- | --- |
| icons/example.dmi | ExamplePerson (Example Station) | CC0 |
Fixes SERVER-PROD-TJ
---------
Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
* Please describe the intent of your changes in a clear fashion.
This PR addresses the "bad usr: proc name: get status tab items" error
(SERVER-PROD-CK).
The root cause was identified as the `statpanel(S.panel)` call within
`/mob/proc/get_status_tab_items()` (code/modules/mob/mob.dm:1449). The
`statpanel()` built-in implicitly relies on `usr` to determine which
stat panel is active. However, `get_status_tab_items()` is frequently
called by the `statpanels` subsystem's background update loop, where
`usr` is `null`.
To fix this, the `!statpanel(S.panel)` condition has been removed from
the `if` statement. This eliminates the call to the `usr`-dependent
built-in in a context where `usr` is null, resolving the runtime error.
The `statpanel()` check was unnecessary as the web-based stat panel
handles its own display logic, making this server-side filtering
redundant.
* Please make sure that, in the case of mapping changes, you include
images of these changes in the PR's description.
* Please make sure to mark your PR as wip or review required by making a
comment with !wip or !review required
* If you include sprites/sounds/... (assets) that you have not created
yourself specify the license and original author below.
* Ensure that you also credit them in the appropriate location /
changelog as specified in the contributor guidelines
### Asset Licenses
The following assets that **have not** been created by myself are
included in this PR:
| Path | Original Author | License |
| --- | --- | --- |
| icons/example.dmi | ExamplePerson (Example Station) | CC0 |
Fixes SERVER-PROD-CK
---------
Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
Just removing a few ancient 2008-era vars that were on every mob
globally, but were completely unused in the modern code. I thought about
removing the Mutations too, but since the Hulk mutation is actually used
by a tiny handful of things, I would probably have to do that in a
separate PR by turning the Hulk code into an Element instead.
* Please describe the intent of your changes in a clear fashion.
This PR addresses two related bugs concerning the universal access port
and cable:
**1. TOCTOU Race Condition Leading to Crash (SERVER-PROD-X9)**
* **Root Cause:** When inserting a universal access cable into an IPC's
access port, a check for `access_port.internal_port` occupancy occurs
before a `do_mob` delay (which can include a consent dialog and a
2-second wait). If another action or player inserts something into the
port during this delay, the subsequent call to `insert_item()` would
find `internal_port` already occupied and trigger a `crash_with()`,
leading to a server crash.
* **Fix:**
* A re-check for `access_port.internal_port` occupancy and the continued
existence of the `access_port` itself has been added immediately after
the `do_mob` delay in `access_cable/attack()`. If the port is now
occupied or no longer exists, the insertion attempt is gracefully
aborted with a user message.
* The `crash_with()` call in `insert_item()` has been replaced with a
`log_debug()` and an early return, ensuring that any future unexpected
state in `internal_port` leads to graceful degradation rather than a
server crash.
**2. Stale `internal_port` on Cable Disconnect**
* **Root Cause:** The `access_port` did not override the generic
`remove_cable()` proc. When a cable was retracted or removed,
`access_port.internal_port` was not explicitly cleared, causing the port
to appear permanently occupied even after the cable was gone.
* **Fix:**
* An override for `remove_cable()` has been added to
`/obj/item/organ/internal/machine/access_port`. This ensures that
`clear_port()` is called, properly nulling `internal_port` when the
cable is removed.
* Please make sure that, in the case of mapping changes, you include
images of these changes in the PR's description.
* Please make sure to mark your PR as wip or review required by making a
comment with !wip or !review required
* If you include sprites/sounds/... (assets) that you have not created
yourself specify the license and original author below.
* Ensure that you also credit them in the appropriate location /
changelog as specified in the contributor guidelines
### Asset Licenses
The following assets that **have not** been created by myself are
included in this PR:
| Path | Original Author | License |
| --- | --- | --- |
| icons/example.dmi | ExamplePerson (Example Station) | CC0 |
Fixes SERVER-PROD-X9
---------
Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
* Please describe the intent of your changes in a clear fashion.
This PR fixes a runtime error (`Cannot read null.mat_efficiency`)
occurring in the R&D console's Protolathe menu
(`/obj/structure/machinery/computer/rdconsole/attack_hand`).
The root cause was a copy-paste error in
`code/modules/research/rdconsole.dm`. Specifically, lines 719 and 721
within the `if(3.1)` block (Protolathe menu rendering) were incorrectly
referencing `linked_imprinter.mat_efficiency` instead of
`linked_lathe.mat_efficiency`.
When a robotics R&D console was linked to a protolathe but not a circuit
imprinter, `linked_imprinter` would be null, causing the error when
attempting to display material costs for designs.
The fix replaces `linked_imprinter.mat_efficiency` with
`linked_lathe.mat_efficiency` at these two lines, ensuring the
Protolathe menu correctly uses the linked protolathe's material
efficiency.
* Please make sure that, in the case of mapping changes, you include
images of these changes in the PR's description.
* Please make sure to mark your PR as wip or review required by making a
comment with !wip or !review required
* If you include sprites/sounds/... (assets) that you have not created
yourself specify the license and original author below.
* Ensure that you also credit them in the appropriate location /
changelog as specified in the contributor guidelines
### Asset Licenses
The following assets that **have not** been created by myself are
included in this PR:
| Path | Original Author | License |
| --- | --- | --- |
| icons/example.dmi | ExamplePerson (Example Station) | CC0 |
Fixes SERVER-PROD-39
---------
Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
- bugfix: "Synthetic external armour now deteriorates with the actual
damage taken. Previously, the calculation led to the armour instead
taking less damage the less it was blocked."
- bugfix: "Fixing the synthetic endoskeleton now fixes the permanent
paincrit effect on IPCs. This was caused by the self preservation status
being toggled when the endoskeleton was destroyed, but it was never
reset when the endoskeleton was fixed."
- bugfix: "Species components are now added and removed properly,
meaning you can switch from IPC to human and back and forth as a
mercenary once more."
- bugfix: "The Bishop internal PDA now uses your actual ID on your
person as its own ID."
- bugfix: "Fixed the endoskeleton welder repair surgery. You can do this
surgery by using a welder while aiming chest and after having opened the
chest fully."
- bugfix: "The endoskeleton now takes damage from EMPs as well. This
should make them A LOT more effective against IPCs."
- qol: "The posibrain will now show up in diagnostics."
- rscadd: "Posibrains can now be destroyed by hitting them. This will
completely kill the IPC's consciousness!"
Co-authored-by: Matt Atlas <liermattia@gmail.com>
fixes#22025
- bugfix: "Modular energy guns with a reactor now self-recharge from
assembly, instead of only starting after the first shot is fired."
try_recharge is currently only triggered on fire and loops until charge
is full. this triggers it when a modular gun is completed to initiate
the recharging
fixes#22249
- bugfix: "Leaning on the north side of a wall now correctly hides your
lower body behind the wall instead of drawing you on top of it."
- code_imp: "Adds a COMSIG_MOB_LYING_DOWN signal, sent when a mob
transitions into lying down."
Cutout was previously only cutting out the base because KEEP_TOGETHER
wasn't being applied. Adds the flag on lean, removes it on stop_lean.
Animated the cutout while here. Applies a mask to the whole sprite, then
animates it upwards in step with the lean itself, so the feet
progressively disappear as they should.
https://github.com/user-attachments/assets/fec0a852-247a-4570-a6d1-60dda6fe6a3c
This PR fixes a bunch of skills related bugs, the biggest of which were
the result of the system being overly trusting of the database, when in
reality due to a bunch of unpredictable edge cases, the database is not
guaranteed to always have what I think it has. To fix these bugs, I've
had to slightly refactor how skills are generated on player characters
and antagonists, such that the burden of proof for skills is with the
Skills Subsystem rather than the Database.
Skills generated for a fresh character that has NO preferences saved
(Worst case scenario):
<img width="1491" height="849" alt="image"
src="https://github.com/user-attachments/assets/683fb538-106a-4679-8e2a-30dd45f456a1"
/>
Promoting that same character to Antagonist now increases certain skills
to a minimum baseline:
<img width="1315" height="830" alt="image"
src="https://github.com/user-attachments/assets/94bcc69e-cbbe-45fa-956e-f53b7f5d2779"
/>
By Mel's request, Bluespace Technicians spawn with all skills fully
maxed out for debugging purposes:
<img width="1909" height="985" alt="image"
src="https://github.com/user-attachments/assets/db4f3f65-3d87-47fc-907e-c68eae6d4cdb"
/>