## 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
If an APC was emagged it would permanently half-break as it would assume
that it had a malf AI that it needed to add points to, and would not
update its charge states
## Changelog
🆑
fix: Fixed constant runtimes and broken APC processing behavior on
emagged APCs
/🆑
## About The Pull Request
This fixes several bitfield operations that were missing parenthesis
encapsulation. I noticed this problem in:
- #92601
And decided to use regex to search for similar patterns which I came
across in:
- Move loops bypassing the `MOVELOOP_STATUS_RUNNING` status
- Elastic arms mutation bypassing `ABSTRACT` object flags for picking up
objects
- Species radiation bypassing `HEAD_HAIR` hairstyle flags for balding
- Damaged APC board status bypassing `EMAGGED` and `BROKEN` status for
screentips
- Shuttle cleanup code bypassing `MOVE_CONTENTS` for moving old turfs
- Tram crossing signals bypassing `NORTH` and `EAST` direction checks
## Why It's Good For The Game
Code behaves as intended.
## About The Pull Request
Fixes the bugged malf ai descriptions, properly describing which modules
need minimum number of hacked apcs
Adds a processing power limit to discourage just sitting on your ass for
2 hours to stack up infinite points
Increases the power draw of hacked APCs to increase the phantom drain on
powernet brought by malf hacking a lot
## Why It's Good For The Game
Discourages hacking two apcs and waiting for next two hours. Also having
working descriptions is cool.
## About The Pull Request
AI now gains its malf points over time, based on the number of APCs
hacked. I also added a simple way to lock malf modules from being bought
if you haven't hacked enough APCs, to avoid cheese with delta or robot
factory.
## Why It's Good For The Game
APCs hacked are a constant risk of being found, and instantly targeted,
yet they give one time bonus, that is fairly small. This incentivises
not using antag powers, and using natural AI tools, which blurs the line
for the crew between malf and subverted AIs, and makes fighting it
easier and more boring. With constant gain from the APCs the risk of
being found is rewarded, and malf that hacks a big amount of APCs and
avoids being found can use its powers fairly liberally, at a cost of
having to manage the detection chance.
## About The Pull Request
- If a cable is destroyed by an explosion, all rooms within 64-100 (it's
a probability) tiles AND which are connected to the same powernet as the
split cable will have their lights flicker 1-3 times.
- Also adds a verb for visualizing powernets.
- Reduces cable integrity from 300 to 50.
- Cables have innate 75% bomb armor when under a floor tile.
## Why It's Good For The Game
- A big devastating explosion a few doors down is, usually, not felt at
all outside of the screen shake. This adds a bit more ambience to the
effect - you hear a big explosion, your screen goes wild, and the lights
cut for just a second.
- Verb just makes it easier to trace powernets.
- I found it a little ridiculous that cables have 300 integrity, the
same as most furniture. This ultimately makes them a lot more vulnerable
to stuff like acid and fire.
- To compensate for their drastically reduced integrity, I gave cables a
considerable boost to explosive resistance while concealed under the
floor. This prevents bombs from outright shredding all cables in a 50
mile radius. (Devastating explosions will still one-tap them, but heavy
explosions will on average take two blasts.)
## Changelog
🆑 Melbert
add: If a cable is destroyed by an explosion, all rooms within 64-100
(it's a probability) tiles AND which are connected to the same powernet
as the split cable will have their lights flicker 1-3 times.
balance: Cable integrity has been reduced from 300 to 50
balance: Cables have an innate 75% bomb resistance while under floor
tiles
/🆑
## About The Pull Request
During map export both the APC & its terminal are exported. However,
during import that terminal is not attached to the APC because it will
only attempt to create a new one if one is not already present and not
locate an existing terminal and re attach to it.
It now attempts to locate an existing terminal, from a previous map
export so the APC charges again and stuff
## Changelog
🆑
fix: map exported APC's now locate the terminals under them & attach to
it thus enabling charging & stuff
/🆑
## About The Pull Request
When using the `map_export` admin verb the following things are fixed:
- All objects density, anchored, opacity, atom_integrity, and
resistance_flags vars are saved
- Multi-tile objects being spammed on all tiles the sprite reaches
- Dirt decals error icon
- Airlocks error icon and to save welded state
- Dark Wizard Simple Mobs error icon
- Closets to save welded, open, and locked states
- Air alarms to save name
- Air scrubbers/vents to save name and welded states
- APCs to save name, charge, cell, lighting, equipment, and
environmental states
- APCs spawning a duplicated terminal underneath it when one already
exists
- SMES to save charge, input, and output states
- Holodecks to revert any holodeck turfs to the empty turf and skip
saving any hologram items
- Photos and Paintings error icons
- Bloody Footprints error icons
- False Walls error icons
- Docking Ports runtimes because the map template var would change
- Effects (lasers, portals, beams, sparks, etc.) saving when they should
be omitted
I would have loved to get `component_parts` to save for machines and
turf decals, but perhaps that is for another day since it requires
complicated solutions.
Here are some before and after pictures:




## Why It's Good For The Game
Better map saving code.
## Changelog
🆑
fix: Fix `map_export` admin verb not properly saving a massive amount of
objects.
/🆑
## About The Pull Request
516 requires float layered overlays to be using pixel_w and pixel_z
instead of pixel_x and pixel_y respectively, unless we want
visual/layering errors. This makes sense, as w,z are for visual effects
only. Sadly seems we were not entirely consistent in this, and many
things seem to have been using x,y incorrectly.
This hopefully fixes that, and thus also fixes layering issues. Complete
1:1 compatibility not guaranteed.
I did the lazy way suggested to me by SmArtKar to speed it up (Runtiming
inside apply_overlays), and this is still included in the PR to flash
out possible issues in a TM (Plus I will need someone to grep the
runtimes for me after the TM period to make sure nothing was missed).
After this is done I'll remove all these extra checks.
Lints will probably be failing for a bit, got to wait for [this
update](4b77cd487d)
to them to make it into release. Or just unlint the lines, though that's
probably gonna produce code debt
## Why It's Good For The Game
Fixes this massive 516 mess, hopefully.
closes#90281
## Changelog
🆑
refactor: Changed many of our use cases for pixel_x and pixel_y
correctly into pixel_w and pixel_z, fixing layering issues in the
process.
/🆑
---------
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Co-authored-by: SmArtKar <master.of.bagets@gmail.com>
## About The Pull Request
Change `/obj/item/construction/examine` so that if there's any upgrades
installed it will list their names in the examine text. Also add a
`/datum/bitfield` entry for RCD upgrades for a little debug QOL.
## Why It's Good For The Game
It sucks to accidentally print an upgrade you already have for the RCD.
## Changelog
🆑
qol: The RCD examine text now lists any upgrades it has installed.
/🆑
## About The Pull Request
Man.
### Standardizing Ethereal Defines
The _single_ biggest issue with all of the recent Ethereal prs has been
that, well, none of our Ethereal defines meaningfully tie to each other,
and as shown repeatedly it's _incredibly_ easy to the others when
changing one of them.
To resolve this, we introduce a `STANDARD_ETHEREAL_CHARGE` define that
every single other Ethereal define is scaled around, which itself is
tied to `STANDARD_CELL_CHARGE`.
Now these can be changed without immediately blowing up everything else,
and with awareness that they tie back to something.
As a side to this, we redefine all reagent-based charge recovery to be
relative to `ETHEREAL_DISCHARGE_RATE` rather than an arbitrary power
level, so it's easier to compare them to how quickly an ethereal
discharges.
### Adjusting Ethereal Defines
Previously, we defined `ETHEREAL_DISCHARGE_RATE` as `8e-3 *
STANDARD_CELL_CHARGE` per second, while defining `ETHEREAL_CHARGE_FULL`
as `2 * STANDARD_CELL_CHARGE`.
With some math, we get that we'd `2 / 8e-3 = 250 seconds`, 4 whole
minutes, to go from full charge to none at all.
It only takes half as much to get hungry, and about 3 minutes to start
taking toxin damage from roundstart.
So we slash this by eight, to `1e-3 STANDARD_ETHEREAL_CHARGE`, giving us
a nice 16-17~ minutes until we're hungry, and another 16-17~ until we
are 100% out of charge. This is also closer to the pre-power-rework
discharge rate.
What made this _worse_ was that the Ethereal APC charge define
`ETHEREAL_APC_POWER_GAIN` wasn't updated to match the current
charge/discharge levels, still being at `10 * STANDARD_CELL_CHARGE`,
which due to how it was coded led to it being impossible for Ethereals
to recharge from APCs.
We first and foremost change this to `0.1 * STANDARD_ETHEREAL_CHARGE`,
which is roughly equal to what it was before the most recent change, and
actually falls in line with Ethereal charge levels.
### Refactoring Ethereal Charge Methods
APC and Power Store recharging were both performing some awkward checks,
which led to our primary issues above, where they would refuse to even
attempt to charge if the stomach couldn't handle a full load or the cell
didn't have a full load.
So we rewrite their entire method to instead check how much can be
charged by taking the minimum of the cell charge, stomach used charge,
and charge-per-step.
We do this instead of just discharging it and taking the return value,
as the stomach may not have enough space for the cell's power, and
that'd get wasted.
This rewrite also allows us to address a small list of bugs.
We keep the `to_chat` for power store draining, as it better
communicates that this method is imperfect than a balloon alert would.
# Testing:<br>I spent an extended period of time looking at Ethereals
slowly starve in front of me with a stopwatch in hand.
## Why It's Good For The Game
Fixes#88934.
Fixes#88977.
16-17~ minutes is a _lot_ more bearable than 2-3~ minutes, and more in
line with discharge rates before the power rework.
Having Ethereal charging stuff actually work is nice.
## Changelog
🆑
balance: Ethereal hunger rate has been adjusted to be 1/8th of its
previous rate, now taking roughly 16-17~ minutes to go down from full to
normal or normal to none. Ethereal defines have been standardized to
help keep this sane.
refactor: Ethereal APC and power store draining/charging methods have
been refactored. Please report any issues.
fix: Ethereal APC and power store draining/charging no longer
arbitrarily caps out at slightly below or above the max/min.
fix: Ethereal APC draining/charging no longer runtimes when there is no
cell or it gets removed mid-charge.
fix: Ethereals can no longer continue charging their stomach even if it
gets surgically removed from them mid-charge.
fix: Ethereal power store draining actually updated the charge level
overlay.
qol: Ethereal APC and power store draining displays a balloon alert when
it can't continue for whatever reason.
/🆑
## About The Pull Request
Title; also fixed a runtime in `restore_comp` where no user was provided
to log the message. Also changed some var names and dmdocs the place
## Why It's Good For The Game
Fixes#72868
## Changelog
🆑
fix: fixed APC control console found in CE office only accessing APCs on
its z-level
fix: fixed restoring an emagged APC control console potentially leaving
the console in a forever state of restoring
/🆑
## About The Pull Request
This PR kills the abstract internal and external typepaths for organs,
now replaced by an EXTERNAL_ORGAN flag to distinguish the two kinds.
This PR also fixes fox ears (from #87162, no tail is added) and
mushpeople's caps (they should be red, the screenshot is a tad
outdated).
And yes, you can now use a hair dye spray to recolor body parts like
most tails, podpeople hair, mushpeople caps and cat ears. The process
can be reversed by using the spray again.
## Why It's Good For The Game
Time-Green put some effort during the last few months to untie functions
and mechanics from external/internal organ pathing. Now, all that this
pathing is good for are a few typechecks, easily replaceable with
bitflags.
Also podpeople and mushpeople need a way to recolor their "hair". This
kind of applies to fish tails from the fish infusion, which colors can't
be selected right now. The rest is just there if you ever want to
recolor your lizard tail for some reason.
Proof of testing btw (screenshot taken before mushpeople cap fix, right
side has dyed body parts, moth can't be dyed, they're already fabolous):

## Changelog
🆑
code: Removed internal/external pathing from organs in favor of a bit
flag. Hopefully this shouldn't break anything about organs.
fix: Fixed invisible fox ears.
fix: Fixed mushpeople caps not being colored red by default.
add: You can now dye most tails, podpeople hair, mushpeople caps etc.
with a hair dye spray.
/🆑
## About The Pull Request
Fixes#86985. Also, since the higher numbers of megacells made
overcharging from apcs more frequent, the do_after is twice as quick,
but gives half as much charge. The players still feed at the same speed,
but wont blow past "full" instantly to "overfed".
## Why It's Good For The Game
Etherials can eat from APCs/Voltaic Wine again!
## Changelog
🆑 WebcomicArtist
fix: Un-breaks etherial apc charging and charge from ethereal wine.
/🆑
## About The Pull Request
<details>
- renamed ai folder to announcer
-- announcer --
- moved vox_fem to announcer
- moved approachingTG to announcer
- separated the ambience folder into ambience and instrumental
-- ambience --
- created holy folder moved all related sounds there
- created engineering folder and moved all related sounds there
- created security folder and moved ambidet there
- created general folder and moved ambigen there
- created icemoon folder and moved all icebox-related ambience there
- created medical folder and moved all medbay-related ambi there
- created ruin folder and moves all ruins ambi there
- created beach folder and moved seag and shore there
- created lavaland folder and moved related ambi there
- created aurora_caelus folder and placed its ambi there
- created misc folder and moved the rest of the files that don't have a
specific category into it
-- instrumental --
- moved traitor folder here
- created lobby_music folder and placed our songs there (title0 not used
anywhere? - server-side modification?)
-- items --
- moved secdeath to hailer
- moved surgery to handling
-- effects --
- moved chemistry into effects
- moved hallucinations into effects
- moved health into effects
- moved magic into effects
-- vehicles --
- moved mecha into vehicles
created mobs folder
-- mobs --
- moved creatures folder into mobs
- moved voice into mobs
renamed creatures to non-humanoids
renamed voice to humanoids
-- non-humanoids--
created cyborg folder
created hiss folder
moved harmalarm.ogg to cyborg
-- humanoids --
-- misc --
moved ghostwhisper to misc
moved insane_low_laugh to misc
I give up trying to document this.
</details>
- [X] ambience
- [x] announcer
- [x] effects
- [X] instrumental
- [x] items
- [x] machines
- [x] misc
- [X] mobs
- [X] runtime
- [X] vehicles
- [ ] attributions
## Why It's Good For The Game
This folder is so disorganized that it's vomit inducing, will make it
easier to find and add new sounds, providng a minor structure to the
sound folder.
## Changelog
🆑 grungussuss
refactor: the sound folder in the source code has been reorganized,
please report any oddities with sounds playing or not playing
server: lobby music has been repathed to sound/music/lobby_music
/🆑
## About The Pull Request
Introduces a new MODule in the uplink, makes the user transperent and
grants the ability to siphon light sources to recharge your suit.
Ingame demonstration: https://www.youtube.com/watch?v=bhXNOAMDy4U
## Why It's Good For The Game
I've been playing a ton of Splinter Cell and Intravenous recently and
this random idea popped in my head.
"Wouldn't it be cool if traitors could blend in the darkness to get a
jump on their opponents?"
Also unrelated
"Wouldn't it be cool if tots had a tool to recharge their suit that
didn't involve sitting in a pod for 10 minutes?"
This PR introduces a new module to the uplink, the Wraith.
It comes with a passive and active component.
Passively it works exactly like the crew version of the cloaking module
with just a couple of differences.
1) Doesn't need to be manually activated, if you lose the cloak it's
regained after 5 seconds.
2) Lower stealth alpha value( how trasperent you are basically),
slightly less visible than the crew version, not as good the ninja
module however , I tuned it just enough so that you are more or less
undetectable in the dark.
The active component of the module lets you destroy stationary lights to
recharge your suit power, if used on handheld or borg lights it turns
them off for a minute.
**Why do we need this module when we already have the stealth implant
and the chameleon projector?**
I can think of a few reasons.
1) MODsuits were designed to be customizible, traitor suits range
between 6 to 16 TC, having to invest in a 7-8 TC item after you already
bought a suit is fairly expensive.
2) This MODule would be a better fit for ambushes, as it doesn't have
the *uncloaking* delay of its counterparts.
It is however considerably worse if you get caught, as the cloak is
disrupted on bump or damage.
3) It has better interactions with the sandbox.
Lights can go out for many reasons, maybe it’s just a power outage, or
some assistant broke it, or maybe it was anightmare.
It leaves room for plausible deniability, adding to the paranoia.
It's also not complete invisibility, if you want to stay undetected you
need to lurk in the darkness, you might expand your domain, at the cost
of the crew eventually wising up to your shaeneningans.
Lastly, since the active component of the module uses the same proc of
the saboteur handgun, I've updated the code to be a generic proc rather
than a signal, to make it easier to reuse in the future.
Item desc provided by NecromancerAnne.
Module sprite made by Orcacora.
## Changelog
🆑
add: The Wraith Cloaking Module is now available in the uplink, costs 3
TC.
code: the saboteur handgun now uses a generic proc rather than a signal
/🆑
---------
Co-authored-by: Xander3359 <66163761+Xander3359@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
This fixes a couple of bugs that are still lurking for malf AI,
primarily, and reverts an unintentional balance change I did by making
mech domination cancel the delta activation.
There's a balance change instead; previously mech domination death
killed you (seemingly because of badly formed callstacks assuming you
never had a core or APCs available); I replaced this by causing the AI
to produce a massive EMP centered at their location if their mech gets
destroyed while they're piloting it.
## Why It's Good For The Game
Fixes https://github.com/tgstation/tgstation/issues/86107
Fixes https://github.com/tgstation/tgstation/issues/83753
Undoes unintentional balance change and adds with something that is
still quite debilitating, especially if you're currently under attack as
a malf AI.
## Changelog
🆑 Bisar
balance: AIs piloting mechs no longer die if they hit the supermatter,
nor do they harmlessly snap back to their core. The shock now causes
them to produce a massive EMP.
balance: Undid a balance change I did during the malf AI refactor. The
doomsday countdown will no longer stop if a malf AI dominates a mech.
fix: Fixed a few bugs with AI shunting and AI mech death.
/🆑
## About The Pull Request
this is a revival of #82635 . i got permission from potato to reopen
this, he did almost all the work. i only just solved the conflicts and
fixed all the bugs that were preventing the original from being merged
(but it should be TMed first)
## Why It's Good For The Game
slightly improves the performance of basic mob AI
## Changelog
🆑
LemonInTheDark
refactor: able_to_run and incapacitated have been refactored to be event
based
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: ZephyrTFA <matthew@tfaluc.com>
## About The Pull Request
Fixes#85779,
Fixes#86041
APCs use batteries instead of cells now, and overload and power sink APC
drain were made to scale off of cell capacity instead of battery
capacity. Power sinks were not adjusted at all to match the new power
changes.
## Why It's Good For The Game
## Changelog
🆑
fix: Fixed light overloads not draining significant amounts of energy.
fix: Power sinks now drain APCs at a significant rate instead of
glacially slow.
balance: Power sinks are adjusted to not explode within 30 seconds of
the average power output a station produces.
/🆑
## About The Pull Request
Currently to check for Silicon access, we do:
``if is silicon or is admin ghost or has unlimited silicon privileges or
has machine remote in hand``
What has unlimited silicon privileges? Bots, Drones, and admin ghosts.
To check for AI access, it just checks for AI instead of silicon, and
doesnt check for unlimited silicon privileges.
This was kinda silly, so I thought I should make this a little easier to
understand.
Now all silicon/ai traits come from ``AI_ACCESS_TRAIT`` or
``SILICON_ACCESS_TRAIT``. I made a single exception to keep Admin ghost,
since now instead of being a var on the client, we moved it to using the
same trait but giving it to the client instead, but since we have to
keep parity with previous functionality (admins can spawn in and not
have this on, it only works while as a ghost), I kept previous checks as
well.
No more type checks, removes a silly var on the mob level and another on
the client.
Now while I was doing this, I found a lot of tgui's ``ui_act`` still
uses ``usr`` and the wrong args, so I fixed those wherever I saw them,
and used a mass replace for the args.
Other changes:
- machinery's ``ui_act`` from
https://github.com/tgstation/tgstation/pull/81250 had ``isAI`` replaced
with ``HAS_AI_ACCESS``, this has been reverted. Machine wands and admin
ghosts no longer get kicked off things not on cameras. This was my
fault, I overlooked this when adding Human AI.
- Human AI's wand gives AI control as long as it's in your hand, you can
swap to your offhand. I hope this doesn't end up going horribly,
otherwise I'll revert this part. It should let human AIs not have their
UI closed on them when swapping to eat food or use their door wand or
whatnot.
- Bots previously had special checks to scan reagents and be
unobservant, I replaced this with giving them the trait. I also fixed an
instance of unobservant not being used, so now statues don't affect the
basic creature, whatever that is.
## Why It's Good For The Game
This is an easier to understand way of handling silicon access and makes
these mobs more consistent between eachother.
Other than what I've mentioned above, this should have no impact on
gameplay itself.
## Changelog
🆑
fix: Statues don't count as eyes to creatures.
fix: Human AIs and Admin ghosts no longer get kicked off of machines
that aren't on cameranets.
/🆑
Hello everybuddy, your number three rated coder-failure here to clean up
some mess. This PR accomplishes some of the more major structural clean
up changes I wanted to do with /obj/ folder, but decided to wait on
until wallening gets merged, and so, time has come. Several things to
still be done, although I know these cleaning PR's are quite a load, so
will wait for this one to get done with first.
## Why It's Good For The Game
Saner spriters, better sprites, less annoyance. Also deleted a whole
load of redundancy this time around, a lot of sprites which existed
simultaniously in two places now got exit their quantum superposition.
## What's going on here
Kept you waitin huh!
This pr resprites most all walls, windows and other "wall adjacent"
things to a 3/4th perspective, technical term is "tall" walls (we are
very smart).
If you're trying to understand the technical details here, much of the
"rendering tech" is built off the idea of split-vis. Basically, split a
sprite up and render it on adjacent turfs, to prevent seeing "through"
walls/doors, and to support seeing "edges" without actually seeing the
atom itself.
Most of the rest of it is pipelining done to accommodate how icons are
cut.
## Path To Merge
Almost* all sprites and code is done at this point.
There are some things missing both on and off the bounty list, but that
will be the case forever unless we force upstream (you guys) to stop
adding new shit that doesn't fit the style.
I plan on accepting and integrating prs to the current working repo
<https://github.com/wall-nerds/wallening> up until a merge, to make
contribution simpler and allow things like bounties to close out more
easily
This pr is quite bulky, even stripping away map changes it's maybe 7000
LOC (We have a few maps that were modified with UpdatePaths, I am also
tentatively pring our test map, for future use.)
This may inhibit proper review, although that is part of why I am
willing to make it despite my perfectionism. Apologies in advance.
Due to the perspective shift, a lot of mapping work is going to need to
be done at some point. This comes in varying levels of priority. Many
wallmounts are offset by hand, some are stuck in the wall/basically
cannot be placed on the east/west/north edges of walls (posters), some
just don't look great good in their current position.
Tests are currently a minor bit yorked, I thought it was more important
to get this up then to clean them fully.
## What does it look like?






