## About The Pull Request
Updates Biodome to be gooder.
## Why It's Good For The Game
Biodome is one of the more interesting maps thanks to the titular
gimmick, but for one reason or another the playerbase loathes it. I'll
be making changes to Biodome that I think will improve it, as well as
changes to
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
<img width="1861" height="1187" alt="17684994760802257449426043441716"
src="https://github.com/user-attachments/assets/0617a32e-bee7-4cbf-a5d9-e9234046bde3"
/>
<img width="1952" height="1483" alt="17684995784481011964462438821388"
src="https://github.com/user-attachments/assets/bf8ee6df-f3a6-4692-bff2-729be806b2b6"
/>
<img width="1610" height="1279" alt="17684995044717250940024567843557"
src="https://github.com/user-attachments/assets/c33d9ba5-f20c-42a4-a985-b0dae3b47e66"
/>
</details>
## Changelog
🆑
map: various changes to Biodome
/🆑
## To-do
- [x] Rework to science
- [x] Divide upper biodome with firelocks so that vacuum cannot spread
- [x] Plasmaglass to turbine
- [x] Compress solars and make them stylistically identical: follow
Boxstation example
- [x] Expand bitrunning; chute to send crates straight to ore storage?
Space heater. Make it look pretty and Gamer in there.
- [x] Remove bitrunning window. (Gamers hate sunlight, and also
voidwalker abductions)
- [x] Make unique cryopods room
- [x] Expand crystallizer room (
https://discord.com/channels/1059199070016655462/1460406585401544867/1461868917285982269
)
- [x] Reorganize service biodome departments: move janitorial to be
built into the wall. Remove bathroom and rad shelter and build them into
a building. Make more space so that the biodome can be more bio.
- [x] Reorganize the bridge: move more stuff to lower floor (meeting
room, HOP office). Make the blueshield office less of a shrek shack.
- [x] Make the cargo waiting area bigger and friendlier to passerby.
- [x] Expand blacksmith's workshop. Right now it's more like maints...
- [x] Transport tube rebuild; make them less winding and more practical
to get to square hallways around station
- [x] Add more space windows for void walkers
- [x] Wire APC research lab into the grid
- [x] Warden's office windoors
- [x] Wires/atmospipes south of sec to connect in
- [x] Sec firing range and maints door near it need access change proper
- [x] Look at courtrooms access
- [x] Remove metal foam floors from maints above engi
- [x] APC in R&D front office wire to grid
- [x] APC in sec C-hallway wire to grid
- [x] Correct airlocks direction near vacant office
- [x] Vacant office mislabelled maints door
- [x] SM cooling loop unconnected in plasma windows
- [x] Fix dispopipes and atmospipes in wrestling arena
- [x] Biodome lake tiles need planet atmos removed
- [x] Doors in science need acess tweaks
- [x] L-shaped genpop area
- [x] Fix elevator engineering side to be OSHA compliant
- [ ] Beer tap fix
- [x] Sec locker room needs lights
- [x] Wall-mounted extinguisher is on the table near arrivals secpoint
- [ ] Check maints for holes
- [x] Remove duplicated button in sec mechbay
- [x] Fix access to the law office backdoor
- [x] Change the west minibridge
- [x] Check on the courthouse backroom access
- [x] Replace the metal foam over the engineering areas
- [x] The new sauna in the unisex restrooms has no APC and therefore has
infinite power.
- [x] The old dorm in maints (with neon carpet) has an non-functional
bolting button. (Possibly intentional.)
- [x] Robotics mechbay shutters have no access, for the inside buttons;
hallway button does. (Possibly intentional.)
- [x] Captains Quarters area extenders outside of the area. (Image
attached below.)
- [x] Science external solars are disconnected from maintenance and the
walls do not attach properly (Image attached below.)
- [ ] Gather more criticism of Biodome flaws
- [ ] Testing
## About The Pull Request
That's all.
The sprites clearly have a pedestal which is attached to the floor. They
shouldn't behave as if they are free floating wash basins.
<details><summary>example: a barber shop</summary>
<img width="614" height="818" alt="StrongDMM_ahHbCymkjR"
src="https://github.com/user-attachments/assets/aeee4090-e209-4ad7-8d1d-fef9dcbb36e2"
/>
</details>
Also runs the UpdatePaths script so it can collapse some duplicate tiles
which have been annoying me with diffs each time it's run.
## Why It's Good For The Game
More mapping flexibility for bathrooms and medical spaces.
## Changelog
🆑
code: sinks can be mounted to floors
/🆑
---------
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
## About The Pull Request
This PR refactors ``effect_system``s to be a bit easier to use by
getting rid of ``set_up``, allowing ``attach()`` to be chained into
``start()`` and refactoring most direct system usages in our code to use
helper procs.
``set_up`` was unnecessary and only existed to allow ``New``'s behavior
to be fully overriden, which is not required if we split
sparks/lightning/steam into a new ``/datum/effect_system/basic`` subtype
which houses the effect spreading behavior. This allows us to roll all
logic from ``set_up`` into ``New`` and cut down on code complexity.
Chaining setup as ``system.attach(src).start()`` also helps a bit in
case no helper method exists
I've added ``do_chem_smoke`` and ``do_foam`` helpers, which respectively
allow chemical smoke or foam to be spawned easily without having to
manually create effect datums and reagent holders.
Also turns out we've had some nonfunctional effect systems which either
never set themselves up, or never started, so I fixed those while I was
at it (mostly by moving them to aforementioned helper procs)
## Why It's Good For The Game
Cleaner code, makes it significantly easier for users to work with. Also
most of our effect system usage was copypasta which was passing booleans
as numbers, while perfectly fine helper procs existed in our code.
## Changelog
🆑
refactor: Refactored sparks, foam, smoke, and other miscellaneous effect
systems.
refactor: Vapes now have consistent rigging with cigs using the new
system.
fix: Fixed some effects never working.
/🆑
## About The Pull Request
This PR sort-of brings back old IEDs, albeit much more freeform compared
to their previous iteration. Using #94861's ``spark_act`` interactions
they can now be made by filling up a soda can with a variety of
chemicals (welding fuel being the easiest to obtain), dunking in a piece
of wire, taping it up (optional, required if using welding fuel or
plasma) and lighting it on fire with a lighter or welding tool (anything
that's hot enough works, really)
They have a random delay of 2-4 seconds, and can be disarmed by snipping
the fuse with wirecutters in time before they detonate (or don't,
depending on the mixture)
There's also a new, more "professional" improvised chemical explosive in
the form of beakerbombs. These can be assembled by putting a lid on a
beaker (alt-click, prevents the beaker from spilling its contents when
thrown) and attaching an assembly with an igniter or a condenser to it.
<img width="150" height="90" alt="dreamseeker_2OKpZeN7ay"
src="https://github.com/user-attachments/assets/599e75ea-9653-4db9-a915-b2ca6307635f"
/>
When triggered, igniters will heat the reagents up by a bit while
condensers will cool them down. However, you can also attach and wire up
a power cell, which will cause it to dump all of its power into the
beaker when the igniter fires off, triggering ``spark_act`` interactions
potentially causing a larger explosion.
<img width="534" height="447" alt="dreamseeker_k9Uzf18Eoa"
src="https://github.com/user-attachments/assets/4cfed5b4-3875-4522-9bfa-5f6a3c8e0864"
/>
Decently sized boom from The Contraption.
Plasma and welding fuel's potency inside of beakerbombs/soda cans is
significantly reduced compared to other riggable objects (strengthdiv is
3 times higher) as they're very easy to obtain and would make for very
powerful explosives, considering their very strong strengthdiv as most
rigging interactions use very little fuel/plasma to cause a large
explosion, which was carried over to the new system. (Don't worry, this
still leaves them at sensible values with welding fuel being about as
strong as old IEDs on average)
Closes#94990 via having plasma's electrical power modifier have a
decline past a certain point based on its volume
## Why It's Good For The Game
#81529 didn't justify IED removal whatsoever and I think with new
mechanics these can be used as easier (but weaker) to make improvised
bombs, being much less clunky to make and use than pipebombs.
Beakerbombs are essentially a somewhat weaker (even with metamat
beakers, you're still 20u short of a normal large beaker grenade at
200u) form of grenades, but have access to new interactions involving
charged up explosions, which could make for some variety among chemists'
weaponry.
## Changelog
🆑
add: Added back IEDs made by attaching some wire and tape to a soda can
filled with fuel, plasma, or any other explosive of your choice. They
need to be lit on fire with a lighter or a welding tool.
add: You can now attach a lid to beakers with alt-click, preventing them
from being spilled when thrown.
add: Added beakerbombs, made by attaching an assembly (with optional
power cell and wiring) to a lidded beaker.
balance: Rigged explosions now create flames.
balance: Plasma explosions now limit their explosion potency past a
certain point based on their volume
/🆑
## About The Pull Request
Fixes#94662
Makes the remaining suicides I could find that gib or dust preserve
items, as generally suicide should be a personal decision that people
aren't using to spitefully deny traitor objectives or whatever.
ALSO I changed tadpole suicide to just make a big hole in your chest
instead of gib you because, unlike a space carp, I don't think a tadpole
growing into a single regularly sized frog is going to cause your body
to burst into pieces.
The thing about "good first issues" is unfortunately we do also still
want them to get fixed at some point, and people were mentioning that
"suicide drill to delete items" had actually happened in real rounds.
## Changelog
:cl:se
balance: Killing yourself with a tadpole now only bursts your chest open
and not your entire body, and frankly even that is pretty impressive
work for a single frog to manage.
fix: Killing yourself in various other ways that gib or dust you will no
longer delete the items you were wearing, consistent with most of the
other ways of killing yourself that gib or dust you.
/🆑
## About The Pull Request
Instead of being snowflake interactions on objects themselves, rigging
things with plasma or welding fuel is now handled on reagents' side via
``on_spark_act``, allowing each reagent to decide how they want to
handle exposure to electric currents or violent heating.
- Obviously plasma and welding fuel cause explosions, but former gains
additional power from electric current being passed through it (same
math as powercells), while latter doesn't explode unless in an enclosed
space, or a high enough current/temperature has been reached, and merely
creates a hotspot instead.
- Napalm and phlogiston create hotspots, or (try to) damage the holder
if they're enclosed
- Sorium, liquid dark matter, TATP, nitroglycerin and flash/smoke/sonic
powders trigger their usual detonation effects, albeit slightly weaker.
- Teslium creates a ZAP, with additional power for a BIG ZAP if it has
been triggered by electric current.
- RDX becomes spicier with temperature and current, similarly to how it
becomes more dangerous when mixed with LE or teslium.
- Gunpowder produces a delayed explosion effect (unless its hot or the
current is high enough, in which case its instant) and causes sparks as
the message claims it does (normal gunpowder explosions also do that)
Plasma and gunpowder rigged items can now be controlled using
stabilizing agent - in its presence, plasma will not explode unless the
used charge is higher than 0.2% of a standard cell's per unit of agent,
while gunpowder will instead spend 0.1 + (charge / 10% of a standard
cell's charge) units of agent to delay its detonation.
Smoke (powder) now produces a visible message and slightly damages lungs
of whoever it reacted inside of, if the container was a mob.
The numbers on plasma/welding fuel rigs should be ***roughly*** the
same. Also lighters can now be rigged in a fashion similar to welding
tools.
Also it turns out we broke light rigging at some point, so now it works
again.
## Why It's Good For The Game
This makes the system much more flexible and allows players to make more
creative IEDs, expanding upon the sandbox aspect of the game. Also I
have an upcoming project bringing IEDs (kind of, in a new form) back,
which is why I wrote this in the first place (but decided to atomize the
PRs).
As for smoke damage, it feels weird to not have any tells when someone
suddenly starts hacking up volumetric amounts of smoke, it makes sense
that they'd struggle a bit after coughing a few dozen cubic meters of
thick vape clouds.
## Changelog
🆑
add: Multiple new reagents such as napalm, sorium, TATP,
smoke/sonic/flash powders and other explosives can now be used to rig
cells or tools.
add: Plasma and gunpowder rigged items can now have controlled current
requirement/delay by adding some stabilizing agent alongside the main
reagent.
balance: Creating chemical smoke inside of a mob now makes them
violently cough it up, damaging their lungs a bit.
fix: Chemically-rigged lightbulbs now once again explode.
refactor: Refactored how power cells, welding tools, lightbulbs,
cigarettes (and now, lighters) handle being rigged with chemicals.
/🆑
## About The Pull Request
Fixes https://github.com/tgstation/tgstation/issues/94909 so that lights
don't stay processing when the cell is empty.
## Why It's Good For The Game
Fixes bug, broken lights are removed from the machines processing queue.
## Changelog
🆑 LT3
fix: Fixed lights being able to run on emergency power forever
/🆑
## About The Pull Request
By right-clicking on a cable with wirecutters players can "clamp"
connections through a radial menu, preventing wires from linking to
wires in the same direction. This is indicated by a small clamp at the
blocked side of the node. RMBing again can allow you to unclamp links as
well.
https://github.com/user-attachments/assets/c2bfb375-2d2b-4e8b-9f5e-1372c0ab4eaa
Also rewrote wires to use tool_acts and improved some of the connection
code while I was at it.
## Why It's Good For The Game
Makes our wiring much more versatile and allows both players and mappers
to thread cables through smaller areas (like SM SMES rooms) easier
## Changelog
🆑
qol: You can now clamp cables by RMBing them with wirecutters in order
to prevent them from connecting to other cables in a certain direction.
refactor: Refactored cable interaction and some of connection code
/🆑
* Fix runtimes in `/datum/id_trim` and when equipping corpses if a map's
.json file fully removes a job
* Remove unused `/datum/powernet/var/number`
* Fix ctrl+clicking a telescreen to mute it also activating it normally
* Unmark `_liver.dm` as executable
## About The Pull Request
- Fixes#94119
> This will require a different solution which someone smarter than me
has to figure out in the foreseeable future
Today me is now smarter than yesterday me. We basically just unmount
when the object is about to shuttle moved and remount after it has been
shuttle moved
This also map edits some objects that could not be mounted in shuttles
previously
## Changelog
🆑
fix: objects mounted in shuttle areas deconstruct when their support
structure is destroyed
fix: fixes runtime in arrivals shuttle when its request console is
destroyed
map: moved around some objects in shuttles so they can be mounted on its
walls again
/🆑
## About The Pull Request
Floppy disks received a sprite upgrade, as well as unique wraps:
<img width="364" height="150" alt="image"
src="https://github.com/user-attachments/assets/0ac433e3-7432-4c06-bec2-aeae00b6852f"
/>
<img width="786" height="527" alt="image"
src="https://github.com/user-attachments/assets/0f36bd0d-0362-4431-8131-49060a2fe348"
/>
You can now stack floppy disks! They also scatter around when thrown.
The video also showcases new styling options with a selection of
stickers! You can also write something on the disk instead of selecting
an icon:
https://github.com/user-attachments/assets/ff0a8542-9d79-4108-ae46-672ca5d620a2
MOST disks now inherit the `/item/disk` type to properly stack and do...
stuff. An updatepaths script included.
## Why It's Good For The Game
Old school is cool. Stacking disks makes them feel more authentic, while
styling allows for more crearivity!
## Changelog
🆑
add: New unique wraps for floppy disks
qol: Floppy disks can now be stacked
image: New sprites and stickers for floppy disks
map: Added and ran an updatepaths script
refactor: Most disks are now under the base disk item type
/🆑
---------
Co-authored-by: The-Tyrant <tyrantofgaming@gmail.com>
## About The Pull Request
You can charge up SMES' with inducers
## Why It's Good For The Game
I can charge up the mining base.
## Changelog
🆑
balance: You can use inducers on SMES' now.
/🆑
## About The Pull Request
Inspired by #94233. `grind_results`(list) & `juice_typepath`(typepath)
are only used when grinding & juicing after which the atom is deleted.
This means if that object is not processed these vars occupy memory &
don't do anything.
Now these values are only generated on demand by calling their
respective procs. Considering how these vars are on the obj level the
memory savings are quite significant
## Changelog
🆑
refactor: grinding & juicing have been refactored to occupy low memory.
Report bugs on github
code: improved grinding & juicing code
/🆑
## About The Pull Request
<img width="579" height="67" alt="image"
src="https://github.com/user-attachments/assets/d7a4427e-2a6e-44d3-94ba-c90a2d474984"
/>
Simple rotation components number in the 8-9k range per round, and each
contains a needless callback datum as well.
These do not need to hold any state and can be bespoke elements, and the
proc to do things post_rotation can just be a normal atom proc.
<details><summary>Still works as you'd expect, including items that have
flag requirements like the wrench</summary>


</details>
## Why It's Good For The Game
Makes a heavily used element much more lightweight, saves a few mb of
memory.
## Changelog
🆑
refactor: simple rotation component has been refactored into an element
Please report any bugs to github.
/🆑
## About The Pull Request
[cost of operation] < [available consumed power] is a check that will
never succeed, because it'll never have consumed more power than
`amount`. Currently, this doesn't cause any issues when there is enough
power because it's < and not <=. But it does mean that machines that
check if use_energy() succeeded will never fail. Unless there's no APC.
## Why It's Good For The Game
Checks checking for what they're checking for is generally a positive
for the utility of said checks
## Changelog
🆑
fix: Things that are supposed to be able to fail to draw enough power to
operate are actually able to do so.
/🆑
## About The Pull Request
- Fixes#94497. Adds atom mount component directly but only for non
shuttle areas
- Hand placed posters are pixel shifted onto the wall and not directly
force moved allowing for stuff like acid/fire to interact with them
- Hand placing posters & signs apply the atom mounted component directly
without calling `find_and_mount_on_atom()`
## Changelog
🆑
code: improves code for placing posters and signs on walls
fix: hand placed posters now interact with fire/acid on their mounted
turf
fix: wallframes in player hands gets consumed when mounted in shuttle
areas
/🆑
## About The Pull Request
Depends on #94064 for the unit test but offers a better method for
finding an atom to mount on
- Finding a mount now takes into consideration the objects pixel x & y
offsets meaning diagonal mounting is now supported. Gives great
flexibility for mappers
- If you don't want to use pixel offsets but default back to using the
objects direction that behaviour is still preserved. Useful if your
object uses directional icon states(lights & cameras for now) AND don't
use offsets
- If no direction could be specified then as the last resort it defaults
back to the objects local turf for mounting
## Changelog
🆑
fix: all mounted objects on tables, fences, windows & walls should fall
of correctly when the atom it is placed on is destroyed
fix: security telescreen now falls off when their mounted wall is
destroyed
fix: defib wall mount falls off when their mounted wall is destroyed
fix: floor lights are mounted to the ground/catwalk/tram floor they are
sitting on meaning destroying it will destroy the light
fix: wall mounted plaques now fall off when their mounted wall is
destroyed
/🆑
## About The Pull Request
Extends the part of the crafting unit test that ensures consistency
between the total mats of the components of a recipe (or rather, the
result of said recipe) and a generic instance of the same type as its
result, previously only implemented on food recipes.
## Why It's Good For The Game
This ensures a degree of consistency with the material composition of
various objects in the game. I couldn't do it in the original PR as that
one was too big already and it took months to get it merged, and have
the relative bugs fixed.
Currently a WIP as I slowly deal with the unit test reports.
## Changelog
🆑
refactor: Follow-up to the crafting/material refactor from months ago.
All objects crafted with stacks now inherit their mat composition (not
necessarily the effects and color) by default, while previously only a
few things like chair, sinks and toilets did. Report any object looking
or behaving weirdly as a result.
fix: The material composition of ammo boxes is no longer a 1/10 of what
it's supposed to be. It was a shitty hack to make it harder to recycle
empty ammo boxes. Instead, they lose materials as they're emptied now.
/🆑
## About The Pull Request
The AI core structure now fully integrates item/tool interactions and no
longer uses attackby/take_damage overrides. Construction behaviour has
been isolated into its own file.
All handling relating to the AI core's status when shunted has been
turned into signals. For this reason, helper procs for managing core
link state have been made and integrated into the relevant users (APC
shunting, mech takeover). The AI core no longer references the remote AI
mob.
/obj/structure/ai_core/deactivated has been removed from code since it
had no function after refactoring. There was only a single instance of
it being used in a map, which has been replaced with a var edit.
There may be more things I changed, but I'm h
## About The Pull Request
Depends on #94064 for the unit test but offers a better method for
finding an atom to mount on
- Finding a mount now takes into consideration the objects pixel x & y
offsets meaning diagonal mounting is now supported. Gives great
flexibility for mappers
- If you don't want to use pixel offsets but default back to using the
objects direction that behaviour is still preserved. Useful if your
object uses directional icon states(lights & cameras for now) AND don't
use offsets
- If no direction could be specified then as the last resort it defaults
back to the objects local turf for mounting
## Changelog
🆑
fix: all mounted objects on tables, fences, windows & walls should fall
of correctly when the atom it is placed on is destroyed
fix: security telescreen now falls off when their mounted wall is
destroyed
fix: defib wall mount falls off when their mounted wall is destroyed
fix: floor lights are mounted to the ground/catwalk/tram floor they are
sitting on meaning destroying it will destroy the light
fix: wall mounted plaques now fall off when their mounted wall is
destroyed
/🆑
## About The Pull Request
Macros that are strings do not need to be doing this.
## Why It's Good For The Game
Less improper things to copy paste existing in the codebase
## About The Pull Request
It's just a partial cleanup of
anti-[STYLE](https://github.com/tgstation/tgstation/blob/master/.github/guides/STYLE.md)
code from /tg/'s ancient history. I compiled & tested with my helpful
assistant and damage is still working.
<img width="1920" height="1040" alt="image"
src="https://github.com/user-attachments/assets/26dabc17-088f-4008-b299-3ff4c27142c3"
/>
I'll upload the .cs script I used to do it shortly.
## Why It's Good For The Game
Just minor code cleanup.
Script used is located at https://metek.tech/camelTo-Snake.7z
EDIT 11/23/25: Updated the script to use multithreading and sequential
scan so it works a hell of a lot faster
```
/*
//
Copyright 2025 Joshua 'Joan Metekillot' Kidder
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
//
*/
using System.Text.RegularExpressions;
class Program
{
static async Task Main(string[] args)
{
var readFile = new FileStreamOptions
{
Access = FileAccess.Read,
Share = FileShare.ReadWrite,
Options = FileOptions.Asynchronous | FileOptions.SequentialScan
};
FileStreamOptions writeFile = new FileStreamOptions
{
Share = FileShare.ReadWrite,
Access = FileAccess.ReadWrite,
Mode = FileMode.Truncate,
Options = FileOptions.Asynchronous
};
RegexOptions regexOptions = RegexOptions.Multiline | RegexOptions.Compiled;
Dictionary<string, int> changedProcs = new();
string regexPattern = @"(?<=\P{L})([a-z]+)([A-Z]{1,2}[a-z]+)*(Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss)([A-Z]{1,2}[a-z]+)*";
Regex camelCaseProcRegex = new(regexPattern, regexOptions);
string snakeify(Match matchingRegex)
{
var vals =
matchingRegex.Groups.Cast<Group>().SelectMany(_ => _.Captures).Select(_ => _.Value).ToArray();
var newVal = string.Join("_", vals.Skip(1).ToArray()).ToLower();
string logString = $"{vals[0]} => {newVal}";
if (changedProcs.TryGetValue(logString, out int value))
{
changedProcs[logString] = value + 1;
}
else
{
changedProcs.Add(logString, 1);
}
return newVal;
}
var dmFiles = Directory.EnumerateFiles(".", "*.dm", SearchOption.AllDirectories).ToAsyncEnumerable<string>();
// uses default ParallelOptions
// https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.paralleloptions?view=net-10.0#main
await Parallel.ForEachAsync(dmFiles, async (filePath, UnusedCancellationToken) =>
{
var reader = new StreamReader(filePath, readFile);
string oldContent = await reader.ReadToEndAsync();
string newContent = camelCaseProcRegex.Replace(oldContent, new MatchEvaluator((Func<Match, string>)snakeify));
if (oldContent != newContent)
{
var writer = new StreamWriter(filePath, writeFile);
await writer.WriteAsync(newContent);
await writer.DisposeAsync();
}
reader.Dispose();
});
var logToList = changedProcs.Cast<KeyValuePair<string, int>>().ToList();
foreach (var pair in logToList)
{
Console.WriteLine($"{pair.Key}: {pair.Value} locations");
}
}
}
```
## Changelog
🆑 Bisar
code: All (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use
snake_case, in-line with the STYLE guide. Underscores rule!
/🆑
## About The Pull Request
This adds some mapping directional helpers for the new burned subtypes
of lights that makes it consistent with other lights.
## Why It's Good For The Game
Consistency and better mapping.
## Changelog
🆑
qol: Add direction helpers for burned subtypes of lights
/🆑
## About The Pull Request
Updates the laser gun into four proper subtypes: Standard, Pistol, Rifle
and Carbine.
<img width="229" height="210" alt="image"
src="https://github.com/user-attachments/assets/12c03076-8ebf-4d87-8c98-6a8cce6821db"
/>
Current sprites are pending a palette change.
**Standard:** Functions as you would expect. Same as ever.
**Pistol**: Lower charge, 20 force, normal sized, recharges faster.
**Carbine**: 15 force, 26 mag, two round burst. Projectiles flight
slightly faster. Cannot dual-wield.
**Rifle**: 20 force. 40 mag. Two round burst. EMP resistant (not
immune). Projectiles fly slightly faster. Cannot dual-wield (not that
you need to).
All but the rifle can be sourced from cargo. You can also buy the sovl
version of the laser gun if you're especially nostalgic.
### Armory Changes
The Armory now can potentially spawn either pistols, carbines or
standard. The weighting leans closer to spawning carbines and standard
as opposed to pistols.
### Lore Dump
The laser line of weapons now all have lore. That rich, deep lore that
every game needs and is totally not important at all to the meat and
potatoes of the game. I'm paid by the hour ($0.00)
### Code Tidying
Lasers are old and a total mess code-wise so we've tidied up while we're
here.
## Why It's Good For The Game
Variety is the spice of life and also some of these weapons could have
used a face lift. Especially the laser carbine. Both functionaltiy wise
and appearance wise.
A bit of randomness in the armory means some rounds might have unique
outcomes compared to others. Sometimes, items in cargo don't see
particularly much use, so peppering in a few random potential deviations
can maybe nudge people to utilize variant gear on future rounds.
I'm obsessed with writing too much information. I blame Hatterhat.
## Changelog
🆑
add: Three variants of the laser gun; Carbine (replacing the existing
one), Pistol and Rifle! Find it (possibly) in your armory today!
balance: The armory laser guns might be different variants of the laser
gun, rather than always being the standard. The standard is the same as
ever, even if it looks different.
add: If you care, the sovl version is available as a goodie. And in the
hands of pirates...
spellcheck: Lore! LORE FOR LASER GUNS! LOOOORE! Examine laser guns
closely and you might learn more about them.
balance: The new set of laser guns come with brand new sprites.
/🆑
---------
Co-authored-by: StaringGasMask <62149527+Exester509@users.noreply.github.com>
## About The Pull Request
This 1st has to be PR'd so the integration tests can point out all
wallmounts that could not find a support structure to mount on. I then
will do many map edits to align them onto the closest atom
Yes we no longer use wall mount but atom mounted component. All objects
that are mounted on windows/tables & fences now also fall off when
destroyed
It'll probably be a WHILE before I can fix all wall mounts. Long day.
Expect me to misalign many stuff to fix failing CI so make sure to
provide suggestions when possible
Improved wallmount code overall
- Fixes#93793
## Changelog
🆑
fix: fixes all incorrectly maploded wall mounts that aren't actually
hanging on any support structure
fix: objects mounted on tables, windows & fences also fall off now when
destoryed
qol: lights can be mounted on windows
qol: cameras can be mounted on windows
qol: buttons can be mounted on tables
refactor: improved how wall mounts interact with objects as a whole
report bugs on github
/🆑
## About The Pull Request
What it says on the tin, simply makes `power_store` subtypes never set
themselfes to full instead of setting themselfes to empty after setting
themselfes to full. Saving an uncountably small amount of processing and
making the code a lil bit cleaner.
This could theoretically have an issue if something sets its own
`charge` and then has a `/empty` subtype since that wont be emptied,
those don't exist though and the only cell that even sets its `charge`
to something is the ethereal one that should not have an empty subtype
Below be the screenshot of it working, because this 3 line change could
truly have disasterous consequences
(admin-spawned in order: high-capacity battery, empty high-capacity
battery, potato battery)
<img width="1600" height="858" alt="image"
src="https://github.com/user-attachments/assets/6a894e0f-5e59-4b47-bb08-dc9c93d0b3f8"
/>
## Why It's Good For The Game
Cleaner code
## Changelog
## About The Pull Request
Features:
- Floor lights can be constructed using a small light fixture on the
turf you are standing on
- Floor light construction sprites
- `/burned` subtypes for lights
- Convert `/build` subtypes to `/empty` subtypes with `UpdatePaths`
script
## Why It's Good For The Game
Floor lights can now be constructed in game using the same mechanics as
other lights. The `/burned` and `/empty` subtypes might be useful for
mapping.
## Changelog
🆑
add: Add constructable floor lights by using a small light fixture on
the floor. They are constructed the same way as other lights.
qol: Add `/burned` subtype to `/obj/machinery/light` for mapping
shenanigans
image: Add floor light construction sprites
map: Converted the `/built` subtype for `/obj/machinery/light` to be
`/empty` and added an UpdatePaths script.
/🆑
---------
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
## About The Pull Request
why is copilot automatically writing my webedit commits bro
## Why It's Good For The Game
Not a pain in the ass for Mappers
## Changelog
🆑
code: mapped in floodlights connect to powernet immediately
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
- Fixes#93392
- Replaces all custom callbacks with call to `deconstruct()`. The
callbacks weren't necessary as it did the same thing as `deconstruct()`
but in an round about way
- Removed duplicate `Initialize()` procs and the params `building` &
`ndir` from all wall mounts. Makes everything cleaner
## Changelog
🆑
fix: wall mounts placed by player now falls off when the wall they are
mounted on is destroyed
code: cleaned up wall mount code
/🆑
## About The Pull Request
- Fixes#93550
- Closes#93549
## Changelog
🆑
fix: You can deconstruct a smes power bank
fix: portable smes UI updates & closes correctly when unanchored from
the connector
/🆑
---------
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
## About The Pull Request
Infinite capacity power cells and megacells were returning TRUE (which
evaluates to 1) instead of the actual amount used in their use()
methods. This caused bugs when large electrical loads were applied, as
the power system expected the actual amount consumed to be returned for
proper power accounting. Without this fix, the infinite capacity
megacell would not work properly on the main power grid of the station
as the load would be too big, and it would choke the power grid.
This is the use() method.
```C
/// Use power from the cell.
/// Args:
/// - used: Amount of power in joules to use.
/// - force: If true, uses the remaining power from the cell if there isn't enough power to supply the demand.
/// Returns: The power used from the cell in joules.
/obj/item/stock_parts/power_store/use(used, force = FALSE)
var/power_used = min(used, charge) // Calculate how much power we can actually provide
if(rigged && power_used > 0)
explode()
return 0 // Cell exploded, no power provided
if(!force && charge < used)
return 0 // Not enough charge and force=FALSE, no power provided
charge -= power_used // Reduce the cell's charge by the amount used
if(!istype(loc, /obj/machinery/power/apc))
SSblackbox.record_feedback("tally", "cell_used", 1, type)
return power_used // Return the actual amount of power provided
```
It is overridden in battery.dm and cell.dm but the override is
implemented inccorectly. This PR fixes that.
Changes:
- battery.dm: Changed infinite battery use() to return used instead of
TRUE
- cell.dm: Changed infinite cell use() to return used instead of TRUE
## Why It's Good For The Game
Its a bug fix.
## Changelog
🆑
fix: Fixed a bug where infinite capacity power cells and megacells
wouldn't work on large power grids (high loads).
/🆑
## About The Pull Request
Added an infinite capacity megacell with the same logic as the power
cell equivalent. Both code and sprite is updated.
<img width="32" height="32" alt="icellbig"
src="https://github.com/user-attachments/assets/d80e71ff-4b62-4317-adaa-01dde287960a"
/>
## Why It's Good For The Game
It helps long rounds of debugging when you just want to smack an
infinite capacity megacell into the SMES for infinite power.
## Changelog
🆑
add: New item "Infinite Capacity Megacell added, which can be used for
infinite power in the SMES.
/obj/item/stock_parts/power_store/battery/infinite
/🆑