diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index f1c58be502..b007c1a194 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -16129,11 +16129,11 @@
/area/service/bar)
"aMw" = (
/obj/machinery/vending/dinnerware{
- contraband = list(/obj/item/reagent_containers/food/condiment/flour = 4);
+ contraband = list(/obj/item/reagent_containers/food/condiment/flour=4);
desc = "This vendor is full of condiments to put on food.";
name = "\improper Condiments Vendor";
product_ads = "Get your sauces here!;No slave labour was used to make these products!;Nanotrasen Approved?!";
- products = list(/obj/item/storage/bag/tray = 8, /obj/item/reagent_containers/food/drinks/drinkingglass = 10, /obj/item/storage/box/cups = 5, /obj/item/reagent_containers/food/condiment/pack/ketchup = 20, /obj/item/reagent_containers/food/condiment/pack/mustard = 20, /obj/item/reagent_containers/food/condiment/pack/hotsauce = 20, /obj/item/reagent_containers/food/condiment/pack/astrotame = 20, /obj/item/reagent_containers/food/condiment/saltshaker = 20, /obj/item/reagent_containers/food/condiment/peppermill = 20)
+ products = list(/obj/item/storage/bag/tray=8,/obj/item/reagent_containers/food/drinks/drinkingglass=10,/obj/item/storage/box/cups=5,/obj/item/reagent_containers/food/condiment/pack/ketchup=20,/obj/item/reagent_containers/food/condiment/pack/mustard=20,/obj/item/reagent_containers/food/condiment/pack/hotsauce=20,/obj/item/reagent_containers/food/condiment/pack/astrotame=20,/obj/item/reagent_containers/food/condiment/saltshaker=20,/obj/item/reagent_containers/food/condiment/peppermill=20)
},
/turf/open/floor/wood,
/area/service/bar)
@@ -17889,7 +17889,7 @@
/area/service/bar)
"aRA" = (
/obj/machinery/vending/dinnerware{
- contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2, /obj/item/reagent_containers/food/condiment/flour = 4)
+ contraband = list(/obj/item/kitchen/rollingpin=2,/obj/item/kitchen/knife/butcher=2,/obj/item/reagent_containers/food/condiment/flour=4)
},
/turf/open/floor/plasteel/cafeteria,
/area/service/kitchen)
@@ -54482,6 +54482,10 @@
},
/turf/open/floor/carpet/arcade,
/area/commons/arcade)
+"fCV" = (
+/obj/machinery/piratepad/civilian,
+/turf/open/floor/plasteel,
+/area/cargo/office)
"fDn" = (
/obj/structure/table,
/obj/item/trash/chips{
@@ -65860,6 +65864,12 @@
/obj/item/assembly/signaler,
/turf/open/floor/plating,
/area/maintenance/bar)
+"wfZ" = (
+/obj/machinery/computer/piratepad_control/civilian{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/cargo/office)
"wgo" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -90509,7 +90519,7 @@ boR
bqs
bbR
bkM
-bbR
+fCV
bwd
bxB
bvL
@@ -90766,7 +90776,7 @@ boT
bbR
bbR
buI
-bbR
+wfZ
bwd
bxD
byL
diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm
index 715469ff78..0d37607b81 100644
--- a/code/__DEFINES/economy.dm
+++ b/code/__DEFINES/economy.dm
@@ -52,3 +52,18 @@
#define PRICE_ABOVE_EXPENSIVE 500 // RCD, Crew pinpointer/monitor, galoshes
#define PRICE_REALLY_EXPENSIVE 700 // More premium stuff.
#define PRICE_ALMOST_ONE_GRAND 900 // $$$ Insulated gloves, backpack water-tank spray $$$
+
+//Defines that set what kind of civilian bounties should be applied mid-round.
+#define CIV_JOB_BASIC 1
+#define CIV_JOB_ROBO 2
+#define CIV_JOB_CHEF 3
+#define CIV_JOB_SEC 4
+#define CIV_JOB_DRINK 5
+#define CIV_JOB_CHEM 6
+#define CIV_JOB_VIRO 7
+#define CIV_JOB_SCI 8
+#define CIV_JOB_ENG 9
+#define CIV_JOB_MINE 10
+#define CIV_JOB_MED 11
+#define CIV_JOB_GROW 12
+#define CIV_JOB_RANDOM 13
diff --git a/code/game/machinery/civilian_bountys.dm b/code/game/machinery/civilian_bountys.dm
new file mode 100644
index 0000000000..f8650625d7
--- /dev/null
+++ b/code/game/machinery/civilian_bountys.dm
@@ -0,0 +1,225 @@
+///Pad for the Civilian Bounty Control.
+/obj/machinery/piratepad/civilian
+ name = "civilian bounty pad"
+ desc = "A machine designed to send civilian bounty targets to centcom."
+ layer = TABLE_LAYER
+
+///Computer for assigning new civilian bounties, and sending bounties for collection.
+/obj/machinery/computer/piratepad_control/civilian
+ name = "civilian bounty control terminal"
+ desc = "A console for assigning civilian bounties to inserted ID cards, and for controlling the bounty pad for export."
+ status_report = "Ready for delivery."
+ icon_screen = "civ_bounty"
+ icon_keyboard = "id_key"
+ warmup_time = 3 SECONDS
+ var/obj/item/card/id/inserted_scan_id
+
+/obj/machinery/computer/piratepad_control/civilian/Initialize()
+ . = ..()
+ pad = /obj/machinery/piratepad/civilian
+
+/obj/machinery/computer/piratepad_control/civilian/attackby(obj/item/I, mob/living/user, params)
+ . = ..()
+ if(isidcard(I))
+ if(id_insert(user, I, inserted_scan_id))
+ inserted_scan_id = I
+ return TRUE
+
+/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/multitool/I)
+ if(istype(I) && istype(I.buffer,/obj/machinery/piratepad/civilian))
+ to_chat(user, "You link [src] with [I.buffer] in [I] buffer.")
+ pad = I.buffer
+ return TRUE
+
+/obj/machinery/computer/piratepad_control/civilian/LateInitialize()
+ . = ..()
+ if(cargo_hold_id)
+ for(var/obj/machinery/piratepad/civilian/C in GLOB.machines)
+ if(C.cargo_hold_id == cargo_hold_id)
+ pad = C
+ return
+ else
+ pad = locate() in range(4,src)
+
+/obj/machinery/computer/piratepad_control/civilian/recalc()
+ if(sending)
+ return FALSE
+ if(!inserted_scan_id)
+ status_report = "Please insert your ID first."
+ playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE)
+ return FALSE
+ if(!inserted_scan_id.registered_account.civilian_bounty)
+ status_report = "Please accept a new civilian bounty first."
+ playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE)
+ return FALSE
+ status_report = "Civilian Bounty: "
+ for(var/atom/movable/AM in get_turf(pad))
+ if(AM == pad)
+ continue
+ if(inserted_scan_id.registered_account.civilian_bounty.applies_to(AM))
+ status_report += "Target Applicable."
+ playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE)
+ return
+ status_report += "Not Applicable."
+ playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE)
+
+/**
+ * This fully rewrites base behavior in order to only check for bounty objects, and nothing else.
+ */
+/obj/machinery/computer/piratepad_control/civilian/send()
+ playsound(loc, 'sound/machines/wewewew.ogg', 70, TRUE)
+ if(!sending)
+ return
+ if(!inserted_scan_id)
+ stop_sending()
+ return FALSE
+ if(!inserted_scan_id.registered_account.civilian_bounty)
+ stop_sending()
+ return FALSE
+ var/datum/bounty/curr_bounty = inserted_scan_id.registered_account.civilian_bounty
+ var/active_stack = 0
+ for(var/atom/movable/AM in get_turf(pad))
+ if(AM == pad)
+ continue
+ if(curr_bounty.applies_to(AM))
+ active_stack ++
+ curr_bounty.ship(AM)
+ qdel(AM)
+ if(active_stack >= 1)
+ status_report += "Bounty Target Found x[active_stack]. "
+ else
+ status_report = "No applicable targets found. Aborting."
+ stop_sending()
+ if(curr_bounty.can_claim())
+ //Pay for the bounty with the ID's department funds.
+ inserted_scan_id.registered_account.transfer_money(SSeconomy.get_dep_account(inserted_scan_id.registered_account.account_job.paycheck_department), curr_bounty.reward)
+ status_report += "Bounty Completed! [curr_bounty.reward] credits have been paid out. "
+ inserted_scan_id.registered_account.reset_bounty()
+ pad.visible_message("[pad] activates!")
+ flick(pad.sending_state,pad)
+ pad.icon_state = pad.idle_state
+ playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE)
+ sending = FALSE
+
+/obj/machinery/computer/piratepad_control/civilian/AltClick(mob/user)
+ . = ..()
+ id_eject(user, inserted_scan_id)
+
+/obj/machinery/computer/piratepad_control/civilian/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "CivCargoHoldTerminal", name)
+ ui.open()
+
+/obj/machinery/computer/piratepad_control/civilian/ui_data(mob/user)
+ var/list/data = list()
+ data["points"] = points
+ data["pad"] = pad ? TRUE : FALSE
+ data["sending"] = sending
+ data["status_report"] = status_report
+ data["id_inserted"] = inserted_scan_id
+ if(inserted_scan_id && inserted_scan_id.registered_account)
+ data["id_bounty_info"] = inserted_scan_id.registered_account.bounty_text()
+ data["id_bounty_num"] = inserted_scan_id.registered_account.bounty_num()
+ data["id_bounty_value"] = inserted_scan_id.registered_account.bounty_value()
+ return data
+
+/obj/machinery/computer/piratepad_control/civilian/ui_act(action, params)
+ if(..())
+ return
+ if(!pad)
+ return
+ if(!usr.canUseTopic(src, BE_CLOSE))
+ return
+ switch(action)
+ if("recalc")
+ recalc()
+ if("send")
+ start_sending()
+ if("stop")
+ stop_sending()
+ if("bounty")
+ if(!inserted_scan_id || !inserted_scan_id.registered_account)
+ return
+ var/datum/bank_account/pot_acc = inserted_scan_id.registered_account
+ if(pot_acc.civilian_bounty && ((world.time) < pot_acc.bounty_timer + 5 MINUTES))
+ var/curr_time = round(((pot_acc.bounty_timer + (5 MINUTES))-world.time)/ (1 MINUTES), 0.01)
+ to_chat(usr, "You already have an incomplete civilian bounty, try again in [curr_time] minutes to replace it!")
+ return FALSE
+ var/datum/bounty/crumbs = random_bounty(pot_acc.account_job.bounty_types) //It's a good scene from War Dogs (2016).
+ /*if(SSeconomy.inflation_value() > 1) //lets try not to add inflation for right now
+ if(istype(crumbs, /datum/bounty/item))
+ var/datum/bounty/item/items = crumbs
+ items.required_count = max(round((items.required_count)/(SSeconomy.inflation_value()*2)), 1)
+ if(istype(crumbs, /datum/bounty/reagent))
+ var/datum/bounty/reagent/chems = crumbs
+ chems.required_volume = max(round((chems.required_volume)/SSeconomy.inflation_value()*2), 1)
+ crumbs.reward = round(crumbs.reward/(SSeconomy.inflation_value()*2))*/
+ pot_acc.bounty_timer = world.time
+ pot_acc.civilian_bounty = crumbs
+ if("eject")
+ id_eject(usr, inserted_scan_id)
+ . = TRUE
+
+///Self explanitory, holds the ID card inthe console for bounty payout and manipulation.
+/obj/machinery/computer/piratepad_control/civilian/proc/id_insert(mob/user, obj/item/inserting_item, obj/item/target)
+ var/obj/item/card/id/card_to_insert = inserting_item
+ var/holder_item = FALSE
+
+ if(!isidcard(card_to_insert))
+ card_to_insert = inserting_item.RemoveID()
+ holder_item = TRUE
+
+ if(!card_to_insert || !user.transferItemToLoc(card_to_insert, src))
+ return FALSE
+
+ if(target)
+ if(holder_item && inserting_item.InsertID(target))
+ playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE)
+ else
+ id_eject(user, target)
+
+ user.visible_message("[user] inserts \the [card_to_insert] into \the [src].",
+ "You insert \the [card_to_insert] into \the [src].")
+ playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE)
+ updateUsrDialog()
+ return TRUE
+
+///Removes A stored ID card.
+/obj/machinery/computer/piratepad_control/civilian/proc/id_eject(mob/user, obj/target)
+ if(!target)
+ to_chat(user, "That slot is empty!")
+ return FALSE
+ else
+ target.forceMove(drop_location())
+ if(!issilicon(user) && Adjacent(user))
+ user.put_in_hands(target)
+ user.visible_message("[user] gets \the [target] from \the [src].", \
+ "You get \the [target] from \the [src].")
+ playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE)
+ inserted_scan_id = null
+ updateUsrDialog()
+ return TRUE
+
+
+///Beacon to launch a new bounty setup when activated.
+/obj/item/civ_bounty_beacon
+ name = "civilian bounty beacon"
+ desc = "N.T. approved civilian bounty beacon, toss it down and you will have a bounty pad and computer delivered to you."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "floor_beacon"
+ var/uses = 2
+
+/obj/item/civ_bounty_beacon/attack_self()
+ loc.visible_message("\The [src] begins to beep loudly!")
+ addtimer(CALLBACK(src, .proc/launch_payload), 4 SECONDS)
+
+/obj/item/civ_bounty_beacon/proc/launch_payload()
+ playsound(src, "sparks", 80, TRUE)
+ switch(uses)
+ if(2)
+ new /obj/machinery/piratepad/civilian(drop_location())
+ if(1)
+ new /obj/machinery/computer/piratepad_control/civilian(drop_location())
+ qdel(src)
+ uses = uses - 1
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 464b3c5ccc..fac44ddf54 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -372,6 +372,11 @@
. += "The [D.account_holder] reports a balance of [D.account_balance] cr."
. += "Alt-Click the ID to pull money from the linked account in the form of holochips."
. += "You can insert credits into the linked account by pressing holochips, cash, or coins against the ID."
+ if(registered_account.civilian_bounty)
+ . += "There is an active civilian bounty."
+ . += "[registered_account.bounty_text()]"
+ . += "Quantity: [registered_account.bounty_num()]"
+ . += "Reward: [registered_account.bounty_value()]"
if(registered_account.account_holder == user.real_name)
. += "If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number."
else
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index 74d11e9c11..7d23d25953 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -348,6 +348,10 @@
name = "Snow Taxi (Computer Board)"
build_path = /obj/machinery/computer/shuttle/snow_taxi
+/obj/item/circuitboard/computer/bountypad
+ name = "Bounty Pad (Computer Board)"
+ build_path = /obj/machinery/computer/piratepad_control/civilian
+
// /obj/item/circuitboard/computer/bountypad
// name = "Bounty Pad (Computer Board)"
// build_path = /obj/machinery/computer/piratepad_control/civilian
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index ef9825ee79..e16de56465 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -685,15 +685,15 @@
/obj/item/stack/sheet/glass = 1,
/obj/item/vending_refill/donksoft = 1)
-// /obj/item/circuitboard/machine/bountypad
-// name = "Civilian Bounty Pad (Machine Board)"
-// icon_state = "generic"
-// build_path = /obj/machinery/piratepad/civilian
-// req_components = list(
-// /obj/item/stock_parts/card_reader = 1,
-// /obj/item/stock_parts/scanning_module = 1,
-// /obj/item/stock_parts/micro_laser = 1
-// )
+
+/obj/item/circuitboard/machine/bountypad
+ name = "Civilian Bounty Pad (Machine Board)"
+ icon_state = "generic"
+ build_path = /obj/machinery/piratepad/civilian
+ req_components = list(
+ /obj/item/stock_parts/scanning_module = 1,
+ /obj/item/stock_parts/micro_laser = 1
+ )
// /obj/item/circuitboard/machine/accounting
// name = "Account Registration Device (Machine Board)"
diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm
index 744c01a257..35c7c787b6 100644
--- a/code/modules/cargo/bounties/assistant.dm
+++ b/code/modules/cargo/bounties/assistant.dm
@@ -101,27 +101,30 @@
required_count = 15
wanted_types = list(/obj/item/shard)
+/*
/datum/bounty/item/assistant/comfy_chair
- name = "Comfy Chairs"
+ name = "Comfortable Chairs"
description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him."
reward = 900
required_count = 5
wanted_types = list(/obj/structure/chair/comfy)
+*/
-// /datum/bounty/item/assistant/geranium
-// name = "Geraniums"
-// description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you."
-// reward = 1000
-// required_count = 3
-// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium)
+ /datum/bounty/item/assistant/geranium
+ name = "Geraniums"
+ description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you."
+ reward = 1000
+ required_count = 3
+ wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium)
+ include_subtypes = FALSE
-// /datum/bounty/item/assistant/poppy
-// name = "Poppies"
-// description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you."
-// reward = 1000
-// required_count = 3
-// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy)
-// include_subtypes = FALSE
+/datum/bounty/item/assistant/poppy
+ name = "Poppies"
+ description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you."
+ reward = 1000
+ required_count = 3
+ wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy)
+ include_subtypes = FALSE
/datum/bounty/item/assistant/shadyjims
name = "Shady Jim's"
@@ -156,11 +159,6 @@
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/monkeycube)
*/
-/datum/bounty/item/assistant/chainsaw
- name = "Chainsaw"
- description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please."
- reward = 2500
- wanted_types = list(/obj/item/chainsaw)
/datum/bounty/item/assistant/ied
name = "IED"
@@ -169,30 +167,12 @@
required_count = 3
wanted_types = list(/obj/item/grenade/iedcasing)
-/datum/bounty/item/assistant/bonfire
- name = "Lit Bonfire"
- description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Ship a lit bonfire to warm them up."
- reward = 5000
- wanted_types = list(/obj/structure/bonfire)
-
-/datum/bounty/item/assistant/bonfire/applies_to(obj/O)
- if(!..())
- return FALSE
- var/obj/structure/bonfire/B = O
- return !!B.burning
-
/datum/bounty/item/assistant/corgimeat
name = "Raw Corgi Meat"
description = "The Syndicate recently stole all of CentCom's corgi meat. Ship out a replacement immediately."
reward = 3000
wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi)
-/datum/bounty/item/assistant/tail_whip
- name = "Nine Tails whip"
- description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails."
- reward = 4000
- wanted_types = list(/obj/item/melee/chainofcommand/tailwhip)
-
/datum/bounty/item/assistant/bolas
name = "Bolas"
description = "Centcom's chef has lost their mind. They're streaking naked though the halls, greased up with butter and cooking oil. Send some bola's so we can capture them."
@@ -215,7 +195,7 @@
wanted_types = list(/obj/item/storage/belt/utility)
/datum/bounty/item/assistant/gasmasks
- name = "Gas Masks"
+ name = "Gas Masks"
description = "The good news is that we have more miasma than we'll ever need. The bad news is, somone opened the release valve on the canisters. Ship us some gas masks!"
reward = 1250
required_count = 4
diff --git a/code/modules/cargo/bounties/botany.dm b/code/modules/cargo/bounties/botany.dm
index 31e13e9a9b..5ed2faec98 100644
--- a/code/modules/cargo/bounties/botany.dm
+++ b/code/modules/cargo/bounties/botany.dm
@@ -228,3 +228,14 @@
multiplier = 6
bonus_desc = "Under no circumstances mention this shipment to security."
foodtype = "\"meal\""
+
+/datum/bounty/item/botany/bonfire
+ name = "Lit Bonfire"
+ description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Grow some logs and Ship a lit bonfire to warm them up."
+ wanted_types = list(/obj/structure/bonfire)
+
+/datum/bounty/item/botany/bonfire/applies_to(obj/O)
+ if(!..())
+ return FALSE
+ var/obj/structure/bonfire/B = O
+ return !!B.burning
diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm
index c83fa116d6..9998fb0e8d 100644
--- a/code/modules/cargo/bounties/chef.dm
+++ b/code/modules/cargo/bounties/chef.dm
@@ -137,3 +137,10 @@
reward = 2250
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/bbqribs)
+
+/datum/bounty/item/chef/corgifarming //Butchering is a chef's job.
+ name = "Corgi Hides"
+ description = "Admiral Weinstein's space yacht needs new upholstery. A dozen Corgi furs should do just fine."
+ reward = 30000 //that's a lot of dead dogs
+ required_count = 12
+ wanted_types = list(/obj/item/stack/sheet/animalhide/corgi)
diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm
index 5ddce8fb2c..59f5f083c8 100644
--- a/code/modules/cargo/bounties/engineering.dm
+++ b/code/modules/cargo/bounties/engineering.dm
@@ -89,3 +89,15 @@
description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper."
reward = 50000 //requires 14k credits of purchases, not to mention cooperation with engineering/heads of staff to set up inside the cramped shuttle
wanted_types = list(/obj/singularity/energy_ball)
+
+/datum/bounty/item/engineering/emitter
+ name = "Emitter"
+ description = "We think there may be a defect in your station's emitter designs, based on the sheer number of delaminations your sector seems to see. Ship us one of yours."
+ reward = 2500
+ wanted_types = list(/obj/machinery/power/emitter)
+
+/datum/bounty/item/engineering/hydro_tray
+ name = "Hydroponics Tray"
+ description = "The lab technicians are trying to figure out how to lower the power drain of hydroponics trays, but we fried our last one. Mind building one for us?"
+ reward = 2000
+ wanted_types = list(/obj/machinery/hydroponics/constructable)
diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm
index c1f8d9c9d0..1f56b929e6 100644
--- a/code/modules/cargo/bounties/medical.dm
+++ b/code/modules/cargo/bounties/medical.dm
@@ -125,3 +125,15 @@
reward = 2250
required_count = 5
wanted_types = list(/obj/item/defibrillator)
+
+/datum/bounty/item/medical/chainsaw
+ name = "Chainsaw"
+ description = "A CMO at CentCom is having trouble operating on golems. She requests one chainsaw, please."
+ reward = 2500
+ wanted_types = list(/obj/item/chainsaw)
+
+/datum/bounty/item/medical/tail_whip //Like the cat tail bounties, with more processing.
+ name = "Nine Tails whip"
+ description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails."
+ reward = 4000
+ wanted_types = list(/obj/item/melee/chainofcommand/tailwhip)
diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm
index 5ddf456573..d463e1393d 100644
--- a/code/modules/cargo/bounties/security.dm
+++ b/code/modules/cargo/bounties/security.dm
@@ -52,3 +52,37 @@
reward = 2750
required_count = 3
wanted_types = list(/obj/item/firing_pin/test_range)
+
+/datum/bounty/item/security/pepperspray
+ name = "Pepperspray"
+ description = "We've been having a bad run of riots on Space Station 76. We could use some new pepperspray cans."
+ reward = 3000
+ required_count = 4
+ wanted_types = list(/obj/item/reagent_containers/spray/pepper)
+
+/datum/bounty/item/security/prison_clothes
+ name = "Prison Uniforms"
+ description = "Terragov has been unable to source any new prisoner uniforms, so if you have any spares, we'll take them off your hands."
+ reward = 2000
+ required_count = 4
+ wanted_types = list(/obj/item/clothing/under/rank/prisoner)
+
+/datum/bounty/item/security/plates
+ name = "License Plates"
+ description = "As a result of a bad clown car crash, we could use an advance on some of your prisoner's license plates."
+ reward = 1000
+ required_count = 10
+ wanted_types = list(/obj/item/stack/license_plates/filled)
+
+/datum/bounty/item/security/earmuffs
+ name = "Earmuffs"
+ description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance."
+ reward = 1000
+ wanted_types = list(/obj/item/clothing/ears/earmuffs)
+
+/datum/bounty/item/security/handcuffs
+ name = "Handcuffs"
+ description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)."
+ reward = 1000
+ required_count = 5
+ wanted_types = list(/obj/item/restraints/handcuffs)
diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm
index 2a64f150a0..4b24488a08 100644
--- a/code/modules/cargo/bounty.dm
+++ b/code/modules/cargo/bounty.dm
@@ -76,8 +76,13 @@ GLOBAL_LIST_EMPTY(bounties_list)
return TRUE
// Returns a new bounty of random type, but does not add it to GLOB.bounties_list.
-/proc/random_bounty()
- switch(rand(1, 15))
+/proc/random_bounty(var/guided = 0)
+ var/bounty_num
+ if(guided)
+ bounty_num = guided
+ else
+ bounty_num = rand(1,13)
+ switch(bounty_num)
if(1)
var/subtype = pick(subtypesof(/datum/bounty/item/assistant))
return new subtype
@@ -100,27 +105,27 @@ GLOBAL_LIST_EMPTY(bounties_list)
var/subtype = pick(subtypesof(/datum/bounty/virus))
return new subtype
if(8)
- var/subtype = pick(subtypesof(/datum/bounty/item/science))
- return new subtype
- if(9)
+ if(rand(2) == 1)
+ var/subtype = pick(subtypesof(/datum/bounty/item/science))
+ return new subtype
var/subtype = pick(subtypesof(/datum/bounty/item/slime))
return new subtype
- if(10)
+ if(9)
var/subtype = pick(subtypesof(/datum/bounty/item/engineering))
return new subtype
- if(11)
+ if(10)
var/subtype = pick(subtypesof(/datum/bounty/item/mining))
return new subtype
- if(12)
+ if(11)
var/subtype = pick(subtypesof(/datum/bounty/item/medical))
return new subtype
- if(13)
+ if(12)
var/subtype = pick(subtypesof(/datum/bounty/item/botany))
return new subtype
- if(14)
+ if(13)
var/subtype = pick(subtypesof(/datum/bounty/item/silly))
return new subtype
- if(15)
+ if(14)
var/subtype = pick(subtypesof(/datum/bounty/item/gardencook))
return new subtype
diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm
index e8b6498c36..7ebf9468ac 100644
--- a/code/modules/economy/account.dm
+++ b/code/modules/economy/account.dm
@@ -10,6 +10,8 @@
var/account_id
var/being_dumped = FALSE //pink levels are rising
var/withdrawDelay = 0
+ var/datum/bounty/civilian_bounty
+ var/bounty_timer = 0
/datum/bank_account/New(newname, job)
if(add_to_accounts)
@@ -100,6 +102,47 @@
if(M.can_hear())
to_chat(M, "[icon2html(icon_source, M)] [message]")
+/**
+ * Returns a string with the civilian bounty's description on it.
+ */
+/datum/bank_account/proc/bounty_text()
+ if(!civilian_bounty)
+ return FALSE
+ if(istype(civilian_bounty, /datum/bounty/item))
+ var/datum/bounty/item/item = civilian_bounty
+ return item.description
+ if(istype(civilian_bounty, /datum/bounty/reagent))
+ var/datum/bounty/reagent/chemical = civilian_bounty
+ return chemical.description
+
+/**
+ * Returns the required item count, or required chemical units required to submit a bounty.
+ */
+/datum/bank_account/proc/bounty_num()
+ if(!civilian_bounty)
+ return FALSE
+ if(istype(civilian_bounty, /datum/bounty/item))
+ var/datum/bounty/item/item = civilian_bounty
+ return "[item.shipped_count]/[item.required_count]"
+ if(istype(civilian_bounty, /datum/bounty/reagent))
+ var/datum/bounty/reagent/chemical = civilian_bounty
+ return "[chemical.shipped_volume]/[chemical.required_volume] u"
+
+/**
+ * Produces the value of the account's civilian bounty reward, if able.
+ */
+/datum/bank_account/proc/bounty_value()
+ if(!civilian_bounty)
+ return FALSE
+ return civilian_bounty.reward
+
+/**
+ * Performs house-cleaning on variables when a civilian bounty is replaced, or, when a bounty is claimed.
+ */
+/datum/bank_account/proc/reset_bounty()
+ civilian_bounty = null
+ bounty_timer = 0
+
/datum/bank_account/department
account_holder = "Guild Credit Agency"
var/department_id = "REPLACE_ME"
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index ff9f86e932..e297df8238 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -71,6 +71,8 @@
var/display_order = JOB_DISPLAY_ORDER_DEFAULT
+ var/bounty_types = CIV_JOB_BASIC
+
//If a job complies with dresscodes, loadout items will not be equipped instead of the job's outfit, instead placing the items into the player's backpack.
var/dresscodecompliant = TRUE
// How much threat this job is worth in dynamic. Is subtracted if the player's not an antag, added if they are.
diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm
index 2e89035bfa..9aa8ea07c4 100644
--- a/code/modules/jobs/job_types/atmospheric_technician.dm
+++ b/code/modules/jobs/job_types/atmospheric_technician.dm
@@ -20,6 +20,7 @@
ACCESS_ENGINE_EQUIP, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_ENG
+ bounty_types = CIV_JOB_ENG
starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring)
diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm
index c9f608fc00..70ca762f39 100644
--- a/code/modules/jobs/job_types/bartender.dm
+++ b/code/modules/jobs/job_types/bartender.dm
@@ -17,6 +17,7 @@
minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_EASY
paycheck_department = ACCOUNT_SRV
+ bounty_types = CIV_JOB_DRINK
display_order = JOB_DISPLAY_ORDER_BARTENDER
threat = 0.5
diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm
index 4c91f87791..53502ee30e 100644
--- a/code/modules/jobs/job_types/botanist.dm
+++ b/code/modules/jobs/job_types/botanist.dm
@@ -16,6 +16,7 @@
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_EASY
paycheck_department = ACCOUNT_SRV
+ bounty_types = CIV_JOB_GROW
display_order = JOB_DISPLAY_ORDER_BOTANIST
threat = 1.5 // lol powergame
diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm
index 6d4204d041..209b3f82d0 100644
--- a/code/modules/jobs/job_types/chemist.dm
+++ b/code/modules/jobs/job_types/chemist.dm
@@ -18,6 +18,7 @@
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
+ bounty_types = CIV_JOB_CHEM
display_order = JOB_DISPLAY_ORDER_CHEMIST
threat = 1.5
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index e77338365d..60b963d7ec 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -30,6 +30,7 @@
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_ENG
+ bounty_types = CIV_JOB_ENG
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/expert, /datum/skill_modifier/job/affinity/wiring)
diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm
index 89b06f6802..401b503110 100644
--- a/code/modules/jobs/job_types/chief_medical_officer.dm
+++ b/code/modules/jobs/job_types/chief_medical_officer.dm
@@ -28,6 +28,7 @@
ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_MED
+ bounty_types = CIV_JOB_MED
display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm
index 666ee8f036..2a021e6575 100644
--- a/code/modules/jobs/job_types/cook.dm
+++ b/code/modules/jobs/job_types/cook.dm
@@ -17,6 +17,7 @@
minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_EASY
paycheck_department = ACCOUNT_SRV
+ bounty_types = CIV_JOB_CHEF
display_order = JOB_DISPLAY_ORDER_COOK
threat = 0.2
diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm
index 5ff1bebfbf..611c3f99cd 100644
--- a/code/modules/jobs/job_types/geneticist.dm
+++ b/code/modules/jobs/job_types/geneticist.dm
@@ -18,6 +18,7 @@
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
+ bounty_types = CIV_JOB_SCI
display_order = JOB_DISPLAY_ORDER_GENETICIST
threat = 1.5
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index 57f248b760..5339b5927c 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -32,6 +32,8 @@
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SEC
+ bounty_types = CIV_JOB_SEC
+
display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia, /datum/quirk/insanity)
diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm
index d6a763acfe..75a85c88d1 100644
--- a/code/modules/jobs/job_types/medical_doctor.dm
+++ b/code/modules/jobs/job_types/medical_doctor.dm
@@ -16,6 +16,7 @@
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
+ bounty_types = CIV_JOB_MED
display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR
threat = 0.5
diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm
index b9fc5809e3..2b374921be 100644
--- a/code/modules/jobs/job_types/paramedic.dm
+++ b/code/modules/jobs/job_types/paramedic.dm
@@ -16,6 +16,7 @@
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
+ bounty_types = CIV_JOB_MED
display_order = JOB_DISPLAY_ORDER_PARAMEDIC
diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm
index 50ce44a8b4..178bcc3188 100644
--- a/code/modules/jobs/job_types/research_director.dm
+++ b/code/modules/jobs/job_types/research_director.dm
@@ -32,6 +32,7 @@
ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SCI
+ bounty_types = CIV_JOB_SCI
display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR
starting_modifiers = list(/datum/skill_modifier/job/level/wiring)
diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm
index 90dacc0482..6f7b91571b 100644
--- a/code/modules/jobs/job_types/roboticist.dm
+++ b/code/modules/jobs/job_types/roboticist.dm
@@ -18,6 +18,7 @@
minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_SCI
+ bounty_types = CIV_JOB_ROBO
starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring)
diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm
index eda88a5911..10e3f58594 100644
--- a/code/modules/jobs/job_types/scientist.dm
+++ b/code/modules/jobs/job_types/scientist.dm
@@ -18,6 +18,7 @@
minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_SCI
+ bounty_types = CIV_JOB_SCI
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic)
display_order = JOB_DISPLAY_ORDER_SCIENTIST
threat = 1.2
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index 77cf04cbf7..1b06d050b7 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -21,6 +21,7 @@
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access()
paycheck = PAYCHECK_HARD
paycheck_department = ACCOUNT_SEC
+ bounty_types = CIV_JOB_SEC
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index 273f74defa..e693335779 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -19,6 +19,7 @@
minimal_access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_EASY ///Not necessarily easy itself, but it can be trivial to make lot of cash on this job.
paycheck_department = ACCOUNT_CAR
+ bounty_types = CIV_JOB_MINE
display_order = JOB_DISPLAY_ORDER_SHAFT_MINER
diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm
index 83b11b22f6..e2248362d0 100644
--- a/code/modules/jobs/job_types/station_engineer.dm
+++ b/code/modules/jobs/job_types/station_engineer.dm
@@ -20,6 +20,7 @@
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_ENG
+ bounty_types = CIV_JOB_ENG
starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring)
diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm
index 3e9b3ba06c..be844be529 100644
--- a/code/modules/jobs/job_types/virologist.dm
+++ b/code/modules/jobs/job_types/virologist.dm
@@ -18,6 +18,7 @@
minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
+ bounty_types = CIV_JOB_VIRO
display_order = JOB_DISPLAY_ORDER_VIROLOGIST
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index 26decc294f..8e3ef5a253 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -22,6 +22,7 @@
paycheck = PAYCHECK_HARD
paycheck_department = ACCOUNT_SEC
+ bounty_types = CIV_JOB_SEC
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm
deleted file mode 100644
index 8f3431ba1b..0000000000
--- a/code/modules/mining/mint.dm
+++ /dev/null
@@ -1,146 +0,0 @@
-/**********************Mint**************************/
-
-
-/obj/machinery/mineral/mint
- name = "coin press"
- icon = 'icons/obj/economy.dmi'
- icon_state = "coinpress0"
- density = TRUE
- input_dir = EAST
- ui_x = 300
- ui_y = 250
- needs_item_input = TRUE
- var/obj/item/storage/bag/money/bag_to_use
- var/produced_coins = 0 // how many coins the machine has made in it's last cycle
- var/processing = FALSE
- var/chosen = /datum/material/iron //which material will be used to make coins
-
-
-/obj/machinery/mineral/mint/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/material_container, list(
- /datum/material/iron,
- /datum/material/plasma,
- /datum/material/silver,
- /datum/material/gold,
- /datum/material/uranium,
- /datum/material/titanium,
- /datum/material/diamond,
- /datum/material/bananium,
- /datum/material/adamantine,
- /datum/material/mythril,
- /datum/material/plastic,
- /datum/material/runite
- ), MINERAL_MATERIAL_AMOUNT * 75, FALSE, /obj/item/stack)
- chosen = SSmaterials.GetMaterialRef(chosen)
-
-
-/obj/machinery/mineral/mint/pickup_item(datum/source, atom/movable/target, atom/oldLoc)
- if(QDELETED(target))
- return
- if(!istype(target, /obj/item/stack))
- return
-
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
- var/obj/item/stack/S = target
-
- if(materials.insert_item(S))
- qdel(S)
-
-/obj/machinery/mineral/mint/process()
- if(processing)
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
- var/datum/material/M = chosen
-
- if(!M)
- processing = FALSE
- icon_state = "coinpress0"
- return
-
- icon_state = "coinpress1"
- var/coin_mat = MINERAL_MATERIAL_AMOUNT
-
- for(var/sheets in 1 to 2)
- if(materials.use_amount_mat(coin_mat, chosen))
- for(var/coin_to_make in 1 to 5)
- create_coins()
- else
- var/found_new = FALSE
- for(var/datum/material/inserted_material in materials.materials)
- var/amount = materials.get_material_amount(inserted_material)
-
- if(amount)
- chosen = inserted_material
- found_new = TRUE
-
- if(!found_new)
- processing = FALSE
- else
- STOP_PROCESSING(SSmachines, src)
- icon_state = "coinpress0"
-
-/obj/machinery/mineral/mint/ui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "Mint", name)
- ui.open()
-
-/obj/machinery/mineral/mint/ui_data()
- var/list/data = list()
- data["inserted_materials"] = list()
- data["chosen_material"] = null
-
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
- for(var/datum/material/inserted_material in materials.materials)
- var/amount = materials.get_material_amount(inserted_material)
- if(!amount)
- continue
- data["inserted_materials"] += list(list(
- "material" = inserted_material.name,
- "amount" = amount,
- ))
- if(chosen == inserted_material)
- data["chosen_material"] = inserted_material.name
-
- data["produced_coins"] = produced_coins
- data["processing"] = processing
-
- return data;
-
-/obj/machinery/mineral/mint/ui_act(action, params, datum/tgui/ui)
- . = ..()
- if(.)
- return
- if(action == "startpress")
- if (!processing)
- produced_coins = 0
- processing = TRUE
- START_PROCESSING(SSmachines, src)
- return TRUE
- if (action == "stoppress")
- processing = FALSE
- STOP_PROCESSING(SSmachines, src)
- return TRUE
- if (action == "changematerial")
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
- for(var/datum/material/mat in materials.materials)
- if (params["material_name"] == mat.name)
- chosen = mat
- return TRUE
-
-/obj/machinery/mineral/mint/proc/create_coins()
- set waitfor = FALSE
- var/turf/T = get_step(src,output_dir)
- var/temp_list = list()
- temp_list[chosen] = 400
- if(T)
- var/obj/item/O = new /obj/item/coin(src)
- O.set_custom_materials(temp_list)
- if(QDELETED(bag_to_use) || (bag_to_use.loc != T) || !SEND_SIGNAL(bag_to_use, COMSIG_TRY_STORAGE_INSERT, O, null, TRUE)) //important to send the signal so we don't overfill the bag.
- bag_to_use = new(src) //make a new bag if we can't find or use the old one.
- unload_mineral(bag_to_use) //just forcemove memes.
- O.forceMove(bag_to_use) //don't bother sending the signal, the new bag is empty and all that.
-
- SSblackbox.record_feedback("amount", "coins_minted", 1)
- produced_coins++
- CHECK_TICK
diff --git a/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm b/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm
index e5f7fdc004..f2514b6f9c 100644
--- a/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm
+++ b/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm
@@ -41,3 +41,10 @@
build_path = /obj/item/circuitboard/computer/mining_shuttle
category = list("Computer Boards")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
+
+/datum/design/board/bountypad_control
+ name = "Computer Design (Civilian Bounty Pad Control)"
+ desc = "Allows for the construction of circuit boards used to build a new civilian bounty pad console."
+ id = "bounty_pad_control"
+ build_path = /obj/item/circuitboard/computer/bountypad
+ category = list("Computer Boards")
diff --git a/code/modules/research/designs/machine_desings/machine_designs_cargo.dm b/code/modules/research/designs/machine_desings/machine_designs_cargo.dm
index 1ed868cde9..3abb757f36 100644
--- a/code/modules/research/designs/machine_desings/machine_designs_cargo.dm
+++ b/code/modules/research/designs/machine_desings/machine_designs_cargo.dm
@@ -40,3 +40,10 @@
build_path = /obj/item/circuitboard/machine/ore_redemption
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/board/bountypad
+ name = "Machine Design (Civilian Bounty Pad)"
+ desc = "The circuit board for a Civilian Bounty Pad."
+ id = "bounty_pad"
+ build_path = /obj/item/circuitboard/machine/bountypad
+ category = list ("Misc. Machinery")
diff --git a/code/modules/research/techweb/nodes/misc_nodes.dm b/code/modules/research/techweb/nodes/misc_nodes.dm
index 2e5fdca6bf..f26a34148f 100644
--- a/code/modules/research/techweb/nodes/misc_nodes.dm
+++ b/code/modules/research/techweb/nodes/misc_nodes.dm
@@ -12,7 +12,7 @@
display_name = "Advanced Data Theory"
description = "Better insight into programming and data."
prereq_ids = list("datatheory")
- design_ids = list("icprinter", "icupgadv", "icupgclo")
+ design_ids = list("icprinter", "icupgadv", "icupgclo","bounty_pad","bounty_pad_control")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
/////////////////////////plasma tech/////////////////////////
diff --git a/sound/machines/wewewew.ogg b/sound/machines/wewewew.ogg
new file mode 100644
index 0000000000..b521e0c976
Binary files /dev/null and b/sound/machines/wewewew.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 28464dedef..0cbed7f72e 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -898,6 +898,7 @@
#include "code\game\machinery\bloodbankgen.dm"
#include "code\game\machinery\buttons.dm"
#include "code\game\machinery\cell_charger.dm"
+#include "code\game\machinery\civilian_bountys.dm"
#include "code\game\machinery\cloning.dm"
#include "code\game\machinery\colormate.dm"
#include "code\game\machinery\constructable_frame.dm"
@@ -2514,7 +2515,6 @@
#include "code\modules\mining\machine_vending.dm"
#include "code\modules\mining\mine_items.dm"
#include "code\modules\mining\minebot.dm"
-#include "code\modules\mining\mint.dm"
#include "code\modules\mining\money_bag.dm"
#include "code\modules\mining\ores_coins.dm"
#include "code\modules\mining\point_bank.dm"
diff --git a/tgui/packages/tgui/interfaces/Mint.js b/tgui/packages/tgui/interfaces/Mint.js
deleted file mode 100644
index b9070f41cb..0000000000
--- a/tgui/packages/tgui/interfaces/Mint.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * THIS FILE WILL SOON BE DEPRICATED!
- */
-import { useBackend } from '../backend';
-import { Button, LabeledList, Section } from '../components';
-import { Window } from '../layouts';
-
-export const Mint = (props, context) => {
- const { act, data } = useBackend(context);
- const inserted_materials = data.inserted_materials || [];
- return (
-
-
- act(data.processing
- ? 'stoppress'
- : 'startpress')} />
- }>
-
- {inserted_materials.map(material => (
- act('changematerial', {
- material_name: material.material,
- })} />
- )}>
- {material.amount} cm³
-
- ))}
-
-
-
- Pressed {data.produced_coins} coins this cycle.
-
-
-
- );
-};