Commit Graph

3701 Commits

Author SHA1 Message Date
SkyratBot
df6cbe4b7a [MIRROR] Adds a Touchy quirk (#26462)
* Adds a Touchy quirk (#81387)

## About The Pull Request

Adds a new quirk for -2 points that requires you to be next to something
to examine them, like blindness but without the timer or actual
blindness itself.

## Why It's Good For The Game

For the player using the quirk, it's 2 points for losing the ability to
simply examine everything around you, making it harder to tell what
someone has in their hands when they are charging at you, for example.
You need to get up and close to things to see what they are.
For people being examined, it's just another possible excuse to be near
them, opening up plausible deniability for actions such as sleepy pens,
changeling stings, etc.

## Changelog

🆑 Atlasle, JohnFulpWillard
add: Adds the Touchy quirk, you need to be next to something to examine
it, for 2 extra quirk points.
/🆑

* Adds a Touchy quirk

* skyrat fix

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: jjpark-kb <mccorvey.norman@gmail.com>
2024-02-11 18:06:04 -05:00
SkyratBot
3576e75000 [MIRROR] [NO GBP] Fixes raw ectoplasmic anomaly refining (#26447)
* [NO GBP] Fixes raw ectoplasmic anomaly refining (#81377)

## About The Pull Request

This adds a proper cap for raw ectoplasmic cores, so they can actually
be refined now. Cool!
## Why It's Good For The Game

Broken thing need fix oops argh.

Closes #81369.
## Changelog
🆑 Rhials
fix: You can now refine ectoplasmic raw cores at the implosion machine
thing.
/🆑

* [NO GBP] Fixes raw ectoplasmic anomaly refining

---------

Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com>
2024-02-10 23:16:56 -05:00
SkyratBot
b485162a04 [MIRROR] Station Goals are now handled by SSstation instead of a global list (#26313)
* Station Goals are now handled by SSstation instead of a global list (#81177)

## About The Pull Request

You can now get station goals in a slightly better way over using a
`locate() in` call on a global list.
The Meteor Satellite goal no longer stores a giant list of ALL OBJECTS
in view. And now correctly only counts turfs.
## Changelog
🆑
fix: Meteor Satellites no longer erroneously count every piece of paper
as a protected turf.
fix: As a result the station goal is slightly more difficult
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@ users.noreply.github.com>

* Station Goals are now handled by SSstation instead of a global list

* Will it work? I do not know. But it compiles.

---------

Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@ users.noreply.github.com>
Co-authored-by: Useroth <37159550+Useroth@users.noreply.github.com>
2024-02-08 16:21:12 +01:00
SkyratBot
5fde8bd1ad [MIRROR] Makes point_types not be dumb (#26376)
* Makes point_types not be dumb (#81202)

## About The Pull Request

We currently have a list of point types that is meant to be
list(``DEFINE`` = name) but it's completely useless since the define is
just the name anyways. It's not used for anything, it has no purpose to
be this way. It seems more like a holdover from when there were multiple
types of research points (it was made for that purpose, even before
nanite points were a thing) but even for that, it serves no purpose.

I reworked it now to be the abbreviated name of the research point type,
de-hardcoding techwebs a little bit and removing the need for
downstreams to edit the techweb UI.

## Why It's Good For The Game

This at least looks better and makes more sense at people just looking
over it.

## Changelog

No player-facing changes.

* Makes point_types not be dumb

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
2024-02-07 13:26:48 -05:00
SkyratBot
602ac52e9d [MIRROR] Fixes ore vents spawning without ores on icebox, sets up map specific ore configurations (#26375)
* Fixes ore vents spawning without ores on icebox, sets up map specific ore configurations (#81103)

## About The Pull Request

In short, we used a static list previously within the ore_generation
subsystem that held the amount of each ore that we expected a single map
to uniformly need. We held this number constant, since we were spawning
15 vents per map.

**Pros:** This worked flawlessly for Lavaland since 15 vents on a single
Z level makes it pretty densely packed map with a good amount of
map-based ore spawns, and it worked consistently.

**Cons:** 15 vents did not work well on Icebox however, even when split
so that the majority of the ores were spawning on the lower levels,
players did not feel like icebox spawned nearly enough ores and reported
the map spawning empty.

**Result:** As a result, we adjusted the ratio, so that we spawned
vastly more ores on the lower levels, now up to 4 vents on the upper
level, and 21 vents on the lower level. However, as we were still using
the ore distribution list based on lavaland, icebox vents were quickly
running out of ores to distribute between them, resulting in empty vents
-> which produced empty boulders -> which not only don't really let you
process them properly, but also just result in a metric ton of runtimes.

Icebox now has it's own list of ore distributions. These distributions
are now moved to a set of global lists as opposed to being saved on the
subsystem as a static list, which will make going and setting up new ore
distribution lists very very easy. Additionally, we've moved the setting
and getting of those ore_distributions over to the seedRuins proc, so
that we're actually setting the list of ores right before we actually
place them to make sure that the order that it's set is roughly as it's
needed, while still setting the list at the same time the
map-appropriate ruin placements are dropped in.

**Plus some misc cleanup fixes:**
`var/list/ore_vent_sizes` in SSore_generation wasn't being treated as a
similar budget list as `ore_vent_minerals`, since it `pick()`s off it's
own static size list. Which is honestly fine for this five seconds, I
can handle that later while we make sure the rest of the code code is
stable. In the meantime, I've just tweak it so that it's easy to see at
a glance how many of each random vent has spawned into the map.

Tweaked the description to not include anything about chemical
processing, as I'm planning on hitting on that in a part 2 PR that I'll
be picking back up after the freeze.

## Why It's Good For The Game

Cleans up the code a bit, but primarily fixes ores not spawning on
icebox as they should.
Should fix #81058.
Improves description to not mention mechanics that aren't in game.
Also, cleans up a piece of code that currently isn't serving much of a
purpose.

## Changelog

🆑
fix: Icebox should have it's ore distribution and it's ore vents fixed,
so that vents should now produce ore.
spellcheck: Boulder processing machines now don't mention things they
don't do.
/🆑

* Fixes ore vents spawning without ores on icebox, sets up map specific ore configurations

---------

Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
2024-02-07 13:26:08 -05:00
SkyratBot
0ac1027456 [MIRROR] Gives paradox clone their own ghost polling icon (#26374)
* Gives paradox clone their own ghost polling icon (#81229)

## About The Pull Request

Currently all ghost roles, when polling for players, shows a syndicate
poster. This is lame as hell, especially since most of the roles aren't
even Syndicate aligned.
This adds support to have your own icons for it, and adds one for the
Paradox clone since I already had an idea for it.

## Why It's Good For The Game

Paradox clones are not syndicate aligned and it does not make sense to
portray that to players, this looks much better, and hopefully soon
other antags will follow suite.

![image](https://github.com/tgstation/tgstation/assets/53777086/b6016ff1-9914-42a8-bd9f-e72ba5539e11)

## Changelog

🆑
add: Paradox clones now have a bluespace stream instead of a syndicate
poster as their ghost poll icon.
/🆑

* Gives paradox clone their own ghost polling icon

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
2024-02-07 13:25:37 -05:00
SkyratBot
bd9d2ca175 [MIRROR] Fixes Cult voting for a leader (#26312)
* Fixes Cult voting for a leader (#81169)

## About The Pull Request

With the recent changes to polling, it seems like it didn't properly
poll cultists, I fixed that and fixed other issues with it (such as it
telling players that they are signing up to BE a cult leader, when they
arent).

Also fixed the button to put yourself forward as cult leader, it
properly removes and gives itself when necessary.

## Why It's Good For The Game

Cult button works again how cool is that

Closes https://github.com/tgstation/tgstation/issues/80620

## Changelog

🆑
fix: Cultists can now vote for a Cult leader again.
/🆑

* Fixes Cult voting for a leader

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
2024-01-31 21:49:45 +01:00
SkyratBot
43696efe83 [MIRROR] Removes overly optimistic warn on byond version (#26303)
* Removes overly optimistic warn on byond version (#81185)

## About The Pull Request

I assumed this would be fixed because I assumed it was a bug. My report
goes unresponded to.

* Removes overly optimistic warn on byond version

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2024-01-31 21:39:12 +01:00
Zenitheevee
69e572d370 [SEMI-MODULAR] Port Tarkon Fixes (#26271)
* Should.. be everything?

* forgot one thing.

* brain hurt shutup
2024-01-30 09:26:13 -06:00
Useroth
22bcdbf5f9 Nova ports batch 1 (#26273)
* Map votes are no longer random (#43)

* Disables the annoying fear of Santa from the claustrophobia quirk (#51)

* Removes the job locks from all armbands except the sec armbands, and reflavors all armbands to not directly state this person is a member of x department (#62)

* [MODULAR] Removes Arbitrary Loadout Restrictions (#58)

* Removes an AM template from NorthStar as well as the prison curtain logic (#72)

* Bilingual now let's you take common (if you don't already have it) (#78)

* Period Era Re-Enactment: Basic autopunctuation (#84)

* [Semi-modular] Gives Xeno-hybrids some xeno-organs in trade for high temperature weakness (#91)

* The Thrill of the Hunt: Hemophage blood digestion changes (#93)

* Removes the ability for shocks to stop your heart (#116)

* Ghost cafe turf fixes (#161)

* ungatekeeps headshots (#170)

* Lo(v)re Wins: Mothic Language return (#186)

* Add Bone Greaves As Foot Clothing For Tribals (#197)

* Saving Private Oversized: Quirk balancing adjustments (#199)

* Over(sized) and Under: Oversized combat adjustments (#202)

* Shuttles no longer bolt their doors on transit (#203)

* Increases PAI description and OOC notes limit (#207)

* Makes headset sounds not insane (WHY DO THEY HAVE A RANGE OF 17 TI:LES?) (#215)

* Add Bone D6 For Tribals. (#217)

---------

Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: Name <w4rd3nn@gmail.com>
Co-authored-by: Ephemeralis <Ephemeralis@users.noreply.github.com>
Co-authored-by: lila <sheepwiththemask@gmail.com>
Co-authored-by: nikothedude <59709059+nikothedude@users.noreply.github.com>
Co-authored-by: Sable <102194057+Thlumyn@users.noreply.github.com>
Co-authored-by: goobliner <141452834+goobliner@users.noreply.github.com>
Co-authored-by: Lutowski <136726218+Lutowski@users.noreply.github.com>
Co-authored-by: FearfulFurnishing <139661819+FearfulFurnishing@users.noreply.github.com>
Co-authored-by: SomeRandomOwl <2568378+SomeRandomOwl@users.noreply.github.com>
Co-authored-by: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com>
2024-01-29 20:13:27 +00:00
SkyratBot
9fe2ef7c99 [MIRROR] Add: 2 Quirks Configs (#26206)
* Add: 2 Quirks Configs (#81033)

This PR adds two new config options for quirks:
- *Flag* `DISABLE_QUIRK_POINTS`
  - When enabled, disables quirk points balancing.
- When enabled, players can select positive quirks without first
selecting negative ones.
- When enabled, the quirk points balance visually hides itself on the
Quirks page.
- *Number* `MAX_POSITIVE_QUIRKS`
- Limits the maximum quantity of positive quirks which players can
select using the Character Preferences page.
  - I ported this from the old `MAX_QUIRKS` define.
- When set to `0`, players won't be able to select any positive quirks,
and they won't appear on the Quirks page.
- When set to `-1`, players will be able to select any quantity of
positive quirks.
  - When commented-out or undefined, the default is `6`.
- When set to `0` or `-1`, the positive quirk balance visually hides
itself on the Quirks page.

There is some downstream repositories asking for the quirks system to be
configurable. Additionally, I always find myself tweaking these values
on my own private servers and I thought it would be nice to share my
edits. Usually I was simply commenting-out sections of this code in
order to get the same result, so it helps to have an official way to
disable quirk points.

🆑 A.C.M.O.
config: Added two new config flags for quirks, DISABLE_QUIRK_POINTS and
MAX_POSITIVE_QUIRKS.
/🆑

* Oh come on

---------

Co-authored-by: Dani Glore <fantasticdragons@gmail.com>
Co-authored-by: Useroth <37159550+Useroth@users.noreply.github.com>
2024-01-29 01:56:10 +01:00
SkyratBot
ddfd3e36bd [MIRROR] Improves upon setting custom materials for printed items (#26242)
* Improves upon setting custom materials for printed items (#81015)

## About The Pull Request
This is an improvement on #80839 regarding how custom materials are set
on items, it's based on the following findings.

1. `set_custom_materials()` proc already comes with an prebuilt
`multiplier` var

1e8d511946/code/game/atom/atom_materials.dm (L11)
This means we can pass the machine's cost coefficiency directly to this
proc rather than creating our own list of materials with their values
scaled by the factor like so

1e8d511946/code/game/machinery/autolathe.dm (L192-L193)
We can instead just do `set_custom_materials(design.materials,
material_cost_coefficient)` without ever needing this list, thus making
code cleaner, with that the changes propogate to how `has_materials()` &
`use_materials()` procs are also used as we can now use their
`coefficiency` param rather than seeing it go to waste

2. All items custom materials will now always be integer values. With
this `SSmaterials.FindOrCreateMaterialCombo` now has better performance
because when computing the key for caching values like `1.5` or `1.7` it
will become just `1` and will point to the same cache thus reducing
memory usage

3. Materials are now uniformly split among all the contents of a printed
item from techfab or autolathe. What this means is items like the foam
ammo box printed from autolathe will have both the ammo case and their
40 bullets each set with custom materials such that their final sum
becomes equal to the design cost. For info on how that's done see the
documentation of `split_materials_uniformly` proc.

One downside of this proc is when items have a very small amount of
`custom_materials`(less than 2). In that case values like `0.8` or `1.5`
or `1.7` ends up getting rounded to 1 which means you end up getting
less materials when recycling than what you used for printing that item.
In this case You get 0.48 iron from both the box & it's ammo instead of
0.79 iron used for printing in tier1 autolathe(Or 0.50 for tier4
autolathe).

This shouldn't be an issue as you still can't make any profits from this
but at least everything in the box is now recyclable.

## Changelog
🆑
fix: items that contain recursive contents inside them (like foam dart
boxes from autolathes) now have their custom materials set to match with
its design cost rather than being nullified, meaning they are now
recyclable.
code: all custom materials are now integer values. Improved code for how
materials are used in techfab & auto lathe for printing
/🆑

* Improves upon setting custom materials for printed items

---------

Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
2024-01-25 22:47:49 -05:00
SkyratBot
2d06a3a7b3 [MIRROR] Stock market event refactor and code improvements (#26229)
* Stock market event refactor and code improvements (#80985)

## About The Pull Request

Stock market events are a system coded into the stock market system in
an attempt to keep the stocks unpredictable, at least on paper. They...
need work, I'm in full agreement on that, but I haven't been able to get
the energy to really fix stocks as of recently. I plan on going and
kicking events up and making them a lot cooler, but in the meantime,
I've refactored stock market events into their own datum type,
`/datum/stock_market_event`. This works like most similar event datum
style objects, where an event has a proc called when an event starts, a
proc called when an event ends, and a proc called between on subsequent
stock market subsystem firings.

This does some minor tweaks to the newscaster stories automatically
generated after an event fires, namely so that they can be produced
quickly while emphasizing the important part of the event, what material
is being effected, and a summary of what kind of behavior has happened
to the material stock.

Additionally, this made for a good excuse to do some code cleanup here
while I had the opportunity, swapping to `::` as opposed to `initial()`
calls where it seemed cleaner and more appropriate. This should make
adding new stock market events as well as more unique events that can
effect cargo and the round at large simple to do.

This PR shouldn't have any mechanical changes to how stock market
behaves in a live round.

## Why It's Good For The Game

Improves code quality of stock market, increases readability of stock
market events that have happened on the newscaster, and performs some
minor cleanup to the TGUI for the stock market while I'm at it, all
while keeping balance the same while we're still in the feature freeze.

Full disclosure, once the freeze is over I have some pretty easy numbers
tweaks planned to help significantly improve the stock market system
that I had layered on this branch, but we've shuttled them off this PR
for now to get this part ready to ship.

## Changelog

🆑
refactor: Stock market events are now their own objects, and are handled
by the stock market individually.
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>

* Stock market event refactor and code improvements

---------

Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>
2024-01-25 09:34:29 -05:00
SkyratBot
5543a44882 [MIRROR] ArcMining Pr Beta: Version 1.2 (#26205)
ArcMining Pr Beta: Version 1.2 (#78524)

This one's not like the last one, so much so that I'm not even going to
outsource the PR description to a robot this time!
Basically, **You should read the PR body before assuming that everything
is the same as last time. It's not.**

Click the link below to see a video summary of the main features of this
pull request.
https://youtu.be/Aho2omR0mjY?feature=shared

This pull request serves as a large rework of minerals produced by
mining, and by extension mining itself. I'll try and list each change
and it's associated nuance here.

The biggest addition to the game with ArcMining is **Ore Vents**. Ore
vents spawn as a ruin on the map, placing a randomized ore vent onto map
generation. Ore vents spawn in 3 different sizes, **Small, Medium, and
Large**. These vents will pick from a pool of materials they can
generate, and will hang out across the map. A player can use a mining
scanner to discover an ore vent, granting a small quantity of **mining
points** to begin with. Once scanned, ore vents will show what minerals
that ore vent will generate after they're fully tapped.

Scanning the vent again will trigger the extraction process. A small
drone will fly down, called the NODE drone, and buckle onto the vent.
Your job during wave defense is to protect the drone and to defeat waves
of randomly spawning mobs (dependent on if you're on lavaland or on
icebox). The quantity, duration, and time between waves is scaled to the
size of the vent you're protecting. Starting by scanning and protecting
lower tier vents earlier in the shift is a safer bet than doing a large
vent in the first few minutes. The drone has 500 health, and can take a
good few hits, but leaving it alone will cause it to meet an unfortunate
end quite quickly.

Cooperation can be your best asset, as mining with allies can greatly
help with wave defense, and mineral points are granted to anyone who
helps with defending the ore vent equally (So 500 * size tier,
regardless of how much help you receive). Once complete, the ore vent
will have a mining machine constructed on top of it, and will start to
dredge up **Boulders** from the earth automatically. More on boulders
later.

Ore vents can be located based on your mining scanner, and will provide
an appropriate audio cue based on if the ore vent has been discovered or
not, and once processed will no longer alert you to it's presence.

**Each station comes with a free vent that produces exclusively iron and
glass, free of charge.** This is to help with shifts where the station
may not have shaft miners to produce minerals, and to provide the
station with a baseline amount of minerals where none may exist
otherwise.

Mineral generation has been completely reworked. Previously, Mineral
Generation had a flat 13% spawn rate in-game. Once minerals spawned,
they would also have a chance to propagate their minerals to nearby
tiles, resulting in a rather massive pool of minerals that could spawn
throughout lavaland on the whole.

This tweaks that, by making minerals in walls spawn based on their
proximity to ore vents on maps that use cave generation. Both the
probability, and quantity of ores spawning in walls is scaled based on
distance, with ore vents looking like large caches of ores found in
walls. This makes following ores found in walls and checking their
quantity of minerals spawned a good indicator of how close you are to a
nearby vent in-round.

This means you can collect some points form both discovering ore vents
first, as well as collecting their surrounding ores, turn those in for
mining points, and then trading them in for gear upgrades to more
effectively take on ore vents. As a result of tweaking the balance of
this, the total amount of ores spawned in walls overall has been
decreased. However, by making more of the process time based, we still
result in a mostly balanced finished product.

On station, there are now three new machines. These are the BRM, the
Refinery, and the Smelter.

- The BRM acts as a teleporter. Instead of needing to carry boulders
back to the station, you can activate the BRM, and it will automatically
pick boulders to teleport back to itself. You can use this to teleport
boulders dredged up from lavaland onto the station for processing. **The
BRM will only lock on to boulders that are resting on an ore vent.**
Moving boulders back by hand will mean you'll have to haul it back by
hand.
- The refinery processes the non-metallic materials out of boulders.
This process sends the materials straight to the ORM, and collects
mining points from the ores smelted in the machine. Swiping with an ID
card lets you withdraw those points for your own personal account, but
remember that these points are for your whole team to share from. The
**Mining points obtained from this process is only 75% of the amount an
equivalent amount of ores would provide.**
- The smelter works nearly identically, however the smelter produces
metallic materials out of boulders instead.
- Once a boulder has had all of it's materials extracted, it's broken
down and deleted from the line. Otherwise, the boulder is spat out for
the next machine to process it (either the refinery or smelter).
- Once there's no minerals left in a boulder of any type, the refinery
or smelter will break the boulder down.
- Boulders **do not stack onto tiles with each other**, so they'll block
each other when pulled or when moving on a conveyor belt.

Boulders can also be processed by hand. Using a mining tool on a boulder
with right click will allow you to break down a boulder into it's
composite ores, but limits you to a maximum of 10 ore per boulder, where
the full amount can be extracted using the proper processing machines.
Also, processing by hand does deal small amounts of stamina damage over
time, do breaking a full large boulder can be particularly taxing.

Additional Boulder Processing Machines can be built, with the BRM board
being obtained from the Protolathe, while the Smelter and Refinery
boards being obtainable from the Autolathe instead. A _boulder
processing beacon_ can also be obtained from the mining points vendor as
a reward to assist with boulder processing. Boulder processing beacons
can be used to spawn in a new BRM, refinery, and smelter on the tile the
user is standing on, however **you'll still need to link them to the
ORM**!

All three machines can be upgraded with Stock Parts, allowing for **more
boulders to be processed at a time**. It does not, however, increase the
amount of minerals received from boulders, or points earned.

Mining borgs have been given some minor adjustments to compensate for
the changes to mining. Their mineral scanner, which now has an active
component to gameplay, is now a module as opposed to built into the mob.
This module allows for the same ability to discover and start waves of
monsters to fight.

Mining modules will find that their PKA now has a total of 90% mod
capacity as compared to the 80% they had before, to allow for more
robust defense of ore vents.

In addition, all borgs and AIs can interact with the BRM for boulder
collection.

Mining Mechs have had their utility tweaked as a result of these changes
as well. Mineral scanners to be used on mining mechs now have a larger
radius by comparison to their handheld cousins. Similarly, it now has an
active scanning button, which will actively discovery nearby ore vents.
To begin wave defense, you will need to hop out and scan a second time
however, so that you can properly accept the risks of drawing a horde of
bloodthirsty wildlife towards you and your companions.

Mechs can also manually process boulders, similar to mining tools using
their drill.

Golems, being more gentle and less aggressive than humans, while being
made out of LITERAL ROCKS, have a greater need to secure access to ores
and minerals to eat. As such, they have adapted to be able to do two new
things:

- Golems may now right click ore vents to be able to manually haul a
boulder out of the vent. This costs a hefty amount of stamina, but it
allows for golems to avoid combat during regular gameplay.
- Golems may now left click a boulder with an open hand in order to
manually process a boulder like a pickaxe. While not faster, it is
consistent and prevents golems from starving if they have access to a
vent, but no ores, somehow.

The labor camp, being a camp for rehabilitation and ~~excessive manual
labor~~ has been tweaked. Boulders now replace the random minerals
located on their island, and to acquire their prizes inside, much be
excavated and then broken out of the rock. Now YOU TOO can excavate
minerals and become a true mineral hero by working your way to freedom.

As a result of fewer mining points being available across the map due to
the new ore spawning mechanics, and the shift in how and when ores will
be coming in, almost every progress based mining point cost has been
reduced by around 10-20%. Many numbers are still subject to change at
present, but the idea is that core progress unlocks should be made a bit
more available earlier in the round before players can start to solo or
duo larger or more difficult ore vents, after which they'll be rolling
in ores.

Every once in awhile, an unusual boulder will get hauled up from the
mineral rich depths of lavaland. These **Artifact boulders** can
occasionally produce rare items, but for now they've mostly just been
pulling up **Strange objects** for science. Nanotrasen Natural Sciences
department will reward you extra points to be collected by boulder
processing machines for successfully extracting one. In the future, this
opens up a passive reward space that mining can reward to the station,
like providing cytology DNA samples, ancient seeds, or other artifacts.

- Boulders can be stored in all varieties of ore boxes (ground, mech)
should you choose, however as mentioned it's best to leave them where
they spawn and teleport them to the station for convenience.
- Maps that are not subject to cave generation will find that they are
largely untouched in terms of mineral balance.
- Future or existing ruins can now be tweaked to have a mineral balance
cost, as the ore vent ruin does. This will allow us to spawn in more
interesting ruins for pre-made combat challenges.
- There are unique ore vents that spawn across the map, that will summon
a boss mob relevant to that map. If the boss mob is defeated, that vent
will spawn large boulders pulling from every possible ore type that can
spawn. Not for the faint of heart!
- Similarly, the number of ore vents and mineral budget is now
adjustable in the cave generation procs, so maps may spawn with more or
less ore vents as desired for balance.
- Artifact boulders opens up a LOT of room for possible future content
like archaeology, xenoarch, artisci, and other design spaces!
- Megafauna STILL SPAWN ON THE MAP. They just happen to spawn in
addition to boss ore vents.
- **I'll add more to this as I get asked questions and remember things,
this is a huge PR and I'm confident I've missed at least something**

I outlined a lot of this in #78040, so I'll try and keep this relatively
snappy this time, while noting that I've made some concessions to make
the whole system a lot more playable while not trying to break out
design decisions that are at the end of the day, better for the game and
the overall resource balance in round.

Minerals are a very poorly balanced system, and have been since their
inception many years ago. We heavily rely on mineral balance in round,
and yet we've really only balanced it by introducing so much supply that
there's no equivalent exchange for materials that doesn't just heavily
flood the exchanged material. For example, items printed from materials
that are otherwise considered "rare" on master exist in such quantities
and they'll never practically run out in our allotted 90 minute time
slot design. This PR adjusts how ores spawn to a point where we can
minimize the amount of ores that need to exist on the map for mining to
be able to progress, while still providing enough resources for the
station that it covers the needs of the station adequately.

Miners will need to be more strategic about what resources they've
collected, and be able to make decisions about which vents are worth the
risk of attempting to fight, how to prepare for a wave defense, and when
to head back up for upgrades, while finally giving them at least some
kind of incentive to work together and use different equipment.
Resonators make cleaning up the caves around vent easy, sandbags set up
easy defenses for your vent, mechs can serve as a wider range radar
while mining, all while still providing a new gameplay loop to mining.

By limiting the amount of ores that can enter the round from the
massive, massive amounts that were coming into the round beforehand (see

gameplay to the processing of minerals. I have some plans for that,
however this PR already got bloated really REALLY badly due to scope
creep and the number of intersecting systems that rammed into each other
to make this PR possible. So that'll be next. Plus, as I've mentioned,
we open up places for ore processing to find fossils, relics, and other
things that can implemented down the line.

Overall, I don't expect this PR to save or kill ore balance, but we gain
a LOT more control over it through the use of our mining defines
attached to this PR, and at the end of the day, that's a great place to
start off of.

🆑
add: Added ore vents. Scanning them with mining scanners shows what
minerals they contain. Scan again to fight off a horde of beasts as your
drone assistant excavates the vent, so the ore vent will produce mineral
boulders!
bal: Ores that spawn in walls now spawn based on their proximity to ore
vents, with their chance to spawn and their minerals contained scaling
from low to high.
add: Added the BRM, Refinery, and Smelter. These pieces of equipment are
used to process ore boulders into minerals for the station. Stock Part
upgrades allow more boulders to be processed at one time. They collect
mining points as well, to be redeemed with an ID card swipe.
add: Boulders are teleported to the station via the BRM if left
untouched. Boulders can also be cracked open for a reduced amount of ore
using pickaxes or golems hands.
add: All stations come equipt with a pre-excavated ore vent, which
produces a basic supply of iron and glass only. Scan other vents for
your critical resources!
add: Look there's a shit ton of changes on mining, for more detail check
out the Pull Request: https://github.com/tgstation/tgstation/pull/78524.
sound: New sounds and noises for your high octane factorio-like
gameplay!
image: All new boulder sprites for the new minerals and rocks added to
the mining gameplay loop, as well as mining machines!
image: Overlays appear over vents when scanned to let you know their
contents at a glance when actively scanned with any mining scanners.
/🆑

---------

Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-01-22 01:33:55 +01:00
SkyratBot
ab5a4d0f99 [MIRROR] split area.contained_turfs up by zlevel, make init 10 seconds faster (#26161)
* split area.contained_turfs up by zlevel, make init 10 seconds faster (#80941)

## About The Pull Request

Situation: areas have a list of all turfs in their area.

Problem: `/area/space` is an area and has a 6 to 7 digit count of turfs
that has to be traversed for every turf we need to remove from it. This
can take multiple byond ticks just to preform this action for a single
space rune

Solution: split the list by zlevel, and only search the right zlevel
list when removing turfs from areas.

replaces `area.get_contained_turfs()` with a few new procs:

* `get_highest_zlevel()` - returns the highest zlevel the area contains
turfs in. useful for use with `get_turfs_by_zlevel`
* `get_turfs_by_zlevel(zlevel)` - returns a list of turfs in the area in
a given zlevel. Useful for code that only cares about a specific zlevel
or changes behavior based on zlevel like lighting init.
* `get_turfs_from_all_zlevels()` - the replacement for
`get_contained_turfs()`, renamed as such so anybody copying/cargo
culting code gets a hint that a zlevel specific version might exist.
Still used in for loops that type checked so byond would do that all at
once
* `get_zlevel_turf_lists()` - returns the area's zlevel lists of lists
but only for non-empty zlevels. very useful for for loops.

The area contents unit test has been rewritten to ensure any improper
data triggers failures or runtimes by not having it use the helpers
above (some of which ensure a list is always returned) and access the
lists directly.

* split area.contained_turfs up by zlevel, make init 10 seconds faster

* eeyes

* Update area_spawn_subsystem.dm

* Unshits turf contain code slightly (#81023)

Literally just implements my reviews from #80941 
I am frankly a smidge pissed that the pr was merged without them being
handled. No code is worth merging past known issues, and if the author
is just gonna dip then that's life.
I don't like privileging mso on stuff like this, especially because
frankly I'm kinda mad at him rn but also because when a pr is made the
onus on finishing it falls to the person who made it.

Should not need to clean up after someone as a maintainer, and shouldn't
normalize doing it. I'm not like mad at zypher directly mind he offered
to do this too, just the idea he was espousing here.

---------

Co-authored-by: Kyle Spier-Swenson <kyleshome@gmail.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2024-01-21 03:34:23 +00:00
SkyratBot
cd085ace35 [MIRROR] Fixes clown ops getting their codes (#26181)
* Fixes clown ops getting their codes (#80992)

## About The Pull Request

Nukies were using ``get_machines_by_type`` in ``assign_nuke`` to get the
nuke and set its code, which doesn't work for clown ops because they use
a subtype. This fixes it by replacing it with
``get_machines_by_type_and_subtypes`` instead.
while I was messing with clown op code I also made it a little bit less
copy paste

![image](https://github.com/tgstation/tgstation/assets/53777086/2db9e859-8d53-4704-a110-7f8a5f33ee0f)

## Why It's Good For The Game

Clown ops now get a code to their nuke rather than it staying as
'ADMIN', pretty cool!

Closes https://github.com/tgstation/tgstation/issues/78306

## Changelog

🆑 Momo8289, Pepsilawn, Sinsinins, JohnFulpWillard
fix: Clown ops now get a code set for their nuke.
/🆑

* Fixes clown ops getting their codes

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
2024-01-20 13:50:32 -05:00
SkyratBot
ebc069d742 [MIRROR] Optimizes Reftracking (Bigly) (Plus harddel fixes) [MDB IGNORE] (#26138)
* Optimizes Reftracking (Bigly) (Plus harddel fixes) (#80443)

## About The Pull Request

### Reftracking BS

Alllright so reftracking is slow, really really slow.
That's a problem for me, both because I want it to be fast so I can more
efficiently torture players by running it on live, but also because it
impedes both local and CI runs.

So I've set out to micro optimize the DoSearchVar proc, one of the
hottest in the game.
I've done this in a few different ways.

#### The simple shit

Removing redundant proc args
Yeeting assoc arg setting (extra cost)
Moving if statements around to prioritize the more common case
Ignoring empty lists.

#### The not simple shit

Throwing our snowflake list checking into the sun
(Background, byond has some special lists that cannot be accessed like
an assoc list, trying to will lead to runtimes)
The way we handle this involves inspecting their ref string, and it eats
a LOT of time.

Faster then to mark all the lists we know are special by var name, and
then use try/catch to detect and silence anything that sneaks through
(this is on the order of like 1/3 per run, kinda curious what they are
tbh)
Thanks to MSO for the idea for this btw.

Removes the vars and logic that tied ref searching to clients.
It's not how this code is used, and it slows everything else down for
really no reason

Added support for handing in a known "hanging reference" count, and then
searching for that.
This lets us early exit the ref search if we find everything we were
looking for, which is REALLY powerful, and why I asked for refcount() in
the first place.

### Harddel Fixes

[Fixes some harddels w gulag stuff born of the 515 one way ref
issues](046d7daa03)

[Ensures proximity cameras clean their ref to their proximity datum if
it's
deleted](ff607e9ccb)

[Deleting a pipe connected via the gas_machine_connector datum to a
machine should also delete that machine (harddel
fix)](9eecca22e7)
## Why It's Good For The Game

All this combined speeds up refsearching massively, on the order of
hundreds of seconds, and makes it far less time consuming for both CI
and running on live.
I'll be bullying some servers semi soon, want to see what I can cut out.

* Optimizes Reftracking (Bigly) (Plus harddel fixes)

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2024-01-16 17:33:15 +01:00
SkyratBot
d55095b95c [MIRROR] Adds a Debug command to stop all weather. [MDB IGNORE] (#26073)
Adds a Debug command to stop all weather. (#80848)

Atomizing out of #78524 as a result of that PR being too big and this
was quite easy to do.

This adds a debug (admin) command that allows you to stop all weather
effects that are going on across the map in a given instance. This is
useful for when you are testing something on lavaland and need the storm
to stop, or if you otherwise had some other kind of weather effect
interfering with testing something. It's worth noting this directly
calls end() on the active weather effect, meaning that for more
complicated weather that may have different side effects, it may need
some extra finess, but as of current writing no weather does anything
interesting in their wind_down() procs.

God weather is so annoying while testing lavaland, plus this is just
straight admin and testing tooling so there's no harm.

🆑
admin: Added a new admin verb that ends all active weather within the
weather subsystem.
/🆑

Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
2024-01-12 03:47:36 +01:00
Gandalf
0585ed154e Fixes statpanel (#26040)
* Update statpanel.dm

* Update statpanel.dm

What if we try to make it shorter

* Actually let's move the slash

---------

Co-authored-by: Useroth <37159550+Useroth@users.noreply.github.com>
2024-01-08 14:18:08 +00:00
SkyratBot
9083c2dc17 [MIRROR] [NO GBP] Fixes expiration times for coupon codes. [MDB IGNORE] (#26029)
* [NO GBP] Fixes expiration times for coupon codes. (#80771)

## About The Pull Request
Flash coupon codes were expiring in less than a second. I hadn't thought
of using the `DisplayTimeText` proc.

* [NO GBP] Fixes expiration times for coupon codes.

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-01-07 03:04:07 -05:00
SkyratBot
3033c6bfdc [MIRROR] fix tgs version feedbackdb logging [MDB IGNORE] (#26006)
* fix tgs version feedbackdb logging (#80774)

I found this while looking in this file for other reasons.

Shutdown is called after blackbox.Seal() in 99% of cases, keeping this
from getting logged.

* fix tgs version feedbackdb logging

---------

Co-authored-by: Kyle Spier-Swenson <kyleshome@gmail.com>
2024-01-05 20:16:45 +00:00
Gandalf
02167eeb26 Player counts and station time to statpanel [Port from blubberstation] (#25955)
* Update statpanel.dm

* indent

* Update statpanel.dm
2024-01-05 19:31:02 +00:00
SkyratBot
8135a338a5 [MIRROR] Fixes a runtime in throwthings [MDB IGNORE] (#25984)
* Fixes a runtime in throwthings (#80753)

## About The Pull Request

![tJlDYvPfAy](https://github.com/tgstation/tgstation/assets/13398309/7631077e-8889-4a08-a91c-40007b44b8cc)

This is kinda not great because it causes them to not reach the part of
the code where they're supposed to clean up after themselves. Added a
safety for it.

![image](https://github.com/tgstation/tgstation/assets/13398309/48b9a791-b9b6-4ce7-8428-ff0184ea5512)

## Why It's Good For The Game

## Changelog

🆑
fix: fixed a runtime in datum/thrownthing
/🆑

* Fixes a runtime in throwthings

---------

Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
2024-01-04 19:19:48 +00:00
SkyratBot
698ecf2a7c [MIRROR] Increased odds of station traits a little. Introduced a "budget", so smaller traits only take half as much space. [MDB IGNORE] (#25980)
* Increased odds of station traits a little. Introduced a "budget", so smaller traits only take half as much space. (#80211)

## About The Pull Request
Recently, I chatted with others about how few station traits are rolled
on a round by round basis - about 59% of the shifts go without either
positive or negative traits for example - and how the mild most of these
traits are (not a bad thing per se), which results in an underwhelming
feature, despite the more interesting bits of it. So, after sharing
opinions, I've decided to make this PR to increase the rolls and odds a
bit.

EDIT: After reading comments and taking some time to think this
thoroughfully, I've decided to push the probabilities back a little in
favor of a simple budget system for station traits, to allow for smaller
things to only count as half a station trait. This mean smaller traits
won't necessarily stop "better" ones from rolling, or at least allow for
plentier permutations of traits that do not affect the round TOO much.
I've also reduced the weight of the glitched pda beeps trait from 15 to
10, the same of scarves, wallets and colored assistant jumpsuits.

## Why It's Good For The Game

I believe the current odds of station traits to be a smidge low, and
that the lack of any sort of cost-budget for station traits to hurt the
rarer, more interesting traits (and the feature in general) if the more
common, milder ones take just as much space. It's totally within the
spirit of the feature to have small, niche traits, though they can get
quite boring pretty fast on their own, so what I'm saying is that their
cost should stay low so that other traits can roll.

## Changelog

🆑
refactor: Introduced a simple budget system to station traits, so that
smaller things only count as half a trait, for example.
balance: Increased the odds and maximum number of station traits that
can be rolled each shift.
/🆑

* Increased odds of station traits a little. Introduced a "budget", so smaller traits only take half as much space.

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-01-04 17:00:10 +00:00
SkyratBot
c41dd0e2f4 [MIRROR] Saves some free lag by removing some in area (in world) loops [MDB IGNORE] (#25977)
* Saves some free lag by removing some in area (in world) loops (#80644)

## About The Pull Request

Goes through and changes some `in area` / `in a` loops to use
`get_contained_turfs` to cut down on `in_world` loops. Saves some free
lag.

## Changelog

🆑 Melbert
fix: Some things which affect everything in an area are less laggy, the
"all lights are broken" station trait especially
/🆑

* Saves some free lag by removing some in area (in world) loops

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2024-01-04 16:59:25 +00:00
SkyratBot
d270fb2b2d [MIRROR] Fixes some runtimes in pathfinding (and bonus) [MDB IGNORE] (#25969)
* Fixes some runtimes in pathfinding (and bonus) (#80735)

## About The Pull Request

Found these while running a test server all night. I am not sure if the
second one really causes issues because `.` is being set to something
but it is is certainly polluting the runtime logs.

Also fixes an unrelated runtime with one of the admin verbs, where it
would runtime if you canceled out of the input prompt.

## Why It's Good For The Game

Less runtime spam.

![IklvTShHJB](https://github.com/tgstation/tgstation/assets/13398309/2441ad6b-67b7-4d65-83a3-eabba4516fe9)

![veGkt0Eyul](https://github.com/tgstation/tgstation/assets/13398309/e99eced9-89e6-4065-93d9-578795ddbd8d)

## Changelog

🆑
fix: fixes some runtimes in pathfinding code, as well as one in the give
direct control admin verb
/🆑

* Fixes some runtimes in pathfinding (and bonus)

---------

Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
2024-01-04 16:57:38 +00:00
SkyratBot
8eeca186df [MIRROR] Cleans up some extra args in Destroy() [MDB IGNORE] (#25907)
* Cleans up some extra args in Destroy() (#80642)

## About The Pull Request

After https://github.com/tgstation/tgstation/pull/80628, these shouldn't
be needed anymore right?

## Why It's Good For The Game

Cleans up some vestigial code

## Changelog
EDIT: Not player-facing.

* Cleans up some extra args in Destroy()

---------

Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: Pinta <68373373+softcerv@users.noreply.github.com>
2023-12-30 01:21:26 -05:00
Useroth
30208d384e Adds a config entry for bypassing the veteran locks on jobs and quirks (#25895)
Adds a config value for bypassing the veteran system for jobs and quirks.
2023-12-29 18:49:31 +00:00
SkyratBot
b4d3b18bae [MIRROR] Fixing the constant poll alert runtimes, and the selector outline not being updated. [MDB IGNORE] (#25891)
* Fixing the constant poll alert runtimes, and the selector outline not being updated. (#80610)

* Fixing the constant poll alert runtimes, and the selector outline not being updated.

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2023-12-29 18:14:38 +00:00
SkyratBot
067188d366 [MIRROR] Micro-optimize qdel by only permitting one parameter [MDB IGNORE] (#25889)
* Micro-optimize qdel by only permitting one parameter (#80628)

Productionizes #80615.

The core optimization is this:

```patch
-	var/hint = to_delete.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up.
+	var/hint = to_delete.Destroy(force) // Let our friend know they're about to get fucked up.
```

We avoid a heap allocation in the form of copying the args over to a new
list. A/B testing shows this results in 33% better overtime, and in a
real round shaving off a full second of self time and 0.4 seconds of
overtime--both of these would be doubled in the event this is merged as
the new proc was only being run 50% of the time.

* Micro-optimize qdel by only permitting one parameter

---------

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2023-12-29 14:41:12 +00:00
SkyratBot
3e6edd73ee [MIRROR] Add system for safely manipulating JSON databases and apply it to photo albums and photo frames [MDB IGNORE] (#25887)
* Add system for safely manipulating JSON databases and apply it to photo albums and photo frames (#80519)

We frequently have issues with data loss in our long storage .json files
for various reasons, such as the file being completely blanked out on
write etc.

This introduces a system that tries to safely handle that by saving the
known working json file into a backup that will be loaded in the case a
write fails.

This system queues updates in order to send through to the next tick.
This is an improvement over the existing implementation of photo albums
and photo frames (I think all persistence, even) which do not save until
the end of a properly rebooted round, but not during a server crash.

Also saves the jsons in pretty prints, which make them easier to read
but especially make them easier to diff in a git repository, which MSO
wants to setup (and hopefully make public so I can make a dashboard on
bus.moth.fans for looking at photo albums and their history, which is
something I've wanted to do for a very long time).

## Changelog
🆑
refactor: Photo albums and photo frames are now more resilient to data
loss, especially when a server crashes.
/🆑

* Add system for safely manipulating JSON databases and apply it to photo albums and photo frames

---------

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2023-12-28 08:08:13 -08:00
SkyratBot
cf00bcb7b7 [MIRROR] basic bot path huds and medbot research [MDB IGNORE] (#25870)
* basic bot path huds and medbot research (#80277)

## About The Pull Request
this pr integrates the bot path huds to ai controllers and move loops to
allow basic bots to display their paths in the hud.
also closes #80280 and closes #80330

## Why It's Good For The Game
basic bots now can display their path on huds

## Changelog
🆑
add: basic bots can now display their paths on huds
fix: medbots can research healing again
/🆑

* basic bot path huds and medbot research

---------

Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
2023-12-27 09:46:33 -05:00
SkyratBot
49452b3851 [MIRROR] The Coupon Master PDA app [MDB IGNORE] (#25855)
* The Coupon Master PDA app (#80240)

## About The Pull Request
This PR adds a new PDA program to the supply category, which allows
users to redeems coupons for various cargo packs (mostly goodies), like
the ones also found at the bottom of cig packs.

How it works is fairly simple:

- Once installed, the modular computer subsystem will periodically, at a
3-5 minutes interval, generate a coupon code datum associated to a plain
text code, which is sent out to everyone with the program installed.
- The user can then open the program and insert the text into an input
box to redeem the coupon code, which is then associated with their bank
account.
- He will then have to find a photocopier, and tap it with the PDA to
print the coupon. Only one coupon can be printed. Photocopier fees
apply, so it'd cost 5 creds to the average assistant to print the
coupon.
- He can then insert the coupon in a cargo console and order/reuest the
associated pack (same deal as cig coupons).
- Some coupon codes however, especially those with juicer discounts,
will expire after a while if not printed.

Albeit mostly innocuous, the program provides negative Detomatix
resistance, slowly fills the computer file storage with trash files with
each redeemed coupon, and halves the download speed of new apps. Not
really the cleanest ware out there.

This PR also extends coupons to several non-goody packs, since they have
been privately buyable for over the last couple years now. Some packs
get discounts less frequently however, with those in the uncommon
category being roughly 1 in a 12 chance and the rare being 1 in 50.

Here's a screenshot of the UI (outdated, I've reduced the height from
500 to 400 and the notice box tip to specify the right click):
![Coupon
Master](https://github.com/tgstation/tgstation/assets/42542238/1d242d09-0f62-4e2e-8a6e-014daa3f6a55)

Fun fact: Right now, the odds of a 75% discount coming from the Coupon
Master for the 1.000.000 credits bycycle pack are roughly 0.0012%, while
that of a 50% for the same pack, from a cig pack coupon are 0.0042%.

## Why It's Good For The Game
These last couple days I've been wanting to test myself at making simple
UIs, as well as contributing to the modular computers feature, which has
started to become pretty neat ever since PDAs were reworked into a
subtype of it.

Beside, coupons are a very small feature limited to the bottom of
cigarette packs (also possibly cursed) in the current state of affairs.
Cargo is filled with packs that are niche or fluff. Modular computers
also has those little things that, while interesting, do not contribute
a whole lot. Maybe this is one of them, but I guess free* coupons are
always a big W.

## Changelog

🆑
add: Added the 'Coupon Master' program for the PDA. Install it to
receive periodical, redeemable coupons for several cargo packs. Requires
NTnet connection and the messenger enabled to work.
add: Coupons are no longer only limited to goodies, but may also apply
discount to some other packs as well.
/🆑

<sup>*minus the photocopier fee</sup>

---------

Co-authored-by: Watermelon914 <37270891+Watermelon914@ users.noreply.github.com>

* The Coupon Master PDA app

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: Watermelon914 <37270891+Watermelon914@ users.noreply.github.com>
2023-12-25 20:38:54 +00:00
SkyratBot
fd2e346683 [MIRROR] Fixes throwing hard del [MDB IGNORE] (#25846)
* Fixes throwing hard del (#80551)

## About The Pull Request

Fixes https://github.com/tgstation/tgstation/issues/80472

## Why It's Good For The Game

Less CI failures

## Changelog

🆑
fix: fixes a hard del with thrown items
/🆑

* Fixes throwing hard del

---------

Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
2023-12-25 12:15:06 +00:00
Gandalf
e2285feacd https://github.com/Skyrat-SS13/Skyrat-tg/pull/25828 2023-12-25 00:16:37 +00:00
SkyratBot
922ec66ee7 [MIRROR] Better Ghost Selection [MDB IGNORE] (#25789)
* Better Ghost Selection

* yes

* oldcode updates and compat

---------

Co-authored-by: 13spacemen <46101244+13spacemen@users.noreply.github.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
2023-12-25 00:11:10 +00:00
SkyratBot
4a51a0fb74 [MIRROR] Change quirks_taken from nested tally to tally [MDB IGNORE] (#25831)
* Change quirks_taken from nested tally to tally (#80479)

Nested tally is overkill and requires that this be handled especially in
Superset. Version is not updated as the data for this is the exact same.

I recommend running this query after merge (CC @ MrStonedOne):

```sql
UPDATE feedback SET key_type = 'tally' WHERE key_name = 'quirks_taken'
```

* Change quirks_taken from nested tally to tally

---------

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2023-12-24 23:20:38 +00:00
Gandalf
9361376345 PDA update (Messenger works while dead, Microwave works, etc). (#80069) [REMIRROR] (#25829)
* PDA update (Messenger works while dead, Microwave works, etc). (#80069)

This is an update that touches many more things all at once (compared to
my other PRs) meant to make PDAs in general feel more consistent and not
take away from one of the experiences we want to encourage: interaction
between players.

1. Replaced all checks of a 'pda' with a 'modular pc'. This means
technically (though not done in-game currently) other modpcs can hold an
uplink, and microwaves can charge laptops.
2. Speaking of microwave, they now don't break and require
deconstruction if the cell is removed mid-charge.
3. When a Mod PC is out of power, it will now allow the Messenger to
work (which now also doesn't consume any additional power), if the app
exists on the PC. Here's a video demonstration

https://github.com/tgstation/tgstation/assets/53777086/7ae12f81-a271-49b8-95fa-2ba54d2e2d1f

4. Flashlights can't be turned on while the cell is dead
5. I replaced a bunch of program vars with ``program_flags`` and renamed
``usage_flags`` to ``can_run_on_flags``.
6. Added a debug modPC that has every app installed by default. Mafia
had some issues in the past that were unknown because Mafia wasn't
preinstalled with any tablet so was never in create & destroy nor in any
other unit test. This was just an easy solution I had, but PDAs should
get more in-depth unit tests in the future for running apps n stuff- I
just wanted to make sure no other apps were broken/harddeling.

Currently when a PDA dies, its only use is to reply to PDA messages sent
to you, since you can still reply to them. Instead of just fixing it and
telling players to cope, I thought it would be nice to allow PDA
Messenger to still work, as it is a vital app.
You can call it some emergency power mode or whatever, I don't really
mind the reason behind why it is this way.

When I made cells used more on PDAs, my main goal was to encourage
upgrading your PDA and/or limiting how many apps you use at once, I did
not want this to hit on players who use it as a form of interaction.
This is the best of both worlds, I think.

The rest of the changes is just for modularity, if some downstream wants
to add tablets, phone computers, or whatever the hell else, they can
still get just as far as PDAs should be able to get to, hopefully.

🆑
add: PDAs with a dead power cell are now limited to using their
Messenger app.
fix: Microwaves now stop charging PDAs if the cell was removed
mid-charge.
fix: Microwaves can now charge laptops.
fix: PDA Flashlights can't be turned on while the PDA is dead.
fix: You can now hold a laptop up to a camera (if it has a notekeeper
app installed) like PDAs already could.
/🆑

---------

Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>

* ok

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
2023-12-24 23:20:11 +00:00
SkyratBot
218fcdb8d5 [MIRROR] adds head of staff job flag [MDB IGNORE] (#25705)
* adds head of staff job flag

* Update jobs.dm

---------

Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
2023-12-24 23:05:59 +00:00
SkyratBot
d21f0a63f5 [MIRROR] Remove /datum/game_mode, we SSdynamic now [again] [MDB IGNORE] (#25371)
* Remove /datum/game_mode, we SSdynamic now [again]

* Modular

* OLD CODE + repath

---------

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
2023-12-24 22:57:35 +00:00
SkyratBot
d718af9913 [MIRROR] Bridge Assistant Station Trait [MDB IGNORE] (#25667)
* Bridge Assistant Station Trait

* Diffs

* fixes

* Update job_traits.dm

---------

Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
2023-12-24 22:54:11 +00:00
SkyratBot
d34aab9be3 [MIRROR] PDA general maintenance (NTNet downloader rework) [MDB IGNORE] (#25133)
* PDA general maintenance (NTNet downloader rework)

* Update modular_computer.dm

* e

* weh

* Update archive_viewer.dm

* Update three_layer_hats.json

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
2023-12-24 22:28:40 +00:00
SkyratBot
25b05ac565 [MIRROR] Change how a station trait is declared abstract [MDB IGNORE] (#25581)
Change how a station trait is declared abstract

Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
2023-12-24 21:30:34 +00:00
SkyratBot
55482d6880 [MIRROR] Sign up for Cargorilla from the lobby [MDB IGNORE] (#25572)
* Sign up for Cargorilla from the lobby

* Modular

* Update jobs.dm

* our title screen compat

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
2023-12-24 20:14:28 +00:00
SkyratBot
4a481bb178 [MIRROR] Change datum.vars warning to use MIN_COMPILER_VERSION [MDB IGNORE] (#25818)
* Change datum.vars warning to use MIN_COMPILER_VERSION (#80515)

We can't change this line of code until we require 515.1620, so it
shouldn't warn.

* Change datum.vars warning to use MIN_COMPILER_VERSION

---------

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2023-12-24 18:57:28 +00:00
SkyratBot
2c789e5276 [MIRROR] Replaces cyborg lover with transhumanist [MDB IGNORE] (#25811)
* Replaces cyborg lover with transhumanist (#80509)

<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->
This reworks cyborg lover to be more interesting. Taking this quirk will
start the user off with a robotic limb. The user gains mood buffs by
being around silicon based lifeforms and loses mood by being around
organic based lifeforms.
Additionally, they can gain mood buffs by replacing all of their limbs
to their silicon counterparts but can also gain a massive mood debuff if
they lose or replace their starting robotic limb with an organic one.

The idea being here that they hate organics and seek to become robotic

Also, transhumanists won't be scared of people who have two or more
augments.

## Why It's Good For The Game

<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->
Cyborg lover isn't really all that interesting since it's just a basic
mood buff upon clicking on a silicon.
This makes it more interesting by making it a dynamic between silicons
and organics and may adapt the playstyle of anyone choosing to take this
perk as they will need to stay away from organics to avoid mood debuffs.

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
balance: Cyborg lover has been replaced with Transhumanist.
Transhumanists start with a robotic limb and get mood buffs by being
near to silicon-based lifeforms. However, they get mood debuffs by being
near organics, so there is a tradeoff to taking this quirk. The cost for
this quirk has been reduced from 2 to 0.
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->

---------

Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com>
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>

* Replaces cyborg lover with transhumanist

---------

Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com>
Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com>
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>
2023-12-24 18:31:06 +00:00
Useroth
ee13b168c5 Fuck off (#25792) 2023-12-23 11:43:00 +01:00
Val
dac72373b8 Replaces old Wiki link(s) to new Wiki link(s) (#25757)
Changes old SR domain to new SR domain
2023-12-21 15:29:04 -05:00
SkyratBot
db6f8e646f [MIRROR] Combine roundstart intercept and security level announcements [MDB IGNORE] (#25759)
* Combine roundstart intercept and security level announcements (#80475)

## About The Pull Request

At roundstart when the intercept report is sent, two announcements are
created at the same time. It's loud and overlaps. This combines them
into a single announcement.

Before:

![image](https://github.com/tgstation/tgstation/assets/83487515/024e783a-65d9-4c28-8850-f114b1f020ad)

After:

![image](https://github.com/tgstation/tgstation/assets/83487515/7272f82f-23b4-4e90-99a2-1b590c7d56cf)

## Why It's Good For The Game

Two Centcom or any other announcements playing at the same time
(especially with two different sound files) can be annoying and the
sounds distort each other.

## Changelog

🆑 LT3
qol: Roundstart intercept report and security level announcements are
combined into a single announcement
/🆑

* Combine roundstart intercept and security level announcements

---------

Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
2023-12-21 01:24:56 +00:00
SkyratBot
d6b5e46172 [MIRROR] actually log total vote votes correctly [MDB IGNORE] (#25741)
* actually log total vote votes correctly (#80438)

yeah i goofed

* actually log total vote votes correctly

---------

Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
2023-12-19 23:00:37 -05:00