Codeside Cargo Refactor (#20030)

**NOTE TO SYSADMINS: See "SQL Details" section below for information on
SQL modifications.**

Moves the data containing cargo items (i.e. the ones you order from ops
and get in the cargo shuttle) from the online database to the codebase.
Everything from suppliers to categories to individual items is now
code-side and editable by developers/contributors.

Refactors cargo items to use `singletons` instead of `datums` for
`cargo_supplier`, `cargo_category`, and `cargo_item`. Multiple-instnace
things like cargo_orders, etc. still use `datums`.

Fixed a bunch of strange discrepancies in categories, suppliers, and
pricing for various cargo items. I did a little bit, but it's exhausting
to go through all of it right now.

Clicking the 'Details' button on the Cargo Order app now actually gives
you details instead of bluescreening. Also added some UI elements to the
Cargo Order app - Cargo Control and Delivery remain untouched.

Overhauled the Cargo Order console TGUI window. It now has tabs on the
left, displays restricted access, supplier information, and boasts
search functionality.

### SQL Details
<details>
<summary>SQL Details [Click to Expand]</summary>

The following SQL tables should be deleted or deprecated from the server
database, as they are no longer in use:

- `ss13_cargo_items`
- `ss13_cargo_categories`
- `ss13_cargo_suppliers`

The included migration file, `V011__codeside_cargo`, creates a new table
`ss13_cargo_item_orderlog` to the DB. This **replaces**
`ss13_cargo_orderlog_items`. Because of this,
`ss13_cargo_orderlog_items` is deprecated and should either be deleted
or locked & preserved for logging purposes.

</details>

## Screenshots


![image](https://github.com/user-attachments/assets/79129923-1fb6-4cee-ac8d-5505a52270a4)

![image](https://github.com/user-attachments/assets/a323be35-8ce6-4ec4-98f7-ee701d0931a3)

![image](https://github.com/user-attachments/assets/5ddb02c5-152f-4715-b2da-20903fa11c93)

![image](https://github.com/user-attachments/assets/420e45b0-6a9f-4420-beb8-a2c8423a5be4)

![image](https://github.com/user-attachments/assets/114f4755-ee51-41e6-8670-07aacc5326ae)

---------

Signed-off-by: naut <55491249+nauticall@users.noreply.github.com>
Co-authored-by: Fluffy <65877598+FluffyGhoster@users.noreply.github.com>
This commit is contained in:
naut
2025-03-04 18:18:00 +00:00
committed by GitHub
co-authored by Fluffy
parent 14d7425cee
commit 55f4e12614
32 changed files with 7869 additions and 583 deletions
+356
View File
@@ -0,0 +1,356 @@
/singleton/cargo_item/crayonbox
category = "recreation"
name = "box of crayons"
supplier = "getmore"
description = "Nontoxic crayons! For drawing, writing, painting. Warranty void if consumed."
price = 30
items = list(
/obj/item/storage/box/fancy/crayons
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/painting_kit
category = "recreation"
name = "painting kit"
supplier = "virgo"
description = "A painter's kit containing an easel, a small canvas, and some paints. Additional canvases sold separately."
price = 350
items = list(
/obj/structure/easel,
/obj/item/canvas,
/obj/item/storage/box/fancy/crayons,
/obj/item/reagent_containers/glass/rag,
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/canvas_small
category = "recreation"
name = "small canvas"
supplier = "virgo"
description = "A painting canvas. Does not include the tools required to use it."
price = 50
items = list(
/obj/item/canvas
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/canvas_medium
category = "recreation"
name = "medium canvas"
supplier = "virgo"
description = "A painting canvas. Does not include the tools required to use it."
price = 80
items = list(
/obj/item/canvas/nineteen_nineteen
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/canvas_large
category = "recreation"
name = "large canvas"
supplier = "virgo"
description = "A painting canvas. Does not include the tools required to use it."
price = 100
items = list(
/obj/item/canvas/twentythree_twentythree
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/trumpet
category = "recreation"
name = "trumpet"
supplier = "virgo"
description = "A trumpet for those triumphant tooting sessions."
price = 300
items = list(
/obj/item/device/synthesized_instrument/trumpet
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/guitar
category = "recreation"
name = "guitar"
supplier = "virgo"
description = "An acoustic guitar for those balcony serenades."
price = 190
items = list(
/obj/item/device/synthesized_instrument/guitar
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/violin
category = "recreation"
name = "violin"
supplier = "virgo"
description = "A wooden musical instrument with four strings and a bow."
price = 250
items = list(
/obj/item/device/synthesized_instrument/violin
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/polyguitar
category = "recreation"
name = "polyguitar"
supplier = "virgo"
description = "An electric polyguitar. 100% digital audio."
price = 250
items = list(
/obj/item/device/synthesized_instrument/guitar/multi
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/piano
category = "recreation"
name = "piano"
supplier = "virgo"
description = "Like a regular piano, but always in tune! Even if the musician isn't."
price = 1200
items = list(
/obj/structure/synthesized_instrument/synthesizer/piano
)
access = 0
container_type = "box"
groupable = FALSE
spawn_amount = 1
/singleton/cargo_item/pianosoundsynthesizer
category = "recreation"
name = "synthesizer 3.0"
supplier = "virgo"
description = "An expensive sound synthesizer. Great for those orchestra-of-one performances."
price = 1900
items = list(
/obj/structure/synthesized_instrument/synthesizer
)
access = 0
container_type = "box"
groupable = FALSE
spawn_amount = 1
/singleton/cargo_item/jukebox
category = "recreation"
name = "juke box"
supplier = "nanotrasen"
description = "A common sight in any modern space bar, this jukebox has all the space classics."
price = 500
items = list(
/obj/machinery/media/jukebox
)
access = 0
container_type = "box"
groupable = FALSE
spawn_amount = 1
/singleton/cargo_item/adhomian_phonograph
category = "recreation"
name = "adhomian phonograph"
supplier = "zharkov"
description = "An Adhomian record player."
price = 700
items = list(
/obj/machinery/media/jukebox/phonograph
)
access = 0
container_type = "box"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/waterballoons
category = "recreation"
name = "water balloons (x10)"
supplier = "nanotrasen"
description = "Ten empty water balloons for water balloon fights."
price = 100
items = list(
/obj/item/toy/waterballoon
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 10
/singleton/cargo_item/balloons
category = "recreation"
name = "balloons (x10)"
supplier = "nanotrasen"
description = "Ten empty regular balloons. Can be filled using a tank of air or other gas. Warranty void if filled with hydrogen."
price = 80
items = list(
/obj/item/toy/balloon
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 10
/singleton/cargo_item/toysword
category = "recreation"
name = "toy sword"
supplier = "nanotrasen"
description = "A cheap, plastic replica of a blue energy sword. Realistic sounds and colors! Ages 8 and up."
price = 200
items = list(
/obj/item/toy/sword
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/replicakatana
category = "recreation"
name = "replica katana"
supplier = "nanotrasen"
description = "A cheap plastic katana. Useful for pretending you're a samurai or for tabletop roleplaying sessions."
price = 200
items = list(
/obj/item/toy/katana
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/foamdart
category = "recreation"
name = "foam darts (x5)"
supplier = "nanotrasen"
description = "It's some foam darts, for use in foam weaponry. Ages 8 and up."
price = 20
items = list(
/obj/item/toy/ammo/crossbow
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 5
/singleton/cargo_item/foamdartcrossbow
category = "recreation"
name = "foam dart crossbow"
supplier = "nanotrasen"
description = "A weapon favored by many overactive children. Ages 8 and up."
price = 200
items = list(
/obj/item/toy/crossbow
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/gravitationalsingularitytoy
category = "recreation"
name = "gravitational singularity toy"
supplier = "getmore"
description = "'Singulo' brand spinning toy. Certified mesmerizing since 2440."
price = 100
items = list(
/obj/item/toy/spinningtoy
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/randomplushies
category = "recreation"
name = "random plushies (x4)"
supplier = "nanotrasen"
description = "Four random surplus plushies from a local toy store's clearance sale. People grow old, apparently."
price = 250
items = list(
/obj/random/plushie
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 4
/singleton/cargo_item/therapydoll
category = "recreation"
name = "therapy doll"
supplier = "virgo"
description = "A toy for therapeutic and recreational purposes."
price = 120
items = list(
/obj/item/toy/plushie/therapy
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/snappop
category = "recreation"
name = "snap pop (x5)"
supplier = "nanotrasen"
description = "A number of snap pops."
price = 200
items = list(
/obj/item/toy/snappop
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 5
/singleton/cargo_item/redlasertagequipmentset
category = "recreation"
name = "red laser tag equipment set"
supplier = "nanotrasen"
description = "A two-player set of red-team laser tag equipment consisting of a helmet, armor, and a gun."
price = 200
items = list(
/obj/item/clothing/head/helmet/riot/laser_tag,
/obj/item/clothing/suit/armor/riot/laser_tag,
/obj/item/gun/energy/lasertag/red
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 2
/singleton/cargo_item/bluelasertagequipmentset
category = "recreation"
name = "blue laser tag equipment set"
supplier = "nanotrasen"
description = "A two-player set of blue-team laser blue equipment consisting of a helmet, armor, and a gun."
price = 200
items = list(
/obj/item/clothing/head/helmet/riot/laser_tag/blue,
/obj/item/clothing/suit/armor/riot/laser_tag/blue,
/obj/item/gun/energy/lasertag/blue
)
access = 0
container_type = "crate"
groupable = TRUE
spawn_amount = 2