diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 10c876a2d6..29a49a746d 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -30033,6 +30033,9 @@
/obj/machinery/keycard_auth{
pixel_y = 25
},
+/obj/machinery/computer/bounty{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/cargo/qm)
"bvG" = (
@@ -54977,6 +54980,15 @@
"gjl" = (
/turf/closed/wall,
/area/cargo/warehouse)
+"gkP" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/computer/bounty{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/cargo/office)
"gnf" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -90073,7 +90085,7 @@ bnG
bnz
bpA
bbR
-bkM
+gkP
jlm
bud
eyM
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 22d4d53255..fb7ab03ad3 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -115810,6 +115810,9 @@
/obj/effect/turf_decal/tile/brown{
dir = 4
},
+/obj/machinery/computer/bounty{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/cargo/qm)
"twd" = (
@@ -121720,6 +121723,9 @@
/obj/effect/turf_decal/tile/brown{
dir = 8
},
+/obj/machinery/computer/bounty{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/cargo/office)
"vEI" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 7dae7cbffc..9f0363dc29 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -65530,6 +65530,7 @@
/obj/effect/turf_decal/tile/brown{
dir = 4
},
+/obj/machinery/computer/bounty,
/turf/open/floor/plasteel,
/area/cargo/qm)
"mSd" = (
@@ -72173,6 +72174,7 @@
/obj/effect/turf_decal/tile/brown{
dir = 8
},
+/obj/machinery/computer/bounty,
/turf/open/floor/plasteel,
/area/cargo/office)
"qBq" = (
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index 1100ce3896..75676fa92c 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -6774,6 +6774,9 @@
/obj/effect/turf_decal/tile/brown{
dir = 8
},
+/obj/machinery/computer/bounty{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/cargo/storage)
"amw" = (
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 75dfa4b568..6abbc9e739 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -21143,6 +21143,9 @@
/obj/machinery/status_display/supply{
pixel_x = -32
},
+/obj/machinery/computer/bounty{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/cargo/office)
"aZk" = (
@@ -23011,6 +23014,9 @@
/obj/effect/turf_decal/tile/brown{
dir = 4
},
+/obj/machinery/computer/bounty{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/cargo/qm)
"bdI" = (
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index 382764c586..58d9627476 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -581,6 +581,10 @@
name = "Supply Request Console (Computer Board)"
build_path = /obj/machinery/computer/cargo/request
+/obj/item/circuitboard/computer/bounty
+ name = "Nanotrasen Bounty Console (Computer Board)"
+ build_path = /obj/machinery/computer/bounty
+
/obj/item/circuitboard/computer/ferry
name = "Transport Ferry (Computer Board)"
icon_state = "supply"
diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm
new file mode 100644
index 0000000000..4158327c3c
--- /dev/null
+++ b/code/modules/cargo/bounty_console.dm
@@ -0,0 +1,67 @@
+#define PRINTER_TIMEOUT 10
+
+/obj/machinery/computer/bounty
+ name = "\improper Nanotrasen bounty console"
+ desc = "Used to check and claim bounties offered by Nanotrasen"
+ icon_screen = "bounty"
+ circuit = /obj/item/circuitboard/computer/bounty
+ light_color = "#E2853D"//orange
+ var/printer_ready = 0 //cooldown var
+ var/static/datum/bank_account/cargocash
+
+/obj/machinery/computer/bounty/Initialize(mapload)
+ . = ..()
+ printer_ready = world.time + PRINTER_TIMEOUT
+ cargocash = SSeconomy.get_dep_account(ACCOUNT_CAR)
+
+/obj/machinery/computer/bounty/proc/print_paper()
+ new /obj/item/paper/bounty_printout(loc)
+
+/obj/item/paper/bounty_printout
+ name = "paper - Bounties"
+
+/obj/item/paper/bounty_printout/Initialize(mapload)
+ . = ..()
+ info = "
Nanotrasen Cargo Bounties
"
+ update_icon()
+
+ for(var/datum/bounty/B in GLOB.bounties_list)
+ if(B.claimed)
+ continue
+ info += {"[B.name]
+ - Reward: [B.reward_string()]
+ - Completed: [B.completion_string()]
"}
+
+/obj/machinery/computer/bounty/ui_interact(mob/user, datum/tgui/ui)
+ if(!GLOB.bounties_list.len)
+ setup_bounties()
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "CargoBountyConsole", name)
+ ui.open()
+
+/obj/machinery/computer/bounty/ui_data(mob/user)
+ var/list/data = list()
+ var/list/bountyinfo = list()
+ for(var/datum/bounty/B in GLOB.bounties_list)
+ bountyinfo += list(list("name" = B.name, "description" = B.description, "reward_string" = B.reward_string(), "completion_string" = B.completion_string() , "claimed" = B.claimed, "can_claim" = B.can_claim(), "priority" = B.high_priority, "bounty_ref" = REF(B)))
+ data["stored_cash"] = cargocash.account_balance
+ data["bountydata"] = bountyinfo
+ return data
+
+/obj/machinery/computer/bounty/ui_act(action,params)
+ if(..())
+ return
+ switch(action)
+ if("ClaimBounty")
+ var/datum/bounty/cashmoney = locate(params["bounty"]) in GLOB.bounties_list
+ if(cashmoney)
+ cashmoney.claim()
+ return TRUE
+ if("Print")
+ if(printer_ready < world.time)
+ printer_ready = world.time + PRINTER_TIMEOUT
+ print_paper()
+ return
+
+
diff --git a/code/modules/events/shuttle_catastrophe.dm b/code/modules/events/shuttle_catastrophe.dm
index 2e431a8a34..18b9dc61ca 100644
--- a/code/modules/events/shuttle_catastrophe.dm
+++ b/code/modules/events/shuttle_catastrophe.dm
@@ -9,6 +9,8 @@
/datum/round_event_control/shuttle_catastrophe/canSpawnEvent(players, gamemode)
if(SSshuttle.emergency.name == "Build your own shuttle kit")
return FALSE //don't undo manual player engineering, it also would unload people and ghost them, there's just a lot of problems
+ if(SSshuttle.emergency.in_flight())
+ return FALSE //ditto, problems
return ..()
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 ea8e59a6b3..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
@@ -17,7 +17,15 @@
build_path = /obj/item/circuitboard/computer/cargo/request
category = list("Computer Boards")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
-
+
+/datum/design/board/bounty
+ name = "Computer Design (Bounty Console)"
+ desc = "Allows for the construction of circuit boards used to build a Bounty Console."
+ id = "bounty"
+ build_path = /obj/item/circuitboard/computer/bounty
+ category = list("Computer Boards")
+ departmental_flags = DEPARTMENTAL_FLAG_CARGO
+
/datum/design/board/mining
name = "Computer Design (Outpost Status Display)"
desc = "Allows for the construction of circuit boards used to build an outpost status display console."
diff --git a/tgstation.dme b/tgstation.dme
index 49bfc8b6ba..7c99c4d0b1 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1963,6 +1963,7 @@
#include "code\modules\buildmode\submodes\throwing.dm"
#include "code\modules\buildmode\submodes\variable_edit.dm"
#include "code\modules\cargo\bounty.dm"
+#include "code\modules\cargo\bounty_console.dm"
#include "code\modules\cargo\centcom_podlauncher.dm"
#include "code\modules\cargo\console.dm"
#include "code\modules\cargo\coupon.dm"
diff --git a/tgui/packages/tgui/interfaces/CargoBountyConsole.js b/tgui/packages/tgui/interfaces/CargoBountyConsole.js
new file mode 100644
index 0000000000..ad485231eb
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CargoBountyConsole.js
@@ -0,0 +1,119 @@
+import { useBackend } from '../backend';
+import { AnimatedNumber, Box, Button, Section, Table } from '../components';
+import { formatMoney } from '../format';
+import { Window } from '../layouts';
+
+export const CargoBountyConsole = (props, context) => {
+ const { act, data } = useBackend(context);
+ const {
+ bountydata = [],
+ } = data;
+ return (
+
+
+ }
+ buttons={(
+
+
+ );
+};
+
+const BountyHeader = (props, context) => {
+ const { act, data } = useBackend(context);
+ const {
+ stored_cash,
+ } = data;
+ return (
+
+ formatMoney(value)} />
+ {' credits'}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/NtosBountyConsole.js b/tgui/packages/tgui/interfaces/NtosBountyConsole.js
new file mode 100644
index 0000000000..bfd2b0e4c9
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/NtosBountyConsole.js
@@ -0,0 +1,119 @@
+import { useBackend } from '../backend';
+import { AnimatedNumber, Box, Button, Section, Table } from '../components';
+import { formatMoney } from '../format';
+import { NtosWindow } from '../layouts';
+
+export const NtosBountyConsole = (props, context) => {
+ const { act, data } = useBackend(context);
+ const {
+ bountydata = [],
+ } = data;
+ return (
+
+
+ }
+ buttons={(
+ act('Print')} />
+ )}>
+
+
+
+ Bounty Object
+
+
+ Description
+
+
+ Progress
+
+
+ Value
+
+
+ Claim
+
+
+ {bountydata.map(bounty => (
+
+
+ {bounty.name}
+
+
+ {bounty.description}
+
+
+ {bounty.priority === 1
+ ? High Priority
+ : ""}
+ {bounty.completion_string}
+
+
+ {bounty.reward_string}
+
+
+ act('ClaimBounty', {
+ bounty: bounty.bounty_ref,
+ })} />
+
+
+ ))}
+
+
+
+
+ );
+};
+
+const BountyHeader = (props, context) => {
+ const { act, data } = useBackend(context);
+ const {
+ stored_cash,
+ } = data;
+ return (
+
+ formatMoney(value)} />
+ {' credits'}
+
+ );
+};