# Summary
This PR has the goal of adding a base framework for tracking, saving and
otherwise managing persistent data between rounds, written from scratch.
Persistent data can be anything - Most expectedly noticeboards, dirt,
papers, etc.
_Technical details about the PR below are subject to change._
## Estimated scope
The first iteration of the persistence framework should include the
functioning subsystem and the first implementation of a persistent type
using said subsystem.
- [x] Prepare database for persistent data
- [x] Add new features to `/obj/`
- [x] Logic to get and load persistent data into objects for the
subsystem
- [x] Internal logic for tracking and other
- [x] Implement subsystem
- [x] Basics, files, integration of subsystem
- [x] Database queries for different operations
- [x] Methods for registering and de-registering object tracking for
`/obj`
- [x] Round start logic
- [x] Round end logic
- [x] Implement first persistent type: Papers on notice boards
- [ ] Code review
- [x] Scope validation
- [x] Testing
- [x] Full changelog
- Merge
- [ ] Setup logging config for new subsystem
- [x] Documentation for developers ([How to add new persistent
types](https://github.com/Aurorastation/Aurora.3/wiki/Persistence))
## Inner workings
The new persistence subsystem has the following concept:
At round start the subsystem reads existing data from the database and
creates objects for them.
During the round objects can be added to the tracking using a register
function (or removed by a de-register function).
At round end the subsystem goes over all it's actively tracked objects:
Create new objects (that don't have a persistent ID from the database),
update objects that changed during the round and expire objects that are
no longer tracked.
The objects in questions can register themselves, de-register themselves
and decide themselves what content should be stored and handle how to
set themselves up during the subsystems init phase.
## Information on the new table
`id` - database generated ID for tracking persistent objects over
multiple rounds, objects without an ID are considered new and created
during the round.
`author_ckey` - With the first implementation unused, but expected to be
required in the future to allow any staff/moderation on persistent data.
Nullable as persistent data also can be things like decals without an
actual owner.
`type` - Type of persistent data used for creating objects at round
start.
`created_at` - Statistical values.
`expire_at` - Used for cleaning the database and setting limits for
persistent data types. It's optional and allows permanent persistent
data (command notice boards?).
`content` - JSON formatted data containing the actual properties of an
individual tracked object (e.g. what's written on a paper, what's its
title).
`x`, `y`, `z` - Coordinates taken and given from/to the object during
save/load. Those can be null for future purposes.
## The goal on how to add new persistent data types
`/obj` received two new methods which need to be overriden in the to-be
added new persistent type:
`persistence_get_content()` and `persistence_apply_content(content, x,
y, z)`.
The first method has the responsibility to provide all custom content of
a new type to the subsystem in the form of an associated list (`["title"
= "Hello, World!", "value" = 1337].
What does that mean?
In the example of a piece of paper, the method needs to put the papers
title and text content into a an associated list, that list will be
saved by the persistence subsystem.
The second method has the responsibility to apply the previously saved
content when persistent data is initialized at the start of the round:
The associated list needs to be read back and applied to the paper,
additionally coordinates are provided for the object that have been
taken during saving. Note that the coordinates might be null and could
be ignored during setup.
During the round, when a new object is created, like a paper, you need
to call the subsystem and register a track:
`SSpersistence.register_track(your_object_to_track, ckey (optional)`.
The subsystem will be using the methods above when the round ends and
saves the object - and loads it at the start of the round using the
second method. The ckey needs to be given for all persistent that
contains user generated content, e.g. papers.
In case a persistent object gets removed, you need to call
`SSpersistence.deregister_track(your_tracked_object)`. At the end of the
round the object will be removed from the storage.
`/obj` contains the variable (along some other technical vars)
`persistance_initial_expiration_time_days`, which has a default value of
30 days, but can be safely overriden on a per-type basis. This value (in
days) will be used for the persistent data entry expiration date when a
new object of said type is stored in the database.
## PR description changelog
- Added *The goal on how to add new persistent data types*.
- Updates *Estimated scope* format.
- Updates *Inner workings*.
- Final iteration.
*(Grammer and formatting not tracked manually)*
This PR significantly rebalances the construction costs and times of the
"Mech" side of the machine shop in order to break up the "Light mech
hoverthruster meta" that has been severely prevalent. In general steel
usage for many things is going down, in exchange for using aluminium by
the same amount. Lead is being introduced as the material to use for
"Anything that gives you radiation protection", and most hardsuits and
some mech armors now call for its use.
The biggest thing to be rebalanced are the Hoverthrusters. Imagine my
surprise when I discover that not only were the hoverthrusters insanely
cheap, they also had the lowest power draw of any mech chassis in the
game, which meant that if you used them with the self-recharging power
cells, you essentially had infinite power and full flight.
Hoverthrusters of both kinds are being changed to require rare
materials. So I significantly increased the power draw for
hoverthrusters(For god's sake they let the mech fly at high speed,
they're the exact opposite of low power). As a small concession, the
health for the light thrusters is increased slightly.
Finally, to help encourage more experimenting with lesser-used mech
chassis, I removed the tech requirements for the quadruped chassis,
allowing Machinists to experiment with trying out different, "Less
ideal" mech designs.
Fixes https://github.com/Aurorastation/Aurora.3/issues/21104
Grants Xenobotany/Xenobiology radios with hailing freqs like Xenoarch on
spawn, provide appropriate access to similar shortwaves.
Not going to be giving them all the cool stuff Xenoarch gets for solo
exploration like machetes and shit, they still ought to bring escorts or
else tag along with the xenoarch.
Xenoarch still stuff xenobots/bios in lockers.
Xenoarch stronk.
---------
Signed-off-by: Batrachophreno <Batrochophreno@gmail.com>
## About PR
Due to previously being decals, floor plaques weren't able to inherit
their varedited descriptions and be interacted in any way.
Now they can be read, stolen and ~used in self-defense~ occupy a place
in our lives.
Does various things for the Himean Patrol Ships such as:
- Access requirements for APCs and Air alarms
- Exterior windows spawn with firedoor + grille
- Access requirements for airlocks
- Adds GPS units + stationary units
- Slight Remap to shuttle airlock to allow for exterior cycling of air
<details>
<img width="383" height="232" alt="image"
src="https://github.com/user-attachments/assets/511d1f20-a141-4203-8db1-87619707e8fb"
/>
</details>
---------
Co-authored-by: Ben10083 <Ben10083@users.noreply.github.com>
This started out as an update to reduce vision while inside closets.
While I was testing that, I noticed closet teleporters weren't updating
the camera properly, so I fixed that, as well as a bug with an early
`return` causing closets to have 0 density while a closet teleporter was
on cooldown.
Reduce vision inside locker:
<img width="1354" height="1345" alt="image"
src="https://github.com/user-attachments/assets/5f581031-51c0-4502-bddd-21045329c754"
/>
* "Lowers higher than usual prices of NT, Imperial army and TCAF
gearloadouts."
Some of the gear loadouts had higher than usual prices of 50 per group
and 15 per single compared to the standard 35 and 10. Some of these like
TCAF even were just straight up the same items as the single crate but
at less bang per buck.
Overall none of these kits are strong enough when compared to others, to
justify a higher price that makes it hard for mercs to budget it for
their gimmick. While the NT kit has a hardsuit, it should be noted it is
an empty one that has online slowdown unlike other combat rigs, similar
to the TCFL rigs.
Co-authored-by: Big Rat <lienesica@gmail.com>
Renamed the NTCC Odin's AI from 'Bubble' to 'Huginn' at the request of
the lore team.
Very minor mapping tweak to the Centcom Z-level, though file-wise it
does touch the Horizon (curse you multi-Z).
Space heaters, when spawned via admin panel, will crash if if their TGUI
is accessed immediately. This is because var/env is only initialized on
process(), and if not initialized, the game will be very sad when the UI
tries to display the current temperature by rounding a null value.
Sets env on Initialize() and cleans up /ui_act() logic to prevent crash.
---------
Signed-off-by: Batrachophreno <Batrochophreno@gmail.com>
I'll be honest I can't test this because I'm not on windows but I am 90%
sure this fixes#21097 and fixes#21153
The issue was caused by some refactoring of liver code in #21013 that
wasn't accounted for here
---------
Co-authored-by: Cory <cory@mejtra>
Headmaster now has stationary GPS units for shuttle and ship, as well as
special gps network
Adds access requirements to buttons in bridge and airlock
Co-authored-by: Ben10083 <Ben10083@users.noreply.github.com>
Orion Express Station Ghostrole now has it's own GPS network with
stationary GPS at station and shuttle
Access requirement for engine airlocks
---------
Co-authored-by: Ben10083 <Ben10083@users.noreply.github.com>
The reason is that they look mega silly, especially when you're rapidly
scanning the same person.
Also improves the legibility of the price scanner output.
Co-authored-by: Matt Atlas <liermattia@gmail.com>
as the title says.
in my long contemplation of adding this, people have offered arguments
that an offworlder hos would be unable to fit the requirements for a
security job. i disagree here because not only do they have a lower
brute modifier than M'sai Tajara (who are the only tajara species
allowed to be HOS), but the negatives which would prevent them from
fitting any requirements can easily be made up with the various items
available to offworlders which pretty much alleviate any concerns here.
additionally, given off-worlders are currently allowed to be other
physically strenuous jobs which require even more exertion than HOS
would, such as paramedic, atmos tech, miner, or even security officers
(while i understand some think the final job is also undesirable, as far
as i am aware it has created no issues in the past), there seems to be a
massive inconsistency in the standards applied on offworlders.
so, i think that allowing offworlders to be HOS on the ship does make
sense, as they are adapted for work in space, and allows for a few cool
potential character concepts, with any drawbacks being pretty
inconsequential.
Currently, only Preferences Verbs use subcategories. As a result, all
other Verb tabs are only organized alphabetically, meaning that a single
mechanic (ie. languages) has its governing Verbs scattered rather than
grouped together.
Verb organization by Tab handles broad organization - IC, OOC, Objects,
etc.- highly effectively but requires the user to click-navigate to
other Tabs to access any other verbs.
Verb organization within a Tab can be handled by A.) subcategories and
B.) Verb name prefixes (such as Earphones - *****). The first option is
the clearest and cleanest, but consumes additional vertical space. The
second option conserves vertical space at the cost of visual clarity.
This PR attempts to reorganize Verbs by their Tabs, Subcategories, and
prefixes with the following priorities in mind:
- Minimal disruption; any radical change must be justified (don't move
shit around just for the sake of moving shit around.)
- Verbs which share common functions (such as Languages) should be
grouped together.
- Maintainability. Contributors should not need to memorize an
excessively convoluted Subcategories list; Subcategories must be
intuitive and simple.
- Subcategories should be used judiciously when grouping Verbs to
conserve vertical space. Example: Instead of creating a Subcategory for
Emotes, just rename Audible Emote and Visual Emote to Emote (Audible)
and Emote (Visual).
- Subcategories should highlight uncommon or unusual verbs when
reasonable. Example: There are several animal husbandry-related Verbs,
and because most characters will not have access to those verbs
regularly, we can be less conservative with space (because they'll be
gone most of the time) for the sake of emphasizing their availability.
This PR covers the IC, OOC, and Object Tabs.
Subcategories:
OOC.Chat (Chat functions)
- AOOC
- LOOC
- Devsay (moved from Special Verbs)
- Dsay (moved from Special Verbs)
- OOC
OOC.Debug (Fix shit)
- Fit viewport
- Fix chat
- Refresh TGUI
OOC.Round (Round information)
- Check Gamemode Probability
- Check Round Info
- Custom Event Info
- Vote
IC.Antag (Antag verbs w/o their own tab)
- Invite to the Loyalists
- Invite to the Revolutionaries
- Set Ambition
IC.Critters (More critter stuff than you'd expect there to be)
- Befriend Carp (Previous name 'Become Friends')
- Befriend Cat (Previous name 'Become Friends')
- Befriend Dog
- Befriend Ives
- Name Alien Species
- Name Animal
IC.Language (Language-related stuff)
- Check Default Language
- Check Known Languages
- Set Default Language
IC.Maneuver (Movement, positioning, etc.)
- Adjust walk speed
- Do Pushup
- Face Direction
- Look Down
- Look Up
- Move Downwards
- Move Upwards
- Rest
Object.Equipped (Equipped object stuff, mostly for drip)
- Adjust Badge
- Adjust Bag Straps (Backpacks)
- Adjust Goggles
- Adjust Mask
- Adjust Welding Goggles
- Adjust Welding Mask
- Change Glasses Layer
- Change Pants Layer
- Change Wrist Radio Layer
- Change Wristwear Layer
- Check Time
- Flip Badge
- Flip Belt
- Flip Eyepatch
- Flip Hat
- Flip ID card (ID card)
- Flip Radio (Clip-on radio)
- Flip Wristwear
- Fold Collar
- Lock Antenna(e)
- Point At Watch
- Raise Shroud
- Roll Up Cape Mantle
- Roll Up/Down Jumpsuit
- Roll Up/Down Sleeves
- Switch Belt Layer
- Switch ID Layer
- Switch Lanyard Layer
- Switch Shoe Layer
- Toggle Aviators (Like a dozen variants)
- Toggle Ceremonial Garment Lights
- Toggle Coat Buttons
- Toggle Coat Zipper
- Toggle Hair Coverage (For hats helmets etc)
- Toggle Hair Coverage (FOR BABY CARP!!!!!)
- Toggle Helmet Camera
- Toggle Hood
- Toggle Lyodsuit Mask
- Toggle Poncho Tail Coverage
- Toggle Shirt Buttons
- Toggle Suit Sensors
- Toggle Visor (Pilot helmet)
- Toggle Waistcoat Buttons
- Transform Holoclothing
- Voidsuit - Eject Suit Cooler
- Voidsuit - Eject Tank
- Voidsuit - Toggle Helmet
Object.Held (If you're HOLDING it, its probably relevant to you rn)
- Activate Held Object (Silicons; moved from IC)
- Alter Beacon's Signal (Radio beacon)
- Change Bite Size (Utensils)
- Change Pen Colour
- Choose Colour (Paint sprayer)
- Choose Decal (Paint sprayer)
- Choose Direction (Paint sprayer)
- Choose Preset Colour (Paint sprayer)
- Describe Prototype
- Draw Boot Knife
- Empty Bee Net
- Empty Spray Bottle
- Holster
- Name Gun
- Name Prototype
- Plant Flag (Flags)
- Print Plant Report
- Remove Chopsticks
- Remove Top
- Set Detector High-Bound (Light meter)
- Set Detector Low-Bound (Light meter)
- Set Hailer Message (Hailer)
- Set Timer (Timer igniter)
- Set Valve Pressure (Pneumatic cannon)
- Show Held Item
- Spin Cylinder (Revolvers)
- Switch Verbosity (Health analyzer)
- Toggle Chainsaw Power (Chainsaw)
- Toggle Flashlight Brightness (Flashlights)
- Toggle Gun Safety
- Toggle Hazard Vest
- Toggle Pinpointer Mode (Pinpointer)
- Toggle Mister (Backpack water tank. Goes into/out of hands)
- Twist Cap
- Use Scope
- Wield Pick/Drill
- Wield Two-Handed Weapon (Two-handed weapons)
Object.Cards (I fucking hate cards!!!)
- Deck - Deal
- Deck - Draw
- Deck - Pick
- Hand - Pick
- Turn Hand Into Deck
Object.Earphones (Enough here to separate out)
- Eject Music Cartridge
- Change Volume
- Next Song
- Pause/Unpause
- Play/Stop
- Previous Song
Object.Jetpack (This is probably really important to see quickly)
- Toggle Jetpack
- Toggle Jetpack Stabilization
Object.Tape Recorder (Enough here to separate out)
- Start Recording
- Stop Recording
- Clear Memory
- Playback Memory
- Print Transcript
- Eject Portable Storage
**IC tab example:**
<img width="1061" height="277" alt="Screenshot 2025-08-09 101813"
src="https://github.com/user-attachments/assets/a2afe92d-34fd-4160-bf68-b459a4195e26"
/>
**Objects tab example:**
<img width="1100" height="472" alt="Screenshot 2025-08-09 101807"
src="https://github.com/user-attachments/assets/a36e4c76-594e-4569-93ba-ffcda57e8760"
/>
As security officers have their belts pre-filled, I thought to do the
same for the investigators. This takes the tape, flash and camera from
their locker and adds it to the belt in the same locker, additionally a
tape recorder is also put in it.
As clipboards can be put in the belts, I did find it weird that the
notepads couldn't, so I also added the ability to put notepads into the
security belt, as it felt fitting to be able to do so.
The extra pair of identical shoes were also removed from the locker, to
help reduce the clutter slightly. One pair still spawns in it.
Fixes https://github.com/Aurorastation/Aurora.3/issues/20799
Fixes https://github.com/Aurorastation/Aurora.3/issues/19718
Fixes https://github.com/Aurorastation/Aurora.3/issues/21001
changes:
- bugfix: "Simple mobs no longer allowed to move at hyper-speed when
chasing targets."
- bugfix: "Objects thrown onto Open Space turfs should more reliably
drop down remaining Z-level (if there is gravity)."
- bugfix: "Area adjustments to fix D3 bunker turret controls."
- bugfix: "Fixed naming convention for scuttling device compartment."
- bugfix: "Replaced parent stairwell area with correct child."
- bugfix: "Replaces misleading AI shell exosuit charger with synthetic
recharger."
- qol: "Replaces the Engi break room stripped-down soda dispenser with
stripped-down coffee dispenser."
Title, but from the changelog:
> "Resprited the tajara laborer, al'mariist laborer clothes, the PRA
medical coat and the naval coat."
Some of these showed their age quite massively.
Images, as always, in the details below
Old (current) sprites on the top, new on the bottom.
<details>
<summary> Uniforms: </summary>
<img width="2305" height="1537" alt="uniforms"
src="https://github.com/user-attachments/assets/bcf7ce84-904d-4982-ae9a-c9ad80e1044e"
/>
</details>
<details>
<summary> Suits: </summary>
<img width="2049" height="1025" alt="suits2"
src="https://github.com/user-attachments/assets/4b6c7180-44f5-4721-b2a2-936b93cb07be"
/>
</details>
And, of course,
Suns bless the north.
- Schlorrgo egg making chance reduced from 4% to 1%
- Schlorrgos now have a max amount of eggs they can produce. With total
max of 40 (and realistic max of 10-20 considering how hard it is to
'max' fat a schlorrgo)
Co-authored-by: Ben10083 <Ben10083@users.noreply.github.com>
The Supermatter has a damage rate limiter to prevent extremely high
temperatures from just shotgunning its integrity down to zero in one
tick. That's totally fair.
Doubles that maximum limited rate.
Also reduces volume of delam sound by 25% because I'm a nice person.
---------
Signed-off-by: Batrachophreno <Batrochophreno@gmail.com>
[Original suggestion
here.](https://forums.aurorastation.org/topic/22454-tidy-up-lockers/)
- Replaces departmental/job-specific wardrobe lockers with new 'Drobe'
vending machines, each containing pertinent clothing, all with new
icons: ClothesMate, EngiDrobe, AtmosDrobe, HyDrobe, SecDrobe, BarDrobe,
ChefDrobe, ChapelDrobe, SciDrobe, MediDrobe, ChemDrobe, CargoDrobe,
RoboDrobe
- Makes vending machine ads populate at the top of the purchasing UI and
randomly cycle.
- Few vending-machine related map touch-ups (mostly vending machines
missing the floor 'hatched' pattern underneath).
- Misc code readability improvements.