Commit Graph

4001 Commits

Author SHA1 Message Date
ArcaneMusic
635661c510 Adds minimum player count of 2 to GMM Station Spotlight Trait (#93740)
## About The Pull Request

What it says on the tin, the GMM Station Spotlight trait will not
generate a spotlight if there isn't more than 1 player on the station.

## Why It's Good For The Game

People have been running into the GMM Trait triggering during offline
testing, and functionally it makes sense to not apply the effect if
there's no-one around to potentially act on that information. If you're
alone, and the richest person on the station, that's functionally not
going to change any time soon.

## Changelog
🆑
qol: The GMM Spotlight station trait will not create a lightbeam if
there's not more than 1 player alive.
/🆑

---------

Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
2025-11-04 00:59:46 +01:00
MrMelbert
6395f12833 Adds a rewards bonus for nohitting combat bitrunning domains (#93531)
## About The Pull Request

Completing a combat bitrunning domain grants 0.8 score bonus per player
that escaped without being hit

## Why It's Good For The Game

I figured it be a fun challenge to try to nohit these things, especially
the megafauna ones. For a bonus.

## Changelog

🆑 Melbert
add: Nohitting a combat bitrunning domain rewards a higher score.
/🆑
2025-11-01 13:39:08 +01:00
MrMelbert
585b02c325 Reduces species feature boilerplate (#93570)
## About The Pull Request

Rather than having 100 separate list variables on `SSaccessories`, have
1 list for all feature keys that are associated with sprite accessories

This way you can get a feature by doing
`SSaccessories.feature_list[key]`, instead of necessitating
`SSaccessories.ears_list`, `SSaccessories.tail_list`, etc.

This lets us cut back on a lot of boilerplate in prefs, dna, and organs

## Why It's Good For The Game

We can see the benefit in this example: This is all the code for horn
DNA, bodypart overlay, and preference
```dm
/datum/dna_block/feature/accessory/horn
	feature_key = FEATURE_HORNS
```
```dm
/datum/bodypart_overlay/mutant/horns
	layers = EXTERNAL_ADJACENT
	feature_key = FEATURE_HORNS
	dyable = TRUE

/datum/bodypart_overlay/mutant/horns/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner)
	return !(bodypart_owner.owner?.obscured_slots & HIDEHAIR)
```
```dm
/datum/preference/choiced/species_feature/lizard_horns
	savefile_key = "feature_lizard_horns"
	savefile_identifier = PREFERENCE_CHARACTER
	category = PREFERENCE_CATEGORY_FEATURES
	main_feature_name = "Horns"
	should_generate_icons = TRUE
	relevant_organ = /obj/item/organ/horns

/datum/preference/choiced/species_feature/lizard_horns/icon_for(value)
	return generate_lizard_side_shot(get_accessory_for_value(value), "horns")
```

## Changelog

🆑 Melbert
refactor: Refactored species unique organs slightly, particularly how
they are set up at game start. Report any oddities, like invisible tails
or wings
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-10-30 03:46:32 +01:00
Bloop
6e032a6aca Improves debugging for events config + fixes inconsistencies in events.json (#93595)
## About The Pull Request

If an event is not found in the list, it will be null, so the stack
trace when there is an invalid one in there will always return "Invalid
event attempting to be configured." AKA nothing useful to indicate which
event in the config is actually causing the failure.

Also stops stack trace from declaring 'invalid' config when they are
simply not loaded due to the current map.

It should be printing out [variable] instead.

Also removes a bunch of non existent events from the events.json and
fixes a few inconsistencies with the default weights.

## Why It's Good For The Game

Stack traces with useful information are good.

## Changelog

Nothing player-facing
2025-10-29 01:01:14 +01:00
FlufflesTheDog
0f3d4596f3 Dullahan fixes (#93365)
## About The Pull Request
Fixes up some of the blaring problems with the woefully unloved
dullahans, making them at least playable in time for halloween. List of
individual fixes in the changelog, but notable code changes include that
visible/audible messages can (currently exists for dullahan heads and
holopad projections) now be proxied, so that detached cameras can
optionally relay TTS, emotes, and other messages to the proper client.
## Why It's Good For The Game
Its spooky month!
## Changelog
🆑
fix: Dullahans spawn with their intended organs
fix: Dullahans can hear/see emotes
fix: Dullahan heads properly have preferences applied to them
fix: Dullahan heads no longer appear eyeless
fix: Dullahans can hear things from their head regardless of if their
body is nearby
fix: Dullahans can hear TTS messages
fix: Dullahans have a TTS voice
qol: Dullahans have a head in the character preview, for the sake of
easier customization
/🆑
2025-10-29 00:20:58 +01:00
FalloutFalcon
060d4a65ba valid_subtypes proc (#93541)
## About The Pull Request
discussed in #93439, a generic proc for getting a list of all types
minus abstract types.
applies this to most instances of a for loop that currently filters out
abstract types

it SHOULD be a nothing burger for performance, however I have not bench
marked the difference. (also testing, there is a total of 7 calls in
init to it)
2025-10-28 12:49:18 -05:00
Aliceee2ch
ee388c204f More love to paramedic: revamping/adding paramedic offices, new access and more! (#93457)
## About The Pull Request

most of info in changelog, here i'll pin some screenshots. 
(also didnt touch catwalk on purpose since its medbay in process of
rework)

<details><summary>Screenshots</summary>


### Example of paramedic dispatch area, before it was used only on 2
maps:
<img width="479" height="490" alt="image"
src="https://github.com/user-attachments/assets/ca6f0ba6-93ed-4386-a94d-63b90985ef27"
/>
   
### Example of how I changed pallete to match paramedic outfit: dark
color mixed with blue
<img width="479" height="490" alt="image"
src="https://github.com/user-attachments/assets/e7acef94-2fd3-4fb4-9abf-5b83fd5cd738"
/>

### Icebox
<img width="463" height="320" alt="image"
src="https://github.com/user-attachments/assets/3e12aa10-caac-4b6e-89e8-81690d979150"
/>

(moved chem storage south)
<img width="534" height="476" alt="image"
src="https://github.com/user-attachments/assets/863a0644-520b-40a7-9deb-f1174b252757"
/>


### Tramstation
<img width="518" height="504" alt="image"
src="https://github.com/user-attachments/assets/f410f6c8-e2ee-423e-838c-03643ea1499f"
/>

(removed elevator and replaced with some public atmos equipment)
<img width="353" height="727" alt="image"
src="https://github.com/user-attachments/assets/df635bb5-5692-4367-b2b6-7c8df3c6c9a4"
/>

(theres new hall to replace the elevator path)
<img width="857" height="725" alt="image"
src="https://github.com/user-attachments/assets/15d12685-c9a0-44b5-a916-41766b12677c"
/>


### New locker that has all kind of stuff for emergencies!
<img width="186" height="155" alt="image"
src="https://github.com/user-attachments/assets/c1e40fd6-44f7-48e0-a5e4-ecb9fc562627"
/>


</details>

## Why It's Good For The Game

Since paramedic got more attention now, I feel it would be wise to
separate paramedic content (jaws and medical suit) from general medbay
and doctors.
<img width="382" height="135" alt="image"
src="https://github.com/user-attachments/assets/750e0d4c-7011-41e5-8ec4-d5f05f6c3515"
/>

For locker part: I think paramedic should have own locker with all kind
of emergency items/drip items instead of bloating items on the tables.


## Changelog

🆑
add: Added new medical access for paramedics.
map: Added paramedic dispatch on: TramStation and IceBox, removed
elevator from Tram and moved chemstorage on IceBox.
map: Paramedic dispatch area is used on every paramedic office now.
map: Medical MODsuit and Jaws of Recovery moved to paramedic office.
map: Redesigned northern medbay on MetaStation.
sprite: Paramedic locker was added.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-10-22 23:37:24 +00:00
MrMelbert
8b8bcfd674 Adds two heavy midround rulesets, mass traitors and mass changelings (#93447)
## About The Pull Request

- [ ] I tested this pr

Adds "Midround Mass Traitors" and "Midround Mass Changelings" heavy
rulesets

Midround Mass Traitors will turn a number of the crew into sleeper
agents

Midround Mass Lings will spawn a number of changeling meteors 

BY DEFAULT:
- Traitors will spawn 2-4 sleeper agents
- Lings will spawn 2-3 changeling meteors
- They won't run without >=2 candidates
- They have no config blacklist (so the HoP can roll mass midround
traitor, despite not being able to roll normal midround traitor. However
default blacklisted roles like security officers are still blocked)
- They're weighted impossible on tier 0, same weight as most midrounds
on tier 1, and fairly high on tiers 2 and 3
- They're repeatable but very unlikely to repeat
- Significantly higher min pop brackets than their solo counter part

## Why It's Good For The Game

Adds more options for lategame antags than big midrounds

## Changelog

🆑 Melbert
add: Two new heavy dynamic rulesets: "Midround Mass Traitors" and
"Midround Mass Changelings"
/🆑
2025-10-18 19:06:29 +02:00
SyncIt21
749643cddb Reworks cargo market elasticity (#93235)
## About The Pull Request
What it says on the tin. Cargo now has new math for market elasticity,
each parameter and what it does is explained below

**1. Refactor**
1. **k_elasticity**: This is the elasticity as before applied on all
exports except now this is a floating-point value that swings from
`0->1` instead of 10e-10 like is the current case. This in laymen terms
is the percentile of an items actual cost that is sold on cargo [0 means
you get no credits, 0.5 means you get 50% of the items cost, 1 means you
get 100% of the items cost]. Whenever an item is sold on cargo this
value decreases by an amount that is determined by the next variable

2. **k_hit_percentile(default 5%)**: This is the value by which an
export `k_elasticity` decreases whenever an export is successful for
every unit of an item sold. The real formulae by which the exports
elasticity decreases is dependent on the total amount sold and is as
follows
<pre>k_elasticity -= amount sold (1 for most cases except stacks) *
k_hit_percentile</pre>
So subsequent exports yield lesser profits cause the elasticity
decreases. Now the rate at which the elasticity recovers is as follows

3. **k_recovery_time(default 10 minutes)**: This is the time (minimum
unit should be seconds) it takes for the elasticity to rebound back to
100% after it has reached full 0 but recovery process starts immediately
if it decreases at any point. So if elasticity becomes say 50% it means
it would take 5 minutes to reach 100% again

**2. Some Balance changes**
1. Profits earned from exporting gas is linear per mole sold so the more
gas you put in the more profits you get HOWEVER the max number of
credits you can make per canister is 15000 cr
2. Selling fish yields higher prices because it's no longer subject to
the old elasticity formula
3. Selling 50 sheets of anything will decrease future sale price by 10%
and will take 8 minutes to rebound back to 100% if it reaches 0

**3. Improvements:**
- `SSProcessing` subsystem no longer processes more than 180+ export
datums from round start itself but now starts out empty. It instead
processes only those exports whose elasticity has been impacted and
later cancels it after elasticity has reached 100% so performance of
this subsystem has been drastically improved
- export datums now respect `abstract_type` meaning they won't be
created and can be used as a skeleton body for subtypes. So datums like
`datum/material` & `datum/material/market` are not created anymore but
only their subtypes are so we save processing power & memory
 - Shaved of a lot of dead exports that went unused

## Changelog
🆑
balance: cargo exports now have different prices with applied elasticity
code: Improved performance of export code
qol: stock blocks can be recycled for materials & show up as stock
blocks in order console sold items
refactor: refactored cargo export code in whole. Report bugs on GitHub
/🆑

---------

Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
2025-10-18 04:36:09 -04:00
EnterTheJake
a2c7c8e57b Heretic Antagonist Full Overhaul. (#92119)
## About The Pull Request

Heretic has received a complete overhaul. This PR touches nearly every
aspect of the antagonist. For readability's sake, not every change is
going to be listed in this pull request.

For the full list of changes please refer to the design doc:
https://hackmd.io/@BiST8PJVRjiwVPY86U3bLQ/B11HyChz1g.

Code by Me, @Xander3359 and @Arturlang 

TGUI by @Arturlang 

Sprites by OrcaCora and GregorDM

Writing bits by @necromanceranne 

### Core changes

- Cross-pathing has been removed. Main knowledge spells are now
exclusive to their path (for the most part).

- For every main knowledge unlocked (save for the robes and the blade
upgrade), Heretics can choose one option from a draft of 3 random side
knowledges (this is a free point).

- Heretics can now purchase side knowledges from a new tab, the
"Knowledge Shop". Side-knowledges have been divided by tier (Stealth,
Defense, Summons, Combat and Main). Tiers are unlocked as you progress
toward your main path.

- Heretics now gain the grasp and mark upgrade immediately, but their
main knowledge choices cost twice as much (except for the first spell,
the robes and the blade upgrade).

- Path specific robes have been introduced! They come with their own set
of quirks.

- Each Path has received a passive ability. This passive is upgraded
when you first create your robes, and again when you complete the Ritual
of Knowledge.

- Paths have been rebalanced as a result of the removal of cross-path
progression. Cosmic and Moon paths have received soft reworks.

- Upon unlocking the path 2nd level or reaching a total of 8 points
worth of knowledge, Heretics will lose the ability to blade break (and
the limit on blades all together).

- Ascension now automatically calls the shuttle with no possibility of a
recall.

- Late join Heretic has been removed.

### New UI 
<img width="750" height="635" alt="moon path ui"
src="https://github.com/user-attachments/assets/184ef783-5c9c-48a1-a2f7-4807ca93e990"
/>


### Knowledge shop

<img width="787" height="669" alt="Knowledge shop"
src="https://github.com/user-attachments/assets/3dc89b84-8c70-4d47-b612-54396e3ea6e7"
/>




### Quality of life //General balance changes

- Heretics will now gain X-ray vision for a few seconds when nearby an
eldritch essence (this effect has a cooldown).

- Ritual of knowledge now requires 1 uncommon item instead of 2. You may
now use a stunprod instead of a baton to complete the ritual. Beartraps
have been removed from the list of possible reagents.

- The maximum number of possible sacrifices required to ascend has been
reduced from 6 to 5 while the minimum has been upped to 4.

- Codex Cicatrix no longer requires a special pen to be made.

### Passive abilities

- Heretics now start with a passive ability. You can find what it does
on the path info tab after a path has been selected, and what they gain
when upgraded.

- Crafting your first set of Eldritch robes will bump your passive to
level 2.

- Unlocking the 2nd level will subsequently unlock your "Ritual Of
Knowledge"

- Completing the ritual of knowledge or ascending will net you the final
level.

### Path Specific Robes

- Armorer's Ritual is no longer a side knowledge. Each path will have
their own unique version of the ritual. This is placed after the 2nd
spell in the tree.

- Robes can no longer be destroyed by fire and acid, grant t4 flash
protection (Moth Heretics stay winning) and protection against basic
syringes, to bring them on par with other antagonist's armor sets.

- The recipe to craft the robes is now a set of armor/vest, a mask (any
mask will do now, not just gas masks), plus the unique reagent required
for the blades (Plasma for Cosmic, Trash For Rust, match for Ash and so
on)

- Wearing the robes as a non-heretic may yield some unfortunate
side-effects.

### Moon Path Rework

Moon path  rework.

Moon Heretics gain immunity to brain traumas and slowly regenerate brain
health. Equipping the moon amulette channels its effects through the
moon blade; making it unblockable and cause sanity damage instead of
brute. Ring leader's Rise now summons an army of harmless clones that
explode when attacked; the explosion briefly stuns non-heretics and
cause sanity and brain damage to them. Moon blade can also now be used
when pacified and Moon spells are no longer blocked by regular anti
magic, only mind magic protection.


**Cosmic Path Rework**

Cosmic path has received the biggest batch of changes alongside Moon.
The path has been dead last in ascension and pickrate (less than 5%) for
almost 2 years. It did gain some popularity over the last few months,
reaching the highest ascension rate in the game (12%) while mantaining a
relatively low pickrate.

Cosmic sits in a weird spot, where pretty much every knowledge
surrounding the path is either mediocre or, in the case of the
ascension, dysfunctional. Yet it has maintained a smidge of relevancy
due to how quickly Cosmic heretics can capture and sacrifice targets
thanks to Star Touch.

As a result, the best course of action would be to rebalance the
entirety of the kit; granting the heretic more tools to manipulate space
and dictate the flow of a fight, while lessening their ability to end a
confrontation by instantly sleeping their opponents.

lastly The Star Gazer is now ghost controlled ; And they shoot lazers!

<img width="636" height="451" alt="gazer gag 3"
src="https://github.com/user-attachments/assets/601d6881-c042-4e42-8ce6-ac90cd27848b"
/>


## Why It's Good For The Game


### Ok...but why do we want this?

Again, if you want my full reasoning, please check my doc
https://hackmd.io/@BiST8PJVRjiwVPY86U3bLQ/B11HyChz1g.

To keep it short and concise; Heretic is too complex and unintuitive for
its own good. Too impenetrable for new players and too abusable for
experienced players. This can be chalked up to a lot of poor design
decisions. But ultimately, what I believe being the biggest contributor
to the current status of Heretic is the ability to move into different
paths, also known as "Cross-Pathing".

### Cross Pathing my beloathed.

Cross-pathing, while cool in theory, overcomplicates the antagonist and
overloads them with power. Players dealing with the heretic are
incapable of working out what a given heretic can do. This also leads to
late game heretics having 3 rows Worth of action buttons and virtually
no weakness.

Over the last year, I've often received the understandable but also kind
of unfair accusations of making Heretic too powerful without a clear aim
or purpose.

My goal with the paths I've reworked over the last year (Rust,Void and
Blade) wasn't necessarily to just make them stronger (although that was
also part of the goal, as they were paths that were underperforming),
but for them to have more interactions with the sandbox and to better
live up to the fantasy presented to the player.

If an harbringer of frost gets countered by a cup of coffee, we probably
messed something up.


Unfortunately, the current incarnation of Heretic doesn't really allow
for surgical balance changes to specific paths. Every time a knowledge
gets buffed, we make every path that can easily tap onto that knowledge
stronger by default. It doesn't take a genius to understand why this
system is ultimately unsustainable.

### Blade Breaking

I feel that after a heretic has reached the near peak of their power,
they no longer need the ability to instantly escape any encounter. Check
my doc for my full reasoning.

## Less versatile, more specialized paths.

By removing cross-pathing, we remove a huge maintainability burden from
the antagonist. Paths can now be designed around clearer strengths and
weaknesses. They become easier to balance and less of an headache to
understand for everyone.

It also means we can give paths some needed quality of life quirks
without having to worry how such a change might have a knock-on effect
for other paths.

Ash heretics can finally let loose without dying by their own flames.
Cosmic Heretic can go to space without having to carry a modsuit. Moon
Heretic can use their abilities without fear of one random trauma
ruining their day, and so on.

### What a horrible night to have a curse...., wait how do I curse
people again?

As of right now the heretic tree has quite a hefty amount of trinkets
that pretty much never see use.

Partly because the tree itself is a nightmare to navigate. And partly
because why would anyone set up an elaborate plan or scheme when they
can unleash 2 rows of spell in the span of bunch of seconds.

Heretics mostly gravitate towards powers that push them towards greater,
more potent combat strength. If it doesn't contribute to killing people
quicker, it isn't worth doing for most. And given the opportunity cost
associated for taking those powers, they will remain that way so long as
there are better choices to be poached.

The new draft system encourages Heretics to play more with the tools at
their disposal. If you want to go for a specific combo from the side
path options, you may now do so by tapping into the knowledge shop.

Yes, the shop does include a few knowledges from the other paths. But
these are limited to 1 per path, are very expensive and can only be
unlocked very late into the shift.

## Drip Of the Mansus

The iconic heretic robe is actually sequestered to a side path that is
most easily access by only two paths at a time. Since heretic paths are
being made to be much more specialized, the most obvious way in which
this can be showcased is through an easily
identifiable outfit.

By using the robes, we can both telegraph WHAT heretic you are looking
at, and just how much power they've accumulated and when it is
reasonable to take the kid gloves off and treat them as a genuine
threat. If a heretic is in their
robes, that heretic is now a significantly more prominent danger to the
station.

It also serves as a useful means for gating some of the more powerful
effects of a heretic's path behind the robes, AND enable options for
disarming them of that power should they be captured without making it
something endemic to their mob.

A major problem with heretics is a lack of certainty as to how powerful
they have become. A heretics robes is one of the milestones to help
players dealing with heretics identify that.

### Will this be 100% fair and balanced?

This is a massive overhaul to a pretty complex and bloated antagonist.
I've done my best to show the changes to several maintainers and other
members of the community for their feedback. But at some point we'll
have to see how this behave in the environment to get a feel if
something is over or undertuned. (that's my way of saying, yes this is
likely gonna require a testmerge or two).

What I will say is that I'm not trying to change the core identity of
Heretic.

Heretics should have the upperhand in single encounters early on, be
able to joust a small group of players after they unlock their final
spell, and end the round when they ascend. They're a progression
antagonist. They should retain their payoff as well as pose a danger as
they grow stronger.

But if more players feel like they are more reliably able to play the
antagonist in more varied and interesting ways, rather than the
antagonist largely existing as a measuring stick for 'robustness' due to
its elitist design philosophy, then the rework has been a success. There
should be something for
everyone in the antagonist, as is true for all of our antagonist roles.
2025-10-15 22:34:51 +00:00
Roxy
f3848f1ef2 Renames flatten_list proc to assoc_to_values (#93453)
## About The Pull Request

`/proc/flatten_list()` -> `/proc/assoc_to_values()`, also changes the
code doc to mirror the language of `assoc_to_keys()`'s code doc

## Why It's Good For The Game

Having a proc called `assoc_to_keys` that takes an associative list and
returns a list of the keys, and also having a proc that takes an
associative list and returns a list of the values, and the latter not
being called `assoc_to_values` is very funny

## Changelog
🆑
code: renamed flatten_list proc to assoc_to_values
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-10-14 21:01:09 +00:00
MrMelbert
de0393e642 Dynamic Tester differentiates lights and heavies (#93089) 2025-10-06 13:25:45 +02:00
die
680f02c45b absolute minimum compile flag (#93255)
loads a smaller centcomm and map, this reduces init time to like 10
seconds.
## Why It's Good For The Game
for when you want to test something real quick and you don't need a full
environment
2025-10-04 08:13:50 -04:00
John Willard
e9e3df89d9 Latejoiners are buckled in again. (#93250)
## About The Pull Request

Not reported yet but I noticed this and immediately knew I broke it, my
bad.
Fixes latejoiners not being buckled into their chairs & Hangover station
trait effects, also merges the two hangover landmarks into one cause i
dont see why they had to be two, I put it in the same updatepaths as the
PR this is a fix to.

## Why It's Good For The Game

Bug fixes

## Changelog

🆑
fix: Latejoiners are buckled in to their chairs & Hangover station trait
now kicks their effects in again.
/🆑
2025-10-04 04:43:06 +02:00
MrMelbert
d664be4c78 Ensures personalities are loaded before prefs are loaded (#93265)
## About The Pull Request

Aaaaa if you load fast personalities aren't instantiated so personality
loading wipes everything out.

I don't know the best way to ensure personalities are loaded before
anyone could load in unfortunately, so I just threw it in. Will need to
ask around.

## Changelog

🆑 Melbert
fix: Fixed personality wiping
/🆑
2025-10-04 04:40:16 +02:00
ArcaneMusic
f74b725961 Ore vent sizes are now divided up based on their distance to the mining base (#92943) 2025-10-03 18:07:52 +02:00
MrMelbert
3ea7b03369 Accentuate the positive with **Personality**: A (soft) mood rework (#92941)
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
2025-10-02 19:00:13 +00:00
Bloop
a7b1f8f77a Adds more detailed logging data to dynamic (#93060)
## About The Pull Request

Tin. It annoyed me how useless the logging was for forcing a dynamic
ruleset. "but preparation failed!" (ok, but why?)

So this just adds more detailed explanations for why the preparation
failed.

<img width="640" height="47" alt="image"
src="https://github.com/user-attachments/assets/cc1f9e94-293e-422d-bd16-0ae5f28fd1eb"
/>

## Why It's Good For The Game

Better logging and clearer admin messages.

## Changelog

🆑
qol: improves admin logging of forced dynamic events.
/🆑
2025-10-02 20:51:13 +02:00
John Willard
d3dd437437 Lobby TV screen shows an icon of the overflow job (#93023)
## About The Pull Request

Hey so remember that TV thing I added, and I wanted it to be useful for
overflow jobs so I added it in, but couldn't make it look good with
runechat so I made it only appear post-roundstart, rendering it utterly
useless?

Yeah, I do too, so I've come back to fix it with the help of stealing
other people's code (I'm a lazy individual) - Taking Absolucy's work in
https://github.com/Monkestation/Monkestation2.0/pull/4589 for this.

Now it shows an icon of the job with an active overflow under the TV's
effects, and has a tooltip if you hover over in case you don't
understand what it's demonstrating.


https://github.com/user-attachments/assets/97489f93-f40d-47f9-aea2-6cc32c8fcba3

## Why It's Good For The Game

The TV shows overflow information before the round starts, allowing
people to actually see and react to the information rather than only
being shown to latejoiners. I prefer it this way as I don't want to have
to ensure the different things we may put on the TV's runetext all shows
up properly.

## Changelog

🆑 Absolucy, JohnFulpWillard
image: The Lobby TV now shows an icon of the overflow job.
/🆑
2025-10-02 20:04:39 +02:00
John Willard
fd752f043d Easy multi-z support for alarm console (+spawn changes) (#93198)
## About The Pull Request

Station alarm consoles now register to all Station Z levels+Areas if
they were created on a station Z level (this doesn't include mining, but
station ones will see mining areas), otherwise will be a "local" console
to that Z level only.

Mostly the same applies for Cyborg/AI, but if they were built on a
non-station Z level then they have their Z level added on top of Station
Z levels, so example Nukie saboteur borgs will see alarms they might
need, while a Golem/Oldstation AI will also be able to see their own
alarms.

Because of how alarms and spawning in worked, Cyborgs/AIs had CentCom's
Z level as something it would detect, so we simply create the mob at the
spawn location rather than on the title screen during Initialization,
fixing that issue as well.

## Why It's Good For The Game

Adds easy multi-z support for station alarms and removes the previous
bandaid of having to deconstruct your board and multitool it or map in
every single station alarm console to allow station alerts (which is
quite silly) which was done in
https://github.com/tgstation/tgstation/pull/88343.

Closes https://github.com/tgstation/tgstation/issues/61592
Closes https://github.com/tgstation/tgstation/issues/83042
Closes https://github.com/tgstation/tgstation/issues/69314

I find this solution better since it catches pretty much all use cases
without the need for special subtypes and needing players to actually
know the difference between these things.

## Changelog

🆑
fix: Cyborgs and AIs will now see alerts of the whole station rather
than solely the Z level they were spawned on.
fix: Cyborgs and AIs will no longer get alerts about Thunderdome.
/🆑
2025-10-02 18:12:57 +02:00
SimplyLogan
721428c65a Status Display Automation & NT Logo Change (#93088)
## About The Pull Request

- Status Displays update automatically for emergency alerts and show
round start logos by default instead of a blank screen.
- Tested in game with manual graphics and with triggered events.
- There is also a priority system, some emergencies will display
temporarily if a higher priority (shuttle call) is in progress.
- It also has checks on when something ends, i.e if radiation storm
happens, the alert for that goes away after the storm passes instead of
staying on the display.
- The manual buttons on the comms console to update the screens are
still there and work with this.
- BLOB file tweaks - All blob features works but with non blocking
cleanup as Linter threw errors.
- Also found a nicer sprite from AI core to use for the NT logo on the
displays since we'll be seeing it on more, the current one is just a bit
too bright

| Default logo | Alert Level Auto Switch | Events "can" interrupt
shuttle call display but only for 30 seconds |
|--------|--------|--------|
| <img width="443" height="182" alt="image"
src="https://github.com/user-attachments/assets/4027d8cc-041a-4e26-8120-742bf38f9c8a"
/>| <img width="444" height="181" alt="image"
src="https://github.com/user-attachments/assets/267363be-7f3a-4b63-a412-ea74c9d23c60"
/> | <img width="432" height="172" alt="image"
src="https://github.com/user-attachments/assets/842b9bfd-6e32-4833-8c06-42518dd8c0d2"
/> |

**Nanotrasen Logo Replacement - Left is original - Right is new**

<img width="181" height="82" alt="image"
src="https://github.com/user-attachments/assets/ac78d1c2-059b-4ab5-9d2c-3e59bec87620"
/>


## Why It's Good For The Game

- Status displays leave an empty void on the walls in rounds, this adds
a bit more value to them
- Should make the screens feel busier/more dynamic and the game a little
more engaging
## Changelog
🆑
add: Status displays now show logo at round start - Status displays now
change more often for alerts and other key events
fix: Blob non blocking cleanup - Should have no change in player
experience
image: Replaces bright blue NT logo with the more subtle slightly
animated sprite from AI core, fits nicer.
/🆑

---------

Co-authored-by: loganuk <falseemail@aol.com>
2025-09-30 19:50:24 +02:00
Ghom
c957a46a5d Whether something is thrown by a nearby explosion depends on its move_resist now. (#92958)
## About The Pull Request
Objects other than those that are either anchored or have infinity
move_resist can now avoid being thrown by explosions if their
move_resist is high enough for the "tier" of explosion they're subjected
to. This means anchored/bolted AIs are no longer thrown by explosions,
and anything other than 'devastating' (point-blank sorta) explosions
won't chuck mechs around, for example.

You can view the values by looking at the code, the PR is overall pretty
small.

## Why It's Good For The Game
Mechs are sturdy and, as well as many other mobs and objects, shouldn't
be thrown around if they're standing by the rim of a weak-ass explosion.

## Changelog

🆑
balance: Some sturdy objects that you cannot just grab drag around, like
mechs, are more resilient against being thrown around by weaker
explosions.
fix: Some things, like bolted AIs, aren't thrown around by explosions at
all.
/🆑
2025-09-27 01:20:57 +00:00
MrMelbert
750ca9d2ec Two as anything greps (and some other cleanup) (#92974) 2025-09-20 13:44:28 -04:00
SyncIt21
beb50296b6 Ensures uniform distribution of minerals across ore vents & non zero material boulders (#92996)
## About The Pull Request
- Fixes #92972

There were multiple problems with code that I can't be asked to explain
but here is the intended output(`ore_vent_minerals` contains the copy of
the list `ore_vent_minerals_lavaland` which we actually modify & not the
global list itself)

<img width="481" height="241" alt="Screenshot (512)"
src="https://github.com/user-attachments/assets/ed4d2659-b78c-4b99-ae68-e6fad4f116e4"
/>

All ore vents will now have at most 4 minerals but because we use an
associative list it is possible for a mineral to get picked more than
once in the same iteration resulting in old values getting replaced
which isn't a problem but just a point to be known so you don't always
get vents with 4 minerals

Another problem i ran into debugging is that some vents churn out 0
material boulders. That had to do with rounding down of the logarithmic
function which returned 0. We now ensure that never happens

## Changelog
🆑
fix: ore vents have unique distribution of at most 4 minerals without
rare ones being repeated
fix: ore vents should no longer be produce 0 material boulders
/🆑
2025-09-17 21:28:40 -04:00
FalloutFalcon
d2f34e33be moves abstract_type up to datum, spawners wont spawn them (#92909)
## About The Pull Request
moves all implementations (im aware of) for "Im a parent type dont spawn
me please" to the datum layer to standardized behavior
adds a standerized proc for filtering out "bad" items that we dont want
spawning. applies to it the subtype vendor, gifts, and a new spawner and
mystery box for a random gun (neither playerfacing)
"port" of https://github.com/shiptest-ss13/Shiptest/pull/4621



https://github.com/user-attachments/assets/22f6f0b2-b44e-411a-b3dc-6b97dc0287aa

small warning: I dont have EVERY abstract type defined right now but,
ive done a good enough job for now. Im tired of data entry rn
## Why It's Good For The Game
standardizing behavior. Might be a micro hit to performance however

having this lets us not rely on icon state to determine whether
something is a parent type and makes it much easier to tell something is
a parent type (could be applied further to things like admin spawning
menus and things like that).

need feedback on if this is actually good for the game.
## Changelog
🆑
add: Soda cans show up in the silver slime drink table.
add: Examine tag for items that are not mean to show up ingame.
refactor: Standardizes how gifts rule out abstract types.
fix: gifts no longer check if something has an inhand, massively
expanding the list of potential items.
/🆑
2025-09-13 00:36:15 +02:00
MrMelbert
da9eb945fc Adds a 1/5 chance for Paradox Clone to spawn two for the price of one (#92855)
## About The Pull Request

Paradox Clone ruleset has a 1/5 chance of spawning an additional clone
of the same target. This chance is configurable (so server operators can
disable it), but the amount of clones it adds is not.

The second clone is *not* on a team with the first. Paradox Clone's
primary objective has been updated to `Be the only [x] alive`, rather
than `Kill [x]`.

- [ ] I tested this pr

## Why It's Good For The Game

A while back someone suggested "What if Paradox Clone spawned a third
clone with the objective to protect the guy instead of kill them"

I thought this sounded pretty neat but the idea of spawning an antag
that worked against antags seemed to be grounds for problems. So I stole
half the idea.

This adds a little more variety in Paradox Clone happenings:
- Clones have no idea or indication if there are other clones (unless
you spawn together - which is not guaranteed), so each clone is less
sure of things and has to improvise more
- Neither the clones nor the crew can be fully complacent after dealing
with one "clone"
- More plausible deniability for Genetics or Changelings to mess with
people
- And yes, even the clones aren't 100% sure if the *other* clone is real
or fake, so now they're roped in on the fun

## Changelog

🆑 Melbert
add: There's a 1/5 chance that Paradox Clone spawns a second clone if
there are enough candidates. Neither clone is aware of or on a team with
the other - There can only be one.
add: Paradox Clones are now tasked to `Be the only [x] alive`, meaning
means of identity cloning (such as Genetics or Changelings) may throw a
wrench in your plan.
/🆑
2025-09-12 16:44:11 +02:00
SimplyLogan
a1fdc715df Request Emergency Temporary Access - RETA (#92753)
<img width="819" height="348" alt="image"
src="https://github.com/user-attachments/assets/0424ec76-2648-43d3-8e94-d44558b44bcf"
/>

## About The Pull Request

Follow up from #92751 - Not to conflict with it but as an idea on how to
change it for the long run.

Paramedics currently start with broad department access. This proposal
replaces that by granting temporary department access only when an
emergency is called.

When a player presses "Call X" on a Requests Console, responders called
receive temporary access to the common work areas of that department.

![image](https://hackmd.io/_uploads/r1xNOv0Fle.png)
> [Security] The Automated Announcement System coldly states, "SECURITY
EMERGENCY in Research Lab! (Called by Sloan Keppel, Scientist) RETA door
access granted to responders."

> [Science] The Automated Announcement System coldly states, "RETA
activated (Called by Sloan Keppel, Scientist). Security personnel now
have temporary access to your areas."

They do not receive access to sub rooms or high risk areas.

- Access lasts 5 minutes (configurable)  
- Access is removed when the timer expires or the emergency is resolved
- No mapping changes are required (uses existing request consoles)  
- Removes Paramedics round start access but gives them external access
to rescue bodies in space by default
- Flashing blue lights on doors affected by temporary access
<img width="897" height="837" alt="image"
src="https://github.com/user-attachments/assets/97980cb4-3481-44b6-9f96-fc241ca16f57"
/>


**The full document is here:
https://hackmd.io/@NM8HxpG_Toahg5pimrpsKw/Hk0tKq3Yxe**

**Wiki documentation for players and admins:
https://wiki.tgstation13.org/Guide_To_RETA**


## Why It's Good For The Game

- Removes paramedics’ broad “Doctor+” access.
- Keeps them effective as emergency responders.
- Responders must be called in OR access upgraded.
- Keeps sensitive areas secure.
- Prevents spam or stacking through cooldown.
- Scales across all maps without mapper work.
- Gives admins a new tool for temp department wide access
- Dedicated logging file and unit tests
- Very performant, only affects living players with connected mind
- Gives Request Consoles more use as an alarm button and further utility
- Imagine later on "Request Janitor" which sorts access and tells
Janitor where needed

## Changelog
🆑
add: RETA System - Request Consoles give temporary access to responders
when used for some areas. Paramedics lose broad access but get external
space access.
qol: Request consoles now show name and job role on call message &
Cooldown on spamming calls + sound prompt
qol: Medibot access no longer based on Paramedic trim ID - Still has
original access
image: Added "lights_reta" for temporary door access when in effect
admin: Gives admins "RETA door access" verb for giving department wide
area access on maps.
config: New config settings for RETA

/🆑
2025-09-10 23:33:40 +00:00
Bloop
a029668e56 Makes the dynamic tester tiers / population caps start at 1 (#92870)
## About The Pull Request

No antags are spawned at 0 anyway, and it causes some runtimes. 

## Why It's Good For The Game

## Changelog

Not player-facing
2025-09-07 11:12:38 +02:00
Pickle-Coding
fb1bc13935 Excited groups no longer breakdown during certain gas reactions. (#92412)
## About The Pull Request
Excited groups no longer breakdown during certain gas reactions that are
considered too volatile without necessarily being a fire.
## Why It's Good For The Game
This stops shit like antinoblium from breaking down and equalising with
a large chunk of the station instantly. Should make that feel more like
goop spreading.
## Changelog
🆑
balance: Some gas reactions will prevent excited groups from breaking
down.
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2025-09-02 21:39:37 -07:00
subject217
ef6aed1974 fixes a typo in an admin message about achievements cleanup (#92831)
## About The Pull Request

the verb is achievements-admin-panel

## Why It's Good For The Game

tells the admin what to actually type

## Changelog

🆑
spellcheck: fixed a typo in the admin message about achievements cleanup
/🆑
2025-09-02 18:59:03 -07:00
MrMelbert
67d27ffe91 Accounting Glowup: Advances, Pay raises and cuts, and more (#92419)
## About The Pull Request

Fixes #92188

1. The Accounting console now has a new UI

<img width="757" height="486" alt="image"
src="https://github.com/user-attachments/assets/0c6ce73f-ae1c-4a54-b6ba-bcc3b3232d13"
/>

2. The Accounting console can now dish out advances on paychecks, giving
you for full paycheck early. You can give up to 3 advances. This of
course means your next paycheck is not paid out when relevant.

3. The Accounting console can now change paycheck sizes of crewmembers -
up to 1.5x and down to 0.5x.

## Why It's Good For The Game

- Gives the HoP some more duties, now being able to dish out money on
request, reward good behavior, or punish bad behavior.

## Changelog

🆑 Melbert
add: Accounting Console: New UI!
add: Accounting Console: Now can give advances to crewmembers
add: Accounting Console: Can now give pay raises or pay cuts
add: Accounting Console: Now only printable in the security lathe
add: Accounting Console: A spare board is now now found in secure tech
storage.
fix: Fix vending machines adding payments to audit log twice.
fix: Non-crewmembers are no longer shown in the accounting console
/🆑

---------

Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
2025-09-02 18:57:20 -07:00
Tim
dce0bf9f9a Correct bitwise logic for bitfield checks (#92609)
## 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.
2025-09-01 02:16:22 +00:00
MrMelbert
80069f4830 Increase repo default max number of traitors spawned roundstart (#92478)
## About The Pull Request

Repo default max traitors upped from

1 per 38 players (up to 2 traitors at 50 pop, up to 3 traitors at 80
pop)

to

1 per 24 players (up to 3 traitors at 50 pop, up to 4 traitors at 80
pop)

Note: The ruleset can be executed twice or even thrice depending on RNG,
meaning a particularly chaotic round may spawn with up to 6/9 traitors
at 50 pop (and more may be added via midrounds and latejoins).

## Why It's Good For The Game

#67823 changed this number

This was done because dynamic would force spawn midround traitor IF any
midround ruleset failed to execute. But dynamic no longer does that. So
this value should be reverted.
2025-08-30 12:49:27 -05:00
MrMelbert
c2b8ef1d09 Allow localhosts to set "dev override preferences" to load a specific preference savefile for guests (#92770)
## About The Pull Request

A verb is now available on localhost called `"Export Save as Dev
Preferences"`

This exports your current savefile to `/config/dev_preferences.json`

If you then connect to your localhost as a guest, it will load
`dev_preferences.json` as your preference datum

This allows for devs testing the game locally to load preferences for
guests.
(Guests connecting to live servers are completely unaffected.)

## Why It's Good For The Game

Initially I only did this because the recent keybinding changes have
destroyed my muscle memory when testing w/o logging in.

But as I worked on it I thought of a few other usecases, like when
implementing preference version migration - the dev preference is never
saved which means you can re-compile as much as you want without needing
to revert your save manually.
2025-08-29 18:36:56 -04:00
Rhials
822a1d3d55 Fugitive Hunters spawn again (#92761)
## About The Pull Request

Fugitive hunters no longer runtime on their timer check. 

The `check_spawn_hunters` proc was getting passed the fugitive hunters'
backstory (not needed in the proc) instead of the time until their
expected spawn.
## Why It's Good For The Game

The fugitive hunters are a pretty important part of the fugitive antag.
It's like playing hide and seek without any seekers. It sucks.

Closes the unresolved part of #92618.
2025-08-29 15:15:08 -05:00
necromanceranne
cb7e44e7ee Updates the AFK logout report to utilize configs for it's timers (#92662)
## About The Pull Request

Rather than use hardcoded timers for the logout report, the report
instead utilizes a timer based on config values. The default value is
the current live value.

This timer can also be configurated to utilize randomization. Currently,
it defaults to randomizing between -3 minutes to +3 minutes for when the
report is sent.

The logout report timer is also added to the admin log.

## Why It's Good For The Game

This shouldn't be dictated by the codebase, as it is an admin tool.
2025-08-26 12:29:56 -05:00
AnturK
53a034c5b0 Adds admin panel for achievement metadata cleanup (#92345) 2025-08-25 23:11:47 -06:00
Rhials
8476ac925e Solo fugitives spawn with a toolbox, like group fugitives do (#92685)
## About The Pull Request

Solo fugitives weren't getting their toolbox because
`equip_fugitive_leader()` doesn't get called. While this makes sense,
seeing as there isn't a "leader" to equip, there isn't actually a reason
not to call this for single fugitives.

So, `equip_fugitive_leader()` now runs for all fugitive quantities. If
someone wants to add more essential equipment for newly spawned
fugitives, it should go there alongside the toolbox.
## Why It's Good For The Game

Partially handles #92618.
## Changelog
🆑 Rhials
fix: Solo fugitives now spawn with a mechanical toolbox, as intended.
/🆑
2025-08-24 07:29:58 +02:00
Kashargul
0bd054538a follow up fix for #92508 (#92571)
## About The Pull Request
This is a follow up patch for #92508, otherwise than said in coderbus,
calling the cleanup too early can lead to bad assets. We'll now keep
track of the count of assets in generation and only clean up after they
all have passed the generation.
<img width="3067" height="455" alt="grafik"
src="https://github.com/user-attachments/assets/0b65acf3-464f-436c-8a60-84c9472be6cd"
/>
## Why It's Good For The Game
## Changelog
There should be nothing player facing here as the asset job fails
straight up if the cache was cleared too early.
2025-08-15 14:51:58 +02:00
Time-Green
a47835a04f 1X3 ICEBOX | Wilderness Expansion (Now not extremely slow!) (#91920)
## About The Pull Request
Turns the surface z-level of icebox into a 1x3 area, effectively adding
2 wilderness new z-levels surrounding the station

Because it's not always clear to other people what I'm talking about,
this is what I mean with making the surface level a 3x3 z-level

The wilderness z-levels are gridlinked, instead of crosslinked, which
just means the connections are consistent and not randomized. If you
keep going right, you will always end up where you started again,
eventually. This also removes the black border around the surface icebox
z-level (cause you can just go there now)

**Wilderness levels**
I've added some Z-level templates that can be generated. They're
incredibly basic, but all can spawn runes on them as well.
- Snow planes (5x)
- Ice planes (1x)
- Forest planes (1x)
- Mountain planes (1x)

I've also tweaked surface generation quite a bit. It being completely
covered in bones always felt weird, and the intersparsed rocks and
chasms never sat right with me. The default overworldgen is now more
like the Forested trait, but with more sparse trees.

All of this is modular btw. You can increase the amount of z-levels,
make any space z-level be unrandomized gridlinked or add your own
wilderness z-levels (either to your own map or icebox)

## Why It's Good For The Game
Icebox exploration is kind of depressing. We have this unique setting,
but we can't really go anywhere? You can go down and find that one pool,
which is about the peak of exploration of icebox.

Now you can literally explore the entire round and get incredibly lost!
It's also a great opportunity for mappers! (Especially since the
templates I made were made rather quickly as I wasn't sure if this had
merit).

2 extra z-levels isn't a lot, but it'll let us further develop planetary
wilderness z-levels further without impacting load times that much.
Maybe 3x3 icebox can be real in the future, but for now 1x3 icebox will
have to do
2025-08-15 01:58:58 -05:00
SmArtKar
d8120d30e4 Renames "Tick Overrun" in MC overview to "Subsystem Overtime" (#92556)
## About The Pull Request

Because we suck at naming things, and this is SS overtime and not tick
overrun

## Changelog
🆑
admin: Renamed "Tick Overrun" in MC overview to "Subsystem Overtime" to
be true as to what it actually displays
/🆑
2025-08-15 00:37:23 +02:00
necromanceranne
ae3b29018a Declutters settlers a bit. (#92425) 2025-08-14 12:52:05 +00:00
_0Steven
089c6a8f94 Refactors say modes and custom say verbs. Extends custom say verbs to more situations, forwards more spans. (#92127)
## About The Pull Request

Oh man, so this entire pr started because of two things:
1. A kinda hacky fix to #92123 that got closed a good while ago.
2. A borg I know mentioning you can't do custom say verbs over robotic
talk.

Which subsequently led me down this rabbit hole of say modes and custom
say verbs.
So! The most wide-reaching thing this does is merge the custom say
verb/radio emote logic that used to be specialcased in
`compose_message(...)` into `say_quote(...)`, renaming this to
`generate_messagepart(...)` with its new functionality. This means
things that don't use the exact same chain as living things talking
normally can still generate custom say verbs if given that message
modifier.

Then, we split up say modes into a "can we do this" and "try to do this"
check to reduce conflicts (like #92123), and forward more of our data to
the latter. This allows us to then edit the say modes to actually make
use of that data, and with the previous addition of
`generate_messagepart(...)` allow for custom say verbs to be used.

In doing this I realized the logging was kind of awkward and all over
the place, so we create the new logging helper `log_sayverb_talk(...)`
which handles selecting how we should log things based on the given
message modifiers.

For better or worse I forgot about this pr for a few weeks, so I don't
perfectly remember all the details, but those are the big key parts.
## Why It's Good For The Game

Fixes #92123.

I think custom say verbs are some of the best flavour we have for
talking over radio, and any situation benefits from that being possible.
It's great to be able to tap your microphone, and it's hilarious for an
AI to be able to emote beaming an image directly into the heads of their
borgs over robotic talk.

The rest is mostly cleanup.
2025-08-12 16:24:50 -05:00
Kashargul
8cd44d26c6 fix asset loading subsystem (#92508)
## About The Pull Request
The entire asset loading had multiple issues.

Firstly, we could hit a tick check after an asset was generated and
didn't remove the index, leading to the asset being generated twice.

Secondly, we had the issue that the icon forge batching uses UNTIL to
wait until generation finishes. This led to the situation that the
entire subsystem fire proc was paused outside of the internal tick check
pause.
## Why It's Good For The Game
Especially on larger sprite sheets or when there're many to be generated
this led to the situation that we looked up a rust job multiple times:
 
`[2025-08-08T18:42:11] Runtime in
code/modules/asset_cache/iconforge/batched_spritesheet.dm,200:
Spritesheet design UNKNOWN ERROR: NO SUCH JOB`

## Changelog
No player facing changes.
2025-08-11 21:15:50 +02:00
SyncIt21
0b6101a37e General maintenance for vending machines (#91987)
## About The Pull Request
**1. Code Improvements**
- Removed unused vars `coin`, `bill` & other stuff
- Removed duplicate definition of `on_deconstruction()`
- Autodoc for a lot of procs
- Merged smaller procs into larger ones to avoid scrolling in the code
editor & reduced overhead
- Split the vending machine file into several smaller files for easy
code management

**2. Qol**
- Implemented vending machine ads. They now display random stuff on the
UI


https://github.com/user-attachments/assets/9720ea60-f268-4ca2-940d-243e3d0ac75f
- More error messages for custom & normal vendors as to why an item
could not be loaded
- Custom vending machines can be deconstructed safely via crowbar
without any explosion only after unlinking your account from the machine
else you get the same explosion. Upon deconstruction all loaded items
are moved into its restock canister meaning the machine can be safely
moved with all its products just like a regular vending machine to a new
location

**3. Fixes**
- Fixes #81917. Any returned items in the vending machine now show up as
free in the UI & won't cost credits to buy them
- Fixes #87416. Custom & normal vendors now keep track of products
removed via `Exited()` so the UI gets always updated
- Fixes #83151. Items with different names & custom prices now show up
in unique rows
- Fixes #92170 Custom vendors now show the correct icon for inserted
items
- Closes #80010. From the above fix this situation is impossible so it's
safe to close this as a duplicate
- Closes #78016 same problem as above with `Exited()` duplicate
- Custom vendors can now actually be used by players who are not the
owner instead of locking down the UI
- Vending machines keep track of `max_amount` of stocked items by hand
as well & not just RPED

**4. Refactor**
- Separates custom vending machine code from normal vending machine
code. This prime Marely focus on the `vending_machine_input` list which
now only exists inside the custom vending machine
- Compressed the UI code for vending machine so both custom & normal
vending machines can send the same data instead of separating the 2.
Overall less code
- Moved attack chain from `attackby()` to `item_interaction()` for
loading items

## Changelog
🆑
code: cleaned up vending machine code
qol: vending machines now have more product slogans you never heard
before
qol: custom & normal vending machines now have more feedback on why an
item could not be loaded
qol: vending machines now display random ads on the UI
qol: custom vending machines can be deconstructed via crowbar safely
only after unlinking your account from the machine.
qol: upon deconstructing a custom vendor all its products are moved into
its refill canister & it will be restored when reconstructing the
machine elsewhere
fix: Returned items to the vending machine now show up as free in the UI
and won't be greyed out if you don't have credits to get them back
fix: items that leave the vending machine by any means will update the
UI in all cases
fix: loading items by hand to the vending machine now respects the
max_amount for that category
fix: custom vendors can now actually be used by players who are not the
owner thus enabling them to transfer credits to the owner during
purchases & basically they do their job again
fix: custom vendors now show the correct icon for inserted items
fix: Items with different names & custom prices now show up in unique
rows in custom vendors
refactor: separated custom & normal vending machine code. Reduced UI
code & improved attack chain
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2025-08-11 14:37:13 +02:00
SmArtKar
87e1ef6f64 Changes human name updates to be request-based instead of being automatically done every single tick (#92393)
## About The Pull Request

Changes human name to update whenever anything that could result in
their visible name changing occurs, such as changing IDs, equipping
gasmasks, picking potted plants, etc. Currently name updates occur every
``Life()`` tick and in a few "special" cases, which causes a lot of name
changes from sources such as equipment to not apply until the mob ticks,
and makes us waste a tiiiny bit of CPU time on name updates.
I've also slighly cleaned up human /Life() and made species'
``spec_life()`` not run when the mob is dead, as it was causing certain
unintended interactions, such as slimepeople regenerating blood while
dead.

## Why It's Good For The Game

Microoptimization, ensures that correct names are always used (in case
something could update their name but the mob hasn't ticked yet), plus
its just a cleaner implementation
2025-08-08 13:01:12 -05:00
LemonInTheDark
0909348cea Makes the MC stat panel tab usable, and also nicer (#92405) 2025-08-08 19:32:46 +02:00
Arturlang
0bc42d6940 Fixes the issue of usr pointing to admins by making Trigger pass down clicker (#92354)
## About The Pull Request
Fixes the issue of usr pointing to admins by making Trigger pass down
clicker, as usr is fucky and can be passed down by other unrelated
procs. Fun.
Added the clicker arg to all usages of Trigger as well
Also changes isobserver check in antagonist ui_act code that prevents
observers from clicking UI's instead to check if the ui.user is
owner.current
## Why It's Good For The Game
Fixes admins giving heretic to people opening the heretic UI for the
admin instead
2025-08-05 22:58:40 -05:00
FalloutFalcon
b76d0e6ed0 debug proc for visuallizing spatial grids (#92325)
## About The Pull Request
debug PROC (because its super laggy so i locked it behind a proc call on
a subsystem) for painting the world based on the cell its located in

pulled out of my port of spatial grids in
https://github.com/shiptest-ss13/Shiptest/pull/4399


https://github.com/user-attachments/assets/07008518-e418-442b-ab80-6557e936fee2
## Why It's Good For The Game
useful for debugging spatial grid issues. also helped ,e discover a bug
since it calls get_cell on every atom.
## Changelog
🆑
code: debug proc for painting the world based on spatial grid.
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2025-08-04 09:09:16 -07:00
SmArtKar
d0770346d8 Fixes constant and realtime station time being calculated incorrectly (#92428)
## About The Pull Request

Sorta-config related, replaced magic numbers in station time code with
defines and fixed station time calculations.
Constant time was (incorrectly) adjusted by your timezone in actual
station time calculations despite us changing all time ops to UTC+0, and
realtime was adjusted by your timezone in the wrong direction (realtime
returns GMT, and station time itself deducted your timezone again). Also
fixed station_time_debug debug proc using seconds instead of deciseconds
(by converting it to defines)

I've also made realtime config change time dilation factor from 12 to 1,
as its intended to make station time reflect real time *in the server's
own timezone*, and 12x time dilation made it deviate from that extremely
quickly (this does not affect gameplay in any meaningful manner, station
time dilation only affects displayed clock time and not any in-game
events except nightshifts)

- Closes #92380

## Changelog
🆑
fix: Fixed constant and realtime station time being calculated
incorrectly
/🆑

---------

Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
2025-08-04 03:06:34 +02:00