## Credits
<details>
<summary>Historical Mumbojumbo</summary>
I am gonna do my best to document how this project came to be. I am
operating off third party info and half remembered details, so if I'm
wrong please yell at me.
This project started sometime in late 2020, as a product of Rohesie
trying to integrate and make easier work from Mojave Sun (A recently
defunct fallout server) with /tg/.
Mojave Sun (Apparently this was LITERALLY JUST infrared baron, that man
is insane) was working with tall walls, IE walls that are 48px tall
instead of the normal 32. This was I THINK done based off a technical
prototype from aao7 proving A it was possible and B it didn't look like
dogwater.
This alongside oranges begging the art team for 3/4th walls (he meant
TGMC style) lead to Rohesie bringing on contributors from general /tg/,
including actionninja who would eventually take over as technical lead
and Kryson, who would define /tg/'s version of the artstyle. Much of the
formative aspects of this project are their work.
The project was coming along pretty well for a few months, but ran into
serious technical issues with `SIDE_MAP`, a byond map_format that allows
for simpler 3/4th rendering.
Due to BULLSHIT I will not detail here, the map format caused issues
both at random with flickering and heavily with multiz.
Concurrent with this, action stepped down after hacking out the
rendering tech and starting work on an icon cutter that would allow for
simpler icon generation, leaving ninjanomnom to manage the project.
Some time passed, and the project stalled out due to the technical
issues. Eventually I built a test case for the issues we had with
`SIDE_MAP` and convinced lummox jr (byond's developer) to explain how
the fuckin thing actually worked. This understanding made the project
theoretically possible, but did not resolve the problems with multi-z.
Resolving those required a full rework of how rendering like, worked. I
(alongside tattle) took over project development from ninjanomnom at
this time, and started work on Plane Cube (#69115), which when finished
would finally make the project technically feasible.
The time between then and now has been slow, progressive work. Many many
artists and technical folks have dumped their time into this (as you can
see from the credits). I will get into this more below but I would like
to explicitly thank (in no particular order) tattle, draco, arcanemusic,
actionninja, imaginos, viro and kylerace for keeping the project alive
in this time period. I would have curled up into a ball and died if I
had to do this all myself, your help has been indispensable.
</details>
<details>
<summary>Detailed Credits</summary>
Deep apologies if I have forgotten someone (I am sure I have, if someone
is you please contact me). I've done my best to collate from the git
log/my memory.
Thanks to (In no particular order):
Raccoff: Being funny to bully, creating threshold decals for airlocks
aa07: (I think) inspiring the project
ActionNinja: Laying the technical rock we build off, supporting me
despite byond trying to kill him, building the icon cutter that makes
this possible
ArcaneMusic: Artistic and technical work spanning from the project's
start to literally today, being a constant of motivation and positivity.
I can't list all the stuff he's done
Armhulen: Key rendering work (he's the reason thindows render right), an
upbeat personality and a kick in the ass. Love you arm
Azlan: Damn cool sprites, consistently
Ben10Omintrix: You know ben showed up just to make basic mobs work, he's
just fuckin like that man
BigBimmer: A large amount of bounty work, alongside just like, throwing
shit around. An absolute joy to work with
Capsandi: Plaques, blastdoors, artistic work early on
CapybaraExtravagante: Rendering work on wall frames
Draco: SO MUCH STUFF. Much of the spritework done over the past two
years is his, constantly engaged and will take on anything. I would have
given up if not for you
Floyd: Early rendering work, so early I don't even know the details.
Enjoy freedom brother
Imaginos16: A guiding hand through the middle years, handled much of the
sprite review and contribution for a good bit there
Iamgoofball: A dedication to detail and aesthetic goals, spends a lot of
effort dissecting feedback with a focus on making things as good as they
can be at the jump
Infrared: Part of the impetus for the project, made all the xenomorph
stuff in the MS style
Jacquerel: A bunch of little upkeep/technical things, has done so much
sprite gruntwork (WHY ARE THERE SO MANY PAINTING TYPES)
Justice12354: Solved a bunch of error sprites (and worked out how to
actually make prs to the project) Thanks bro!
Kryson: Built the artstyle of the project, carrying on for years even
when it was technically dying, only stopping to casually beat cancer. So
much of our style and art is Kryson
KylerAce: Handled annoying technical stuff for me, built window frame
logic and fully got rid of grilles.
LemonInTheDark: Rendering dirtywork, project management and just so much
fucking time in dreammaker editing sprites
Meyhazah: Table buttons, brass windows and alll the old style doors
Mothblocks: Has provided constant support, gave me a deadline and
motivation, erased worries about "it not being done", gave just SO much
money to fill in the critical holes in sprites. Thanks moth
MTandi: Contributed art despite his own blackjack and hookers club
opening right down the road, I'm sorry I rolled over some of your
sprites man I wish we had finished earlier
Ninjanomnomnom: Consulted on gags issues, kept things alive through some
truly shit times
oranges: This is his fault
Rohesie: Organized the effort, did much of the initial like, proof of
concept stuff. I hope you're doin well whatever you're up to.
san7890: Consulting on mapper UX/design problems, being my pet mapper
Senefi: Offsetting items with a focus on detail/the more unused
canidates
SimplyLogan: Detailed map work and mapper feedback, personally very kind
even if we end up talking past each other sometimes. Thank you!
SpaceSmithers: Just like, random mapping support out of nowhere, and
bein a straight up cool dude
Tattle: A bunch of misc project management stuff, organizing the
discord, managing the test server, dealing with all the mapping bullshit
for me, being my backup in case of bus. I know you think you didn't do
much but your presence and work have been a great help
Thunder12345: Came out of nowhere and just so much of the random
bounties, I'm kind of upset about how much we paid him
Time-Green: I hooked him in by fucking with stuff he made and now he's
just doin shit, thanks for helping out man!
Twaticus: Provided artistic feedback and authority for my poor feeble
coder brain, believed in the project for YEARS, was a constant source of
❤️ and affirmation
unit0016: I have no god damn idea who she is, popped out of nowhere on
the github one day and dealt with a bunch of annoying
rendering/refactoring. Godspeed random furry thank you for all your
effort and issue reports
Viro: A bunch of detailed spriting moving towards 3/4ths, both on and
off the wallening fork. If anyone believed this project would be done,
it was viro
Wallem: Artistic review and consultation, was my go-to guy for a long
time when the other two spritetainers were inactive
Waltermeldon: Cracked out a bunch of rendering work, he's the reason
windows look like not dogwater. Alongside floyd and action spent a TON
of time speaking to lummox/unearthing how byond rendering worked trying
to make this thing happen
ZephyrTFA: Added directional airlock helpers, dealt with a big fuckin
bugaboo that was living in my brain like it was nothing. Love you
brother
And finally:
The Mojave Sun development team. They provided a testbed for the idea,
committed hundreds and hundreds of hours to the artstyle, and were a
large reason we caught issues early enough to meaningfully deal with
them. Your work is a testament to what longterm effort and deep detailed
care produce. I hope you're doing well whatever you're up to. Go out
with a bang!
</details>
## Changelog
🆑 Raccoff, aa07, ActionNinja, ArcaneMusic, Armhulen, Azlan,
Ben10Omintrix, BigBimmer, Capsandi, CapybaraExtravagante, Draco, Floyd,
Iamgoofball, Imaginos16, Infrared, Jacquerel, Justice12354, Kryson,
KylerAce, LemonInTheDark, Meyhazah, Mothblocks, MTandi, Ninjanomnom,
oranges, Rohesie, Runi-c, san7890, Senefi, SimplyLogan, SomeAngryMiner,
SpaceSmithers, Tattle, Thunder12345, Time-Green, Twaticus, unit0016,
Viro, Waltermeldon, ZephyrTFA with thanks to the Mojave Sun team!
add: Resprites or offsets almost all "tall" objects in the game to match
a 3/4ths perspective
add: Bunch of rendering mumbo jumbo to make said 3/4ths perspective work
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: = <stewartareid@outlook.com>
Co-authored-by: Capsandi <dansullycc@gmail.com>
Co-authored-by: ArcaneMusic <hero12290@aol.com>
Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com>
Co-authored-by: SomeAngryMiner <53237389+SomeAngryMiner@users.noreply.github.com>
Co-authored-by: KylerAce <kylerlumpkin1@gmail.com>
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
Co-authored-by: Runi-c <5150427+Runi-c@users.noreply.github.com>
Co-authored-by: Roryl-c <5150427+Roryl-c@users.noreply.github.com>
Co-authored-by: tattle <article.disaster@gmail.com>
Co-authored-by: Senefi <20830349+Peliex@users.noreply.github.com>
Co-authored-by: Justice <42555530+Justice12354@users.noreply.github.com>
Co-authored-by: BluBerry016 <50649185+unit0016@users.noreply.github.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SimplyLogan <47579821+loganuk@users.noreply.github.com>
Co-authored-by: Emmett Gaines <ninjanomnom@gmail.com>
Co-authored-by: Rob Bailey <github@criticalaction.net>
Co-authored-by: MMMiracles <lolaccount1@hotmail.com>
## About The Pull Request
The charge indicator overlay on power cells is now properly updated when
the cell is charged/discharged. Before, you could use a power cell until
it's empty and the overlay wouldn't change at all.
## Why It's Good For The Game
The overlay is there to indicate the charge of the cell. It should work.
## Changelog
🆑
fix: The charge indicators on power cells now work properly.
code: Removed some now redundant power cell appearance updates
/🆑
---------
Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com>
## About The Pull Request
Fixed an issue with APC icon not turning green from #84983

Also changed the implementation of the way the emitters are prioritized.
Now there are separate lists for early and late processing machines.
## Why It's Good For The Game
Bug fixes, better power distribution, power monitors showing reliable
data
## Changelog
🆑
fix: APC icon properly turns green on full charge
fix: APC shows correct charging rate in UI
code: Added early machine process for shield generators and emitters to
prioritize power draw
code: Added late machine process for power monitors to gather accurate
powernet load
/🆑
## About The Pull Request
Fixed the issue when the power priority was preferring random machinery
around the station over the crucial Emitters and Shieldgens.
Because of how the consumers are selected right now, PACMAN attached to
a station network will give power for the machinery/lights/environment
of a random APC instead of the emitters next to it.
This also makes power sinks process before APCs.
Also made APCs charge in cascades within a powernet:
1. APCs try to charge to 5% to enable environment channel.
2. When all are above 5%, then allow APCs to charge to 20% to enable
lighting channel
2. When all are above 20%, then allow APCs to charge to 35% to enable
equipment channel
3. When all are above 35%, then allow APC to charge to full battery
As a result, a low-rate power source can provide enough power to at
least make all airlocks working and have dim lights enabled.
Charlie station APCs after you run PACMAN with 15 uranium sheets:

## Why It's Good For The Game
Makes emitters actually work, instead of having people fire kisses at SM
to raise the internal energy.
Makes it possible to use PACMAN to kickstart SM.
Gives a reason to set up solars.
Makes the power distribution more fair and equal after the recent APC
battery buff.
## Changelog
🆑
fix: Fixed emitters, shield gens and other wired machinery having lower
power consumption priority than APCs
qol: Made APCs charge more evenly to ensure that environment and lights
are working everywhere before giving the power for equipment
/🆑
## About The Pull Request
As the title says. A standard power cell now only stores 10 KJ and
drains power similar to how it did before the refactor to all power
appliances.
The new standard megacell stock part stores 1 MJ (what cells store right
now). APCs and SMESs have had their power cells replaced with these
megacell stock parts instead. Megacells can only be used in APCs and
SMESs. It shouldn't be possible to use megacells in any typical
appliance.
This shouldn't change anything about how much 'use' you can get out of a
power cell in regular practice. Most should operate the same and you
should still get the same amount of shots out of a laser gun, and we can
look at expanding what can be switched over to megacells, e.g. if we
want mechs to require significantly more power than a typical appliance.
Thanks to Meyhazah for the megacell icon sprites.
## Why It's Good For The Game
Power cell consumption is way too high ever since the power appliance
refactor that converted most things to be in joules. It's a bit
ridiculous for most of our machinery to drain the station's power supply
this early on.
The reason it's like this is because regular appliances (laser guns,
borgs, lights) all have a cell type that is identical to the APC/SMES
cell type. And it means that if we want to provide an easy way to charge
these appliances without making it easy to charge APCs/SMESs through a
power bug exploit, we need to introduce a new cell type to differentiate
between what supplies power and regular appliances that use power. This
is primarily what the megacell stock part does.
This moves us back to what it was originally like before the power
refactor, where recharging power cells wouldn't drain an exorbitant
amount of energy. However, it maintains the goal of the original
refactor which was to prevent people from cheesing power generation to
produce an infinite amount of power, as the power that APCs and SMESs
operate at is drastically different from the power that a regular
appliance uses.
## Changelog
🆑 Watermelon, Mayhazah
balance: Drastically reduces the power consumption and max charge of
power cells
balance: Added a new stock part called the battery, used primarily in
the construction of APCs and SMESs.
add: Suiciding with a cell/battery will shock you and potentially dust
you/shock the people around you if the charge is great enough.
/🆑
---------
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
Co-authored-by: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com>
## About The Pull Request
- Fixes#84064
- Closes #83392(doesn't occur upstream but should help downstream if
they have the problem)
## Changelog
🆑
fix: breaking an APC will depower the area
/🆑
## About The Pull Request
lol
## Why It's Good For The Game
people's rounds shouldn't be ruined from misclicking the button that's
right next to the "progress as an antagonist" button
## Changelog
🆑
qol: adds a confirmation to malf AI shunting into APCs
/🆑
Fixes#83254🆑 ShizCalev
fix: Malf AI can now properly interact with APCs under their control
fix: Malf AI & their slaved cyborgs won't be told that access is denied
when trying to right-click lock/unlock APCs.
/🆑
## About The Pull Request
Replaces the Ansem, SC/FISHER, and suppressor in the Sam Fisher gimmick
bundle with the Ansem/SC, a variant of the Ansem that:
- has an integral suppressor (read: acts like it's always suppressed,
because it is)
- an underbarrel light disruptor (functionally identical to the
SC/FISHER, fired with RMB)
(note: firing the disruptor in combat mode causes the main gun to fire
as if it were being fired akimbo. which it shouldn't, but I'm not sure
how to make it not do that)
- is longer, visually, but not storage-wise, and also visibly has an
underbarrel light disruptor

Also added code support for integrally suppressed ballistic guns (with
no separate suppressor overlay), handled by the can_unsuppress variable.
Also fixes the SC/FISHER disrupting APCs for ten times longer than they
probably should have been disrupted.
## Why It's Good For The Game
In regards to the Ansem, SC/FISHER, suppressor:
The Sam Fisher gimmick bundle having the Ansem and SC/FISHER as separate
items always kinda bugged me, since it seemed too clunky for a
sneaky-beaky operator-type to have to juggle two guns (one which you had
to bump to normal-size, leaving it unable to fit in the belt) to break
lights and then shoot dudes in the back of the head. So now it's one
gun, like the M-90gl and its grenade launcher. I think the bundle's rare
enough that it's fine to give them this much.
In regards to the APC thing:
Shooting an APC with a gimmick gun and leaving it unpowered for two
minutes seemed unintentional.
In regards to the code support for integrally suppressed guns:
Maybe someone else will want to put in another integrally suppressed
gun? It was relevant for this use-case.
## Changelog
🆑
qol: The Ansem, suppressor, and SC/FISHER included in the Fisher gimmick
bundle now come together as one whole gun, the Ansem/SC. It's integrally
suppressed, and fires the disruptor on right-click.
fix: The SC/FISHER disrupts APCs for an appropriate amount of time, not
ten times the intended disruption length.
/🆑
---------
Co-authored-by: Hatterhat <Hatterhat@users.noreply.github.com>
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
I was trying to fix a bug with ejecting from mechs as malf AI and the
more I looked the worse it seemed to get? So I'm putting in this PR with
the intent to refactor AI code to not be a Byzantine nightmare of new
objects referencing each other incompletely or with buggy behavior.
Finished PR for #82579 because I didn't want to clutter the comments
with commits of me trying to fix shit with git restore and revert
## Why It's Good For The Game
Fixes#81877Fixes#82524
Mech dominating now just works off (and integrates with) similar code
for APC shunting
The cores left behind by AIs shunting or controlling mechs now properly
reference the AI instead of only the other way around
Some of these refactors slightly change how malf works; I think most of
it was unintended behavior in the first place, let me know in review if
not
## Changelog
The code for AIs remoting out of their shell has been refactored.
🆑
fix: Mech domination now properly integrates with shunting.
fix: Combat upgraded AIs no longer get two buggy malf ability pickers if
they also become malfunctioning
refactor: Refactored most of the functionality around malf AI shunting,
mech control
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
A few items with special silicon interactions did not have the proper
flags to permit their use at distance (airlocks for instance)
## Why It's Good For The Game
Fixes#82800
## Changelog
🆑
fix: Restored silicon alt-clicking capability
/🆑
## About The Pull Request
This re writes most cell power usage cases with 2 defines
`STANDARD_CELL_CHARGE`(Joules) & `STANDARD_CELL_RATE`(Watts) so changing
cell capacity values in the future won't cause discrepancies.
## Changelog
🆑
code: most cell power usages are scaled with defined constants to help
adapt to future changes
/🆑
## About The Pull Request
Fixes the following input stalling exploits (maybe missed some):
- Changing GPS tag
- Setting teleporter destination
- Request Console Reply
- Various AI law board interactions
- Note, I used `is_holding` but technically this means these fail with
telekinesis. I can swap them to `can_perform_action(...)`, which allows
TK, but I noticed some places explicitly deny TK interactions with Ai
law boards. Not sure which is preferred.
- Borg Rename Board
- Plumbing Machines and Ducts
- APCs and SMES terminal placements
- Stargazers Telepathy
- Go Go Gadget Hat
## Changelog
🆑 Melbert
fix: You can't change the GPS tag of something unless you can actually
use the GPS
fix: You can't set the teleporter to a location unless you can actually
use the teleporter
fix: You can't reply to request console requests unless you can actually
use the console
fix: You can't update AI lawboards unless you're actually holding them
fix: You can't update a borg rename board unless you're actually holding
it
fix: You can't mess with plumbing machines unless you can actually use
them
fix: You can't recolor / relayer ducts unless you're actually holding
them
fix: You can't magically wire APCs and SMESs unless you're right by them
fix: You can't use Stargazer Telepathy on people who you can't see
fix: You can't configure the Inspector Hat unless you can actually use
it
/🆑
## About The Pull Request
Fixes many instances of things not charging ethereals properly. Scales
all things that are meant for charging/taking from the ethereal stomach
by STANDARD_CELL_CHARGE, so we never run into this issue again. Ethereal
stomachs now store a cell inside them, and uses that for the charge
instead of tracking a variable. Fixes recharging stations not being able
to charge ethereal stomachs. The ethereal signal proc attempted to feed
a callback datum to adjust_charge(), which caused a runtime. Changes
that by invoking the charge_cell callback instead.
Also fixes recharge station charging speed. They weren't converted
correctly. Also formats their charging speed in their description, and
displays power rather than referencing cycles.
## Why It's Good For The Game
So ethereals charge properly.
Closes#82470
## Changelog
🆑
fix: Fixes many instances of energy sources for ethereals supplying a
thousand times less energy than intended.
fix: Fixes recharging stations not being able to charge ethereals.
fix: Fixes recharge stations charging too fast.
qol: Recharge stations display their recharging speed in formatted
power, rather than unformatted energy per cycle.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Using these search regexes:
Ending in 0:
`addtimer\((.*),\s?(\d{1,3})0\b\)`
replacement:
`addtimer($1, $2 SECONDS)`
Two digit ending in odd:
`addtimer\((.*), (\d)([1-9])\)$`
replacement:
`addtimer($1, $2.$3 SECONDS)`
Single digit ending odd:
`addtimer\((.*), ([1-9])\)$`
replacement:
`addtimer($1, 0.$2 SECONDS)`
## Why It's Good For The Game
Code readability
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
Using these search regexes:
Number ending in 0:
`do_after\((\w+), (\d+)0,`
Replace:
`do_after($1, $2 SECONDS,`
Single digit number:
`do_after\((\w+), [1-9],`
replace:
`do_after($1, 0.$2 SECONDS,`
Double:
`do_after\((\w+), (\d)([1-9]),`
Replace:
`do_after($1, $2.$3 SECONDS,`
## Why It's Good For The Game
Code readability
## About The Pull Request
For how many lines this is, there's not a lot to really say.
In general, we simply move all item interactions from `attackby(...)` to
`item_interaction(...)`, split each item interaction off into a separate
proc, and make them all return the proper item interaction flags.
We _do_ kill some probably dead code, and remove a call to
`attackby(...)` elsewhere. Then, for clarity, we move the cell check
below the ID check so it can be next to the other item type checks, as
the priority between cell and ID is unlikely to matter anyway.
Other than what's described above and detailed below, each section's
functionality should be the same.
Now, for the parts that _do_ need to be explained more.
### Killing Probably Dead Code
Alright, so, the first part that does not have the cleanest transition.
d38f9385b8/code/modules/power/apc/apc_attack.dm (L22-L23)
Whatever the fuck this is.
Asking around, this seems to just be dead code.
For sanity's sake removing it and testing, silicon interactions with it
seem to work just fine.
So we kill it. We just kill it. We Just Kill It.
Closest we could find requires the distance check there to be false, so
it wouldn't apply. But it _does_ bring us to the second bit of weird
code.
### Calling APC Attackby Elsewhere?
So wallframes let you screwdriver them to put them up, which from a
comment seems to be because of cyborgs.
APC wallframes of course override this with their own implementation,
that allows you to also replace a damaged cover or frame like that!
d38f9385b8/code/game/objects/items/apc_frame.dm (L29-L39)
...By just calling the wholeass `attackby(...)` proc on the APC and
calling it a day.
But hey, this is where our previous splitting up comes in handy, because
we just have a `wallframe_act(...)` proc!
So we just call that instead.
```dm
var/obj/machinery/power/apc/mounted_apc = locate(/obj/machinery/power/apc) in get_turf(user)
mounted_apc.wallframe_act(user, src)
return ITEM_INTERACT_SUCCESS
```
...And not use single letter variables, while we're at it.
That should be all.
Remember to get snacks and drinks.
## Why It's Good For The Game
Split off 178 line `attackby(...)` item interaction chain into separate
procs called in `item_interaction(...)`.
Screwdrivering APC wallframes no longer calls the wholeass
`attackby(...)` on the APC, but just call the new sub-proc for the
specific interaction it cares about.
## Changelog
🆑
refactor: APCs have had their item interaction chain refactored. This
should functionally be the same, but please report any issues.
/🆑
## About The Pull Request
Improves the auto/protolathe low charge error message. Instead of simply
saying low power, it will tell you how long until it has enough charge
to print.

## Why It's Good For The Game
Less mashing the lathe over and over with no idea how much APC charge it
needs to start printing again
## Changelog
🆑 LT3
code: APCs can now calculate time-to-charge
qol: Overloaded lathes will now tell you the wait time until they're
ready to print again
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>