Commit Graph
50724 Commits
Author SHA1 Message Date
VMSolidusandGitHub 238096d2bb Some Mob Define Cleanup (#22536)
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.
2026-06-01 10:36:04 +00:00
sentry[bot]GitHubsentry[bot] <39604003+sentry[bot]@users.noreply.github.com>VMSolidus
86e01dba16 Fix Moved() null.source_atom crash (#22537)
* Please describe the intent of your changes in a clear fashion.
This PR addresses the runtime error "Cannot read null.source_atom: proc
name: Moved" occurring in `/atom/movable/proc/Moved`.

**Root Cause:**
When a `datum/dynamic_light_source` or `datum/static_light_source` is
deleted (e.g., an item emitting light is removed), BYOND nullifies its
reference in any lists it's part of. If the cleanup in the light
source's `Destroy()` proc is incomplete (e.g., due to `contained_atom`
changing before deletion), a null entry can remain in the
`hybrid_light_sources` or `static_light_sources` lists of the atom it
was attached to (like a mob).

When the atom moves, the `Moved()` proc iterates these lists.
Encountering a null entry and attempting to access `null.source_atom`
results in a crash.

**Solution:**
1. **Null-guard datum references:** Added checks (`if(!light)` and
`if(!L)`) within the `Moved()` proc's loops for `hybrid_light_sources`
and `static_light_sources`.
2. **Prune stale entries:** If a null datum is found, it is immediately
removed from its respective list using `LAZYREMOVE` to prevent future
occurrences and clean up the list.
3. **Null-guard `source_atom`:** Added a secondary check
(`if(!light.source_atom)`) to ensure `source_atom` itself is not null
before attempting to call `update_light()` or `static_update_light()`.

These changes prevent the crash by safely handling null references
during iteration and proactively cleaning up the lists.

* 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-GQ

---------

Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2026-06-01 10:35:38 +00:00
sentry[bot]GitHubsentry[bot] <39604003+sentry[bot]@users.noreply.github.com>VMSolidus
32fbb7d965 Fix statpanel obj_window null dereference (#22538)
* Please describe the intent of your changes in a clear fashion.
This PR addresses SERVER-PROD-75, where the `set_turf_examine_tab` and
`return_object_images` procs in the statpanels subsystem would crash due
to attempting to access `client.obj_window.atoms_to_show` when
`client.obj_window` was null.

The root cause was a lifecycle desync: `client.obj_window` is primarily
initialized within `/mob/set_listed_turf` and can be explicitly nulled
by `/datum/object_window_info/Destroy()`. However, the statpanels
subsystem would still attempt to update the turf examine tab if
`mob.listed_turf` was set, even if `client.obj_window` had become null
(e.g., after a mob transfer, relogin, or `obj_window` destruction
without a subsequent `set_listed_turf` call).

The fix involves lazy-initializing `client.obj_window` within both
`set_turf_examine_tab` and `return_object_images`. This ensures that
`client.obj_window` is always a valid `/datum/object_window_info`
instance before its properties are accessed, preventing the null
dereference crash.
* 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-75

---------

Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2026-06-01 10:35:21 +00:00
sentry[bot]GitHubsentry[bot] <39604003+sentry[bot]@users.noreply.github.com>VMSolidus
879296835e Fix: Subspace broadcast filters non-radio devices (#22539)
* Please describe the intent of your changes in a clear fashion.
Addresses an `undefined variable` error (`canhear_range`) occurring in
`/proc/get_hearers_in_radio_ranges` when an
`/obj/item/implant/explosive` was present in the list of devices.

The root cause was identified in the `TRANSMISSION_SUBSPACE` path of
`/datum/signal/subspace/vocal/broadcast()`. Previously, this path would
copy all devices registered under `RADIO_CHAT` (which included the
explosive implant) into the `radios` list. Although a subsequent loop
attempted to filter out non-receivable devices, it would skip processing
non-`/obj/item/radio` types but not remove them from the list. This
meant the explosive implant, lacking a `canhear_range` variable, was
still passed to `get_hearers_in_radio_ranges`, causing the crash when
`radio.canhear_range` was accessed.

The fix modifies the `TRANSMISSION_SUBSPACE` logic to explicitly build
the `radios` list by iterating through `SSradio.get_devices` and only
adding actual `/obj/item/radio` instances that are capable of receiving
the signal. This ensures that `get_hearers_in_radio_ranges` only
receives valid radio objects, preventing the `canhear_range` error and
preserving the `as anything` keyword in the helper proc as it will now
always receive a correctly typed list.
* 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-SR

---------

Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2026-06-01 10:34:44 +00:00
hazelratandGitHub 5a6fd09549 The Great Nitpicking: lighting maintenance & maintenance tweaks (#22543)
This is mostly a maintenance overhaul, intended to establish a more
universal style for our maintenance. Grates as walkways are now almost
universal, more decals are used, fewer window panes are used, and there
is slightly less obvious damage. The Horizon is still quite a young
ship, it follows that its maintenance should be a little neater than on
your average SS13 map. This also replaces the old red bulbs in
maintenance with standard small light bulbs, which can be manipulated
with the new randomized area lighting. For now, they're running on
engineering lighting.

This also fills in a few dark spots on the map which became very obvious
after the recent lighting changes, and makes a few other small changes
which I've been meaning to make such as adding tiles to EVA airlocks,
full tiles under airlocks, and catwalks to substations. Remaps the
scuttling device chamber to play nice with the nuke's funny turf-related
code.

<details>
<img width="1081" height="1080" alt="image"
src="https://github.com/user-attachments/assets/86fb3c3c-4bc4-43a4-8278-fb83ee198ba3"
/>
<img width="1075" height="1080" alt="image"
src="https://github.com/user-attachments/assets/23be010c-ac66-44b1-9cd9-63b3f1346bfc"
/>
<img width="1079" height="1080" alt="image"
src="https://github.com/user-attachments/assets/61da3c91-d85a-48b1-87a2-5d8a94c1e153"
/>
<img width="1077" height="1080" alt="image"
src="https://github.com/user-attachments/assets/07bac654-260d-4189-a2f4-e0dee8f77fed"
/>
<img width="1079" height="1080" alt="image"
src="https://github.com/user-attachments/assets/63edd7ed-31ff-49ba-923a-331d0c8c242f"
/>
<img width="1083" height="1080" alt="image"
src="https://github.com/user-attachments/assets/653ce4ff-9369-458d-b0fc-33c30b9fc809"
/>
<img width="1080" height="1080" alt="image"
src="https://github.com/user-attachments/assets/bb37950b-a3a7-4996-b758-2f0d75f297f7"
/>
<img width="1082" height="1080" alt="image"
src="https://github.com/user-attachments/assets/b3a4b1fb-fb1b-4a2d-abd9-3a19935bd422"
/>
<img width="1074" height="1080" alt="image"
src="https://github.com/user-attachments/assets/0daf22bf-d005-40ec-a3c2-ffb6f635a4b4"
/>
</details>
2026-06-01 10:34:20 +00:00
sentry[bot]GitHubsentry[bot] <39604003+sentry[bot]@users.noreply.github.com>VMSolidus
643c692784 Fix: Universal access port TOCTOU race and disconnect issues (#22554)
* 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>
2026-06-01 10:33:15 +00:00
sentry[bot]GitHubsentry[bot] <39604003+sentry[bot]@users.noreply.github.com>VMSolidus
d82b463aca Fix rdconsole Protolathe menu null.mat_efficiency (#22555)
* 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>
2026-06-01 10:32:55 +00:00
sentry[bot]GitHubsentry[bot] <39604003+sentry[bot]@users.noreply.github.com>VMSolidus
b07b1a5c85 Fix: Prevent addtimer with qdeleted object in MouseEntered (#22557)
* Please describe the intent of your changes in a clear fashion.
This PR addresses an error where `addtimer` was called with a callback
assigned to a `qdeleted` object, specifically observed when
`MouseEntered` was triggered on items that self-delete, such as the
robotic combitool when dropped.

The root cause was that the `QDELETED(src)` check in
`/obj/item/MouseEntered` was performed *after* the `addtimer` call. This
allowed a timer to be registered for an object that was already marked
for deletion.

The fix involves moving the `if(QDELETED(src)) return` statement to
occur *before* any `addtimer` calls within the `MouseEntered` proc. This
ensures that if an item is already deleted, the function returns
immediately, preventing the creation of timers bound to invalid objects.
* 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-4F

---------

Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2026-06-01 10:32:49 +00:00
7978efa75f A lot of IPC rework bugfixes. (#22561)
- 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>
2026-06-01 10:32:39 +00:00
lewandGitHub 4e2a68bdef Fixes an unguarded nullref in Fake Crew Arrival Announcement service (#22565)
fixes #22334 

- bugfix: "Fake Crew Arrival Announcement uplink service now works even
with an invalid employer faction."
2026-06-01 10:32:10 +00:00
lewandGitHub 68c5b95f8b Fixes modular guns not self-recharging until first shot is fired (#22567)
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
2026-06-01 10:32:05 +00:00
Changelogs cc6da2fd6a Automatic changelog compile [ci skip] 2026-06-01 03:53:33 +00:00
lewandGitHub 483674ac59 Animates the disappearance of the lower half of the body when north-side leaning (#22568)
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
2026-06-01 00:10:15 +00:00
Changelogs 001e27671a Automatic changelog compile [ci skip] 2026-05-31 03:38:20 +00:00
Casper3667andGitHub 6995af8dd7 adds a EFTPOS to the merchant role ship (#22547)
I missed it in https://github.com/Aurorastation/Aurora.3/pull/22367
2026-05-30 17:14:52 +00:00
Wowzewow (Wezzy)andGitHub e3d3d00347 More Handling Sounds (#22528)
Just ports more pickup, drop and handling sounds from /tg/ to keep pace.

Attributions in their own .txt files.
2026-05-30 12:07:44 +00:00
KanoandGitHub d5d868138b Fixes the machinery repath in Cryo Outpost map (#22548)
Fixes the missing machinery in the map, machinery repath was a huge pr
and we were expecting something like this

<img width="640" height="570" alt="what-has-the-dog-done"
src="https://github.com/user-attachments/assets/243afd83-74b9-4705-b98e-8897d52fc78f"
/>
2026-05-30 12:07:32 +00:00
Changelogs 61cacdecc4 Automatic changelog compile [ci skip] 2026-05-30 02:53:10 +00:00
c#min7andGitHub 518ab29fb8 adds some psiprotect drugs to the pharmacy refill shelf (#22514)
Adds 3x bottles of _PsiProtect Broad Use_ (Cheap variant) to the
pharmacy retail shelf for prescription refills, emergency ADPI
prescriptions (and investigation).
2026-05-29 20:38:04 +00:00
KanoandGitHub f38d497d89 Fixes not being able to write a friendly message on longbow shells (#22531)
Fixes #22517
2026-05-29 20:38:02 +00:00
VMSolidusandGitHub 13f87e4a26 Various Skill Bugfixes (#22533)
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"
/>
2026-05-29 20:37:57 +00:00
sentry[bot]GitHubsentry[bot] <39604003+sentry[bot]@users.noreply.github.com>VMSolidus
3aa4942572 Fix Treasure Trove ambience list assignment (#22542)
* Please describe the intent of your changes in a clear fashion.
Addresses issue SERVER-PROD-3T: "Cannot read
'sound/ambience/konyang/konyang...'.len".

The `ambience` variable for `/area/trove/beach`, `/area/trove/ocean`,
and `/area/trove/jungle` was incorrectly assigned a raw file path string
instead of a `list()` containing the path. This caused a runtime error
when the `Entered()` proc attempted to access `.len` on the string,
which does not have that property.

This fix wraps the file path literals in `list()` for these three areas,
ensuring `ambience` is always a list as expected by the system.
* 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-3T

---------

Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2026-05-29 20:37:51 +00:00
Casper3667andGitHub e95e5de0f8 make the OM able to fly the spark and canary (#22540)
The OM now get spark and canary access, as they lacked it previously
despite https://wiki.aurorastation.org/index.php/Guide_to_Piloting
saying that they can fly both, and that they are a command member.

They still cannot fly the Quark.
2026-05-29 20:37:48 +00:00
Changelogs 47facfc8e8 Automatic changelog compile [ci skip] 2026-05-29 03:25:59 +00:00
CatsinHDandGitHub 994f412965 Removes Hephaestus as an option for New Kingdom of Adhomai Tajara (#22516)
Title.

As originally planned by the Tajara lore team, Hephaestus was to be
removed as an option for New Kingdom of Adhomai Tajara roughly a month
from the original PR date of this PR #22201. It has been just over a
month, therefore Heph will be removed.

Original intent is for the transition from Heph to Zavod, both in-lore
and OOC so players have time to play out characters changing contracts.
2026-05-28 20:02:50 +00:00
Casper3667andGitHub 0ae5bc0574 Fixed the elevator time display and increased the elevator timer (#22510)
fixes https://github.com/Aurorastation/Aurora.3/issues/22409

The reason for the increased elevator timer was due to how rarely it
came up that the supplier time would be longer than the base 30 second
timer, so instead the two timers were combined to trial how a longer
timer would feel.
2026-05-28 10:34:33 +00:00
Wowzewow (Wezzy)andGitHub 8e49b97325 Duffelbag tweaks (#22513)
- Duffelbags no longer give slowdown. Instead, you'll have to set them
down first before using them.

Slowdown is a pretty abhorrent malus, so much so that they've mostly
went extinct on the server.

Experimenting with this feature inspired from Eris. Might extend it to
backpacks (also very unused due to lack of drip) and look for it as an
alternative to trading something other than slowdown for slots.
2026-05-28 10:16:20 +00:00
Changelogs 52579602ec Automatic changelog compile [ci skip] 2026-05-28 02:57:01 +00:00
BatrachophrenoandGitHub 17df9b2d79 Remove rare gas isotopes from exoplanet atmospheres (#22509)
See title. Deuterium, Tritium, and Helium-3 no longer eligible to spawn
in the atmospheres of randomly-generated exoplanets.
2026-05-27 17:05:54 +00:00
ElorgRHGandGitHub f14d47fd6b The Eye Opens - Part 2.5 - Voidsuit Species Variants (#22520)
The Outer Eyes opens its eyes for diversity hires.

Okay, originally I did not make species variants (and an obj sprite for
the helmet) in https://github.com/Aurorastation/Aurora.3/pull/22394, and
I do not have a good explanation for why beside saying I was lazy, so
here they are. Also a suit cycler for easy spawning.

From the changelog:
>  - rscadd: "Added species variants to the Outer Eyes voidsuit."
>  - rscadd: "Added an Outer Eyes suit cycler."
> - imageadd: "Added a proper object sprite to the Outer Eyes voidsuit
helmet."

<img width="1536" height="1536" alt="diversity"
src="https://github.com/user-attachments/assets/762a88dc-9e47-494d-a064-a8b5764c390c"
/>


**Silence,
Violence.**
2026-05-27 16:15:13 +00:00
FenodyreeAvandGitHub 78d17e1d6c Fixes mech chargers (#22486)
Fixes mech chargers being impossible to deconstruct or upgrade.
Fixes mech charger upgrades doing nothing.

Adds a pre-filled rapid part exchanger for testing machine upgrades, or
maybe spawning as loot.

<img width="435" height="159" alt="image"
src="https://github.com/user-attachments/assets/ca534837-ef29-44ff-b9cb-c4fb107e6f99"
/>
2026-05-27 15:53:56 +00:00
eda591585c Clean variant: Removes helm console restrictions on silicons. (#22149)
No longer does the SCC see fit that their AI must be restricted by silly
'safety' regulations, this PR does away with restrictions around robots
piloting the helm console allowing them to drive ships where they need
to go in emergencies or low pop situations.

Clean variant from https://github.com/Aurorastation/Aurora.3/pull/22142

---------

Signed-off-by: ArbiterAmbrose <n22don2009@gmail.com>
Co-authored-by: Batrachophreno <Batrochophreno@gmail.com>
2026-05-27 15:53:26 +00:00
87848fbdc3 Adds skill based upgrades to modular lasers. (#22425)
**Modular laser changes**

- tl:dr Shooting mod laser at a mob counts up an improvement potential
variable, which when the gun is disassembled, gets spread across the
components.
- When the components are repaired, by someone with high skill, there is
a chance to increase a variable, such as damage, shot count, accuracy.
- Players give the biggest increase, followed by non-player humans
(protohumans & mechs fall in this catagory), then simple mobs and
finally monkeys. Non combat modlasers improve slowly when used for their
intended task (betarays slowly tick up when shooting hydroponics bays)

The philosophy for these changes is that research should continue to be
involved with the equipment they give out.
It should also be difficult (but not impossible) for research to upgrade
their weapons without support from other departments.
Xenobio slimes, protohumans, medical help to keep the protohuman alive
while you shoot it, security help to actually use the guns on real
targets (this gives the biggest increases).

The more powerful a weapon is the harder it is to upgrade, as it'll kill
it's targets quicker. The more upgraded a weapon is the more difficult
it is to upgrade further, improvement potential will get wasted on
components that have already hit their cap.

On their own, by the time the 5 monkeys research start with are dead,
it's possible for a max skill scientist to improve one gun's worth of
components by ~25%.

The weapons research can now make at roundstart (with max tech) are
significantly worse than what spawns in the armoury.
The weapons research can make with gold, silver, uranium and phoron are
equal to what spawns in the armoury.
The weapons research can make with diamonds are better than what spawns
in the armoury.

Major nerfs to heat vents, auxiliary capacitor and capacitor overcharge,
these were the problem children.
It is now impossible to make a weapon that does not take damage through
use. Safe designs will only break with heavy use, by people who don't
bring them back to research for repairs.
Powerful designs break quickly and need repeated repairs.

Adds two side grade capacitors that can be made at roundstart (with max
tech), one higher damage and fewer shots. One lower damage and more
shots.

High skill characters get much more information when examining modular
lasers and a chance to throw the gun away before it explodes.

Adds some defines to help balance these changes:
Improvement cap (the total percent a component can increase) Currently
100%.
Increase & Decrease Cap, how much an individual variable can be
increased or decreased. Currently 2x and 0.2x.
Improvement multiplier, multiplies all improvement gains. Currently 1x.

**Firing Pin fixes & changes**
Fixed ID locked firing pins and adds them to R&D.

Adds the inner research department to the firing range locked pins. This
is so xenobotanists, xenobiologists & xenoarchs can use the modular
lasers. Freeze rays for slimes, betarays for xenobotanists, laser
activation for artifacts for xenoarch.

It is still impossible for a scientist to make a weapon they can use
anywhere, but they can give them to security who can use them freely.

**Misc bug fixes**
The weapon analyzer UI now updates and only shows relevant statistics,
instead of displaying every variable even when they do nothing.
Replaces the buggy tesla zap with just electrocuting the holder.
Fixes a few broken visual messages.
Fixes the vermin modulator not killing anything, now it also works on
grems.
Fixes click delay on malfunction.
Fixes radiation damage numbers.
Fixes the temperature modulator.
Fixes the report printout showing the wrong numbers.

---------

Co-authored-by: Copilot <copilot@github.com>
2026-05-27 15:51:37 +00:00
runecapandGitHub 5bf47db7dc Stops processing Hivenet Echoes if lists aren't detected & No Extra Broadcast Echoes (#22491)
The lag from the event yesterday was because this triggered without
getting valid lists because Matt didn't add them to the config yet.
Probably won't happen again, but safety never hurts.

EDIT: This also fixes a bug where an extra broadcast echo would generate
for whatever reason.
2026-05-27 15:42:17 +00:00
VMSolidusandGitHub 0593b47b29 Fix Cryopod Runtime Error (#22492)
This is a fix for https://aurorastation.sentry.io/issues/7405385361 

Which I believe might actually also be one of the elusive "niche human
hard dels" that are so hard to track down since this runtime would also
prevent a key memory deallocation from occurring.
2026-05-27 15:42:01 +00:00
Casper3667andGitHub 29bc02f44e Various bullet fixes and changes (#22503)
fixes https://github.com/Aurorastation/Aurora.3/issues/22370 and
https://github.com/Aurorastation/Aurora.3/issues/22475

I decided to lower the amount of bullets to increase the item pile, as
otherwise removing a single shotgun shell from a pile would be enough to
reduce its size, and that felt wrong.

  - rscadd: "Added the ability to stack spent bullet casings."
- balance: "Ammo piles now increase in size the second time when there
is 6 items in the pile, rather than 8"
- bugfix: "Fixed bullet casings being ejected when trying to suicide
with a gun on safety."
- bugfix: "Fixed that bullet piles didn't update their size correctly."
- bugfix: "Fixed that shotgun practice shells were labelled incorrectly
in the autolathe."
  - bugfix: "Singular bullets no longer layer under tables."
2026-05-27 15:39:42 +00:00
KanoandGitHub 9ee3663962 Adds various clothing shortcuts (#22507)
Changes:

- Added various clothing shortcuts. You can now Alt-Click to adjust
layers, Alt-Shift-Click to remove accessories, etc. on most clothings.
- Tweaked inventory HUD icon frames to process shortcut clicks
(Alt-Click and Shift-Alt-Click for now). This means you no longer have
to click specifically on item icons to use shortcuts.
  - Moved a block of code to where it belongs, minor code improvements.

There might cases where the new shortcuts collide with already present
snowflake shortcut interactions on certain items, i tweaked the ones i
stumbled into but there might be more
2026-05-27 15:39:40 +00:00
VMSolidusandGitHub fe4f84703c Morale Modifying Skills (#22508)
This PR adds a new Everyday skill called Ministry, which is targeted
both for the Chaplain role, as well as for characters with Theological
training in general. It provides a character with a unique action called
"Offer Blessing", appearing in the action bar on the top-left corner of
the screen. When used on an adjacent character, it offers a series of RP
prompts for the user to write a blessing of their choice to said
character.

If the blessing is accepted and received, the recipient gains a small
Morale Modifier that scales with the user's Ministry skill ranks.
The morale modifier is also increased if the two characters involved
share a religion in common.

<img width="1907" height="971" alt="image"
src="https://github.com/user-attachments/assets/fef51432-2206-4513-a734-fe62a3acfc6c"
/>

<img width="357" height="94" alt="image"
src="https://github.com/user-attachments/assets/2f344d04-10c9-4fbc-9183-3471c4b51e7c"
/>

<img width="322" height="148" alt="image"
src="https://github.com/user-attachments/assets/fb5cc21f-60bb-4c9f-ba5b-45f6e3ec94ff"
/>

<img width="703" height="34" alt="image"
src="https://github.com/user-attachments/assets/8df6b6c3-8ea7-4f64-b8c4-a439ccadc076"
/>

<img width="361" height="83" alt="image"
src="https://github.com/user-attachments/assets/fe7b6d32-7cb5-4e60-89d8-38353981ffb2"
/>

There is also now a similar skill for the combat category, called
Leadership.

<img width="1268" height="987" alt="image"
src="https://github.com/user-attachments/assets/44448560-1ff7-4bae-966b-1b8f7481005d"
/>

<img width="912" height="67" alt="image"
src="https://github.com/user-attachments/assets/30531b15-0aa3-4ab6-b75c-3af26f8b5bdd"
/>


I have fully tested this PR to its completion.

### Asset Licenses
The following assets that **have not** been created by myself are
included in this PR:

| Path | Original Author | License |
| icons/hud/action_buttons/skills.dmi | gabrielgabey (Discord) |
CC-BY-SA-3.0 |
2026-05-27 15:38:57 +00:00
hazelratandGitHub e9f1bb5709 Area-based Horizon lighting (#22511)
This adds unique lighting palettes to different areas of the SCCV
Horizon. It does this by tying randomized_lighting variable for light
fixtures to the department variable of the area they are in. This
solution is intended to save a lot of time and effort, both now and
later, which would otherwise be spent mapping down each colour of
lighting into every department manually.

Notable points:
- This shifts the parent colour for light bulbs from LIGHT_COLOR_HALOGEN
(#C0C0CA) to the new LIGHT_COLOR_OFFWHITE (#efe5bb), and shifts the
randomized_colors variable to the according list. This shifts them from
a slightly murky blue-tinted white to a slightly brighter yellow-tinted
white. Slightly warm lighting will now be the default for every map.
Warmer lighting communicates the age of a ship or station, the worsening
economic prospects of the setting, and it's also a bit cosier.
- Stark white lighting is retained for medical and the bridge. Research
has been given purple-tinted lighting.
- Command offices are also under blue lighting currently, to visually
differentiate them from the rest of their departments.
- To avoid too much player-facing bloat, only a box for pale purple has
been added so janitors can replace the lighting in research. Otherwise,
yellow can be used for engineering, white for public areas, and blue for
high-security areas.
- Offsites and offships shouldn't be hugely changed by the shift in
default lighting - it's a slight change in hue.

Screenshots below!
<details>
<img width="1077" height="1080" alt="image"
src="https://github.com/user-attachments/assets/1987e29f-c34c-44ea-865f-5f81c0e5c47f"
/>
<img width="1080" height="1080" alt="image"
src="https://github.com/user-attachments/assets/79279c6c-da56-4676-a0e9-7e5db43002cd"
/>
<img width="1083" height="1080" alt="image"
src="https://github.com/user-attachments/assets/621589b5-ada6-4d80-9f8f-8cf13a47df39"
/>
<img width="1085" height="1080" alt="image"
src="https://github.com/user-attachments/assets/09284700-8408-4a86-86c5-7575e7c94a27"
/>
<img width="1081" height="1080" alt="image"
src="https://github.com/user-attachments/assets/8246585c-f437-437a-8d32-9997fae05298"
/>
<img width="1078" height="1080" alt="image"
src="https://github.com/user-attachments/assets/a34841dd-3f49-4010-b2e0-d2e9a748e617"
/>
<img width="1084" height="1080" alt="image"
src="https://github.com/user-attachments/assets/55e89703-8ac7-4fa7-9775-19818c10c119"
/>
<img width="1080" height="1080" alt="image"
src="https://github.com/user-attachments/assets/684dea04-90c5-4877-b2bf-08a2146efb5e"
/>
<img width="1078" height="1080" alt="image"
src="https://github.com/user-attachments/assets/6ce42ac1-0f4b-49eb-8f2c-c6fb1830877e"
/>
<img width="1083" height="1080" alt="image"
src="https://github.com/user-attachments/assets/bc41a4f4-8d5c-4348-b9fe-a41d7950ce37"
/>
<img width="1081" height="1080" alt="image"
src="https://github.com/user-attachments/assets/48c4b733-a375-482b-9f70-e2aa6d0b3e27"
/>
<img width="1083" height="1080" alt="image"
src="https://github.com/user-attachments/assets/52e0041a-602d-4f4b-9d6c-7d0a0946f90b"
/>
</details>
2026-05-27 15:37:50 +00:00
VMSolidusandGitHub c41f0789fe OpenDream Compile Fixes (#22518)
Fixes a handful of errors that prevented this codebase from compiling
with OpenDream. I have tested this.

<img width="1915" height="988" alt="image"
src="https://github.com/user-attachments/assets/6f04fa2b-1d08-484d-9fe4-2a3ff7d95a18"
/>
2026-05-27 15:34:47 +00:00
sentry[bot]GitHubsentry[bot] <39604003+sentry[bot]@users.noreply.github.com>VMSolidus
0951d326d2 Fix storage close() null.vis_contents (#22521)
* Please describe the intent of your changes in a clear fashion.
This PR addresses a runtime error "Cannot modify null.vis_contents."
occurring in `/obj/item/storage/proc/close`.

**Problem:** The `close()` procedure for storage items was crashing when
attempting to modify `storage_start.vis_contents` because
`storage_start` was null.

**Root Cause:** The issue stemmed from stale `s_active` references on
mobs. When a storage item was destroyed, its `Destroy()` proc called
`close_all()`. However, `close_all()` (via `can_see_contents()`) only
cleared `s_active` for mobs with an active client. If a mob was
clientless (e.g., due to a brief disconnect) during the storage's
destruction, their `s_active` would retain a reference to the
now-destroyed storage. Later, if `Move()` was called on this mob (e.g.,
due to inertial drift), it would attempt to call `s_active.close(src)`
on the stale reference. Since the storage object was already destroyed
and `storage_start` had been `QDEL_NULL`ed, accessing
`storage_start.vis_contents` resulted in a null dereference.

**Solution:**
1. **Clear all stale `s_active` references in `Destroy()`:** Modified
`/obj/item/storage/Destroy()` to explicitly iterate through all mobs in
`is_seeing` after `close_all()` and nullify their `s_active` if it
points to the current storage object, regardless of their client status.
This ensures no stale references persist after the storage is destroyed.
2. **Add null guard for `storage_start` in `close()`:** Implemented a
defensive `if(storage_start)` check before accessing
`storage_start.vis_contents` in `/obj/item/storage/proc/close`. This
prevents a crash even if, under unforeseen circumstances,
`storage_start` is null when `close()` is invoked.

* 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-TV

---------

Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2026-05-27 15:33:46 +00:00
Casper3667andGitHub 8d6e8cf5ad Fixes the destination tagger alt click pickup (#22505)
Fixes https://github.com/Aurorastation/Aurora.3/issues/22410
2026-05-27 10:41:57 +00:00
Changelogs 960ea6805c Automatic changelog compile [ci skip] 2026-05-27 03:37:29 +00:00
BatrachophrenoandGitHub 4ecb0bc21c Repath obj/machinery to obj/structure/machinery [MDB Ignore] (#22500)
Repaths obj/machinery to obj/structure/machinery. **Note for
reviewers:** the only meaningful changed code exists within
**code/game/objects/structures.dm** and
**code/game/objects/structures/_machinery.dm**, largely concerning
damage procs. With the exception of moving airlock defines to their own
file, ALL OTHER CHANGES ARE STRICTLY PATH CHANGES.

Objects, _categorically_, are largely divided between those you can hold
in your hand/inventory and those you can't. Machinery objects are
already subtypes of Structures behaviorally, this PR just makes their
pathing reflect that, and allows for future work (tool actions, more
health/destruction functionality) to be developed without unnecessary
code duplication.

I have tested this PR by loading up the Horizon and dismantling various
machines and structures with tools, shooting guns of various types
throughout the ship, and detonating a bunch of explosions throughout the
ship.
2026-05-26 19:35:48 +00:00
FenodyreeAvandGitHub d8e02149e0 Fixes EMPs affecting carried items twice, fixes EMPs not disabling energy guns. (#22482)
Human_defense was calling it's parent, which also EMP'd all carried
items, so carried items were taking two EMP acts.
This mean that PDAs always exploded from light EMPs.

Energy guns used sleep() in their EMP act and didn't multiply by *
SECONDS.
EMP_LIGHT is 2 and EMP_HEAVY is 1, previous implementation was
multiplying where it should divide.
Also added some feedback about why the gun won't fire.

Now decrements a timer in process, 10 seconds for a light EMP, 20
seconds for a heavy EMP.
2026-05-26 17:58:27 +00:00
VMSolidusandGitHub 043cd9ebb5 Diona Null Invoke Fix (#22493)
Fix for https://aurorastation.sentry.io/issues/7409286369

Which produced a runtime error (and associated hard del) when a Diona
enters a cryopod.
2026-05-26 17:57:53 +00:00
mineymonkeyandGitHub e5baaf23a1 chameleon shoes remember how to exist (#22494)
chameleon shoes now have a proper icon_state and are no longer invisble
:)

also fixed emp reseting to the bad icon_state making it impossible to
find
2026-05-26 17:57:51 +00:00
VMSolidusandGitHub df807b33c4 More Misc Sentry Fixes (#22496)
Sorting runtime errors by most events in the past 2 weeks, here's a few
fixes for the following:

https://aurorastation.sentry.io/issues/7472147004 - Runtime when someone
attempts to move before their character is placed in the world.

https://aurorastation.sentry.io/issues/7443212526 - Runtime when
harvesting plants

https://aurorastation.sentry.io/issues/7466716994 - Runtime when
vampires try to drink a bloodbag

https://aurorastation.sentry.io/issues/7496800530 - Runtime when a
player disconnects while a tgui window is open.
2026-05-26 17:57:49 +00:00
Casper3667andGitHub 9b8ebf7e4a Updates the health analyzer TGUI to be prettier (#22498)
This fixes a few minor bugs for non-handheld health analyzers, as well
as updating the UI for them to be prettier.
<img width="521" height="823" alt="image"
src="https://github.com/user-attachments/assets/f0c121f1-e84c-4615-b4c5-1ec1f6620222"
/>
2026-05-26 17:57:40 +00:00
Casper3667andGitHub 58d1241fe7 Fixed carts to not make a noise when pushed into walls (#22506)
fixes https://github.com/Aurorastation/Aurora.3/issues/22359
2026-05-26 17:57:36 +00:00