The Mining vendor now works like the Chef produce console (has to go through Cargo) (#71023)

## About The Pull Request

Now comes with a Hackmd: https://hackmd.io/ImTe5FLeTgmI7spTWKBaFQ?view

In-game screenshots:


![image](https://user-images.githubusercontent.com/53777086/199602671-a604c6da-fec0-487d-b67e-eb0e4380e4d6.png)

![image](https://user-images.githubusercontent.com/53777086/199602695-8d7afb20-3b6c-467f-ac78-37de03dc20d2.png)


![image](https://user-images.githubusercontent.com/53777086/199725350-b01c4ddd-3fec-4288-a698-02daf91f787b.png)

Removes the old Mining vendor console and all its bad code. Instead, the
chef produce console was generalized and a NEW mining vendor is a
subtype of it. If they try to Express this console, it will be 1.5x the
mining points (compared to 2x for the Chef produce console atm), so it
is technically possible, but it is still better to order it through
Cargo.
Different to the Kitchen crate, this one is a private order by the Shaft
Miner, using mining points instead of Credits. Cargo CAN emitter it
open, but I think that's an acceptable risk with all crates. As shown in
the screenshot, Cargo will immediately know who ordered the items so
knows who to call to pick it up when needed.

This also means Shaft Miner's vendor is now categorized somewhat. I
tried my best to make sense out of it but some items really don't make
sense (laser pointer, soap...)

I split the different sections of orderable items into different files
for better management, and de-hardcoded it and its TGUI to make it
easier for anyone who wants to add more to it.
I also made the produce console use paths and added ways 'categories' to
produce consoles, which indicates which sections you should and
shouldn't be allowed to see.
https://github.com/tgstation/tgstation/pull/71007 already did part of
this but it isn't merged yet so :/

Free golems are mostly unaffected by this. Their console only works in
express mode and doesn't increase the prices for it. The only downside
is the cooldown.

I still have some things to finish on this PR so it'll be left as draft
until at least tomorrow.

## Why It's Good For The Game

https://hackmd.io/ImTe5FLeTgmI7spTWKBaFQ?view

1. A large problem currently with Miners is that they don't interact
with the station, this will at least help integrate them more into their
own department, by making the cost of their equipment cheaper if they
bother to actually go through Cargo for their gear.

2. It also means that a non functional Cargo would affect Shaft Miners
too, and as they have access to the shuttle, maybe we can expect some
Miners to pick up the slack if needed.

3. The old mining vendor was the ONLY vendor in the game that had
infinite stock. It doesn't need a refill or anything like any other
vendor, and every other vendor uses credits, mining points is just shaft
miner credits. Why are they an exception? At least being ordered through
the shuttle makes sense.

4. It opens the QM being able to see easier what Miners are doing, and
prevents miners from hiding on Lavaland to do nothing but hunt fauna if
they were meant to be demoted or something by the QM. Basically, gives
the QM more control over the people working in their department.

## Changelog

🆑
add: Shaft Miner's equipment vendor now orders their equipment through
the Cargo shuttle, though you can spend 1.5x the points to express it,
making it a Mining version of the Chef's produce console, with a
weakened express tax.
/🆑
This commit is contained in:
John Willard
2022-11-30 22:29:28 -05:00
committed by GitHub
parent de462ba2af
commit fd19f6d5a0
43 changed files with 1245 additions and 945 deletions
@@ -75,7 +75,7 @@
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
"n" = (
/obj/machinery/mineral/equipment_vendor/golem,
/obj/machinery/computer/order_console/mining/golem,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
"o" = (
@@ -2670,7 +2670,7 @@
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
"QJ" = (
/obj/machinery/mineral/equipment_vendor,
/obj/machinery/computer/order_console/mining,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small/broken/directional/west,
/turf/open/floor/wood/large,
@@ -62557,7 +62557,7 @@
/turf/open/floor/iron/dark,
/area/station/engineering/atmos/hfr_room)
"pnq" = (
/obj/machinery/computer/chef_order,
/obj/machinery/computer/order_console/cook,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
dir = 4
@@ -65794,7 +65794,7 @@
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"pZo" = (
/obj/machinery/mineral/equipment_vendor,
/obj/machinery/computer/order_console/mining,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/directional/north,
/obj/effect/turf_decal/bot,
@@ -12030,7 +12030,7 @@
/turf/open/floor/plating/snowed/icemoon,
/area/mine/laborcamp/security)
"dBx" = (
/obj/machinery/mineral/equipment_vendor,
/obj/machinery/computer/order_console/mining,
/obj/machinery/light/small/directional/south,
/obj/machinery/light_switch/directional/south,
/obj/machinery/newscaster/directional/east,
@@ -24945,7 +24945,7 @@
/turf/open/floor/engine,
/area/station/science/genetics)
"hDx" = (
/obj/machinery/mineral/equipment_vendor,
/obj/machinery/computer/order_console/mining,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/camera{
c_tag = "Mining Bunks";
@@ -31546,7 +31546,7 @@
/turf/open/floor/iron,
/area/station/engineering/atmos)
"jHT" = (
/obj/machinery/computer/chef_order{
/obj/machinery/computer/order_console/cook{
dir = 1
},
/obj/effect/turf_decal/stripes/line{
@@ -44368,7 +44368,7 @@
/turf/open/floor/iron/dark,
/area/station/engineering/main)
"nFk" = (
/obj/machinery/mineral/equipment_vendor,
/obj/machinery/computer/order_console/mining,
/obj/effect/turf_decal/tile/brown{
dir = 4
},
@@ -52083,7 +52083,7 @@
/turf/open/floor/iron,
/area/station/engineering/atmos)
"pYl" = (
/obj/machinery/mineral/equipment_vendor,
/obj/machinery/computer/order_console/mining,
/obj/effect/turf_decal/tile/brown{
dir = 4
},
+2 -2
View File
@@ -38471,7 +38471,7 @@
/turf/open/floor/grass,
/area/station/medical/psychology)
"kUy" = (
/obj/machinery/computer/chef_order{
/obj/machinery/computer/order_console/cook{
dir = 8
},
/obj/effect/turf_decal/bot,
@@ -45206,7 +45206,7 @@
/turf/open/floor/iron/showroomfloor,
/area/station/science/xenobiology)
"mQj" = (
/obj/machinery/mineral/equipment_vendor,
/obj/machinery/computer/order_console/mining,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral{
dir = 1
+2 -2
View File
@@ -15341,7 +15341,7 @@
},
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/computer/chef_order{
/obj/machinery/computer/order_console/cook{
dir = 8
},
/obj/effect/mapping_helpers/burnt_floor,
@@ -49644,7 +49644,7 @@
/turf/open/floor/wood,
/area/station/service/library)
"rFF" = (
/obj/machinery/mineral/equipment_vendor,
/obj/machinery/computer/order_console/mining,
/obj/effect/turf_decal/tile/brown/anticorner/contrasted{
dir = 8
},
+2 -2
View File
@@ -1665,7 +1665,7 @@
/turf/open/floor/plating,
/area/mine/maintenance/living/north)
"kx" = (
/obj/machinery/mineral/equipment_vendor,
/obj/machinery/computer/order_console/mining,
/obj/effect/turf_decal/trimline/brown/filled/line,
/turf/open/floor/iron/dark/smooth_edge{
dir = 1
@@ -1803,7 +1803,7 @@
/turf/open/floor/iron/dark,
/area/mine/production)
"lg" = (
/obj/machinery/mineral/equipment_vendor,
/obj/machinery/computer/order_console/mining,
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 1
},
+2 -2
View File
@@ -25144,7 +25144,7 @@
/turf/open/floor/iron,
/area/station/hallway/secondary/exit)
"jgk" = (
/obj/machinery/computer/chef_order,
/obj/machinery/computer/order_console/cook,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron,
@@ -63042,7 +63042,7 @@
/turf/open/floor/iron,
/area/station/commons/storage/tools)
"wGF" = (
/obj/machinery/mineral/equipment_vendor,
/obj/machinery/computer/order_console/mining,
/obj/effect/turf_decal/tile/brown{
dir = 4
},
+10
View File
@@ -0,0 +1,10 @@
//Categories used for the order console
#define CATEGORY_FRUITS_VEGGIES "Veggies"
#define CATEGORY_MILK_EGGS "Milk & Eggs"
#define CATEGORY_SAUCES_REAGENTS "Reagents"
#define CATEGORY_GOLEM "Golem"
#define CATEGORY_MINING "Mining"
#define CATEGORY_CONSUMABLES "Consumables"
#define CATEGORY_TOYS_DRONE "Toys & Drones"
#define CATEGORY_PKA "PKAs"
+3
View File
@@ -57,3 +57,6 @@ GLOBAL_LIST_EMPTY(air_vent_names) // Name list of all air vents
GLOBAL_LIST_EMPTY(roundstart_station_borgcharger_areas) // List of area names of roundstart station cyborg rechargers, for the low charge/no charge cyborg screen alert tooltips.
GLOBAL_LIST_EMPTY(roundstart_station_mechcharger_areas) // List of area names of roundstart station mech rechargers, for the low charge/no charge mech screen alert tooltips.
///List of all types of '/obj/machinery/mining_ltsrbt'
GLOBAL_LIST_EMPTY(mining_ltsrbt)
+2 -3
View File
@@ -142,6 +142,8 @@ SUBSYSTEM_DEF(shuttle)
while(length(pack_processing))
var/datum/supply_pack/pack = pack_processing[length(pack_processing)]
pack_processing.len--
if(!initial(pack.contains))
continue
if(ispath(pack, /datum/supply_pack))
pack = new pack
@@ -150,9 +152,6 @@ SUBSYSTEM_DEF(shuttle)
pack_processing += generated_packs
continue
if(!pack.contains)
continue
supply_packs[pack.id] = pack
setup_shuttles(stationary_docking_ports)
+3 -2
View File
@@ -42,8 +42,9 @@
if(machine_stat & NOPOWER) // Your screen can't be on if you've got no damn charge
return
. += mutable_appearance(icon, icon_screen)
. += emissive_appearance(icon, icon_screen, src)
if(icon_screen)
. += mutable_appearance(icon, icon_screen)
. += emissive_appearance(icon, icon_screen, src)
/obj/machinery/computer/power_change()
. = ..()
@@ -1,125 +0,0 @@
/obj/machinery/computer/chef_order
name = "Produce Orders Console"
desc = "An interface for ordering fresh produce and other. A far more expensive option than the botanists, but oh well."
icon_screen = "request"
icon_keyboard = "generic_key"
circuit = /obj/item/circuitboard/computer/chef_order
light_color = LIGHT_COLOR_ORANGE
COOLDOWN_DECLARE(order_cooldown)
var/static/list/order_datums = list()
var/list/grocery_list = list()
var/obj/item/radio/radio
var/radio_channel = RADIO_CHANNEL_SUPPLY
/obj/machinery/computer/chef_order/Initialize(mapload)
. = ..()
radio = new(src)
radio.set_frequency(FREQ_SUPPLY)
radio.subspace_transmission = TRUE
radio.canhear_range = 0
radio.recalculateChannels()
if(!order_datums.len)
for(var/path in subtypesof(/datum/orderable_item))
order_datums += new path
/obj/machinery/computer/chef_order/Destroy()
QDEL_NULL(radio)
. = ..()
/obj/machinery/computer/chef_order/proc/get_total_cost()
. = 0
for(var/datum/orderable_item/item as anything in grocery_list)
. += grocery_list[item] * item.cost_per_order
/obj/machinery/computer/chef_order/ui_interact(mob/user, datum/tgui/ui)
. = ..()
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "ProduceConsole", name)
ui.open()
/obj/machinery/computer/chef_order/ui_data(mob/user)
. = ..()
.["off_cooldown"] = COOLDOWN_FINISHED(src, order_cooldown)
/obj/machinery/computer/chef_order/ui_static_data(mob/user)
. = ..()
.["total_cost"] = get_total_cost()
.["order_datums"] = list()
for(var/datum/orderable_item/item as anything in order_datums)
.["order_datums"] += list(list(
"name" = item.name,
"desc" = item.desc,
"cat" = item.category_index,
"ref" = REF(item),
"cost" = item.cost_per_order,
"amt" = grocery_list[item]
))
/obj/machinery/computer/chef_order/ui_act(action, params)
. = ..()
if(.)
return
if(!isliving(usr))
return
var/mob/living/chef = usr
//this is null if the action doesn't need it (purchase, quickpurchase)
var/datum/orderable_item/wanted_item = locate(params["target"]) in order_datums
switch(action)
if("cart_set")
grocery_list[wanted_item] = clamp(params["amt"], 0, 20)
if(!grocery_list[wanted_item])
grocery_list -= wanted_item
update_static_data(chef)
if("purchase")
if(!grocery_list.len || !COOLDOWN_FINISHED(src, order_cooldown))
return
var/obj/item/card/id/chef_card = chef.get_idcard(TRUE)
if(!chef_card || !chef_card.registered_account)
say("No bank account detected!")
return
var/final_cost = get_total_cost()
if(!chef_card.registered_account.adjust_money(-final_cost, "Chef Order: Purchase"))
say("Sorry, but you do not have enough money.")
return
say("Thank you for your purchase! It will arrive on the next cargo shuttle!")
var/message = "The kitchen has ordered groceries which will arrive on the cargo shuttle! Please make sure it gets to them as soon as possible!"
radio.talk_into(src, message, radio_channel)
COOLDOWN_START(src, order_cooldown, 60 SECONDS)
for(var/datum/orderable_item/ordered_item in grocery_list)
if(ordered_item in SSshuttle.chef_groceries)
SSshuttle.chef_groceries[ordered_item] += grocery_list[ordered_item]
else
SSshuttle.chef_groceries[ordered_item] = grocery_list[ordered_item]
grocery_list.Cut()
update_static_data(chef)
if("express")
if(!grocery_list.len || !COOLDOWN_FINISHED(src, order_cooldown))
return
var/obj/item/card/id/chef_card = chef.get_idcard(TRUE)
if(!chef_card || !chef_card.registered_account)
say("No bank account detected!")
return
var/final_cost = get_total_cost()
final_cost *= 2
if(!chef_card.registered_account.adjust_money(-final_cost, "Chef Order: Purchase"))
say("Sorry, but you do not have enough money. Remember, Express upcharges the cost!")
return
say("Thank you for your purchase! Please note: The charge of this purchase and machine cooldown has been doubled!")
COOLDOWN_START(src, order_cooldown, 120 SECONDS)
var/list/ordered_paths = list()
for(var/datum/orderable_item/item as anything in grocery_list)//every order
for(var/amt in 1 to grocery_list[item])//every order amount
ordered_paths += item.item_path
podspawn(list(
"target" = get_turf(chef),
"style" = STYLE_BLUESPACE,
"spawn" = ordered_paths
))
grocery_list.Cut()
update_static_data(chef)
. = TRUE
@@ -1,341 +0,0 @@
#define CATEGORY_FRUITS_VEGGIES 1
#define CATEGORY_MILK_EGGS 2
#define CATEGORY_SAUCES_REAGENTS 3
///A datum for chef ordering options from the chef's computer.
/datum/orderable_item
var/name = "Orderable Item Name"
//description set automatically unless it's hard set by the subtype
var/desc
var/category_index = CATEGORY_FRUITS_VEGGIES
var/obj/item/item_path
var/cost_per_order = 10
/datum/orderable_item/New()
. = ..()
if(type == /datum/orderable_item)
return
if(!item_path)
CRASH("[type] orderable item datum has NO ITEM PATH!")
if(!desc)
desc = initial(item_path.desc)
/datum/orderable_item/Destroy(force, ...)
. = ..()
qdel(item_path)
//Fruits and Veggies
/datum/orderable_item/potato
name = "Potato"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/potato
/datum/orderable_item/tomato
name = "Tomato"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/tomato
/datum/orderable_item/carrot
name = "Carrot"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/carrot
/datum/orderable_item/eggplant
name = "Eggplant"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/eggplant
/datum/orderable_item/mushroom
name = "Plump Helmet"
desc = "Plumus Hellmus: Plump, soft and s-so inviting~"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/mushroom/plumphelmet
/datum/orderable_item/cabbage
name = "Cabbage"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/cabbage
/datum/orderable_item/beets
name = "Onion"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/onion
/datum/orderable_item/apple
name = "Apple"
category_index = CATEGORY_FRUITS_VEGGIES
item_path =/obj/item/food/grown/apple
/datum/orderable_item/pumpkin
name = "Pumpkin"
category_index = CATEGORY_FRUITS_VEGGIES
item_path =/obj/item/food/grown/pumpkin
/datum/orderable_item/watermelon
name = "Watermelon"
category_index = CATEGORY_FRUITS_VEGGIES
item_path =/obj/item/food/grown/watermelon
/datum/orderable_item/corn
name = "Corn"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/corn
/datum/orderable_item/soybean
name = "Soybeans"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/soybeans
/datum/orderable_item/garlic
name = "Garlic"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/garlic
/datum/orderable_item/cherries
name = "Cherries"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/cherries
/datum/orderable_item/chanterelle
name = "Chanterelle"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/mushroom/chanterelle
/datum/orderable_item/cocoa
name = "Cocoa"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/cocoapod
/datum/orderable_item/herbs
name = "Bundle of Herbs"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/herbs
cost_per_order = 5
/datum/orderable_item/bell_pepper
name = "Bell Pepper"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/bell_pepper
/datum/orderable_item/cucumbers
name = "Cucumber"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/food/grown/cucumber
cost_per_order = 10
/datum/orderable_item/pickles
name = "Jar of pickles"
category_index = CATEGORY_FRUITS_VEGGIES
item_path = /obj/item/storage/fancy/pickles_jar
cost_per_order = 60
//Milk and Eggs
/datum/orderable_item/milk
name = "Milk"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/reagent_containers/condiment/milk
cost_per_order = 30
/datum/orderable_item/soymilk
name = "Soy Milk"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/reagent_containers/condiment/soymilk
cost_per_order = 30
/datum/orderable_item/cream
name = "Cream"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/reagent_containers/cup/glass/bottle/juice/cream
cost_per_order = 40
/datum/orderable_item/yoghurt
name = "Yoghurt"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/reagent_containers/condiment/yoghurt
cost_per_order = 40
/datum/orderable_item/eggs
name = "Egg Carton"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/storage/fancy/egg_box
cost_per_order = 40
/datum/orderable_item/fillet
name = "Fish Fillet"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/food/fishmeat
cost_per_order = 12
/datum/orderable_item/spider_eggs
name = "Spider Eggs"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/food/spidereggs
/datum/orderable_item/moonfish_eggs
name = "Moonfish Eggs"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/food/moonfish_eggs
cost_per_order = 30
/datum/orderable_item/desert_snails
name = "Canned Desert Snails"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/food/desert_snails
cost_per_order = 20
/datum/orderable_item/canned_jellyfish
name = "Canned Gunner Jellyfish"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/food/canned_jellyfish
cost_per_order = 20
/datum/orderable_item/canned_larvae
name = "Canned Larvae"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/food/larvae
cost_per_order = 20
/datum/orderable_item/canned_tomatoes
name = "Canned San Marzano Tomatoes"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/food/canned/tomatoes
cost_per_order = 30
/datum/orderable_item/canned_pine_nuts
name = "Canned Pine Nuts"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/food/canned/pine_nuts
cost_per_order = 20
/datum/orderable_item/ready_donk
name = "Ready-Donk Meal: Bachelor Chow"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/food/ready_donk
cost_per_order = 40
/datum/orderable_item/ready_donk_mac
name = "Ready-Donk Meal: Donk-a-Roni"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/food/ready_donk/mac_n_cheese
cost_per_order = 40
/datum/orderable_item/ready_donk_mex
name = "Ready-Donk Meal: Donkhiladas"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/food/ready_donk/donkhiladas
cost_per_order = 40
/datum/orderable_item/tiziran_goods
name = "Tiziran Farm-Fresh Pack"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/storage/box/tiziran_goods
cost_per_order = 120
/datum/orderable_item/tiziran_cans
name = "Tiziran Canned Goods Pack"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/storage/box/tiziran_cans
cost_per_order = 120
/datum/orderable_item/tiziran_meats
name = "Tiziran Meatmarket Pack"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/storage/box/tiziran_meats
cost_per_order = 120
/datum/orderable_item/mothic_goods
name = "Mothic Farm-Fresh Pack"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/storage/box/mothic_goods
cost_per_order = 120
/datum/orderable_item/mothic_cans_sauces
name = "Mothic Pantry Pack"
category_index = CATEGORY_MILK_EGGS
item_path = /obj/item/storage/box/mothic_cans_sauces
cost_per_order = 120
//Reagents
/datum/orderable_item/flour
name = "Flour Sack"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/flour
cost_per_order = 30
/datum/orderable_item/sugar
name = "Sugar Sack"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/sugar
cost_per_order = 30
/datum/orderable_item/rice
name = "Rice Sack"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/rice
cost_per_order = 30
/datum/orderable_item/cornmeal
name = "Cornmeal Box"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/cornmeal
cost_per_order = 30
/datum/orderable_item/enzyme
name = "Universal Enzyme"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/enzyme
cost_per_order = 40
/datum/orderable_item/salt
name = "Salt Shaker"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/saltshaker
cost_per_order = 15
/datum/orderable_item/pepper
name = "Pepper Mill"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/peppermill
cost_per_order = 15
/datum/orderable_item/soysauce
name = "Soy Sauce"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/soysauce
cost_per_order = 15
/datum/orderable_item/bbqsauce
name = "BBQ Sauce"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/bbqsauce
cost_per_order = 60
/datum/orderable_item/vinegar
name = "Vinegar"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/vinegar
cost_per_order = 30
/datum/orderable_item/quality_oil
name = "Quality Oil"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/quality_oil
cost_per_order = 50 //Extra Virgin, just like you, the reader
/datum/orderable_item/peanut_butter
name = "Peanut Butter"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/peanut_butter
cost_per_order = 30
/datum/orderable_item/cherryjelly
name = "Cherry Jelly"
category_index = CATEGORY_SAUCES_REAGENTS
item_path = /obj/item/reagent_containers/condiment/cherryjelly
cost_per_order = 30
//
@@ -0,0 +1,21 @@
/obj/machinery/computer/order_console/cook
name = "Produce Orders Console"
desc = "An interface for ordering fresh produce and other. A far more expensive option than the botanists, but oh well."
circuit = /obj/item/circuitboard/computer/order_console
order_categories = list(
CATEGORY_FRUITS_VEGGIES,
CATEGORY_MILK_EGGS,
CATEGORY_SAUCES_REAGENTS,
)
/obj/machinery/computer/order_console/cook/order_groceries(mob/living/purchaser, obj/item/card/id/card, list/groceries, ltsrbt_delivered = FALSE)
say("Thank you for your purchase! It will arrive on the next cargo shuttle!")
radio.talk_into(src, "The kitchen has ordered groceries which will arrive on the cargo shuttle! Please make sure it gets to them as soon as possible!", radio_channel)
for(var/datum/orderable_item/ordered_item in groceries)
if(!(ordered_item.category_index in order_categories))
groceries.Remove(ordered_item)
continue
if(ordered_item in SSshuttle.chef_groceries)
SSshuttle.chef_groceries[ordered_item] += groceries[ordered_item]
else
SSshuttle.chef_groceries[ordered_item] = groceries[ordered_item]
@@ -0,0 +1,13 @@
/obj/machinery/computer/order_console/mining/golem
name = "golem ship equipment vendor"
circuit = /obj/item/circuitboard/computer/order_console/mining/golem
forced_express = TRUE
express_cost_multiplier = 1
uses_ltsrbt = FALSE
order_categories = list(
CATEGORY_GOLEM,
CATEGORY_MINING,
CATEGORY_CONSUMABLES,
CATEGORY_TOYS_DRONE,
CATEGORY_PKA,
)
@@ -0,0 +1,199 @@
/obj/machinery/computer/order_console/mining
name = "mining equipment vendor"
desc = "An equipment shop for miners, points collected at an ore redemption machine can be spent here."
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "mining"
icon_keyboard = null
icon_screen = null
circuit = /obj/item/circuitboard/computer/order_console/mining
cooldown_time = 10 SECONDS //just time to let you know your order went through.
express_cost_multiplier = 1.5
uses_ltsrbt = TRUE
order_categories = list(
CATEGORY_MINING,
CATEGORY_CONSUMABLES,
CATEGORY_TOYS_DRONE,
CATEGORY_PKA,
)
/obj/machinery/computer/order_console/mining/purchase_items(obj/item/card/id/card, express = FALSE)
var/final_cost = get_total_cost()
var/failure_message = "Sorry, but you do not have enough mining points."
if(express)
final_cost *= express_cost_multiplier
failure_message += "Remember, Express upcharges the cost!"
if(final_cost <= card.mining_points)
card.mining_points -= final_cost
return TRUE
say(failure_message)
return FALSE
/obj/machinery/computer/order_console/mining/order_groceries(mob/living/purchaser, obj/item/card/id/card, list/groceries, ltsrbt_delivered = FALSE)
var/list/things_to_order = list()
for(var/datum/orderable_item/item as anything in groceries)
things_to_order[item.item_path] = groceries[item]
var/datum/supply_pack/custom/mining_pack = new(purchaser, things_to_order)
var/datum/supply_order/new_order = new(
pack = mining_pack, \
orderer = purchaser, \
orderer_rank = "Mining Vendor", \
orderer_ckey = purchaser.ckey, \
reason = "", \
paying_account = card.registered_account, \
department_destination = null, \
coupon = null, \
charge_on_purchase = FALSE,
)
if(ltsrbt_delivered)
var/obj/machinery/mining_ltsrbt/ltsrbt
for(var/obj/machinery/mining_ltsrbt/all_ltsrbts as anything in GLOB.mining_ltsrbt)
if(all_ltsrbts.machine_stat & (NOPOWER|BROKEN|MAINT)) //not functional
continue
if(!all_ltsrbts.enabled) //not enabled
continue
ltsrbt = all_ltsrbts
break
if(ltsrbt && ltsrbt.recieve_order(new_order))
return
say("Found no functional mining LTSRBTs. If there is one, it is likely destroyed, powered down, or under maintenance. Your delivery has instead been rerouted to Cargo.")
else
say("Thank you for your purchase! It will arrive on the next cargo shuttle!")
radio.talk_into(src, "A shaft miner has ordered equipment which will arrive on the cargo shuttle! Please make sure it gets to them as soon as possible!", radio_channel)
SSshuttle.shopping_list += new_order
/obj/machinery/computer/order_console/mining/ui_data(mob/user)
var/list/data = ..()
if(!isliving(user))
return data
var/mob/living/living_user = user
var/obj/item/card/id/id_card = living_user.get_idcard(TRUE)
if(id_card)
data["points"] = id_card.mining_points
return data
/obj/machinery/computer/order_console/mining/ui_act(action, params)
. = ..()
if(!.)
flick("mining-deny", src)
/obj/machinery/computer/order_console/mining/attackby(obj/item/weapon, mob/user, params)
if(istype(weapon, /obj/item/mining_voucher))
redeem_voucher(weapon, user)
return
return ..()
/obj/machinery/computer/order_console/mining/update_icon_state()
icon_state = "[initial(icon_state)][powered() ? null : "-off"]"
return ..()
/**
* Allows user to redeem a mining voucher for one set of a mining equipment
*
* * Arguments:
* * voucher The mining voucher that is being used to redeem the mining equipment
* * redeemer The mob that is redeeming the mining equipment
*/
/obj/machinery/computer/order_console/mining/proc/redeem_voucher(obj/item/mining_voucher/voucher, mob/redeemer)
var/static/list/set_types
if(!set_types)
set_types = list()
for(var/datum/voucher_set/static_set as anything in subtypesof(/datum/voucher_set))
set_types[initial(static_set.name)] = new static_set
var/list/items = list()
for(var/set_name in set_types)
var/datum/voucher_set/current_set = set_types[set_name]
var/datum/radial_menu_choice/option = new
option.image = image(icon = current_set.icon, icon_state = current_set.icon_state)
option.info = span_boldnotice(current_set.description)
items[set_name] = option
var/selection = show_radial_menu(redeemer, src, items, custom_check = CALLBACK(src, PROC_REF(check_menu), voucher, redeemer), radius = 38, require_near = TRUE, tooltips = TRUE)
if(!selection)
return
var/datum/voucher_set/chosen_set = set_types[selection]
for(var/item in chosen_set.set_items)
new item(drop_location())
SSblackbox.record_feedback("tally", "mining_voucher_redeemed", 1, selection)
qdel(voucher)
/**
* Checks if we are allowed to interact with a radial menu
*
* * Arguments:
* * voucher The mining voucher that is being used to redeem a mining equipment
* * redeemer The living mob interacting with the menu
*/
/obj/machinery/computer/order_console/mining/proc/check_menu(obj/item/mining_voucher/voucher, mob/living/redeemer)
if(!istype(redeemer))
return FALSE
if(redeemer.incapacitated())
return FALSE
if(QDELETED(voucher))
return FALSE
if(!redeemer.is_holding(voucher))
return FALSE
return TRUE
/**********************Mining Equipment Voucher**********************/
/obj/item/mining_voucher
name = "mining voucher"
desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
icon = 'icons/obj/mining.dmi'
icon_state = "mining_voucher"
w_class = WEIGHT_CLASS_TINY
/**********************Mining Point Card**********************/
#define TO_USER_ID "To ID"
#define TO_POINT_CARD "To Card"
/obj/item/card/mining_point_card
name = "mining point transfer card"
desc = "A small, reusable card for transferring mining points. Swipe your ID card over it to start the process."
icon_state = "data_1"
///Amount of points this card contains.
var/points = 500
/obj/item/card/mining_point_card/examine(mob/user)
. = ..()
. += span_notice("There's [points] point\s on the card.")
/obj/item/card/mining_point_card/attackby(obj/item/attacking_item, mob/user, params)
if(!isidcard(attacking_item))
return ..()
if(!points)
to_chat(user, span_alert("There's no points left on [src]."))
return
var/obj/item/card/id/attacking_id = attacking_item
balloon_alert(user, "starting transfer")
var/point_movement = tgui_alert(user, "To ID (from card) or to card (from ID)?", "Mining Points Transfer", list(TO_USER_ID, TO_POINT_CARD))
if(!point_movement)
return
var/amount = tgui_input_number(user, "How much do you want to transfer? ID Balance: [attacking_id.mining_points], Card Balance: [points]", "Transfer Points", min_value = 0, round_value = 1)
if(!amount)
return
switch(point_movement)
if(TO_USER_ID)
if(amount > points)
amount = points
attacking_id.mining_points += amount
points -= amount
to_chat(user, span_notice("You transfer [amount] mining points from [src] to [attacking_id]."))
if(TO_POINT_CARD)
if(amount > attacking_id.mining_points)
amount = attacking_id.mining_points
attacking_id.mining_points -= amount
points += amount
to_chat(user, span_notice("You transfer [amount] mining points from [attacking_id] to [src]."))
#undef TO_POINT_CARD
#undef TO_USER_ID
@@ -0,0 +1,176 @@
///List of all items that can be found in the different types of order consoles, to purchase.
GLOBAL_LIST_EMPTY(order_console_products)
/obj/machinery/computer/order_console
name = "Orders Console"
desc = "An interface for ordering specific ingredients from Cargo, with an express option at the cost of more money."
icon_screen = "request"
icon_keyboard = "generic_key"
light_color = LIGHT_COLOR_ORANGE
///Cooldown between order uses.
COOLDOWN_DECLARE(order_cooldown)
///Cooldown time between uses, express console will have extra time depending on express_cost_multiplier.
var/cooldown_time = 60 SECONDS
///Boolean on whether they can bluespace orders using a '/obj/machinery/mining_ltsrbt'
var/uses_ltsrbt = FALSE
///The radio the console can speak into
var/obj/item/radio/radio
///The channel we will attempt to speak into through our radio.
var/radio_channel = RADIO_CHANNEL_SUPPLY
///Whether the console can only use express mode ONLY
var/forced_express = FALSE
///Multiplied cost to use express mode
var/express_cost_multiplier = 2
///The categories of orderable items this console can view and purchase.
var/list/order_categories = list()
///The current list of things we're trying to order, waiting for checkout.
var/list/datum/orderable_item/grocery_list = list()
/obj/machinery/computer/order_console/Initialize(mapload)
. = ..()
radio = new(src)
radio.set_frequency(FREQ_SUPPLY)
radio.subspace_transmission = TRUE
radio.canhear_range = 0
radio.recalculateChannels()
if(GLOB.order_console_products.len)
return
for(var/datum/orderable_item/path as anything in subtypesof(/datum/orderable_item))
if(!initial(path.item_path))
continue
GLOB.order_console_products += new path
/obj/machinery/computer/order_console/Destroy()
QDEL_NULL(radio)
return ..()
/obj/machinery/computer/order_console/proc/get_total_cost()
var/cost = 0
for(var/datum/orderable_item/item as anything in grocery_list)
cost += grocery_list[item] * item.cost_per_order
return cost
/obj/machinery/computer/order_console/ui_interact(mob/user, datum/tgui/ui)
. = ..()
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "ProduceConsole", name)
ui.open()
/obj/machinery/computer/order_console/ui_data(mob/user)
var/list/data = list()
data["total_cost"] = get_total_cost()
data["off_cooldown"] = COOLDOWN_FINISHED(src, order_cooldown)
if(!isliving(user))
return data
var/mob/living/living_user = user
var/obj/item/card/id/id_card = living_user.get_idcard(TRUE)
if(id_card)
data["points"] = id_card.registered_account?.account_balance
return data
/obj/machinery/computer/order_console/ui_static_data(mob/user)
var/list/data = list()
data["ltsrbt_available"] = (uses_ltsrbt && GLOB.mining_ltsrbt.len)
data["forced_express"] = forced_express
data["order_categories"] = order_categories
data["order_datums"] = list()
for(var/datum/orderable_item/item as anything in GLOB.order_console_products)
if(!(item.category_index in order_categories))
continue
data["order_datums"] += list(list(
"name" = item.name,
"desc" = item.desc,
"cat" = item.category_index,
"ref" = REF(item),
"cost" = item.cost_per_order,
"amt" = grocery_list[item],
))
return data
/obj/machinery/computer/order_console/ui_act(action, params)
. = ..()
if(.)
return
if(!isliving(usr))
return
var/mob/living/living_user = usr
switch(action)
if("cart_set")
//this is null if the action doesn't need it (purchase, quickpurchase)
var/datum/orderable_item/wanted_item = locate(params["target"]) in GLOB.order_console_products
grocery_list[wanted_item] = clamp(params["amt"], 0, 20)
if(!grocery_list[wanted_item])
grocery_list -= wanted_item
update_static_data(living_user)
if("purchase", "ltsrbt_deliver")
if(!grocery_list.len || !COOLDOWN_FINISHED(src, order_cooldown))
return
if(forced_express)
return ui_act(action = "express")
var/obj/item/card/id/used_id_card = living_user.get_idcard(TRUE)
if(!used_id_card || !used_id_card.registered_account)
say("No bank account detected!")
return
if(!purchase_items(used_id_card))
return
order_groceries(living_user, used_id_card, grocery_list, ltsrbt_delivered = (action == "ltsrbt_deliver"))
grocery_list.Cut()
COOLDOWN_START(src, order_cooldown, cooldown_time)
if("express")
if(!grocery_list.len || !COOLDOWN_FINISHED(src, order_cooldown))
return
var/obj/item/card/id/used_id_card = living_user.get_idcard(TRUE)
if(!used_id_card || !used_id_card.registered_account)
say("No bank account detected!")
return
if(!purchase_items(used_id_card, express = TRUE))
return
var/say_message = "Thank you for your purchase!"
if(express_cost_multiplier > 1)
say_message += "Please note: The charge of this purchase and machine cooldown has been multiplied by [express_cost_multiplier]!"
COOLDOWN_START(src, order_cooldown, cooldown_time * express_cost_multiplier)
say(say_message)
var/list/ordered_paths = list()
for(var/datum/orderable_item/item as anything in grocery_list)//every order
if(!(item.category_index in order_categories))
stack_trace("[src] somehow delivered [item] which is not purchasable at this order console.")
grocery_list.Remove(item)
continue
for(var/amt in 1 to grocery_list[item])//every order amount
ordered_paths += item.item_path
podspawn(list(
"target" = get_turf(living_user),
"style" = STYLE_BLUESPACE,
"spawn" = ordered_paths,
))
grocery_list.Cut()
return TRUE
/**
* Checks if an ID card is able to afford the total cost of the current console's grocieries
* and deducts the cost if they can.
* Args:
* card - The ID card we check for balance
* express - Boolean on whether we need to add the express cost mulitplier
* returns TRUE if we can afford, FALSE otherwise.
*/
/obj/machinery/computer/order_console/proc/purchase_items(obj/item/card/id/card, express = FALSE)
var/final_cost = get_total_cost()
var/failure_message = "Sorry, but you do not have enough money."
if(express)
final_cost *= express_cost_multiplier
failure_message += "Remember, Express upcharges the cost!"
if(card.registered_account.adjust_money(-final_cost, "[name]: Purchase"))
return TRUE
say(failure_message)
return FALSE
/obj/machinery/computer/order_console/proc/order_groceries(mob/living/purchaser, obj/item/card/id/card, list/groceries, ltsrbt_delivered = FALSE)
return
@@ -0,0 +1,106 @@
/datum/orderable_item/milk_eggs
category_index = CATEGORY_MILK_EGGS
/datum/orderable_item/milk_eggs/milk
name = "Milk"
item_path = /obj/item/reagent_containers/condiment/milk
cost_per_order = 30
/datum/orderable_item/milk_eggs/soymilk
name = "Soy Milk"
item_path = /obj/item/reagent_containers/condiment/soymilk
cost_per_order = 30
/datum/orderable_item/milk_eggs/cream
name = "Cream"
item_path = /obj/item/reagent_containers/cup/glass/bottle/juice/cream
cost_per_order = 40
/datum/orderable_item/milk_eggs/yoghurt
name = "Yoghurt"
item_path = /obj/item/reagent_containers/condiment/yoghurt
cost_per_order = 40
/datum/orderable_item/milk_eggs/eggs
name = "Egg Carton"
item_path = /obj/item/storage/fancy/egg_box
cost_per_order = 40
/datum/orderable_item/milk_eggs/fillet
name = "Fish Fillet"
item_path = /obj/item/food/fishmeat
cost_per_order = 12
/datum/orderable_item/milk_eggs/spider_eggs
name = "Spider Eggs"
item_path = /obj/item/food/spidereggs
/datum/orderable_item/milk_eggs/moonfish_eggs
name = "Moonfish Eggs"
item_path = /obj/item/food/moonfish_eggs
cost_per_order = 30
/datum/orderable_item/milk_eggs/desert_snails
name = "Canned Desert Snails"
item_path = /obj/item/food/desert_snails
cost_per_order = 20
/datum/orderable_item/milk_eggs/canned_jellyfish
name = "Canned Gunner Jellyfish"
item_path = /obj/item/food/canned_jellyfish
cost_per_order = 20
/datum/orderable_item/milk_eggs/canned_larvae
name = "Canned Larvae"
item_path = /obj/item/food/larvae
cost_per_order = 20
/datum/orderable_item/milk_eggs/canned_tomatoes
name = "Canned San Marzano Tomatoes"
item_path = /obj/item/food/canned/tomatoes
cost_per_order = 30
/datum/orderable_item/milk_eggs/canned_pine_nuts
name = "Canned Pine Nuts"
item_path = /obj/item/food/canned/pine_nuts
cost_per_order = 20
/datum/orderable_item/milk_eggs/ready_donk
name = "Ready-Donk Meal: Bachelor Chow"
item_path = /obj/item/food/ready_donk
cost_per_order = 40
/datum/orderable_item/milk_eggs/ready_donk_mac
name = "Ready-Donk Meal: Donk-a-Roni"
item_path = /obj/item/food/ready_donk/mac_n_cheese
cost_per_order = 40
/datum/orderable_item/milk_eggs/ready_donk_mex
name = "Ready-Donk Meal: Donkhiladas"
item_path = /obj/item/food/ready_donk/donkhiladas
cost_per_order = 40
/datum/orderable_item/milk_eggs/tiziran_goods
name = "Tiziran Farm-Fresh Pack"
item_path = /obj/item/storage/box/tiziran_goods
cost_per_order = 120
/datum/orderable_item/milk_eggs/tiziran_cans
name = "Tiziran Canned Goods Pack"
item_path = /obj/item/storage/box/tiziran_cans
cost_per_order = 120
/datum/orderable_item/milk_eggs/tiziran_meats
name = "Tiziran Meatmarket Pack"
item_path = /obj/item/storage/box/tiziran_meats
cost_per_order = 120
/datum/orderable_item/milk_eggs/mothic_goods
name = "Mothic Farm-Fresh Pack"
item_path = /obj/item/storage/box/mothic_goods
cost_per_order = 120
/datum/orderable_item/milk_eggs/mothic_cans_sauces
name = "Mothic Pantry Pack"
item_path = /obj/item/storage/box/mothic_cans_sauces
cost_per_order = 120
@@ -0,0 +1,67 @@
/datum/orderable_item/reagents
category_index = CATEGORY_SAUCES_REAGENTS
/datum/orderable_item/reagents/flour
name = "Flour Sack"
item_path = /obj/item/reagent_containers/condiment/flour
cost_per_order = 30
/datum/orderable_item/reagents/sugar
name = "Sugar Sack"
item_path = /obj/item/reagent_containers/condiment/sugar
cost_per_order = 30
/datum/orderable_item/reagents/rice
name = "Rice Sack"
item_path = /obj/item/reagent_containers/condiment/rice
cost_per_order = 30
/datum/orderable_item/reagents/cornmeal
name = "Cornmeal Box"
item_path = /obj/item/reagent_containers/condiment/cornmeal
cost_per_order = 30
/datum/orderable_item/reagents/enzyme
name = "Universal Enzyme"
item_path = /obj/item/reagent_containers/condiment/enzyme
cost_per_order = 40
/datum/orderable_item/reagents/salt
name = "Salt Shaker"
item_path = /obj/item/reagent_containers/condiment/saltshaker
cost_per_order = 15
/datum/orderable_item/reagents/pepper
name = "Pepper Mill"
item_path = /obj/item/reagent_containers/condiment/peppermill
cost_per_order = 15
/datum/orderable_item/reagents/soysauce
name = "Soy Sauce"
item_path = /obj/item/reagent_containers/condiment/soysauce
cost_per_order = 15
/datum/orderable_item/reagents/bbqsauce
name = "BBQ Sauce"
item_path = /obj/item/reagent_containers/condiment/bbqsauce
cost_per_order = 60
/datum/orderable_item/reagents/vinegar
name = "Vinegar"
item_path = /obj/item/reagent_containers/condiment/vinegar
cost_per_order = 30
/datum/orderable_item/reagents/quality_oil
name = "Quality Oil"
item_path = /obj/item/reagent_containers/condiment/quality_oil
cost_per_order = 50 //Extra Virgin, just like you, the reader
/datum/orderable_item/reagents/peanut_butter
name = "Peanut Butter"
item_path = /obj/item/reagent_containers/condiment/peanut_butter
cost_per_order = 30
/datum/orderable_item/reagents/cherryjelly
name = "Cherry Jelly"
item_path = /obj/item/reagent_containers/condiment/cherryjelly
cost_per_order = 30
@@ -0,0 +1,86 @@
/datum/orderable_item/veggies
category_index = CATEGORY_FRUITS_VEGGIES
/datum/orderable_item/veggies/potato
name = "Potato"
item_path = /obj/item/food/grown/potato
/datum/orderable_item/veggies/tomato
name = "Tomato"
item_path = /obj/item/food/grown/tomato
/datum/orderable_item/veggies/carrot
name = "Carrot"
item_path = /obj/item/food/grown/carrot
/datum/orderable_item/veggies/eggplant
name = "Eggplant"
item_path = /obj/item/food/grown/eggplant
/datum/orderable_item/veggies/mushroom
name = "Plump Helmet"
desc = "Plumus Hellmus: Plump, soft and s-so inviting~"
item_path = /obj/item/food/grown/mushroom/plumphelmet
/datum/orderable_item/veggies/cabbage
name = "Cabbage"
item_path = /obj/item/food/grown/cabbage
/datum/orderable_item/veggies/beets
name = "Onion"
item_path = /obj/item/food/grown/onion
/datum/orderable_item/veggies/apple
name = "Apple"
item_path = /obj/item/food/grown/apple
/datum/orderable_item/veggies/pumpkin
name = "Pumpkin"
item_path = /obj/item/food/grown/pumpkin
/datum/orderable_item/veggies/watermelon
name = "Watermelon"
item_path = /obj/item/food/grown/watermelon
/datum/orderable_item/veggies/corn
name = "Corn"
item_path = /obj/item/food/grown/corn
/datum/orderable_item/veggies/soybean
name = "Soybeans"
item_path = /obj/item/food/grown/soybeans
/datum/orderable_item/veggies/garlic
name = "Garlic"
item_path = /obj/item/food/grown/garlic
/datum/orderable_item/veggies/cherries
name = "Cherries"
item_path = /obj/item/food/grown/cherries
/datum/orderable_item/veggies/chanterelle
name = "Chanterelle"
item_path = /obj/item/food/grown/mushroom/chanterelle
/datum/orderable_item/veggies/cocoa
name = "Cocoa"
item_path = /obj/item/food/grown/cocoapod
/datum/orderable_item/veggies/herbs
name = "Bundle of Herbs"
item_path = /obj/item/food/grown/herbs
cost_per_order = 5
/datum/orderable_item/veggies/bell_pepper
name = "Bell Pepper"
item_path = /obj/item/food/grown/bell_pepper
/datum/orderable_item/veggies/cucumbers
name = "Cucumber"
item_path = /obj/item/food/grown/cucumber
cost_per_order = 10
/datum/orderable_item/veggies/pickles
name = "Jar of pickles"
item_path = /obj/item/storage/fancy/pickles_jar
cost_per_order = 60
@@ -0,0 +1,43 @@
/datum/orderable_item/consumables
category_index = CATEGORY_CONSUMABLES
/datum/orderable_item/consumables/survival_pen
item_path = /obj/item/reagent_containers/hypospray/medipen/survival
cost_per_order = 500
/datum/orderable_item/consumables/luxury_pen
item_path = /obj/item/reagent_containers/hypospray/medipen/survival/luxury
cost_per_order = 1000
/datum/orderable_item/consumables/medkit
item_path = /obj/item/storage/medkit/brute
cost_per_order = 600
/datum/orderable_item/consumables/whiskey
item_path = /obj/item/reagent_containers/cup/glass/bottle/whiskey
cost_per_order = 100
/datum/orderable_item/consumables/absinthe
item_path = /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium
cost_per_order = 100
/datum/orderable_item/consumables/bubblegum
item_path = /obj/item/storage/box/gum/bubblegum
cost_per_order = 100
/datum/orderable_item/consumables/havana_cigars
item_path = /obj/item/clothing/mask/cigarette/cigar/havana
cost_per_order = 150
/datum/orderable_item/consumables/havana_cigars
item_path = /obj/item/clothing/mask/cigarette/cigar/havana
cost_per_order = 150
/datum/orderable_item/consumables/tracking_implants
item_path = /obj/item/storage/box/minertracker
cost_per_order = 600
/datum/orderable_item/consumables/space_cash
item_path = /obj/item/stack/spacecash/c1000
desc = "A stack of space cash worth 1000 credits."
cost_per_order = 2000
@@ -0,0 +1,35 @@
/datum/orderable_item/golem
category_index = CATEGORY_GOLEM
/datum/orderable_item/golem/mining_id
item_path = /obj/item/card/id/advanced/mining
cost_per_order = 250
/datum/orderable_item/golem/science_goggles
item_path = /obj/item/clothing/glasses/science
cost_per_order = 250
/datum/orderable_item/golem/monkeycubes
item_path = /obj/item/food/monkeycube
cost_per_order = 300
/datum/orderable_item/golem/belt
item_path = /obj/item/storage/belt/utility
cost_per_order = 350
/datum/orderable_item/golem/royal_cape
item_path = /obj/item/bedsheet/rd/royal_cape
cost_per_order = 500
/datum/orderable_item/golem/grey_extract
item_path = /obj/item/slime_extract/grey
cost_per_order = 1000
/datum/orderable_item/golem/trigger_guard
item_path = /obj/item/borg/upgrade/modkit/trigger_guard
cost_per_order = 17500
/datum/orderable_item/golem/rnd_boards
item_path = /obj/item/storage/box/rndboards
cost_per_order = 2000
@@ -0,0 +1,105 @@
/datum/orderable_item/mining
category_index = CATEGORY_MINING
/datum/orderable_item/mining/marker_beacon
item_path = /obj/item/stack/marker_beacon
cost_per_order = 10
/datum/orderable_item/mining/skeleton_key
item_path = /obj/item/skeleton_key
cost_per_order = 777
/datum/orderable_item/mining/mining_stabilizer
item_path = /obj/item/mining_stabilizer
cost_per_order = 400
/datum/orderable_item/mining/fulton_core
item_path = /obj/item/fulton_core
cost_per_order = 400
/datum/orderable_item/mining/mining_modsuit
item_path = /obj/item/mod/control/pre_equipped/mining
desc = "A mining-themed MODsuit that works best when in a mining environment."
cost_per_order = 3000
/datum/orderable_item/mining/mining_ltsrbt
item_path = /obj/item/circuitboard/machine/mining_ltsrbt
name = "Mining LTSRBT Board"
desc = "Tired of waiting on the Cargo shuttle? This item lets you bluespace mining orders directly to the station."
cost_per_order = 750
/datum/orderable_item/mining/mining_belt
item_path = /obj/item/storage/belt/mining
cost_per_order = 500
/datum/orderable_item/mining/point_card
item_path = /obj/item/card/mining_point_card
cost_per_order = 500
/datum/orderable_item/mining/jaunter
item_path = /obj/item/wormhole_jaunter
cost_per_order = 750
/datum/orderable_item/mining/crusher
item_path = /obj/item/kinetic_crusher
cost_per_order = 750
/datum/orderable_item/mining/resonator
item_path = /obj/item/resonator
cost_per_order = 800
/datum/orderable_item/mining/resonator_advanced
item_path = /obj/item/resonator/upgraded
cost_per_order = 2500
/datum/orderable_item/mining/mining_scanner
item_path = /obj/item/t_scanner/adv_mining_scanner
cost_per_order = 800
/datum/orderable_item/mining/fulton
item_path = /obj/item/extraction_pack
cost_per_order = 1000
/datum/orderable_item/mining/lazarus
item_path = /obj/item/lazarus_injector
cost_per_order = 1000
/datum/orderable_item/mining/gar_mesons
item_path = /obj/item/clothing/glasses/meson/gar
cost_per_order = 500
/datum/orderable_item/mining/silver_pickaxe
item_path = /obj/item/pickaxe/silver
cost_per_order = 1000
/datum/orderable_item/mining/diamond_pickaxe
item_path = /obj/item/pickaxe/diamond
cost_per_order = 2000
/datum/orderable_item/mining/conscription_kit
item_path = /obj/item/storage/backpack/duffelbag/mining_conscript
cost_per_order = 1500
/datum/orderable_item/mining/capsule
item_path = /obj/item/survivalcapsule
cost_per_order = 400
/datum/orderable_item/mining/capsule_luxury
item_path = /obj/item/survivalcapsule/luxury
cost_per_order = 3000
/datum/orderable_item/mining/capsule_luxuryelite
item_path = /obj/item/survivalcapsule/luxuryelite
cost_per_order = 10000
/datum/orderable_item/mining/kheiralcuffs
item_path = /obj/item/kheiral_cuffs
cost_per_order = 2000
/datum/orderable_item/mining/bhop
item_path = /obj/item/clothing/shoes/bhop
cost_per_order = 2500
/datum/orderable_item/mining/hiking_boots
item_path = /obj/item/clothing/shoes/winterboots/ice_boots
cost_per_order = 2500
@@ -0,0 +1,42 @@
/datum/orderable_item/accelerator
category_index = CATEGORY_PKA
/datum/orderable_item/accelerator/gun
item_path = /obj/item/gun/energy/recharge/kinetic_accelerator
cost_per_order = 750
/datum/orderable_item/accelerator/range
item_path = /obj/item/borg/upgrade/modkit/range
cost_per_order = 1000
/datum/orderable_item/accelerator/damage
item_path = /obj/item/borg/upgrade/modkit/damage
cost_per_order = 1000
/datum/orderable_item/accelerator/cooldown
item_path = /obj/item/borg/upgrade/modkit/cooldown
cost_per_order = 1000
/datum/orderable_item/accelerator/chasis
item_path = /obj/item/borg/upgrade/modkit/chassis_mod
cost_per_order = 250
/datum/orderable_item/accelerator/chasis_orange
item_path = /obj/item/borg/upgrade/modkit/chassis_mod/orange
cost_per_order = 300
/datum/orderable_item/accelerator/tracer
item_path = /obj/item/borg/upgrade/modkit/tracer
cost_per_order = 100
/datum/orderable_item/accelerator/adjustable_tracer
item_path = /obj/item/borg/upgrade/modkit/tracer/adjustable
cost_per_order = 150
/datum/orderable_item/accelerator/aoe_mobs
item_path = /obj/item/borg/upgrade/modkit/aoe/mobs
cost_per_order = 2000
/datum/orderable_item/accelerator/minebot_passthrough
item_path = /obj/item/borg/upgrade/modkit/minebot_passthrough
cost_per_order = 1000
@@ -0,0 +1,31 @@
/datum/orderable_item/toys_drones
category_index = CATEGORY_TOYS_DRONE
/datum/orderable_item/toys_drones/soap
item_path = /obj/item/soap/nanotrasen
cost_per_order = 200
/datum/orderable_item/toys_drones/laser_pointer
item_path = /obj/item/laser_pointer
cost_per_order = 300
/datum/orderable_item/toys_drones/facehugger
item_path = /obj/item/clothing/mask/facehugger/toy
cost_per_order = 300
/datum/orderable_item/toys_drones/mining_drone
item_path = /mob/living/simple_animal/hostile/mining_drone
cost_per_order = 800
/datum/orderable_item/toys_drones/drone_health
item_path = /obj/item/mine_bot_upgrade/health
cost_per_order = 400
/datum/orderable_item/toys_drones/drone_pka
item_path = /obj/item/borg/upgrade/modkit/cooldown/minebot
cost_per_order = 600
/datum/orderable_item/toys_drones/drone_sentience
item_path = /obj/item/slimepotion/slime/sentience/mining
cost_per_order = 1000
@@ -0,0 +1,28 @@
///A datum for chef ordering options from the chef's computer.
/datum/orderable_item
///Name of the item shown in the shop.
var/name
///Description shown in the shop, set automatically unless it's hard set by the subtype
var/desc
///Path of the item that is purchased when ordering us.
var/obj/item/item_path
///The category this item will be displayed in.
var/category_index = NONE
///How much this item costs to order.
var/cost_per_order = 10
/datum/orderable_item/New()
. = ..()
if(!category_index)
CRASH("[type] doesn't have a category_index assigned!")
if(!item_path)
CRASH("[type] orderable item datum with no item path was created!")
if(!name)
name = initial(item_path.name)
if(!desc)
desc = initial(item_path.desc)
/datum/orderable_item/Destroy(force, ...)
if(item_path)
qdel(item_path)
return ..()
@@ -32,7 +32,7 @@
/obj/item/circuitboard/machine/autolathe,
/obj/item/circuitboard/computer/mining,
/obj/item/circuitboard/machine/ore_redemption,
/obj/item/circuitboard/machine/mining_equipment_vendor,
/obj/item/circuitboard/computer/order_console/mining,
/obj/item/circuitboard/machine/microwave,
/obj/item/circuitboard/machine/deep_fryer,
/obj/item/circuitboard/machine/griddle,
@@ -466,11 +466,10 @@
build_path = /obj/machinery/computer/camera_advanced/syndie
//Service
/obj/item/circuitboard/computer/chef_order
/obj/item/circuitboard/computer/order_console
name = "Produce Orders Console"
greyscale_colors = CIRCUIT_COLOR_SUPPLY
build_path = /obj/machinery/computer/chef_order
greyscale_colors = CIRCUIT_COLOR_SERVICE
build_path = /obj/machinery/computer/order_console/cook
//Supply
@@ -527,6 +526,15 @@
name = "Supply Request Console"
build_path = /obj/machinery/computer/cargo/request
/obj/item/circuitboard/computer/order_console/mining
name = "Mining Vending Console"
greyscale_colors = CIRCUIT_COLOR_SUPPLY
build_path = /obj/machinery/computer/order_console/mining
/obj/item/circuitboard/computer/order_console/mining/golem
name = "Golem Ship Equipment Vendor Console"
build_path = /obj/machinery/computer/order_console/mining/golem
/obj/item/circuitboard/computer/ferry
name = "Transport Ferry"
greyscale_colors = CIRCUIT_COLOR_SUPPLY
@@ -1196,19 +1196,6 @@
/obj/item/stock_parts/card_reader = 1)
//Supply
/obj/item/circuitboard/machine/mining_equipment_vendor
name = "Mining Equipment Vendor"
greyscale_colors = CIRCUIT_COLOR_SUPPLY
build_path = /obj/machinery/mineral/equipment_vendor
req_components = list(
/obj/item/stack/sheet/glass = 1,
/obj/item/stock_parts/matter_bin = 3)
/obj/item/circuitboard/machine/mining_equipment_vendor/golem
name = "Golem Ship Equipment Vendor"
build_path = /obj/machinery/mineral/equipment_vendor/golem
/obj/item/circuitboard/machine/ore_redemption
name = "Ore Redemption"
greyscale_colors = CIRCUIT_COLOR_SUPPLY
@@ -680,3 +680,21 @@
name = "police bag"
desc = "A large duffel bag for holding extra police gear."
slowdown = 0
/obj/item/storage/backpack/duffelbag/mining_conscript
name = "mining conscription kit"
desc = "A kit containing everything a crewmember needs to support a shaft miner in the field."
icon_state = "duffel-explorer"
inhand_icon_state = "duffel-explorer"
/obj/item/storage/backpack/duffelbag/mining_conscript/PopulateContents()
new /obj/item/clothing/glasses/meson(src)
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
new /obj/item/storage/bag/ore(src)
new /obj/item/clothing/suit/hooded/explorer(src)
new /obj/item/encryptionkey/headset_mining(src)
new /obj/item/clothing/mask/gas/explorer(src)
new /obj/item/card/id/advanced/mining(src)
new /obj/item/gun/energy/recharge/kinetic_accelerator(src)
new /obj/item/knife/combat/survival(src)
new /obj/item/flashlight/seclite(src)
+14 -1
View File
@@ -42,13 +42,25 @@
var/orderer_ckey
var/reason
var/discounted_pct
///If set to FALSE, we won't charge when the cargo shuttle arrives with this.
var/charge_on_purchase = TRUE
///area this order wants to reach, if not null then it will come with the deliver_first component set to this area
var/department_destination
var/datum/supply_pack/pack
var/datum/bank_account/paying_account
var/obj/item/coupon/applied_coupon
/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason, paying_account, department_destination, coupon)
/datum/supply_order/New(
datum/supply_pack/pack,
orderer,
orderer_rank,
orderer_ckey,
reason,
paying_account,
department_destination,
coupon,
charge_on_purchase,
)
id = SSshuttle.order_number++
src.pack = pack
src.orderer = orderer
@@ -58,6 +70,7 @@
src.paying_account = paying_account
src.department_destination = department_destination
src.applied_coupon = coupon
src.charge_on_purchase = charge_on_purchase
/datum/supply_order/proc/generateRequisition(turf/T)
var/obj/item/paper/requisition_paper = new(T)
+16
View File
@@ -78,3 +78,19 @@
/// For generating supply packs at runtime. Returns a list of supply packs to use instead of this one.
/datum/supply_pack/proc/generate_supply_packs()
return
/**
* Custom supply pack
* The contents are given on New rather than being static
* This is for adding custom orders to the Cargo console (like order consoles)
*/
/datum/supply_pack/custom
name = "mining order"
hidden = TRUE
crate_name = "shaft mining delivery crate"
access = list(ACCESS_MINING)
/datum/supply_pack/custom/New(purchaser, list/given_contents)
. = ..()
name = "[purchaser]'s Mining Order"
contains = given_contents
-313
View File
@@ -1,313 +0,0 @@
/**********************Mining Equipment Vendor**************************/
/obj/machinery/mineral/equipment_vendor
name = "mining equipment vendor"
desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here."
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "mining"
density = TRUE
circuit = /obj/item/circuitboard/machine/mining_equipment_vendor
var/icon_deny = "mining-deny"
var/obj/item/card/id/inserted_id
var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
new /datum/data/mining_equipment("Skeleton Key", /obj/item/skeleton_key, 777),
new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/cup/glass/bottle/whiskey, 100),
new /datum/data/mining_equipment("Absinthe", /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium, 100),
new /datum/data/mining_equipment("Bubblegum Gum Packet", /obj/item/storage/box/gum/bubblegum, 100),
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/mining_stabilizer, 400),
new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500),
new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 500),
new /datum/data/mining_equipment("Brute Medkit", /obj/item/storage/medkit/brute, 600),
new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/kinetic_crusher, 750),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/recharge/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800),
new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800),
new /datum/data/mining_equipment("Luxury Medipen", /obj/item/reagent_containers/hypospray/medipen/survival/luxury, 1000),
new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1500),
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Kheiral Cuffs", /obj/item/kheiral_cuffs, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
new /datum/data/mining_equipment("Ice Hiking Boots", /obj/item/clothing/shoes/winterboots/ice_boots, 2500),
new /datum/data/mining_equipment("Mining MODsuit", /obj/item/mod/control/pre_equipped/mining, 3000),
new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
new /datum/data/mining_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxuryelite, 10000),
new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800),
new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
new /datum/data/mining_equipment("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600),
new /datum/data/mining_equipment("Minebot AI Upgrade", /obj/item/slimepotion/slime/sentience/mining, 1000),
new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100),
new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000)
)
/datum/data/mining_equipment
var/equipment_name = "generic"
var/equipment_path = null
var/cost = 0
/datum/data/mining_equipment/New(name, path, cost)
src.equipment_name = name
src.equipment_path = path
src.cost = cost
/obj/machinery/mineral/equipment_vendor/Initialize(mapload)
. = ..()
build_inventory()
/obj/machinery/mineral/equipment_vendor/proc/build_inventory()
for(var/p in prize_list)
var/datum/data/mining_equipment/M = p
GLOB.vending_products[M.equipment_path] = 1
/obj/machinery/mineral/equipment_vendor/update_icon_state()
icon_state = "[initial(icon_state)][powered() ? null : "-off"]"
return ..()
/obj/machinery/mineral/equipment_vendor/ui_assets(mob/user)
return list(
get_asset_datum(/datum/asset/spritesheet/vending),
)
/obj/machinery/mineral/equipment_vendor/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "MiningVendor", name)
ui.open()
/obj/machinery/mineral/equipment_vendor/ui_static_data(mob/user)
. = list()
.["product_records"] = list()
for(var/datum/data/mining_equipment/prize in prize_list)
var/list/product_data = list(
path = replacetext(replacetext("[prize.equipment_path]", "/obj/item/", ""), "/", "-"),
name = prize.equipment_name,
price = prize.cost,
ref = REF(prize)
)
.["product_records"] += list(product_data)
/obj/machinery/mineral/equipment_vendor/ui_data(mob/user)
. = list()
var/obj/item/card/id/C
if(isliving(user))
var/mob/living/L = user
C = L.get_idcard(TRUE)
if(C)
.["user"] = list()
.["user"]["points"] = C.mining_points
if(C.registered_account)
.["user"]["name"] = C.registered_account.account_holder
if(C.registered_account.account_job)
.["user"]["job"] = C.registered_account.account_job.title
else
.["user"]["job"] = "No Job"
/obj/machinery/mineral/equipment_vendor/ui_act(action, params)
. = ..()
if(.)
return
switch(action)
if("purchase")
var/obj/item/card/id/I
if(isliving(usr))
var/mob/living/L = usr
I = L.get_idcard(TRUE)
if(!istype(I))
to_chat(usr, span_alert("Error: An ID is required!"))
flick(icon_deny, src)
return
var/datum/data/mining_equipment/prize = locate(params["ref"]) in prize_list
if(!prize || !(prize in prize_list))
to_chat(usr, span_alert("Error: Invalid choice!"))
flick(icon_deny, src)
return
if(prize.cost > I.mining_points)
to_chat(usr, span_alert("Error: Insufficient points for [prize.equipment_name] on [I]!"))
flick(icon_deny, src)
return
I.mining_points -= prize.cost
to_chat(usr, span_notice("[src] clanks to life briefly before vending [prize.equipment_name]!"))
new prize.equipment_path(loc)
SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]"))
. = TRUE
/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/mining_voucher))
redeem_voucher(I, user)
return
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
return
if(default_deconstruction_crowbar(I))
return
return ..()
/**
* Allows user to redeem a mining voucher for one set of a mining equipment
*
* * Arguments:
* * voucher The mining voucher that is being used to redeem the mining equipment
* * redeemer The mob that is redeeming the mining equipment
*/
/obj/machinery/mineral/equipment_vendor/proc/redeem_voucher(obj/item/mining_voucher/voucher, mob/redeemer)
var/static/list/set_types
if(!set_types)
set_types = list()
for(var/datum/voucher_set/static_set as anything in subtypesof(/datum/voucher_set))
set_types[initial(static_set.name)] = new static_set
var/list/items = list()
for(var/set_name in set_types)
var/datum/voucher_set/current_set = set_types[set_name]
var/datum/radial_menu_choice/option = new
option.image = image(icon = current_set.icon, icon_state = current_set.icon_state)
option.info = span_boldnotice(current_set.description)
items[set_name] = option
var/selection = show_radial_menu(redeemer, src, items, custom_check = CALLBACK(src, PROC_REF(check_menu), voucher, redeemer), radius = 38, require_near = TRUE, tooltips = TRUE)
if(!selection)
return
var/datum/voucher_set/chosen_set = set_types[selection]
for(var/item in chosen_set.set_items)
new item(drop_location())
SSblackbox.record_feedback("tally", "mining_voucher_redeemed", 1, selection)
qdel(voucher)
/**
* Checks if we are allowed to interact with a radial menu
*
* * Arguments:
* * voucher The mining voucher that is being used to redeem a mining equipment
* * redeemer The living mob interacting with the menu
*/
/obj/machinery/mineral/equipment_vendor/proc/check_menu(obj/item/mining_voucher/voucher, mob/living/redeemer)
if(!istype(redeemer))
return FALSE
if(redeemer.incapacitated())
return FALSE
if(QDELETED(voucher))
return FALSE
if(!redeemer.is_holding(voucher))
return FALSE
return TRUE
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
do_sparks(5, TRUE, src)
if(severity > EXPLODE_LIGHT && prob(17 * severity))
qdel(src)
/****************Golem Point Vendor**************************/
/obj/machinery/mineral/equipment_vendor/golem
name = "golem ship equipment vendor"
circuit = /obj/item/circuitboard/machine/mining_equipment_vendor/golem
/obj/machinery/mineral/equipment_vendor/golem/Initialize(mapload)
desc += "\nIt seems a few selections have been added."
prize_list += list(
new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/advanced/mining, 250),
new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250),
new /datum/data/mining_equipment("Monkey Cube", /obj/item/food/monkeycube, 300),
new /datum/data/mining_equipment("Toolbelt", /obj/item/storage/belt/utility, 350),
new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500),
new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
new /datum/data/mining_equipment("Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1700),
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000)
)
return ..()
/**********************Mining Equipment Vendor Items**************************/
/**********************Mining Equipment Voucher**********************/
/obj/item/mining_voucher
name = "mining voucher"
desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
icon = 'icons/obj/mining.dmi'
icon_state = "mining_voucher"
w_class = WEIGHT_CLASS_TINY
/**********************Mining Point Card**********************/
#define TO_USER_ID "To ID"
#define TO_POINT_CARD "To Card"
/obj/item/card/mining_point_card
name = "mining point transfer card"
desc = "A small, reusable card for transferring mining points. Swipe your ID card over it to start the process."
icon_state = "data_1"
var/points = 500
/obj/item/card/mining_point_card/attackby(obj/item/I, mob/user, params)
if(isidcard(I))
var/obj/item/card/id/swiped = I
balloon_alert(user, "starting transfer")
var/point_movement = tgui_alert(user, "To ID (from card) or to card (from ID)?", "Mining Points Transfer", list(TO_USER_ID, TO_POINT_CARD))
if(!point_movement)
return
var/amount = tgui_input_number(user, "How much do you want to transfer? ID Balance: [swiped.mining_points], Card Balance: [points]", "Transfer Points", min_value = 0, round_value = 1)
if(!amount)
return
switch(point_movement)
if(TO_USER_ID)
if(amount > points)
amount = points
swiped.mining_points += amount
points -= amount
to_chat(user, span_notice("You transfer [amount] mining points from [src] to [swiped]."))
if(TO_POINT_CARD)
if(amount > swiped.mining_points)
amount = swiped.mining_points
swiped.mining_points -= amount
points += amount
to_chat(user, span_notice("You transfer [amount] mining points from [swiped] to [src]."))
..()
/obj/item/card/mining_point_card/examine(mob/user)
. = ..()
. += span_notice("There's [points] point\s on the card.")
#undef TO_POINT_CARD
#undef TO_USER_ID
/obj/item/storage/backpack/duffelbag/mining_conscript
name = "mining conscription kit"
desc = "A kit containing everything a crewmember needs to support a shaft miner in the field."
icon_state = "duffel-explorer"
inhand_icon_state = "duffel-explorer"
/obj/item/storage/backpack/duffelbag/mining_conscript/PopulateContents()
new /obj/item/clothing/glasses/meson(src)
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
new /obj/item/storage/bag/ore(src)
new /obj/item/clothing/suit/hooded/explorer(src)
new /obj/item/encryptionkey/headset_mining(src)
new /obj/item/clothing/mask/gas/explorer(src)
new /obj/item/card/id/advanced/mining(src)
new /obj/item/gun/energy/recharge/kinetic_accelerator(src)
new /obj/item/knife/combat/survival(src)
new /obj/item/flashlight/seclite(src)
+103
View File
@@ -0,0 +1,103 @@
/obj/item/circuitboard/machine/mining_ltsrbt
name = "Mining LTSRBT"
icon_state = "bluespacearray"
build_path = /obj/machinery/mining_ltsrbt
req_components = list(
/obj/item/stack/ore/bluespace_crystal = 2,
/obj/item/stock_parts/subspace/ansible = 1,
/obj/item/stock_parts/micro_laser = 1,
)
def_components = list(
/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial,
)
/**
* Mining LTSRBT
*
* Recieves orders from the mining produce console
* Uses power (scaling with parts) to get that item delivered
* Only works if it's enabled, and can only be enabled on-station.
*/
/obj/machinery/mining_ltsrbt
name = "mining LTSRBT"
desc = "A variant of the Long-To-Short-Range-Bluespace-Transceiver used to deliver Mining equipment to the station as required. Nanotrasen denies the existence of any other forms of the LTSRBT."
icon_state = "exonet_node"
circuit = /obj/item/circuitboard/machine/mining_ltsrbt
density = TRUE
///Boolean on whether the machine is active or not
var/enabled = FALSE
///The amount of power each use of the machine costs.
var/power_usage_per_teleport = 10000
/obj/machinery/mining_ltsrbt/Initialize(mapload)
. = ..()
GLOB.mining_ltsrbt += src
register_context()
/obj/machinery/mining_ltsrbt/Destroy()
GLOB.mining_ltsrbt -= src
return ..()
/obj/machinery/mining_ltsrbt/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
if(!held_item)
context[SCREENTIP_CONTEXT_LMB] = "turn [enabled ? "off" : "on"]"
return CONTEXTUAL_SCREENTIP_SET
if(held_item.tool_behaviour == TOOL_SCREWDRIVER)
context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel"
return CONTEXTUAL_SCREENTIP_SET
if(held_item.tool_behaviour == TOOL_CROWBAR && panel_open)
context[SCREENTIP_CONTEXT_LMB] = "Deconstruct"
return CONTEXTUAL_SCREENTIP_SET
return .
/obj/machinery/mining_ltsrbt/attack_hand(mob/living/user, list/modifiers)
. = ..()
if(!is_station_level(z))
balloon_alert(user, "not on station!")
user.playsound_local(loc, 'sound/machines/buzz-two.ogg', 30, TRUE)
return
enabled = !enabled
balloon_alert(user, "turned [enabled ? "on" : "off"]")
update_appearance(UPDATE_ICON)
/obj/machinery/mining_ltsrbt/update_icon_state()
. = ..()
icon_state = enabled ? initial(icon_state) : "[icon_state]_idle"
/obj/machinery/mining_ltsrbt/RefreshParts()
. = ..()
for(var/obj/item/stock_parts/micro_laser/laser in component_parts)
power_usage_per_teleport = (initial(power_usage_per_teleport) % laser.rating)
/obj/machinery/mining_ltsrbt/screwdriver_act(mob/living/user, obj/item/tool)
. = ..()
if(enabled)
enabled = FALSE
update_appearance(UPDATE_ICON)
default_deconstruction_screwdriver(user, icon_state, icon_state, tool)
return TRUE
/obj/machinery/mining_ltsrbt/crowbar_act(mob/living/user, obj/item/tool)
. = ..()
default_deconstruction_crowbar(tool)
return TRUE
/**
* # Recieve order
*
* Recieves the order and, if successfully goes through, returns TRUE
* Otherwise will return FALSE to cancel the order.
*/
/obj/machinery/mining_ltsrbt/proc/recieve_order(datum/supply_order/order)
if(!enabled)
return FALSE
order.generate(get_turf(src))
use_power(power_usage_per_teleport)
var/datum/effect_system/spark_spread/sparks = new
sparks.set_up(5, 1, get_turf(src))
sparks.attach(src)
sparks.start()
return TRUE
@@ -616,7 +616,7 @@
name = "Mining Rewards Vendor Board"
desc = "The circuit board for a Mining Rewards Vendor."
id = "mining_equipment_vendor"
build_path = /obj/item/circuitboard/machine/mining_equipment_vendor
build_path = /obj/item/circuitboard/computer/order_console/mining
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO
)
+4 -5
View File
@@ -93,8 +93,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
var/list/misc_costs = list() //list of overall costs sustained by each buyer.
var/list/empty_turfs = list()
for(var/place in shuttle_areas)
var/area/shuttle/shuttle_area = place
for(var/area/shuttle/shuttle_area as anything in shuttle_areas)
for(var/turf/open/floor/T in shuttle_area)
if(T.is_blocked_turf())
continue
@@ -129,7 +128,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
var/datum/bank_account/paying_for_this
//department orders EARN money for cargo, not the other way around
if(!spawning_order.department_destination)
if(!spawning_order.department_destination && spawning_order.charge_on_purchase)
if(spawning_order.paying_account) //Someone paid out of pocket
paying_for_this = spawning_order.paying_account
var/list/current_buyer_orders = goodies_by_buyer[spawning_order.paying_account] // so we can access the length a few lines down
@@ -149,6 +148,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
continue
if(spawning_order.paying_account)
paying_for_this = spawning_order.paying_account
if(spawning_order.pack.goody)
LAZYADD(goodies_by_buyer[spawning_order.paying_account], spawning_order)
paying_for_this.bank_card_talk("Cargo order #[spawning_order.id] has shipped. [price] credits have been charged to your bank account.")
@@ -191,8 +191,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
miscboxes[buyer].name = "goody case - purchased by [buyer]"
misc_contents[buyer] = list()
for(var/O in buying_account_orders)
var/datum/supply_order/our_order = O
for(var/datum/supply_order/our_order as anything in buying_account_orders)
for (var/item in our_order.pack.contains)
misc_contents[buyer] += item
misc_costs[buyer] += our_order.pack.cost
+12 -4
View File
@@ -1,16 +1,24 @@
/// Makes sure that no orderable items have dynamic descriptions, if they
/// don't explicitly set a description.
/datum/unit_test/orderable_item_descriptions
/// Also makes sure 2 orderable items don't sell the same thing.
/datum/unit_test/orderable_items
/datum/unit_test/orderable_item_descriptions/Run()
/datum/unit_test/orderable_items/Run()
var/list/all_paths = list()
for (var/datum/orderable_item/orderable_item as anything in subtypesof(/datum/orderable_item))
if (!isnull(initial(orderable_item.desc)))
if(isnull(initial(orderable_item.item_path))) // don't check if they're not actual orderable items
continue
if (!isnull(initial(orderable_item.desc))) //don't check if they have a custom description
continue
var/item_path = initial(orderable_item.item_path)
var/obj/item/item_instance = new item_path
var/obj/item/item_instance = allocate(item_path)
var/initial_desc = initial(item_instance.desc)
if(item_path in all_paths)
Fail("[orderable_item] is purchasable under two different orderable_item types,")
all_paths += item_path
if (item_instance.desc != initial_desc)
Fail("[orderable_item] has an item ([item_path]) that has a dynamic description. [item_instance.desc] (dynamic description) != [initial_desc] (initial description)")
+15 -3
View File
@@ -58,6 +58,7 @@
#include "code\__DEFINES\colors.dm"
#include "code\__DEFINES\combat.dm"
#include "code\__DEFINES\communications.dm"
#include "code\__DEFINES\computers.dm"
#include "code\__DEFINES\configuration.dm"
#include "code\__DEFINES\construction.dm"
#include "code\__DEFINES\cooldowns.dm"
@@ -1465,8 +1466,19 @@
#include "code\game\machinery\computer\atmos_computers\inlets.dm"
#include "code\game\machinery\computer\atmos_computers\meters.dm"
#include "code\game\machinery\computer\atmos_computers\outlets.dm"
#include "code\game\machinery\computer\chef_orders\chef_order.dm"
#include "code\game\machinery\computer\chef_orders\order_datum.dm"
#include "code\game\machinery\computer\orders\order_computer\cook_order.dm"
#include "code\game\machinery\computer\orders\order_computer\golem_order.dm"
#include "code\game\machinery\computer\orders\order_computer\mining_order.dm"
#include "code\game\machinery\computer\orders\order_computer\order_computer.dm"
#include "code\game\machinery\computer\orders\order_items\order_datum.dm"
#include "code\game\machinery\computer\orders\order_items\cook\order_milk_eggs.dm"
#include "code\game\machinery\computer\orders\order_items\cook\order_reagents.dm"
#include "code\game\machinery\computer\orders\order_items\cook\order_veggies.dm"
#include "code\game\machinery\computer\orders\order_items\mining\order_consumables.dm"
#include "code\game\machinery\computer\orders\order_items\mining\order_golem.dm"
#include "code\game\machinery\computer\orders\order_items\mining\order_mining.dm"
#include "code\game\machinery\computer\orders\order_items\mining\order_pka.dm"
#include "code\game\machinery\computer\orders\order_items\mining\order_toys.dm"
#include "code\game\machinery\computer\prisoner\_prisoner.dm"
#include "code\game\machinery\computer\prisoner\gulag_teleporter.dm"
#include "code\game\machinery\computer\prisoner\management.dm"
@@ -3488,9 +3500,9 @@
#include "code\modules\mining\machine_silo.dm"
#include "code\modules\mining\machine_stacking.dm"
#include "code\modules\mining\machine_unloading.dm"
#include "code\modules\mining\machine_vending.dm"
#include "code\modules\mining\mine_items.dm"
#include "code\modules\mining\minebot.dm"
#include "code\modules\mining\mining_ltsrbt.dm"
#include "code\modules\mining\money_bag.dm"
#include "code\modules\mining\ores_coins.dm"
#include "code\modules\mining\satchel_ore_boxdm.dm"
+2 -1
View File
@@ -100,7 +100,8 @@ const CargoStatus = (props, context) => {
color={(grocery && 'orange') || 'green'}
content={location}
tooltip={
(grocery && 'The chef is waiting on their grocery supplies.') ||
(grocery &&
'The kitchen is waiting for their grocery supply delivery!') ||
''
}
tooltipPosition="right"
@@ -1,65 +0,0 @@
import { classes } from 'common/react';
import { useBackend } from '../backend';
import { Box, Button, Section, Table } from '../components';
import { Window } from '../layouts';
export const MiningVendor = (props, context) => {
const { act, data } = useBackend(context);
let inventory = [...data.product_records];
return (
<Window width={425} height={600}>
<Window.Content scrollable>
<Section title="User">
{(data.user && (
<Box>
Welcome, <b>{data.user.name || 'Unknown'}</b>,{' '}
<b>{data.user.job || 'Unemployed'}</b>!
<br />
Your balance is <b>{data.user.points} mining points</b>.
</Box>
)) || (
<Box color="light-gray">
No registered ID card!
<br />
Please contact your local HoP!
</Box>
)}
</Section>
<Section title="Equipment">
<Table>
{inventory.map((product) => {
return (
<Table.Row key={product.name}>
<Table.Cell>
<span
className={classes(['vending32x32', product.path])}
style={{
'vertical-align': 'middle',
}}
/>{' '}
<b>{product.name}</b>
</Table.Cell>
<Table.Cell>
<Button
style={{
'min-width': '95px',
'text-align': 'center',
}}
disabled={!data.user || product.price > data.user.points}
content={product.price + ' points'}
onClick={() =>
act('purchase', {
'ref': product.ref,
})
}
/>
</Table.Cell>
</Table.Row>
);
})}
</Table>
</Section>
</Window.Content>
</Window>
);
};
+58 -46
View File
@@ -1,4 +1,4 @@
import { multiline } from 'common/string';
import { capitalize, multiline } from 'common/string';
import { useBackend, useLocalState } from '../backend';
import { Box, Button, Dimmer, Divider, Icon, NumberInput, Section, Stack } from '../components';
import { Window } from '../layouts';
@@ -16,7 +16,7 @@ const TAB2NAME = [
const ShoppingTab = (props, context) => {
const { data, act } = useBackend(context);
const { order_datums } = data;
const { order_categories, order_datums } = data;
const [shopIndex, setShopIndex] = useLocalState(context, 'shop-index', 1);
const mapped_food = order_datums.filter(
(food) => food && food.cat === shopIndex
@@ -26,30 +26,15 @@ const ShoppingTab = (props, context) => {
<Section mb={-0.9}>
<Stack.Item>
<Stack textAlign="center">
<Stack.Item grow>
<Button
fluid
color="green"
content="Fruits and Veggies"
onClick={() => setShopIndex(1)}
/>
</Stack.Item>
<Stack.Item grow>
<Button
fluid
color="white"
content="Milk and Eggs"
onClick={() => setShopIndex(2)}
/>
</Stack.Item>
<Stack.Item grow>
<Button
fluid
color="olive"
content="Sauces and Reagents"
onClick={() => setShopIndex(3)}
/>
</Stack.Item>
{order_categories.map((item, key) => (
<Stack.Item key={item}>
<Button
fluid
content={item}
onClick={() => setShopIndex(item)}
/>
</Stack.Item>
))}
</Stack>
</Stack.Item>
</Section>
@@ -60,8 +45,13 @@ const ShoppingTab = (props, context) => {
{mapped_food.map((item) => (
<Stack.Item key={item}>
<Stack>
<Stack.Item grow>{item.name}</Stack.Item>
<Stack.Item mt={-1} color="label" fontSize="10px">
<span
style={{
'vertical-align': 'middle',
}}
/>{' '}
<Stack.Item>{capitalize(item.name)}</Stack.Item>
<Stack.Item grow mt={-1} color="label" fontSize="10px">
{'"' + item.desc + '"'}
<br />
<Box textAlign="right">
@@ -96,7 +86,7 @@ const ShoppingTab = (props, context) => {
const CheckoutTab = (props, context) => {
const { data, act } = useBackend(context);
const { order_datums, total_cost } = data;
const { ltsrbt_available, forced_express, order_datums, total_cost } = data;
const checkout_list = order_datums.filter((food) => food && food.amt);
return (
<Stack vertical fill>
@@ -120,8 +110,8 @@ const CheckoutTab = (props, context) => {
{checkout_list.map((item) => (
<Stack.Item key={item}>
<Stack>
<Stack.Item grow>{item.name}</Stack.Item>
<Stack.Item mt={-1} color="label" fontSize="10px">
<Stack.Item>{capitalize(item.name)}</Stack.Item>
<Stack.Item grow mt={-1} color="label" fontSize="10px">
{'"' + item.desc + '"'}
<br />
<Box textAlign="right">
@@ -156,19 +146,36 @@ const CheckoutTab = (props, context) => {
<Stack.Item grow mt={0.5}>
Total Cost: {total_cost}
</Stack.Item>
<Stack.Item grow textAlign="center">
<Button
fluid
icon="plane-departure"
content="Purchase"
tooltip={multiline`
Your groceries will arrive at cargo,
and hopefully get delivered by them.
`}
tooltipPosition="top"
onClick={() => act('purchase')}
/>
</Stack.Item>
{!forced_express && (
<Stack.Item grow textAlign="center">
<Button
fluid
icon="plane-departure"
content="Purchase"
tooltip={multiline`
Your groceries will arrive at cargo,
and hopefully get delivered by them.
`}
tooltipPosition="top"
onClick={() => act('purchase')}
/>
</Stack.Item>
)}
{!!ltsrbt_available && (
<Stack.Item grow textAlign="center">
<Button
fluid
icon="shuttle-van"
content="Deliver"
tooltip={multiline`
Your groceries will arrive to one of
the on-station built LTSRBT devices.
`}
tooltipPosition="top"
onClick={() => act('ltsrbt_deliver')}
/>
</Stack.Item>
)}
<Stack.Item grow textAlign="center">
<Button
fluid
@@ -177,7 +184,7 @@ const CheckoutTab = (props, context) => {
content="Express"
tooltip={multiline`
Sends the ingredients instantly,
and locks the console longer. Doubles the price!
but locks the console longer and increases the price!
`}
tooltipPosition="top-start"
onClick={() => act('express')}
@@ -208,7 +215,7 @@ const OrderSent = (props, context) => {
export const ProduceConsole = (props, context) => {
const { act, data } = useBackend(context);
const { off_cooldown } = data;
const { points, off_cooldown } = data;
const [tabIndex, setTabIndex] = useLocalState(context, 'tab-index', 1);
const TabComponent = TAB2NAME[tabIndex - 1].component();
return (
@@ -242,6 +249,11 @@ export const ProduceConsole = (props, context) => {
</Stack>
</Section>
</Stack.Item>
<Section>
<Stack grow>
<Stack.Item>Currently available balance: {points}</Stack.Item>
</Stack>
</Section>
<Stack.Item grow>
<TabComponent />
</Stack.Item>
@@ -0,0 +1,2 @@
/obj/machinery/mineral/equipment_vendor/@SUBTYPES : /obj/machinery/computer/order_console/mining/@SUBTYPES
/obj/machinery/computer/chef_order : /obj/machinery/computer/order_console/cook {@OLD}