345 Commits
Author SHA1 Message Date
Alexis 88e84645b1 Merge commit '6b52b564a50e4f3091470529c683587e5de15d49' into upstream-sync-7-22-2026 2026-07-22 13:39:09 -04:00
0716e3fff4 Atmos refactor & speedup by utilizing BYOND 516 vector functions (#96448)
## About The Pull Request

### Summary
This PR changes internal structure of `/datum/gas_mixture`:
`gases[gas_id][MOLES]` refactored into `moles[gas_id]`,
`gases[gas_id][ARCHIVE]` into `moles_archive[gas_id]` and
`gases[gas_id][GAS_META]` into `gas_meta` static variable. This allows
us to use BYOND 516 vector functions for calculating total moles and
heat capacity. Also it simplifies some parts of the code, allowing us to
get rid of macros `ADD_GAS` and `ASSERT_GAS`. According to the profiler
`/turf/open/process_cell` time is reduced by ~20%.

### Details
`gas_mixture.gases` was a nested 2d-list with MOLES, ARCHIVE and
GAS_META for each gas_id. For example, to get gas moles you had to do
`gases[gas_id][MOLES]`. I've changed this structure to be as follows:
`moles[gas_id]` - moles for the gas, `moles_archive[gas_id]` - archived
version of moles, `gas_meta[KEY][gas_id]` - static var with meta
information for the gas.

Since I removed key GAS_META from the gases, `gas_meta` was moved to the
static variable and the order of keys in the array was changed from
`gas_meta[gas_id][META_KEY]' to 'gas_meta[META_KEY][gas_id]`. This was
done to allow using it in vector calculations (for example heat capacity
or fusion power). Static variable access is very fast and it is
considered as accessing a global in the bytecode.

Byond 516 introduced new vector functions: `values_sum`, `values_dot`
and others. These functions are very fast, but operate only on
associative lists. This allows us to change the way we calculate
total_moles and heat_capacity - very hot and heavily used functions.
`total_moles()` became just `values_sum(moles)`, and `heat_capacity` is
just a dot product: `values_dot(moles,
gas_meta[META_GAS_SPECIFIC_HEAT])`.

As a side bonus, since `moles` is just an associative list, you don't
really need old macros `ADD_GAS` and `ASSERT_GAS` - all they did was to
make a copy of a list[3] with default value [0, 0, gas_meta] for
specific gas. Now when you're adding gas you can just use `moles[gas_id]
+= amount` and when you query amount of gas you can just query the key
(for example `moles[/datum/gas/oxygen]`) if the key does not exist, it
returns null and works as 0 for all arithmetic and logic operations. For
example, old code would be `if (!air.gases[/datum/gas/oxygen] ||
air.gases[/datum/gas/oxygen][MOLES] < 1)` and now it is `if
(moles[/datum/gas/oxygen] < 1)`. This simplifies some parts of the code
and also speeds things up.

For the performance comparison I used Tracy profiler. I've done many
different tests, and they all show slightly different numbers, but
overall speedup for `process_cell` is about 20%. (-20% to average time
per call from ). My testing setup was as follows:
Load Icebox, drop 30/60/90 radius bomb in the middle of the bridge, set
code to blue, wait 10 minutes until the round ends.
Also I fixed random seed in the master controller and in the planetary
gas randomization so generated maps are the same between tests.
Althought it's not very realistic, it generates a lot of samples for the
`process_cell` (around ~3.5M per 10 minutes).
Another test I did was a plasmafire in an 8x8 space, on runtime station,
it showed (-24% time on process_cell).
Another test was a emagged holodeck burn test, it showed (-13% time)
As for other functions of gas_mixture: `total_moles`: -50%(2x speedup),
`heat_capacity`: -65%(3x speedup), `share`: -30%, `react`: -20%. Timings
of all those functions is in microseconds range and they are very hot
(call count is in the same order as process_cell)

<details><summary>Some pictures from profiler</summary>
<img width="569" height="642" alt="process_cell"
src="https://github.com/user-attachments/assets/76fa0c27-719d-485d-9bfc-859fef788999"
/>
<img width="572" height="315" alt="image"
src="https://github.com/user-attachments/assets/f68497e9-4db8-4a9c-b43f-ad04e6dc5cac"
/>
<img width="569" height="317" alt="image"
src="https://github.com/user-attachments/assets/d7249e7b-f344-47a6-8b39-1bab0521182d"
/>
<img width="541" height="316" alt="image"
src="https://github.com/user-attachments/assets/1bef71fd-533d-40fa-a85e-7a803ad322f7"
/>
<img width="519" height="409" alt="image"
src="https://github.com/user-attachments/assets/51165289-174e-403d-a09c-787dd9af136a"
/>
<img width="523" height="318" alt="image"
src="https://github.com/user-attachments/assets/fe4b1db0-17d8-47f9-8fd0-e2ecef2ee66a"
/>
</details>

<details><summary>Setting up a profiler</summary>
If you wanna to reproduce my results here is a list of steps

1. download: https://github.com/goonstation/byond-tracy-writer (this one
has offsets for my version 1677)
2. build the dll, drop in the tgstation/ folder
3. download rtracy https://github.com/Dimach/rtracy
4. download Tracy profiler (0.13.1) https://github.com/wolfpld/tracy
5. uncomment `#define USE_BYOND_TRACY` in `_compile_options.dm`
6. build tgstation
7. open dream daemon, run the desired test, after round end dream daemon
closes
8. navigate to tgstation/data/profiler, find the `123412341234.utracy`
file
9. run `rtracty 123412341234.utracy`
10. open tracy-profiler.exe, press Connect, save the profiler data
11. repeat steps 5-10 with another branch, save another profiler data
12. open tracy-profiler, open first data, press compare, open second
data
</details>

## Why It's Good For The Game

## Changelog
🆑
refactor: Atmos refactor & speedup by utilizing BYOND 516 vector
functions
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2026-07-14 20:34:31 -07:00
GhomandGitHub adf838c32a Holidays content: Kitchen has more ingredients on some holidays, more mail items, special bar kegs on St Patrick Day, Beer Day and Talk-Like-a-Pirate Day. (#96509)
## About The Pull Request
This PR adds a simple holiday spawner type that can be used for objects
that are only spawned if the holiday they're associated with is being
celebrated. Right now it has three subtypes, all related to the kitchen
(liquid ingredient, powdered ingredient, meat ingredient).

The involved holidays are the fictional tiziran and mothic festivities
Atrakor's Might and Fleet Day. Extra stuff is also spawned on Bee Day
and Beer Day. On Vegan Day, the monkey meat slabs in the meat fridges
are replaced with plant-based meat slabs (killer tomato slices and pod
people meat, plus veggies) and the fridge is renamed from "meat fridge"
to "vegan fridge".

This PR also adds a few more holiday-specific mail objects such as
Speak-Like-a-Pirate Day, Fleet Day, Atrakor's Might, Chernobyl's
Disaster Anniversary (it's just a geiger counter), Monkey Day and
Draconic Language Day.

EDIT: I've decided to make the bar backroom beer keg into a spawner that
will spawn special kegs on specific days (otherwise it's a 1 in 25
chance). These kegs can contain drinks a little more refined than the
average beer keg. Also it comes with a resprite of kegs because the old
one was starting to look a little ass compared to other reagent
dispensers.

## Why It's Good For The Game
For being fictional festivities revolving around food and culture, and
despite the lot of recipes for moths and lizard people, we aren't
offering anything to chef players to let them cook said recipes beside
what's given on any bog-generic round. This is a step toward a slightly
less lackluster implementation of those festivities and recipes into the
game. Also chance for cooler kegs for the bartender.

## Changelog

🆑
add: The kitchen fridges may have additional ingredients on certain
holidays, in particular Atrakor's Might (lizardpeople) and Fleet Day
(mothpeople), and Vegan Day.
add: Added a few more holyday-specific mail items.
add: Replaces the beer keg in the bar backroom with special kegs on St.
Patrick's Day, Beer Day and Speak-Like-a-Pirate day. On any other day,
there's a chance that the beer keg will be replaced with one containing
whiskey or rum, or in rare cases, one of those special kegs.
imageadd: resprited the keg as well.
/🆑
2026-07-01 10:26:56 +12:00
Roxy de4c3b255d Merge branch 'master' of github.com:tgstation/tgstation into upstream-2026-06-23 2026-06-23 15:51:55 -04:00
SmArtKarandGitHub 9b110eb64e Reworks and fixes blood drunk miner megafauna (#96286)
## About The Pull Request

Blood-drunk miner has been reworked to change it from a DPS race into a
more dynamic fight

- Buffed health from 900 to 1300 (45% increase), slightly increased
speed (3 -> 2.5), increased saw damage (6/10 -> 8/12) to compensate for
other changes below
- Slightly reduced PKA shot damage (20 -> 18)
- Saw attacks now have a slightly longer delay inbetween hits
(especially in unfolded form), ***no longer are guaranteed to hit no
matter what*** (was a bug which forced players to eat 50 damage to the
face) and slow down the miner during the combo
- Singular PKA shot has been replaced with a telegraphed barrage of 3
projectiles, during which the miner cannot move, letting players gain
some distance
- Dash is no longer a teleport but a proper charge akin to that of
lobstrocities with a very short chargeup that deals no damage or
knockdown, but allows the miner to travel further
- Miner's attacks no longer give the target stun immunity for a brief
moment (why?)
- Default PKA it drops has been replaced with an infernal version, which
comes with a cheaper (30% vs 50% of the default one) in-built rapid
repeater (that also has a less punishing miss delay)

<img width="169" height="143" alt="Aseprite_UfXRbgVuqB"
src="https://github.com/user-attachments/assets/3ac257a4-5443-4c7f-a891-4e69f8188cb4"
/>

---

Full fight with a single basic pen and 2 legion cores, no PKC trophies:
(fumbled a bit midway though, pre-PKA projectile damage nerf)


https://github.com/user-attachments/assets/40c8af0d-035c-49da-861b-5e74ca7d7551

## Why It's Good For The Game

Current blood-drunk miner is a hard DPS check with unavoidable damage
(both due to the bug and instant dashes/PKA hits) that simply requires
you to facetank the damage using heals and kill it first before it kills
you.
This should make the fight a bit longer, more engaging and fairer than
it is right now.

## Changelog
🆑
add: Blood-drunk miner now drops an infernal PKA with an in-built
improved rapid repeater modification
balance: Blood-drunk miner has been reworked with new attacks and
patterns
fix: Blood-drunk miner's combos are no longer guaranteed to land even if
you move away from it
/🆑
2026-06-05 18:03:12 +02:00
+37 21b4095dfd [MDB IGNORE] [IDB IGNORE] Upstream Sync - 04/17/2026 (#5453)
Upstream 04/17/2026

fixes https://github.com/Bubberstation/Bubberstation/issues/5549

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com>
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com>
Co-authored-by: rageguy505 <54517726+rageguy505@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: Aliceee2ch <160794176+Aliceee2ch@users.noreply.github.com>
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
Co-authored-by: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Co-authored-by: Maxipat <108554989+Maxipat112@users.noreply.github.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com>
Co-authored-by: SimplyLogan <47579821+loganuk@users.noreply.github.com>
Co-authored-by: loganuk <fakeemail123@aol.com>
Co-authored-by: Leland Kemble <70413276+lelandkemble@users.noreply.github.com>
Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com>
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
Co-authored-by: Lucy <lucy@absolucy.moe>
Co-authored-by: siliconOpossum <138069572+siliconOpossum@users.noreply.github.com>
Co-authored-by: Isratosh <Isratosh@hotmail.com>
Co-authored-by: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com>
Co-authored-by: Neocloudy <88008002+Neocloudy@users.noreply.github.com>
Co-authored-by: Alexander V. <volas@ya.ru>
Co-authored-by: ElGitificador <168473461+ElGitificador@users.noreply.github.com>
Co-authored-by: Twaticus <46540570+Twaticus@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
Co-authored-by: Tim <timothymtorres@gmail.com>
Co-authored-by: Iamgoofball <iamgoofball@gmail.com>
Co-authored-by: Layzu666 <121319428+Layzu666@users.noreply.github.com>
Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com>
Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com>
Co-authored-by: mrmanlikesbt <99309552+mrmanlikesbt@users.noreply.github.com>
Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
Co-authored-by: John F. Kennedy <54908920+MacaroniCritter@users.noreply.github.com>
Co-authored-by: Cursor <102828457+theselfish@users.noreply.github.com>
Co-authored-by: Josh <josh.adam.powell@gmail.com>
Co-authored-by: Josh Powell <josh.powell@softwire.com>
Co-authored-by: Yobrocharlie <Charliemiller5617@gmail.com>
Co-authored-by: Hardly3D <66234359+Hardly3D@users.noreply.github.com>
Co-authored-by: shayoki <96078776+shayoki@users.noreply.github.com>
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
2026-05-16 00:56:00 +02:00
LT3andGitHub 24a9759859 Cargo manifest stamp payment consistency (#95832) 2026-05-04 16:33:30 -04:00
SmArtKarandGitHub a3498fdcd7 Material Science 1: A bunch of math (#95090) 2026-02-22 16:53:51 +11:00
_0StevenandGitHub 2ff55b02cd Fixes exporting stock blocks using its own elasticity value separate from the materials exports causing inexplicable stock block sell and elasticity values (#95139)
## About The Pull Request

Tin.
Or, less unhelpfully, this was two issues causes by the same thing:
1. Selling GMM stock blocks was resulting in inexplicably lower results
despite it reporting the material being at 100% elasticity.
2. The GMM was inexplicably showing elasticity resetting or cratering
whenever you sold a stock block for a different material.

Both of these were essentially caused by us using a separate export
datum for stock blocks, which had its own elasticity value independent
of the actual materials it was representing:

https://github.com/tgstation/tgstation/blob/3248f9b4e8bbdeef02ad9482ea80f628f730f10d/code/modules/cargo/exports/materials.dm#L195-L218

But then, how did it reset or especially crater other materials'
elasticity values?
Trick question! It didn't:

https://github.com/tgstation/tgstation/blob/3248f9b4e8bbdeef02ad9482ea80f628f730f10d/code/modules/cargo/exports/materials.dm#L215-L218

https://github.com/tgstation/tgstation/blob/d0e7d3c858d6926f6a4a387b74e140e8ce9f645b/code/modules/cargo/materials_market.dm#L176-L179

In reality, it was setting the material ID for the stock block export at
every sale, causing the GMM to pull its elasticity value for whatever
material was last sold and use *that* because the stock block export
datum is later in the list.

So in this pr we fix it by... merging stock block exports with the
materials exports again.
Honestly, much easier than I expected, because the base materials export
already *has* handling for getting the sheet amount from an item's
custom materials.
So really most of this was making it adjust for the value tracked on the
block, and the rest is... cleanup.

The static list used confused me upon first reading the code, so I added
some more comments. We now also have a cached list per `abstract_type`
under it rather than just the one, because we need a separate one for
market materials but it's still shared between several datums.
We intentionally add `/obj/item/stock_block` when generating the
typecache rather than as a part of the base `export_types`, just so none
of the subtypes need to manually include it (and easily forget it).
We now use `use_shared_exports` instead of requiring all the subtypes
that don't use the cache to re-implement `init_export_types` the exact
same way.
## Why It's Good For The Game

Fixes jank 👍
Fixes #93090.

## Changelog
🆑
fix: Exporting stock blocks no longer uses its own elasticity value
separate from the materials exports, and no longer erroneously shows the
stock block elasticity instead of the material elasticity in the GMM for
the material of the most recently sold stock block.
/🆑
2026-02-20 20:55:04 -05:00
nevimer 00ccf0c6b5 Merge remote-tracking branch 'tgstation/master' into upstream-feb12-2026
# Conflicts:
#	.github/CODEOWNERS
#	.github/workflows/compile_changelogs.yml
#	.github/workflows/stale.yml
#	SQL/database_changelog.md
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/__DEFINES/atom_hud.dm
#	code/__DEFINES/inventory.dm
#	code/__DEFINES/mobs.dm
#	code/__DEFINES/species_clothing_paths.dm
#	code/__DEFINES/subsystems.dm
#	code/__DEFINES/surgery.dm
#	code/__HELPERS/global_lists.dm
#	code/_globalvars/lists/maintenance_loot.dm
#	code/_globalvars/traits/_traits.dm
#	code/controllers/subsystem/minor_mapping.dm
#	code/controllers/subsystem/processing/quirks.dm
#	code/controllers/subsystem/shuttle.dm
#	code/datums/components/palette.dm
#	code/datums/components/surgery_initiator.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/hud.dm
#	code/datums/mood.dm
#	code/datums/mutations/chameleon.dm
#	code/datums/quirks/negative_quirks/nyctophobia.dm
#	code/datums/status_effects/debuffs/debuffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/slime/slime_leech.dm
#	code/datums/weather/weather.dm
#	code/game/data_huds.dm
#	code/game/objects/items.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/frog_statue.dm
#	code/game/objects/items/rcd/RLD.dm
#	code/game/objects/items/robot/items/hypo.dm
#	code/game/objects/items/stacks/medical.dm
#	code/game/objects/items/stacks/wrap.dm
#	code/game/objects/items/storage/garment.dm
#	code/game/objects/items/tools/medical/defib.dm
#	code/game/objects/items/weaponry.dm
#	code/game/objects/items/weaponry/melee/misc.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/game/objects/structures/curtains.dm
#	code/game/objects/structures/dresser.dm
#	code/game/objects/structures/girders.dm
#	code/game/objects/structures/maintenance.dm
#	code/game/objects/structures/mirror.dm
#	code/modules/admin/greyscale_modify_menu.dm
#	code/modules/admin/verbs/light_debug.dm
#	code/modules/antagonists/ashwalker/ashwalker.dm
#	code/modules/antagonists/heretic/knowledge/starting_lore.dm
#	code/modules/antagonists/ninja/ninjaDrainAct.dm
#	code/modules/art/paintings.dm
#	code/modules/client/preferences.dm
#	code/modules/client/verbs/ooc.dm
#	code/modules/clothing/head/wig.dm
#	code/modules/events/disease_outbreak.dm
#	code/modules/holodeck/holo_effect.dm
#	code/modules/jobs/job_types/head_of_security.dm
#	code/modules/jobs/job_types/security_officer.dm
#	code/modules/library/skill_learning/generic_skillchips/point.dm
#	code/modules/mining/lavaland/ash_flora.dm
#	code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/basic/guardian/guardian.dm
#	code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm
#	code/modules/mob/living/carbon/carbon.dm
#	code/modules/mob/living/carbon/human/human.dm
#	code/modules/mob/living/carbon/human/human_defines.dm
#	code/modules/mob/living/carbon/life.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob/living/living_defines.dm
#	code/modules/mob/mob.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mod/mod_control.dm
#	code/modules/mod/modules/modules_general.dm
#	code/modules/modular_computers/computers/item/computer_ui.dm
#	code/modules/paperwork/paper.dm
#	code/modules/paperwork/paperbin.dm
#	code/modules/power/lighting/light.dm
#	code/modules/projectiles/guns/energy/kinetic_accelerator.dm
#	code/modules/projectiles/projectile.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/food_reagents.dm
#	code/modules/reagents/chemistry/reagents/other_reagents.dm
#	code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
#	code/modules/research/xenobiology/crossbreeding/_clothing.dm
#	code/modules/research/xenobiology/crossbreeding/prismatic.dm
#	code/modules/surgery/advanced/brainwashing.dm
#	code/modules/surgery/advanced/lobotomy.dm
#	code/modules/surgery/amputation.dm
#	code/modules/surgery/blood_filter.dm
#	code/modules/surgery/bodyparts/_bodyparts.dm
#	code/modules/surgery/brain_surgery.dm
#	code/modules/surgery/cavity_implant.dm
#	code/modules/surgery/coronary_bypass.dm
#	code/modules/surgery/gastrectomy.dm
#	code/modules/surgery/healing.dm
#	code/modules/surgery/limb_augmentation.dm
#	code/modules/surgery/organ_manipulation.dm
#	code/modules/surgery/revival.dm
#	code/modules/surgery/sleeper_protocol.dm
#	code/modules/surgery/surgery_helpers.dm
#	code/modules/surgery/surgery_step.dm
#	code/modules/unit_tests/_unit_tests.dm
#	code/modules/unit_tests/designs.dm
#	code/modules/unit_tests/icon_state_worn.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png
#	icons/map_icons/clothing/head/_head.dmi
#	icons/map_icons/clothing/shoes.dmi
#	icons/map_icons/items/_item.dmi
#	icons/mob/huds/hud.dmi
#	icons/mob/inhands/64x64_lefthand.dmi
#	icons/mob/inhands/64x64_righthand.dmi
#	icons/obj/machines/computer.dmi
#	tgui/packages/tgui/interfaces/OperatingComputer.jsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
#	tgui/packages/tgui/interfaces/SurgeryInitiator.tsx
#	tools/icon_cutter/check.py
2026-02-12 23:50:09 -05:00
SmArtKarandGitHub 71a232f03b Makes lizard skin and lizardskin items inherit their "donor's" skin color (#94751)
## About The Pull Request

As title says, skin butchered from humans (currently only applies to
lizardskin) now inherits their owner's skin color, and so do items
(lizardskin boots and hats) made from it.

Also this PR gagsifies lizardskin hats and boots for this very reason.

## Why It's Good For The Game

Consistency, when you butcher a purple lizard you should get purple
lizard boots.

## Changelog
🆑
add: Made lizard skin and lizardskin items inherit their "donor's" skin
color
/🆑
2026-01-12 00:29:35 +00:00
Tad HardestyandGitHub 4d7b9be4a2 Fix a variety of grammar errors (#94707)
* Fix uncapitalized sentences, lack of "the", and singular/plural mixup
when inserting items into lathes
* Conform some job descriptions to the pattern used by the majority:
bitrunner, chemist, coroner, janitor, RD, shaft miner
* Remove extra colon from "Open Special Role Information" action buttons
* Uncapitalize "no alerts" / "systems nominal" messages in atmos and
station alert consoles
* Fix incorrect feedback when wrenching down a freezer/heater with its
panel open
* Fix "Thank you for restocking the station!" appearing in the wrong
place in the cargo export summary
* Fix "pizza boxs" on cargo manifests
* Fix mid-sentence capital "The" when:
  * Examining walls with mounted items
  * Inserting parts into machine frames
* Fix "Pete's the udder"
* Fix double-"the" and stringified datum typepath when scooping reagents
* Fix missing spaces in door remote descriptions
* Fix uncapitalized "Nanotrasen" in emergency respone drone ghost role
poll
* Fix double-space in canister opening admin log
* Fix missing "the" when casting bear-form spell
* Fix "auxiliry" in NebulaStation airlocks
* Add `check_grep.sh` rules against "maintainance", "maintainence", and
"maintenence"
* Fix "maintainance" in NebulaStation airlocks, TCG cards, and in
examines of netpod, byteforge, quantum server
* Fix "maintainence" in examines of autolathe, flatpacker, cryo cell,
ore silo, floodlight, power storage unit, turbine, chromatography
machine, ChemMaster, all-in-one grinder, smoke machine, R&D machines,
vending machines
  * Fix "maintenence" in Sulaco ruin terminal
* Add missing periods to:
  * "That's X." examine block header
  * steal objective explanation text
  * atmospheric shield generator examine
  * autolathe examine
  * telescreen examine
  * accidentally stepping on a mousetrap
  * netpod examine
  * byteforge examine
  * hat/mask visor toggling
  * bizza box stack examine
  * ChemMaster 3000 examine
  * floodlight examine
  * power storage unit examine
  * ChemMaster interact messages
  * disposal bin animal eject message
  * techfab examine
  * vending machine examine
  * flatpacker examine
* Fix name capitalization/propriety of:
  * big manipulator
  * DeForest first aid station
  * Christmas tree
  * Thunderdome plaque
  * commission plaque
  * chalkboard coffee menu
  * experimental destructive scanner
  * scanner array
  * prison cube
  * RaptorDex
  * atmospheric shield generator
  * high-performance liquid chromatography machine
  * all-in-one grinder
  * keycard authentication device
* Fix plurality of:
  * fake stairs
  * HUDs
  * restaurant and bar seating
* Fix misc grammar/typos in:
  * recharging station description
  * worm description
  * surgery tray description
  * access failure message of restaurant portal
  * mysterious pillar description
  * Pennywise painting description
  * floodlight examine
  * power storage unit examine
  * flatpacker examine
* Remove extra newline from "Debug Z-Levels" verb
2026-01-03 21:34:59 -07:00
3799968eb3 feat: new floppy disk sprites; most disks are now under the /item/disk type; adds disk stacking, uqinue styling and wrapping (#94112)
## About The Pull Request

Floppy disks received a sprite upgrade, as well as unique wraps:

<img width="364" height="150" alt="image"
src="https://github.com/user-attachments/assets/0ac433e3-7432-4c06-bec2-aeae00b6852f"
/>

<img width="786" height="527" alt="image"
src="https://github.com/user-attachments/assets/0f36bd0d-0362-4431-8131-49060a2fe348"
/>

You can now stack floppy disks! They also scatter around when thrown.
The video also showcases new styling options with a selection of
stickers! You can also write something on the disk instead of selecting
an icon:


https://github.com/user-attachments/assets/ff0a8542-9d79-4108-ae46-672ca5d620a2

MOST disks now inherit the `/item/disk` type to properly stack and do...
stuff. An updatepaths script included.

## Why It's Good For The Game

Old school is cool. Stacking disks makes them feel more authentic, while
styling allows for more crearivity!

## Changelog

🆑
add: New unique wraps for floppy disks
qol: Floppy disks can now be stacked
image: New sprites and stickers for floppy disks
map: Added and ran an updatepaths script
refactor: Most disks are now under the base disk item type
/🆑

---------

Co-authored-by: The-Tyrant <tyrantofgaming@gmail.com>
2026-01-04 08:52:18 +13:00
nevimer 6e9f2ccfc0 Merge remote-tracking branch 'tgstation/master' into upstream-12-15
# Conflicts:
#	.github/workflows/compile_all_maps.yml
#	.github/workflows/run_integration_tests.yml
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/_onclick/hud/credits.dm
#	code/controllers/subsystem/networks/id_access.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/game/machinery/doors/door.dm
#	code/game/objects/structures/crates_lockers/closets/secure/medical.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/modules/antagonists/malf_ai/malf_ai_modules.dm
#	code/modules/jobs/job_types/_job.dm
#	code/modules/loadout/categories/accessories.dm
#	code/modules/loadout/loadout_helpers.dm
#	code/modules/loadout/loadout_items.dm
#	code/modules/loadout/loadout_preference.dm
#	code/modules/mob/living/silicon/robot/robot_defense.dm
#	code/modules/mod/mod_theme.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/reagents/reagent_containers/cups/drinks.dm
#	code/modules/shuttle/mobile_port/variants/supply.dm
#	code/modules/surgery/organs/internal/eyes/_eyes.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png
#	icons/hud/screen_full.dmi
2025-12-15 18:12:29 -05:00
ArcaneMusicandGitHub 3248f9b4e8 Plasma is once again not affected by elasticity. (#94394)
## About The Pull Request

With the changes to elasticity in #93235, elasticity was reworked.
However, whether intentional or not, plasma had it's k_elasticity of 0
removed, meaning that plasma sheets were made elastic. Plasma is unique,
in that it's intended to have a static export value grandfathered in
from the old days ™️, as well as since it's not sold on the GMM,
there's less of a point of having it be affected by elasticity.

This PR Reimplements it's immunity to elasticity.

## Why It's Good For The Game

This is old, old precedent and I think got roped into the elasticity
rework without having the context that it's always been immune to
elasticity.

In addition, it makes sense that the plasma research station would be
the ones setting the price on their unique, rare material. I understand
that cargo isn't hurting for ways to make more money than god right now,
but I'm confident in locking this down as precedent.

## Changelog

🆑
fix: Plasma sheets are once again immune to market elasticity, selling
for a static 80 credits each yet again.
/🆑
2025-12-09 21:50:29 +01:00
FalloutFalconandGitHub 0ff70f7497 adds the cardboard crates to spawners and crafting (#94110) 2025-12-03 11:26:33 +01:00
nevimer baf3837ae8 Merge remote-tracking branch 'tgstation/master' into upstream-2025-11-29
# Conflicts:
#	_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
#	_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	_maps/map_files/tramstation/tramstation.dmm
#	code/_onclick/hud/new_player.dm
#	code/datums/components/squashable.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/datums/diseases/chronic_illness.dm
#	code/datums/status_effects/buffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/stamcrit.dm
#	code/game/machinery/computer/crew.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/wall_mounted.dm
#	code/game/turfs/closed/indestructible.dm
#	code/modules/admin/view_variables/filterrific.dm
#	code/modules/antagonists/heretic/influences.dm
#	code/modules/cargo/orderconsole.dm
#	code/modules/client/preferences.dm
#	code/modules/events/space_vines/vine_mutations.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/carbon/human/death.dm
#	code/modules/mob/living/carbon/human/species_types/jellypeople.dm
#	code/modules/mob/living/damage_procs.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mob_spawn/mob_spawn.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/projectiles/guns/ballistic/launchers.dm
#	code/modules/projectiles/guns/energy/laser.dm
#	code/modules/reagents/chemistry/machinery/chem_dispenser.dm
#	code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/medicine_reagents.dm
#	code/modules/surgery/healing.dm
#	code/modules/unit_tests/designs.dm
#	icons/mob/inhands/items_lefthand.dmi
#	icons/mob/inhands/items_righthand.dmi
#	tgui/packages/tgui/interfaces/ChemDispenser.tsx
2025-11-29 22:49:21 -05:00
d76d2f5438 Laser Gun Update: Deep Lore, Gun Variety, Pew Pew (#93520)
## About The Pull Request

Updates the laser gun into four proper subtypes: Standard, Pistol, Rifle
and Carbine.

<img width="229" height="210" alt="image"
src="https://github.com/user-attachments/assets/12c03076-8ebf-4d87-8c98-6a8cce6821db"
/>

Current sprites are pending a palette change.

**Standard:** Functions as you would expect. Same as ever.

**Pistol**: Lower charge, 20 force, normal sized, recharges faster.

**Carbine**: 15 force, 26 mag, two round burst. Projectiles flight
slightly faster. Cannot dual-wield.

**Rifle**: 20 force. 40 mag. Two round burst. EMP resistant (not
immune). Projectiles fly slightly faster. Cannot dual-wield (not that
you need to).

All but the rifle can be sourced from cargo. You can also buy the sovl
version of the laser gun if you're especially nostalgic.

### Armory Changes

The Armory now can potentially spawn either pistols, carbines or
standard. The weighting leans closer to spawning carbines and standard
as opposed to pistols.

### Lore Dump

The laser line of weapons now all have lore. That rich, deep lore that
every game needs and is totally not important at all to the meat and
potatoes of the game. I'm paid by the hour ($0.00)

### Code Tidying

Lasers are old and a total mess code-wise so we've tidied up while we're
here.

## Why It's Good For The Game

Variety is the spice of life and also some of these weapons could have
used a face lift. Especially the laser carbine. Both functionaltiy wise
and appearance wise.

A bit of randomness in the armory means some rounds might have unique
outcomes compared to others. Sometimes, items in cargo don't see
particularly much use, so peppering in a few random potential deviations
can maybe nudge people to utilize variant gear on future rounds.

I'm obsessed with writing too much information. I blame Hatterhat.

## Changelog
🆑
add: Three variants of the laser gun; Carbine (replacing the existing
one), Pistol and Rifle! Find it (possibly) in your armory today!
balance: The armory laser guns might be different variants of the laser
gun, rather than always being the standard. The standard is the same as
ever, even if it looks different.
add: If you care, the sovl version is available as a goodie. And in the
hands of pirates...
spellcheck: Lore! LORE FOR LASER GUNS! LOOOORE! Examine laser guns
closely and you might learn more about them.
balance: The new set of laser guns come with brand new sprites.
/🆑

---------

Co-authored-by: StaringGasMask <62149527+Exester509@users.noreply.github.com>
2025-11-20 22:21:16 -05:00
Roxy d0ca474789 Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-2025-11-05 2025-11-05 19:43:07 -05:00
SyncIt21andGitHub 85084dbe7c [NO GBP] Fixes high export value of seeds (#93661)
## About The Pull Request
- Fixes
https://github.com/tgstation/tgstation/pull/93235#discussion_r2467112106

Seeds export value now scales with this formulae

`(0.1'ish most common seed -> 1 most rarest seed) * base
cost(CRATE_VALUE * 0.025). `

so you get the same uniform scale before the elasticity rework.

## Changelog
🆑
fix: exporting seeds won't yield ridiculously large profits
/🆑
2025-10-29 17:09:51 +01:00
Roxy e28e9fbdba Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-23-10-2025 2025-10-23 17:38:23 -04:00
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
SyncIt21andRoxy 37aa0e9e44 GMM material export respects apply_elastic parameter (#91998)
## About The Pull Request
- Fixes #90544
- Fixes #91093

## Changelog
🆑
fix: stock blocks created via GMM have the correct export value every
time & won't apply price elasticity
/🆑
2025-07-19 20:29:21 -04:00
SyncIt21andGitHub bd2edb30f2 GMM material export respects apply_elastic parameter (#91998)
## About The Pull Request
- Fixes #90544
- Fixes #91093

## Changelog
🆑
fix: stock blocks created via GMM have the correct export value every
time & won't apply price elasticity
/🆑
2025-07-12 16:18:00 -04:00
GoatandRoxy 788f38a21a [MDB Ignore] Makes toolset arms a subtype of arm implants (#91029) 2025-05-29 16:16:13 -04:00
GoatandGitHub 640e692c87 [MDB Ignore] Makes toolset arms a subtype of arm implants (#91029) 2025-05-28 01:11:27 -04:00
SmArtKarandRoxy f740a1e9bb Corrects mining export names on icebox (#91145)
## About The Pull Request

Closes #90666, converts minetypes to defines, gives icebox a minetype
define which could also be used later to give mining suits some fur or
something.

## Changelog
🆑
fix: Icebox artifact exports no longer claim they're from a lava planet
/🆑
2025-05-22 21:15:57 -04:00
SmArtKarandGitHub 29d9626d3d Corrects mining export names on icebox (#91145)
## About The Pull Request

Closes #90666, converts minetypes to defines, gives icebox a minetype
define which could also be used later to give mining suits some fur or
something.

## Changelog
🆑
fix: Icebox artifact exports no longer claim they're from a lava planet
/🆑
2025-05-16 15:27:49 -06:00
GoatandRoxy 01949372b1 Makes more megafauna loot sellable (#90778)
Clockwork alloy is now in the minor loot category, cain & abel alongside
the wildhunter knife are in the major category, and all of the DFM &
Wendigo drops are now megafauna category loot.
2025-05-08 18:42:37 -04:00
GoatandGitHub 3cb05a0f08 Makes more megafauna loot sellable (#90778)
Clockwork alloy is now in the minor loot category, cain & abel alongside
the wildhunter knife are in the major category, and all of the DFM &
Wendigo drops are now megafauna category loot.
2025-04-30 22:40:59 -04:00
John WillardandShadow-Quill d6c55096da Cult armor slowly kills non-cultists & can be exorcised. (#90557)
Wizard and Cult armors were all thrown in randomly with all the rest of
the cult items so I moved them into their own files for organization,
documented each one, and made the hoodies copy the armor from the suit
they are apart of.

I also made 3 balance changes here:

1- Hardened cult armor (the spaceproof one), if worn by a non-cultist,
will cause random pierce and dislocation wounds to the wearer until they
take it off. From my personal testing this killed me in sub-3 minutes
while I was slower due to the dislocations.
2- Hardened cult armor can now be blessed with a bible, which will turn
it into a new set of chaplain armor. If the chap selected one already
then it'll be a new set, otherwise a random set.
3- The hardened cult armor found as icemoon loot has been replaced with
a new item, the wolf cloak, which is a hooded neck item that gives you a
wolf transformation spell

https://github.com/user-attachments/assets/597e259a-3de2-4d2e-a43a-7953ba5482dc

Hardened cult armor is the only type of cult suit that can be worn by
non-cultists, while every other gear has some way of stopping you
(including the blindfold and the flagellant's robes), this gives you
about 3 minutes time to use it and isn't a straight up "drop it lol".
For the blessing, it's a small interaction that gives one more thing
Chaplains can bless. Once Chaplains start blessing cult equipment we see
balance tipping in the station's favor, usually balance is not that much
of a concern, but this does give the Chaplain a way of expanding their
own experience (especially if they're Honorbound) in a round opening
more funny ways of roleplaying around a cult round.

🆑 Toriate, JohnFulpWillard
add: Adds a Wolf pelt cloak as an icemoon drop, replacing the hardened
Cult armor.
balance: Cult's hardened armor now deals bleeding and dislocating limbs
to non cultists who wear it, and can also be blessed into holy armor.
/🆑
2025-04-29 17:55:19 -06:00
8dcbed6ac2 Revises and adds several new bounties for assistants, roboticists, and medical doctors. (#89772)
## About The Pull Request

This pull request makes several balance adjustments to older bounties,
primarily for the roboticist and assistant. Additionally, this adds a
new type of medical doctor bounty as well.

### Bounty Modifications:

**Assistant**: Toolbox bounty
The toolbox bounty now requests 1 toolbox instead of 6. However, the
toolbox bounty now requires a fully packed mechanical toolbox worth of
contents. That means any toolbox, containing a screwdriver, wrench,
welding tool, crowbar, analyzer, and wire cutters. When shipped,
non-toolbox contents are dropped.

Why It's Good For The Game (**WIGFTG**):
This bounty follows bad design principles, being a bounty that can be
solved entirely from a lathe. For any of these cases, we want to either
replace them or recontexualize them into an activity that forces players
to either learn more about the mechanics in and around that area as a
form of played tutorial, give them a toe-dip into the mechanics required
to complete the activity, or perform an activity that makes the station
better for having completed it.

For the toolbox bounty, this goes all in on teaching players about the
full set of toolbox equipment, instead of just needing one printable
item, it takes them through the full autolathe menu and gives them
plausible deniability for getting a full set of tools.

**Assistant:** Potted Plants.
The potted plant bounty now requires 3 potted plants as opposed to 8.
Most stations are going to be completely devoid of potted plants after
collecting 8 of these, where lowering the quantity to 3 allows for a
larger amount of competition for this type of bounty. This also
disallows using plastic potted plants from being used in the bounty as a
trade off, as real potted plants are available through other means.

**WIGFTG**: Removes a lathe-solved bounty, and adjusts the quantity to
compensate for the fact that previously you would loot the entire
station of all of it's potted plants in order to complete this bounty
one time.

**Assistant:** Action Figures -> Toys
Action figures and their general availability widely varies by maps. At
best, you can snag one per office on (I think) delta, and at worse
you'll need to fish them out of arcade machines across the station.
Considering how often new toys are added to the vending machine, this
can be a very raw deal where you might be spending 10s of minutes just
for maybe one or two action figures. Instead, it feels like a wider and
better solution is to just make this touch the whole toys category.

WIGFTG: For the toys bounty, it's far too scarce to complete regularly,
but instead now it gives makes players interact with the arcade machine
wholistically, which in turn requires players to have to play an arcade
machine just enough that they're likely to gains a level in the gamer
skill, and serve as a primer to interact with how skills interact with
the round at large. Granted, it's the gamer skill, so it's not the end
of the world if players are getting skill increases here as opposed to
other skills that may have more of an effect on the round at large.

**Assistant:** Pens.
Fuck this bounty. I have removed it. 

**WIGFTG**:
Allow me to elaborate.
So the pens bounty requires 10 pens. However, it requires specifically
`/obj/item/pen`, no subtypes. `/obj/item/pen` is not printable. It is
not found at quantities that make it easy to specifically complete. You
cannot use red pens. Or fountain pens. Or blue pens. Or Crayons. Just
standard black pens that spawn in your PDA and on paper bins. And you
need 10. There is **A** printable pen, however,
`/obj/item/pen/red/security`, which is however printable from
autolathes, leading many players and myself to think that this is
another easy printable bounty. But EVEN THEN, even if those pens WERE
ACCEPTABLE, having to manually carry 10 tiny objects to complete a
bounty worth not even 200 credits to the bounty holder? This just sucks.
It's Bleem. Get it outta here.


**Robotics**: All current mech bounties (MK 2 Ripley, Clarke, Odysseus,
Gygax, and Durand)
Robotics bounties have been reworked. Now, mecha bounties require that a
new mecha of that type be built, and that a holodiagnostic scan be
completed of the mech. This can be done once-per mech, which will print
out a holodiagnostic sheet onto the floor. This sheet is what is turned
in for the bounty. As a result, the value of these bounties have been
roughly halved. For those looking to collect the rest of the previous
value, all 5 of these mechs can now be sold on the cargo shuttle for the
remaining value of the old bounties.

**WIGFTG**: The biggest hurdle for roboticists when it comes to economy
is twofold: Roboticist need resources far more than most other jobs in
the game. No metal means no cyborgs, or mechs, or cool equipment for
robotics. But, if a roboticist needs credits, they have to trade away a
new mech in exchange for some of the largest credit pool bounties in the
game. If they can't spend those credits, or can't receive anything using
those credits, that's effort wasted.

There's a tremendous amount of uncertainty when it comes to robotics
being able to meaningfully interact with the credit economy as it
currently stands, or being able to leverage the credit economy to solve
any of their issues. If the player really does just want to sell their
mech for credits, this also provides them with a method of doing so that
will still reward them even further if they feel they truly do not need
it. Side note, the cargo loader mech "old bess" has the trait provided
by generating a diagnostic already, preventing them from just scanning
that for an easy minute 1 bounty.

Ultimately, having to sell a mech for credits as opposed to getting to
use it is not *fun*. Getting to get paid for doing your job, and getting
the benefits of something you'll have spend a reasonable amount of time
and the station's resources on is *fun*. It's a better pay off. It's why
we're here.


![image](https://github.com/user-attachments/assets/d372a338-14dc-49a3-8279-4cb379c13c10)


**Medical:** Crew Scan Bounties.
Medical staff are now given the chance to perform routine medical scan
bounties. These require a medical doctor to scan another crew member who
is above 90% health, and then print the reports to submit. Some
stipulations:
* The report cannot be of the bounty holder.
* A scanned crewmate must be scanned above 90% heath. 
* When the report is printed, the target is given a trait for 5 minutes,
`TRAIT_RECENTLY_TREATED`, which disqualifies them being the target of a
submitted medical report. This is to encourage the doctor to check up on
several members of the crew when submitting this bounty.

**WIGFTG**:
Medical bounties are in an awkward place, honestly. They are possible to
become purely printable bounties using either advanced organs, or
through the organ grower. However, both of these outcomes are research
locked, and will require a more through look down the line, don't get me
wrong. In the meantime, this falls squarely under that area of "getting
medical doctor bounties to be more closely aligned with doing what
they're already supposed to be doing".

I also floated the idea of making medical bounties pick a random
crewmate for a check-up as opposed to a few different members of the
crew from anyone. I might follow up on that at a later date, but this PR
was already getting a bit overloaded.


![image](https://github.com/user-attachments/assets/63ab2a4f-1eab-410b-9b37-c9299199191b)


### Some other things tacked on here:
I swear I'll be fast.

The `/obj/item/paper/medical_report` created is a new subtype of paper
as opposed to the old type that was used by health analyzers, which
holds the last scanned mob as a weakref as opposed to just creating a
snowflaked paper as we were doing before.

The bounty pad, when it generates it's list of bounties, now works
slightly differently so that there's no chance of getting a list of
three "random" bounties that are all exactly the same thing, called in a
new proc, `generate_bounty_list()`.

I've added a new debug item, called the `/obj/item/bounty_voucher`. This
item allows you to use it in-hand and it gives the activating player a
new bounty from a list of all possible bounties. This makes my life,
just specifically just me and nobody else, easier when testing bounties.

As mentioned above, the mecha UI required adding a new button to it in
order to create holoscans. It's fairly innocuous if I do say so myself,
but I can make further tweaks if it's an issue.

## Why It's Good For The Game

I've sprinkled a good bit of this in above, but in general, bounties
needed some more TLC to make sure they align with their place as a
tertiary source of making money in the game. I've talked about this
before in some now-ancient design documents, but in summary, there's
three forms of credit sources in the game:

* Primary sources: This is regular payroll, earned by playing the game
when the economy SS fires. In theory, this is how much money you can
spend without needing to think about making a purchase most of the time.
* Secondary sources: This is from sources like tourist bots. Ignore the
design decisions they inhabit, they're gameplay loops that allow you to
make additional credits while still performing the functions of your job
for the station, which in tourist bot's case, is making food and drinks
and serving people, making up for any costs incurred by their presence.
* Tertiary sources: This is bounties. These are activities that exist as
a fallback from the secondary sources, where you may not be performing
the duties of your job in order to get credits, should they be more
critical as a resource than the service you provide to the station as a
result.

...Everyone has been fairly clear that doing bounties is not very good.
If you're playing medical doctor and want a shiny medical doctor thing,
you would hope that the majority of your time is spent still playing
medical doctor, or scientist, or whatever. However, of all the jobs that
have fairly sub-par bounties, the one job that I've heard time and again
that I actually got *right* was surprisingly, security officer. Their
sets of bounties, (Which aren't just looting the locker room mind
you...) between the contraband bounty and the n-spect scanner bounties,
actually encourages players to basically do tasks that are already part
of their job obligations, without needing to run to the nearest lathe or
to _steal 8 boar tusks that drop from the barrens_. The bounties are
basically, "Go on patrol to this area", "look for suspicious items on
the station", etc.

In effect, those are *secondary credit sources*. Which is fantastic! It
gave me the idea to revisit a few of these job bounties to try and make
them a bit less exhausting to have to deal with, and as usual I got a
bit distracted and the scope got a bit too big and now it's march. God
damnit.

But yeah if this goes well, I'd love to see about adjust a few of the
bounty methodologies to be in-line with the changes I've implemented
here. More bounties that encourage players to be doing what they're
already doing, bounties that encourage players to learn more about the
game when it comes to assistant bounties or that encourage them to get a
toe-dip report on mechanics that they may not be introduced to yet, and
get rid of some of the CBT bounties that nobody in their god damn mind
wants to do.

## Changelog

🆑
add: New Medical bounty! Scan crewmates who have been healed or
currently have a clean bill of health, and ship the medical report to
prove that you're not accidently letting them die on your watch. Most of
the time.
balance: Assistant bounties for toolboxes now only require 1, but the
toolbox must be fully stocked like standard mechanical toolboxes.
balance: Potted plant bounties no longer accept plastic plants. They
only require 3 plants now, however.
balance: The action figure bounty now only requires toys instead.
del: Removed the pens bounty.
balance: The robotics mech bounty now requires a diagnostic scan of a
newly completed mech as opposed to sending the whole mech itself.
Diagnostic scans can now be generated by riding in a mech and completing
the action from the UI menu. Mech bounties are worth about half as much.
add: Mechs can be sold on the cargo shuttle for the remaining half of
the value from previous mech bounties.
fix: You can now no longer roll duplicates of the same bounties when
generating a new bounty from the civilian bounty console.
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2025-04-29 17:11:54 -06:00
John WillardandGitHub ff42163d0b Cult armor slowly kills non-cultists & can be exorcised. (#90557)
## About The Pull Request

Wizard and Cult armors were all thrown in randomly with all the rest of
the cult items so I moved them into their own files for organization,
documented each one, and made the hoodies copy the armor from the suit
they are apart of.

I also made 3 balance changes here:

1- Hardened cult armor (the spaceproof one), if worn by a non-cultist,
will cause random pierce and dislocation wounds to the wearer until they
take it off. From my personal testing this killed me in sub-3 minutes
while I was slower due to the dislocations.
2- Hardened cult armor can now be blessed with a bible, which will turn
it into a new set of chaplain armor. If the chap selected one already
then it'll be a new set, otherwise a random set.
3- The hardened cult armor found as icemoon loot has been replaced with
a new item, the wolf cloak, which is a hooded neck item that gives you a
wolf transformation spell


https://github.com/user-attachments/assets/597e259a-3de2-4d2e-a43a-7953ba5482dc

##### - Code bounty by Ezel/Improvedname

## Why It's Good For The Game

Hardened cult armor is the only type of cult suit that can be worn by
non-cultists, while every other gear has some way of stopping you
(including the blindfold and the flagellant's robes), this gives you
about 3 minutes time to use it and isn't a straight up "drop it lol".
For the blessing, it's a small interaction that gives one more thing
Chaplains can bless. Once Chaplains start blessing cult equipment we see
balance tipping in the station's favor, usually balance is not that much
of a concern, but this does give the Chaplain a way of expanding their
own experience (especially if they're Honorbound) in a round opening
more funny ways of roleplaying around a cult round.

## Changelog

🆑 Toriate, JohnFulpWillard
add: Adds a Wolf pelt cloak as an icemoon drop, replacing the hardened
Cult armor.
balance: Cult's hardened armor now deals bleeding and dislocating limbs
to non cultists who wear it, and can also be blessed into holy armor.
/🆑
2025-04-15 11:00:38 +00:00
Waterpig 753d8e5ba4 Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-25-04a 2025-04-08 18:58:45 +02:00
fbbddbb012 Revises and adds several new bounties for assistants, roboticists, and medical doctors. (#89772)
## About The Pull Request

This pull request makes several balance adjustments to older bounties,
primarily for the roboticist and assistant. Additionally, this adds a
new type of medical doctor bounty as well.

### Bounty Modifications:

**Assistant**: Toolbox bounty
The toolbox bounty now requests 1 toolbox instead of 6. However, the
toolbox bounty now requires a fully packed mechanical toolbox worth of
contents. That means any toolbox, containing a screwdriver, wrench,
welding tool, crowbar, analyzer, and wire cutters. When shipped,
non-toolbox contents are dropped.

Why It's Good For The Game (**WIGFTG**):
This bounty follows bad design principles, being a bounty that can be
solved entirely from a lathe. For any of these cases, we want to either
replace them or recontexualize them into an activity that forces players
to either learn more about the mechanics in and around that area as a
form of played tutorial, give them a toe-dip into the mechanics required
to complete the activity, or perform an activity that makes the station
better for having completed it.

For the toolbox bounty, this goes all in on teaching players about the
full set of toolbox equipment, instead of just needing one printable
item, it takes them through the full autolathe menu and gives them
plausible deniability for getting a full set of tools.

**Assistant:** Potted Plants.
The potted plant bounty now requires 3 potted plants as opposed to 8.
Most stations are going to be completely devoid of potted plants after
collecting 8 of these, where lowering the quantity to 3 allows for a
larger amount of competition for this type of bounty. This also
disallows using plastic potted plants from being used in the bounty as a
trade off, as real potted plants are available through other means.

**WIGFTG**: Removes a lathe-solved bounty, and adjusts the quantity to
compensate for the fact that previously you would loot the entire
station of all of it's potted plants in order to complete this bounty
one time.

**Assistant:** Action Figures -> Toys
Action figures and their general availability widely varies by maps. At
best, you can snag one per office on (I think) delta, and at worse
you'll need to fish them out of arcade machines across the station.
Considering how often new toys are added to the vending machine, this
can be a very raw deal where you might be spending 10s of minutes just
for maybe one or two action figures. Instead, it feels like a wider and
better solution is to just make this touch the whole toys category.

WIGFTG: For the toys bounty, it's far too scarce to complete regularly,
but instead now it gives makes players interact with the arcade machine
wholistically, which in turn requires players to have to play an arcade
machine just enough that they're likely to gains a level in the gamer
skill, and serve as a primer to interact with how skills interact with
the round at large. Granted, it's the gamer skill, so it's not the end
of the world if players are getting skill increases here as opposed to
other skills that may have more of an effect on the round at large.

**Assistant:** Pens.
Fuck this bounty. I have removed it. 

**WIGFTG**:
Allow me to elaborate.
So the pens bounty requires 10 pens. However, it requires specifically
`/obj/item/pen`, no subtypes. `/obj/item/pen` is not printable. It is
not found at quantities that make it easy to specifically complete. You
cannot use red pens. Or fountain pens. Or blue pens. Or Crayons. Just
standard black pens that spawn in your PDA and on paper bins. And you
need 10. There is **A** printable pen, however,
`/obj/item/pen/red/security`, which is however printable from
autolathes, leading many players and myself to think that this is
another easy printable bounty. But EVEN THEN, even if those pens WERE
ACCEPTABLE, having to manually carry 10 tiny objects to complete a
bounty worth not even 200 credits to the bounty holder? This just sucks.
It's Bleem. Get it outta here.


**Robotics**: All current mech bounties (MK 2 Ripley, Clarke, Odysseus,
Gygax, and Durand)
Robotics bounties have been reworked. Now, mecha bounties require that a
new mecha of that type be built, and that a holodiagnostic scan be
completed of the mech. This can be done once-per mech, which will print
out a holodiagnostic sheet onto the floor. This sheet is what is turned
in for the bounty. As a result, the value of these bounties have been
roughly halved. For those looking to collect the rest of the previous
value, all 5 of these mechs can now be sold on the cargo shuttle for the
remaining value of the old bounties.

**WIGFTG**: The biggest hurdle for roboticists when it comes to economy
is twofold: Roboticist need resources far more than most other jobs in
the game. No metal means no cyborgs, or mechs, or cool equipment for
robotics. But, if a roboticist needs credits, they have to trade away a
new mech in exchange for some of the largest credit pool bounties in the
game. If they can't spend those credits, or can't receive anything using
those credits, that's effort wasted.

There's a tremendous amount of uncertainty when it comes to robotics
being able to meaningfully interact with the credit economy as it
currently stands, or being able to leverage the credit economy to solve
any of their issues. If the player really does just want to sell their
mech for credits, this also provides them with a method of doing so that
will still reward them even further if they feel they truly do not need
it. Side note, the cargo loader mech "old bess" has the trait provided
by generating a diagnostic already, preventing them from just scanning
that for an easy minute 1 bounty.

Ultimately, having to sell a mech for credits as opposed to getting to
use it is not *fun*. Getting to get paid for doing your job, and getting
the benefits of something you'll have spend a reasonable amount of time
and the station's resources on is *fun*. It's a better pay off. It's why
we're here.


![image](https://github.com/user-attachments/assets/d372a338-14dc-49a3-8279-4cb379c13c10)


**Medical:** Crew Scan Bounties.
Medical staff are now given the chance to perform routine medical scan
bounties. These require a medical doctor to scan another crew member who
is above 90% health, and then print the reports to submit. Some
stipulations:
* The report cannot be of the bounty holder.
* A scanned crewmate must be scanned above 90% heath. 
* When the report is printed, the target is given a trait for 5 minutes,
`TRAIT_RECENTLY_TREATED`, which disqualifies them being the target of a
submitted medical report. This is to encourage the doctor to check up on
several members of the crew when submitting this bounty.

**WIGFTG**:
Medical bounties are in an awkward place, honestly. They are possible to
become purely printable bounties using either advanced organs, or
through the organ grower. However, both of these outcomes are research
locked, and will require a more through look down the line, don't get me
wrong. In the meantime, this falls squarely under that area of "getting
medical doctor bounties to be more closely aligned with doing what
they're already supposed to be doing".

I also floated the idea of making medical bounties pick a random
crewmate for a check-up as opposed to a few different members of the
crew from anyone. I might follow up on that at a later date, but this PR
was already getting a bit overloaded.


![image](https://github.com/user-attachments/assets/63ab2a4f-1eab-410b-9b37-c9299199191b)


### Some other things tacked on here:
I swear I'll be fast.

The `/obj/item/paper/medical_report` created is a new subtype of paper
as opposed to the old type that was used by health analyzers, which
holds the last scanned mob as a weakref as opposed to just creating a
snowflaked paper as we were doing before.

The bounty pad, when it generates it's list of bounties, now works
slightly differently so that there's no chance of getting a list of
three "random" bounties that are all exactly the same thing, called in a
new proc, `generate_bounty_list()`.

I've added a new debug item, called the `/obj/item/bounty_voucher`. This
item allows you to use it in-hand and it gives the activating player a
new bounty from a list of all possible bounties. This makes my life,
just specifically just me and nobody else, easier when testing bounties.

As mentioned above, the mecha UI required adding a new button to it in
order to create holoscans. It's fairly innocuous if I do say so myself,
but I can make further tweaks if it's an issue.

## Why It's Good For The Game

I've sprinkled a good bit of this in above, but in general, bounties
needed some more TLC to make sure they align with their place as a
tertiary source of making money in the game. I've talked about this
before in some now-ancient design documents, but in summary, there's
three forms of credit sources in the game:

* Primary sources: This is regular payroll, earned by playing the game
when the economy SS fires. In theory, this is how much money you can
spend without needing to think about making a purchase most of the time.
* Secondary sources: This is from sources like tourist bots. Ignore the
design decisions they inhabit, they're gameplay loops that allow you to
make additional credits while still performing the functions of your job
for the station, which in tourist bot's case, is making food and drinks
and serving people, making up for any costs incurred by their presence.
* Tertiary sources: This is bounties. These are activities that exist as
a fallback from the secondary sources, where you may not be performing
the duties of your job in order to get credits, should they be more
critical as a resource than the service you provide to the station as a
result.

...Everyone has been fairly clear that doing bounties is not very good.
If you're playing medical doctor and want a shiny medical doctor thing,
you would hope that the majority of your time is spent still playing
medical doctor, or scientist, or whatever. However, of all the jobs that
have fairly sub-par bounties, the one job that I've heard time and again
that I actually got *right* was surprisingly, security officer. Their
sets of bounties, (Which aren't just looting the locker room mind
you...) between the contraband bounty and the n-spect scanner bounties,
actually encourages players to basically do tasks that are already part
of their job obligations, without needing to run to the nearest lathe or
to _steal 8 boar tusks that drop from the barrens_. The bounties are
basically, "Go on patrol to this area", "look for suspicious items on
the station", etc.

In effect, those are *secondary credit sources*. Which is fantastic! It
gave me the idea to revisit a few of these job bounties to try and make
them a bit less exhausting to have to deal with, and as usual I got a
bit distracted and the scope got a bit too big and now it's march. God
damnit.

But yeah if this goes well, I'd love to see about adjust a few of the
bounty methodologies to be in-line with the changes I've implemented
here. More bounties that encourage players to be doing what they're
already doing, bounties that encourage players to learn more about the
game when it comes to assistant bounties or that encourage them to get a
toe-dip report on mechanics that they may not be introduced to yet, and
get rid of some of the CBT bounties that nobody in their god damn mind
wants to do.

## Changelog

🆑
add: New Medical bounty! Scan crewmates who have been healed or
currently have a clean bill of health, and ship the medical report to
prove that you're not accidently letting them die on your watch. Most of
the time.
balance: Assistant bounties for toolboxes now only require 1, but the
toolbox must be fully stocked like standard mechanical toolboxes.
balance: Potted plant bounties no longer accept plastic plants. They
only require 3 plants now, however.
balance: The action figure bounty now only requires toys instead.
del: Removed the pens bounty.
balance: The robotics mech bounty now requires a diagnostic scan of a
newly completed mech as opposed to sending the whole mech itself.
Diagnostic scans can now be generated by riding in a mech and completing
the action from the UI menu. Mech bounties are worth about half as much.
add: Mechs can be sold on the cargo shuttle for the remaining half of
the value from previous mech bounties.
fix: You can now no longer roll duplicates of the same bounties when
generating a new bounty from the civilian bounty console.
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2025-04-05 16:53:02 +02:00
GhomandGitHub eb0d9bffa2 Fixes some stupid stuff going on with food export. (#90089)
## About The Pull Request
The way this is implemented right now is stupid as fuck. Basically, if
you export a well-priced dish, all other food servings after it will
sell for the same price, provided exports are kept as singletons. This
makes me want to ping the author of the PR that did this and yell at
them, but whatever.

## Why It's Good For The Game
Fixing an issue that's also causing the cargo_crate_sanity unit test to
fail so many times.

Closes #90075
Closes #90073
Closes #90087
Closes #90091

At least until they pop up again.

## Changelog

🆑
fix: Fixing an issue with food exports.
/🆑
2025-03-18 20:21:12 +01:00
ArcaneMusicandGitHub 498baeecd1 Hotfix for Stock Market Exploit. (#90060)
## About The Pull Request

So when I made #89674, I made a miiiinor slight basic error when it came
to the quantity assigned to sheets of materials when they're sold, using
the quantity as referenced by an export report. That quantity was then
brought over to the export value, for gathering the cost.

Cost when sold in an export report is reported as the units of material
in those sheets, while stock blocks actually care about the sheet
quantity, making the value actually 100x larger than it should be. I
caught this super fast while playing a round last night, but I needed to
just quality check to make sure there's no other weird inconsistencies.

Such as the stack of 50 uranium I added for debug and testing purposes
actually only holding 25 sheets. Things like that.

Stock blocks will now actually fluidly recalc their market price after
going fluid, because as it turns out, the fluid var isn't used in price
calculation, which was an easy fix.

## Why It's Good For The Game

🐛 💥 Killing some fairly egregious oversights on the stock market sales
side of things. Thank you for your patience.

## Changelog

🆑
fix: Stock blocks that have gone liquid should properly recalculate
their cost when possible.
fix: Spawned sheets of uranium now actually hold 50 sheets.
/🆑
2025-03-16 17:19:00 +01:00
ArcaneMusicandGitHub eca216288b Material market sales now are subject to elasticity. (#89674)
## About The Pull Request

This PR serves as an alternative to #89638.

For this proposal, stocks are now subject to market elasticity, similar
to most other standard exports in-game. As a result, the value of a
stock is going to scale downward through the quantity that they're sold
at, whether as a stack of material or as a stock block at a given export
rate. A material's new, elastically modified price can then be
reassessed by scanning it with an export scanner.

There was a good bit of behind the scenes work that came with making
this work properly, but the short version of it is as follows:

Stock blocks are no longer their own datum export, and stock blocks are
now dynamically sorted into their appropriate export datum so that the
`datum/export` `cost` variable can properly track elasticity whether
between the sheet of the block form of the item.

`Get_cost()` now calculates the cost based on the non-elastic form when
saving to the block, and then when assessed for sale elasticity is
applied on the block sale instead so as to not apply elasticity twice
and make them worthless.

I axed the `MARKET_PROFIT_MODIFIER` define and removed it from
calculation. Originally it was meant as a crude alternative to a
floodgate and sales factor that would change how much a stock block is
worth in Lou of an actual elastic modifier, but with this implemented I
feel confident in removing this. The wording of this is also reflected
in the instructions tab of the stock market as well.

Lastly, there are three minor things but they came up during testing and
felt appropriate to tweak, but otherwise I'm happy to atomize out
because I was just kinda on a roll:

* I added a small light to the material market when on and powered, as
50% of the sprite is a big hologram light and it only makes sense that
it would emit some light to the surroundings, albeit not a high range.
* The material market now requires power to create stock blocks.
* Refined Bluespace crystals
(`/obj/item/stack/ore/bluespace_crystal/refined`) and other similar
stacks of ore will now throw a warning if the amount or value is less
than 1 in either case, preventing you from making a functionally useless
stock block.

## Why It's Good For The Game

Technically fixes #79978 ?

This solution still enables for the stock market to exist in a
meaningful way, prevents it from being an insanely powerful method of
getting far too many credits too quickly by basically implementing a
soft cooldown system respective to each material export type, and means
that in avoiding that system, requires for cargo to alternate between a
few different types of materials, which should *hopefully* allow for
cargo to also be incentivized to actually deposit some of it's purchased
materials into the station's resources respectively.

The QOL and fix changes mentioned at the bottom of the first section
allow for there to be fewer edge cases situations where the crew is
unable to sell items that would functionally have zero value without
some rather cheesy implementations of how stock blocks currently work by
preventing otherwise invalid stock blocks from being made, as well as to
make it behave in a way more fitting of a standard machine on the
station.

Also just in general enables a bit less duplicate code by relying a bit
more on `export_items_and_contents()` to gather quantities and values
for then redistributing back into the stock blocks, either for sale or
for storage.

## Changelog

🆑
balance: Sheets of material and stock blocks are now subject to elastic
price changes. AKA, if you sell materials, their price will go down
after sale and will return after some time.
fix: Stock blocks can no longer be made with no value or with a quantity
of zero material.
fix: The GMM Machine can now no longer create stock blocks when
unpowered.
qol: The GMM machine now lights up when powered.
/🆑
2025-03-14 15:48:54 +11:00
5624a33c26 Adds a unit test for Cargo Crates to prevent infinite credit oversights. (#89023)
## About The Pull Request

I was kinda shocked that we didn't have something for this considering
that it's an unspoken rule of cargo to check that a crate does not sell
back for more than it's price and that the one comment saying to do so
has been doing some heavy lifting for the last 12 years.

I'm a novice when it comes to unit testing specifically so hopefully the
smoothing out that needs to be done should be fairly quick.

*Edit (2/22/25):*
The following changes were also made in order to allow for this unit
test to work smoothly:

Exports now have a market define added to them, as the purpose of this
unit test is to test exports that occur on the station, bought from
supply and then sold back to supply. As such, these market defines
exclude exports specific to pirates (since the cargo shuttle cannot sell
living mobs back, preventing you from making 10k per parrot crate.).

I've also added the `abstract` variable to some export datums, to
signify that a given export is either variable, or not meant to be
compared against the value of it's own container, such as with gas
canister's base export value as their export datums are generated
dynamically. (The subtypes are not abstract, however.)

The verb, `/mob/living/verb/tally_physical_credits()` has been changed
to `/mob/living/proc/tally_physical_credits()`, because that's my B and
does effect some economy back end but it's a one line fix so I just
absent-mindedly fixed it here instead of atomizing it out. I can
one-line it otherwise.

Mulebots now no longer runtime on spawn as they set their own to their
own `get_turf` as opposed to pulling their `loc`.

A few supply packs have had their prices bumped up slightly to actually
pass the test itself:

* `/datum/supply_pack/misc/candles_bulk`
* `/datum/supply_pack/security/armor`
* `/datum/supply_pack/security/helmets`
* `/datum/supply_pack/security/baton`

## Why It's Good For The Game

Prevents future infinite credit bugs that could have been missed by
simply checking the sale value in game.

## Changelog

🆑
fix: To prevent infinite sales issues, security helmets, armors, and
batons packs now all cost 600 credits, up from 400.
fix: Candle packs now cost 400 credits, up from 300, and candles now
sell for 12.25 cr each.
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2025-03-13 23:26:53 +01:00
GhomandRoxy 87ce43bb8f The edible component now uses DUPE_SOURCE mode (#89687)
## About The Pull Request
The edible component now uses DUPE_SOURCE mode, which is needed to avoid
conflicts between sources. This includes some other tidbits from my
refactor like renaming dcs/flags.dm to ds/declarations.dm (in virtue of
the fact it doesn't only contain flags anymore even before this PR),
meat materials giving protein and fat reagents to affected atoms instead
of generic nutriment and oil, and the pizza material no longer
containing meat, because margherita pizza, which the material is
extracted from, doesn't contain meat either. The pepperonis were
magically conjured space bs.

## Why It's Good For The Game
There are multiple sources of the edible component and we don't want
issues with that. Also atomizing stuff from my refactor.

## Changelog

🆑
balance: objects made out of meat are no longer classified as gross food
on top of being raw and meaty, and actually contain protein and fat
instead of standard nutriment and oil.
balance: the pizza material stacks, crafted with margherita pizza and
rollig pin mind you, no longer magically contain pepperoni.
/🆑
2025-03-12 16:55:07 -04:00
GhomandGitHub da31ea158c The edible component now uses DUPE_SOURCE mode (#89687)
## About The Pull Request
The edible component now uses DUPE_SOURCE mode, which is needed to avoid
conflicts between sources. This includes some other tidbits from my
refactor like renaming dcs/flags.dm to ds/declarations.dm (in virtue of
the fact it doesn't only contain flags anymore even before this PR),
meat materials giving protein and fat reagents to affected atoms instead
of generic nutriment and oil, and the pizza material no longer
containing meat, because margherita pizza, which the material is
extracted from, doesn't contain meat either. The pepperonis were
magically conjured space bs.

## Why It's Good For The Game
There are multiple sources of the edible component and we don't want
issues with that. Also atomizing stuff from my refactor.

## Changelog

🆑
balance: objects made out of meat are no longer classified as gross food
on top of being raw and meaty, and actually contain protein and fat
instead of standard nutriment and oil.
balance: the pizza material stacks, crafted with margherita pizza and
rollig pin mind you, no longer magically contain pepperoni.
/🆑
2025-03-02 13:15:08 +01:00
Majkl-J b6b8306fda Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-25-02a 2025-02-20 00:00:19 -08:00
1393FandGitHub 3a36656ae8 Adds trailing comma to lists/canisters.dm and removes single letter vars from cargo/exports/large_objects.dm (#89273)
## About The Pull Request
title
## Why It's Good For The Game
slightly better code quality?
## Changelog
not player facing
2025-02-03 01:48:42 +00:00
_0StevenandGitHub fdcf242610 Tongue cargo export spellcheck (#89078) 2025-01-16 09:36:03 +01:00
_0StevenandGitHub 0d26dc635d Harvesting organs from other players and selling them is now rewarded (#88847) 2025-01-08 17:12:43 +01:00
GhomandGitHub e34c687669 [NO GBP] Post-Material rods fixes and tweaks (#87696)
This PR follows the material fishing rod PR, which had a small issue in
which I had forgotten to add a return value to a proc and thus fish
caught from material fishing rods would never be made of that specific
material.

I've tweaked some values for materials and fishing rods, I felt some of
the "better" rods were a bit too fast, and some downright let you skip
the fishing minigame with zero to one level. Also, I felt that, despite
making fishing easier kinda, the area of the bait slider still felt a
tad too small, so I've introduced a height multiplier for the slider so
that it could cover more space, depending on the strength multiplier of
the material (for once, not a new niche variable). This doesn't apply to
fishing rods with strength multiplier less than 1 because they don't
need to be made worse.

About fish and cargo, I've added a soft cap (a 0.86 exponent) to fish
selling price. It shouldn't affect the wide majority of fish you catch,
however it does affect those that sell for over 6k per unit, which are
few and rare. However, I've been pinged about some ludicrous
money-making done by selling fish alone on a downstream server, likely
from growing the big fish to be up twice their initial size and weight
(capped to 2.5 the average value for the species), however, new features
may push things a little further, so it's better to be safe than sorry.
Screenshot below: They said it took them about a hour, however take it
with a pinch of salt since it's by no mean easy and fast money by
Terry's standards:

I've also halved the selling price of jumpercable fish, which, despite
requiring an emag or some sort luck, could easily be farmed in due time
with little to no maintenance, being self-reproducing and hunger-less,
and each of them would sell for 6k. conversely, I've increased the price
of the unmarine mastodon a little because of the soft-cap, since it's
very rare.
2024-11-06 20:02:07 +00:00
GhomandGitHub 778ed9f1ab The death or internal/external organ pathing (ft. fixed fox ears and recoloring bodypart overlays with dye sprays) (#87434)
## 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):

![immagine](https://github.com/user-attachments/assets/2bb625c9-9233-42eb-b9b8-e0bd6909ce89)

## 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.
/🆑
2024-10-30 08:03:02 +01:00
Waterpig 9da38495b6 Merge master 2024-08-08 19:59:08 +02:00
a94b3c697a [MIRROR] Raising lobstrosities from chrabs is now a component. Adds in tadpoles which become frogs. (#29147)
Raising lobstrosities from chrabs is now a component. Adds in tadpoles which become frogs. (#85346)

I've componentized part of the code that manages raising lobstrosities
from chrabs so that it can be added to other fish too. As proof of
concept, I've added tadpoles. Tadpoles are not fished like the rest,
instead you merely right-click a puddle and after 5 seconds you'll get
one. Tadpoles are fairly fragile, cannot be butchered, don't reproduce,
require lukewarm freshwater, need to be feed frequently, and become
frogs after about 3 minutes.

A small needed refactor for the chrab code, plus another small fish to
make it easier to complete the first fish scanning experiment.

🆑
add: Added tadpoles, which can be scooped from puddles with right-click.
Functionally they're like most fish, which require an aquarium to
survive, and also need to be fed fairly frequently, however they quickly
become frogs after about 3 minutes of care.
add: Every station now has a couple puddles. One at the public garden
and the other in prison.
qol: Changed the name of an aquarium UI button from "Reproduction
Prevention" to "Reproduction and Growth", as it controls both fish
breeding and growth.
/🆑

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-08-06 21:34:16 +02:00
StrangeWeirdKitten 132f9363e4 Merge branch 'master' of https://github.com/Skyrat-SS13/Skyrat-tg into fuck-fuck-fuck
# Conflicts:
#	_maps/map_files/Birdshot/birdshot.dmm
#	_maps/map_files/NorthStar/north_star.dmm
#	_maps/map_files/VoidRaptor/VoidRaptor.dmm
#	code/datums/status_effects/debuffs/debuffs.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/modules/cargo/packs/imports.dm
#	html/changelogs/archive/2024-07.yml
2024-07-31 21:19:46 -06:00