diff --git a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm
index 69cf7c0867..79d49dc6cf 100644
--- a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm
+++ b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm
@@ -2714,10 +2714,6 @@
},
/turf/open/floor/plasteel,
/area/mine/living_quarters)
-"OI" = (
-/obj/machinery/mineral/mint,
-/turf/open/floor/plasteel,
-/area/mine/production)
"ON" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/brown{
@@ -7031,7 +7027,7 @@ xv
bg
mI
Cd
-OI
+es
sz
gk
Wf
diff --git a/_maps/RandomZLevels/away_mission/caves.dmm b/_maps/RandomZLevels/away_mission/caves.dmm
index e33659fbdd..2195b9d0ec 100644
--- a/_maps/RandomZLevels/away_mission/caves.dmm
+++ b/_maps/RandomZLevels/away_mission/caves.dmm
@@ -1504,12 +1504,6 @@
},
/turf/open/floor/plasteel,
/area/awaymission/caves/listeningpost)
-"eQ" = (
-/obj/machinery/mineral/mint,
-/turf/open/floor/plating/asteroid/basalt{
- initial_gas_mix = "n2=23;o2=14;TEMP=2.7"
- },
-/area/awaymission/caves/BMP_asteroid)
"eR" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel,
@@ -9345,8 +9339,8 @@ bM
bM
bL
bL
-eQ
-eQ
+bV
+bV
bV
bV
bV
diff --git a/_maps/RandomZLevels/away_mission/wildwest.dmm b/_maps/RandomZLevels/away_mission/wildwest.dmm
index 1fc7da1acd..37999e77ab 100644
--- a/_maps/RandomZLevels/away_mission/wildwest.dmm
+++ b/_maps/RandomZLevels/away_mission/wildwest.dmm
@@ -861,10 +861,6 @@
},
/turf/open/floor/carpet,
/area/awaymission/wildwest/gov)
-"di" = (
-/obj/machinery/mineral/mint,
-/turf/open/floor/plating,
-/area/awaymission/wildwest/refine)
"dj" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/wood,
@@ -1282,10 +1278,6 @@
icon_state = "ironsand4"
},
/area/awaymission/wildwest/gov)
-"eA" = (
-/obj/machinery/mineral/mint,
-/turf/open/floor/plasteel,
-/area/awaymission/wildwest/refine)
"eC" = (
/obj/structure/chair/comfy/brown,
/turf/open/floor/wood,
@@ -29059,7 +29051,7 @@ aG
aG
aG
et
-eA
+eu
eu
eu
eu
@@ -33673,7 +33665,7 @@ bc
bc
bc
bc
-di
+bc
bc
bh
aW
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 1fe39b9717..8f21e3ecce 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -29098,9 +29098,6 @@
/turf/open/floor/plasteel/white,
/area/science)
"btB" = (
-/obj/machinery/computer/bounty{
- dir = 4
- },
/obj/effect/turf_decal/tile/blue{
dir = 1
},
@@ -30020,9 +30017,6 @@
departmentType = 2;
pixel_x = -30
},
-/obj/machinery/computer/bounty{
- dir = 4
- },
/obj/effect/turf_decal/tile/brown{
dir = 1
},
@@ -54485,6 +54479,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{
@@ -63577,15 +63575,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"sWR" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/computer/bounty{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/cargo/office)
"sXy" = (
/obj/machinery/door/airlock/external{
name = "Security External Airlock";
@@ -65863,6 +65852,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
@@ -89997,7 +89992,7 @@ bnG
bnz
bpA
bbR
-sWR
+bkM
jlm
bud
eyM
@@ -90512,7 +90507,7 @@ boR
bqs
bbR
bkM
-bbR
+fCV
bwd
bxB
bvL
@@ -90769,7 +90764,7 @@ boT
bbR
bbR
buI
-bbR
+wfZ
bwd
bxD
byL
diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm
index 855f1c5443..2135803d28 100644
--- a/_maps/map_files/CogStation/CogStation.dmm
+++ b/_maps/map_files/CogStation/CogStation.dmm
@@ -21245,9 +21245,6 @@
/turf/open/floor/plasteel/dark/side,
/area/security/courtroom)
"aUF" = (
-/obj/machinery/computer/bounty{
- dir = 1
- },
/turf/open/floor/carpet/green,
/area/command/heads_quarters/hop)
"aUG" = (
@@ -26769,7 +26766,6 @@
/turf/open/floor/engine,
/area/engineering/teg)
"bgS" = (
-/obj/machinery/computer/bounty,
/obj/effect/turf_decal/tile/brown{
dir = 4
},
@@ -27425,6 +27421,9 @@
dir = 1;
pixel_y = -22
},
+/obj/machinery/computer/piratepad_control/civilian{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/cargo/office)
"bis" = (
@@ -29094,9 +29093,6 @@
/turf/open/floor/plasteel,
/area/cargo/sorting)
"blR" = (
-/obj/machinery/computer/bounty{
- dir = 4
- },
/obj/effect/turf_decal/tile/brown{
dir = 8
},
@@ -58023,6 +58019,7 @@
/obj/effect/turf_decal/tile/brown,
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/obj/structure/disposalpipe/segment,
+/obj/machinery/piratepad/civilian,
/turf/open/floor/plasteel,
/area/cargo/office)
"ctx" = (
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 6ba5945fa5..e43a172ce5 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -14448,9 +14448,6 @@
/turf/closed/wall,
/area/hallway/primary/fore)
"bdO" = (
-/obj/structure/table,
-/obj/item/paper_bin,
-/obj/item/pen,
/obj/machinery/light{
dir = 8
},
@@ -14467,20 +14464,19 @@
/obj/effect/turf_decal/tile/brown{
dir = 8
},
+/obj/machinery/computer/piratepad_control/civilian,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"bdP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/disposalpipe/segment,
-/obj/item/kirbyplants{
- icon_state = "plant-21"
- },
/obj/effect/turf_decal/tile/brown{
dir = 1
},
/obj/effect/turf_decal/tile/brown{
dir = 4
},
+/obj/machinery/piratepad/civilian,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"bdQ" = (
@@ -73855,16 +73851,6 @@
},
/turf/open/floor/plasteel,
/area/engineering/main)
-"fdZ" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/computer/bounty{
- dir = 8
- },
-/turf/open/floor/plasteel/grimy,
-/area/command/heads_quarters/hop)
"fer" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -74410,9 +74396,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/computer/bounty{
- dir = 4
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -115753,9 +115736,6 @@
/obj/machinery/light_switch{
pixel_x = 23
},
-/obj/machinery/computer/bounty{
- dir = 8
- },
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
dir = 4
@@ -121652,9 +121632,6 @@
name = "Station Intercom (General)";
pixel_x = 28
},
-/obj/machinery/computer/bounty{
- dir = 8
- },
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
dir = 4
@@ -165088,7 +165065,7 @@ xmR
qTU
xmR
wGq
-fdZ
+xmR
kxP
pnQ
gEc
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 6680f867c4..74dbdcf8d7 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -12343,6 +12343,7 @@
/obj/machinery/light{
dir = 4
},
+/obj/structure/closet/firecloset,
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"auA" = (
@@ -13135,9 +13136,6 @@
/turf/open/floor/plasteel,
/area/command/bridge)
"avS" = (
-/obj/machinery/computer/bounty{
- dir = 4
- },
/obj/machinery/requests_console{
announcementConsole = 1;
department = "Head of Personnel's Desk";
@@ -35252,7 +35250,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/structure/closet/firecloset,
+/obj/machinery/piratepad/civilian,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/starboard)
"beP" = (
@@ -37147,7 +37145,6 @@
/turf/open/floor/plasteel,
/area/cargo/miningoffice)
"bhO" = (
-/obj/machinery/computer/bounty,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral{
dir = 8
@@ -38743,9 +38740,6 @@
dir = 4
},
/obj/effect/turf_decal/bot,
-/obj/machinery/computer/bounty{
- dir = 8
- },
/turf/open/floor/plasteel/dark,
/area/cargo/office)
"bks" = (
@@ -42093,8 +42087,10 @@
/turf/open/floor/plasteel,
/area/cargo/storage)
"bpF" = (
-/obj/structure/sign/departments/cargo,
-/turf/closed/wall,
+/obj/machinery/computer/piratepad_control/civilian{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"bpG" = (
/obj/effect/turf_decal/tile/neutral,
@@ -49269,10 +49265,6 @@
/area/security/checkpoint/supply)
"bBp" = (
/obj/effect/turf_decal/tile/brown,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/brown{
- dir = 4
- },
/obj/structure/cable{
icon_state = "1-2"
},
@@ -85067,6 +85059,10 @@
"khA" = (
/turf/closed/wall/rust,
/area/construction/mining/aux_base)
+"kmy" = (
+/obj/structure/sign/departments/cargo,
+/turf/closed/wall,
+/area/cargo/office)
"koc" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1,
/turf/open/floor/wood,
@@ -122845,7 +122841,7 @@ aYK
aYd
bhe
cLt
-bhI
+kmy
bhX
bhs
biM
diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm
index 590e1980c0..22241d6dfc 100644
--- a/_maps/map_files/LambdaStation/lambda.dmm
+++ b/_maps/map_files/LambdaStation/lambda.dmm
@@ -23376,9 +23376,6 @@
/turf/open/floor/plasteel,
/area/cargo/miningoffice)
"aQs" = (
-/obj/machinery/computer/bounty{
- dir = 4
- },
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 10
},
@@ -24354,12 +24351,10 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"aTo" = (
-/obj/structure/chair{
- dir = 4
- },
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 8
},
+/obj/machinery/piratepad/civilian,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aTp" = (
@@ -25017,9 +25012,6 @@
name = "Station Intercom";
pixel_y = -28
},
-/obj/machinery/computer/bounty{
- dir = 1
- },
/obj/machinery/light,
/turf/open/floor/plasteel,
/area/cargo/storage)
@@ -25120,9 +25112,6 @@
/turf/open/floor/plasteel,
/area/cargo/office)
"aVG" = (
-/obj/structure/chair{
- dir = 4
- },
/obj/machinery/light{
dir = 8;
light_color = "#e8eaff"
@@ -25130,6 +25119,9 @@
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 8
},
+/obj/machinery/computer/piratepad_control/civilian{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aVH" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 847977dab0..00925c100f 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -14313,9 +14313,6 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bca" = (
-/obj/structure/chair{
- dir = 8
- },
/obj/machinery/light{
dir = 4
},
@@ -14327,6 +14324,7 @@
/obj/effect/turf_decal/tile/brown{
dir = 4
},
+/obj/machinery/piratepad/civilian,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bcb" = (
@@ -14593,13 +14591,13 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bdv" = (
-/obj/structure/chair{
- dir = 8
- },
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
dir = 4
},
+/obj/machinery/computer/piratepad_control/civilian{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"bdw" = (
@@ -65479,7 +65477,6 @@
/obj/machinery/light{
dir = 1
},
-/obj/machinery/computer/bounty,
/obj/effect/turf_decal/tile/brown{
dir = 1
},
@@ -72107,7 +72104,6 @@
departmentType = 2;
pixel_y = 30
},
-/obj/machinery/computer/bounty,
/obj/effect/turf_decal/tile/brown{
dir = 1
},
@@ -76632,9 +76628,6 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/machinery/computer/bounty{
- dir = 4
- },
/turf/open/floor/wood,
/area/command/heads_quarters/hop)
"tdQ" = (
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index 301971dd2b..d1b5706c0a 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -5245,9 +5245,6 @@
name = "Cargo Office RC";
pixel_x = 32
},
-/obj/machinery/computer/bounty{
- dir = 8
- },
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
dir = 4
@@ -6769,9 +6766,6 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard/fore)
"amv" = (
-/obj/machinery/computer/bounty{
- dir = 4
- },
/obj/effect/turf_decal/tile/brown{
dir = 1
},
@@ -9011,14 +9005,12 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard/fore)
"aqn" = (
-/obj/structure/chair{
- dir = 1
- },
/obj/machinery/airalarm{
dir = 1;
pixel_y = -22
},
/obj/effect/turf_decal/bot,
+/obj/machinery/piratepad/civilian,
/turf/open/floor/plasteel,
/area/hallway/primary/starboard/fore)
"aqo" = (
@@ -10230,7 +10222,6 @@
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"ass" = (
-/obj/machinery/mineral/mint,
/obj/structure/sign/poster/official/random{
pixel_y = 32
},
@@ -38510,6 +38501,13 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrous_input,
/turf/open/floor/engine/n2o,
/area/engineering/atmos)
+"svk" = (
+/obj/effect/turf_decal/bot,
+/obj/machinery/computer/piratepad_control/civilian{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/starboard/fore)
"svX" = (
/obj/structure/sign/warning/fire{
pixel_y = -32
@@ -89640,7 +89638,7 @@ amA
ano
aog
apg
-aqk
+svk
aRz
abN
acy
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index fab7081ace..5a3d69fe60 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -18176,11 +18176,14 @@
/turf/open/floor/plasteel,
/area/cargo/office)
"aTe" = (
-/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plating,
+/obj/machinery/mineral/ore_redemption{
+ input_dir = 4;
+ output_dir = 8
+ },
+/turf/open/floor/plasteel,
/area/cargo/office)
"aTf" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -19684,12 +19687,11 @@
/turf/open/floor/plasteel,
/area/cargo/office)
"aWv" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/mineral/ore_redemption{
- input_dir = 4;
- output_dir = 8
+/obj/effect/turf_decal/tile/brown,
+/obj/machinery/computer/piratepad_control/civilian{
+ dir = 1
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/cargo/office)
"aWw" = (
/obj/effect/turf_decal/tile/brown,
@@ -21130,9 +21132,6 @@
/obj/machinery/status_display/supply{
pixel_x = -32
},
-/obj/machinery/computer/bounty{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/cargo/office)
"aZk" = (
@@ -22996,9 +22995,6 @@
/turf/open/floor/plasteel,
/area/cargo/qm)
"bdH" = (
-/obj/machinery/computer/bounty{
- dir = 8
- },
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
dir = 4
@@ -59244,11 +59240,10 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"pHo" = (
-/obj/machinery/computer/bounty{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/command/heads_quarters/hop)
+/obj/effect/turf_decal/tile/brown,
+/obj/machinery/piratepad/civilian,
+/turf/open/floor/plasteel,
+/area/cargo/office)
"pJy" = (
/obj/structure/rack,
/obj/item/crowbar,
@@ -97120,7 +97115,7 @@ aAG
aBA
aCQ
aDS
-pHo
+aCS
aAH
aGu
aHh
@@ -101506,7 +101501,7 @@ aSe
aTc
aOT
aVp
-aWu
+pHo
aPW
aYr
aOV
@@ -101763,7 +101758,7 @@ aSf
aTd
aUn
aVr
-aWu
+aWv
aLf
aYs
aZk
@@ -102020,7 +102015,7 @@ lAs
aTe
aUo
aVs
-aWv
+aLf
aLf
aPW
aZl
diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm
index e5aef6889f..51b0cdb586 100644
--- a/_maps/map_files/Snaxi/Snaxi.dmm
+++ b/_maps/map_files/Snaxi/Snaxi.dmm
@@ -25709,7 +25709,6 @@
/obj/effect/turf_decal/tile/brown{
dir = 4
},
-/obj/machinery/computer/bounty,
/turf/open/floor/plasteel,
/area/cargo/storage)
"jjB" = (
@@ -35737,7 +35736,7 @@
pixel_y = -22
},
/obj/machinery/light,
-/obj/structure/closet/emcloset,
+/obj/machinery/piratepad/civilian,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"pLP" = (
@@ -37115,7 +37114,9 @@
},
/area/service/chapel/main)
"qHq" = (
-/obj/structure/closet/crate,
+/obj/machinery/computer/piratepad_control/civilian{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"qHC" = (
@@ -47807,16 +47808,6 @@
},
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai_upload)
-"xEf" = (
-/obj/machinery/computer/bounty{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown,
-/turf/open/floor/plasteel,
-/area/cargo/qm)
"xEt" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -89689,7 +89680,7 @@ rDE
dFF
sLn
acv
-xEf
+jmU
krH
avT
xUL
diff --git a/_maps/map_files/SpookyStation/SpookyStation.dmm b/_maps/map_files/SpookyStation/SpookyStation.dmm
index b40f7adaab..c8fdb504b4 100644
--- a/_maps/map_files/SpookyStation/SpookyStation.dmm
+++ b/_maps/map_files/SpookyStation/SpookyStation.dmm
@@ -3720,10 +3720,6 @@
},
/turf/open/floor/wood,
/area/eventmap/inside)
-"alc" = (
-/obj/machinery/computer/bounty,
-/turf/open/floor/wood,
-/area/eventmap/inside)
"ald" = (
/obj/machinery/computer/cargo/request,
/turf/open/floor/wood,
@@ -12424,9 +12420,6 @@
/turf/open/floor/plasteel,
/area/eventmap/mountaininside)
"aJT" = (
-/obj/machinery/computer/bounty{
- dir = 8
- },
/obj/structure/cable/white{
icon_state = "1-2"
},
@@ -14199,15 +14192,6 @@
},
/turf/open/floor/wood/damturf/broken3,
/area/eventmap/inside)
-"aOT" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/computer/bounty{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/eventmap/inside)
"aOU" = (
/obj/structure/cable/white{
icon_state = "4-8"
@@ -18162,7 +18146,7 @@ aqr
aqr
aOG
aOM
-aOT
+aBm
aqr
aac
aac
@@ -38454,7 +38438,7 @@ adR
aDI
aiZ
akz
-alc
+aOE
aOo
aHT
aqa
diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm
index 3dff7a8f44..569dc9736d 100644
--- a/_maps/map_files/debug/runtimestation.dmm
+++ b/_maps/map_files/debug/runtimestation.dmm
@@ -1913,9 +1913,6 @@
/obj/machinery/camera/autoname{
dir = 4
},
-/obj/machinery/computer/bounty{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/cargo/storage)
"fr" = (
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 7a54b8482d..2b9fa902e9 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -490,6 +490,14 @@
#define COMPONENT_BLOCK_SHARPEN_ALREADY 4
#define COMPONENT_BLOCK_SHARPEN_MAXED 8
#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M)
+
+// /obj/item signals for economy
+#define COMSIG_ITEM_SOLD "item_sold" //called when an item is sold by the exports subsystem
+#define COMSIG_STRUCTURE_UNWRAPPED "structure_unwrapped" //called when a wrapped up structure is opened by hand
+#define COMSIG_ITEM_UNWRAPPED "item_unwrapped" //called when a wrapped up item is opened by hand
+ #define COMSIG_ITEM_SPLIT_VALUE 1
+#define COMSIG_ITEM_SPLIT_PROFIT "item_split_profits" //Called when getting the item's exact ratio for cargo's profit.
+
#define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, used_state, style_flags, list/overlays)
#define COMSIG_ARMOR_PLATED "armor_plated" //called when an armor plate is successfully applied to an object
// THE FOLLOWING TWO BLOCKS SHOULD RETURN BLOCK FLAGS AS DEFINED IN __DEFINES/combat.dm!
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/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm
index 3f594e170e..88255f375e 100644
--- a/code/controllers/subsystem/economy.dm
+++ b/code/controllers/subsystem/economy.dm
@@ -52,6 +52,9 @@ SUBSYSTEM_DEF(economy)
///The modifier multiplied to the value of cargo pack prices.
var/pack_price_modifier = 1
+ var/civ_bounty_tracker = 0
+ /// Contains the message to send to newscasters about earnings, updated on price_update()
+
/datum/controller/subsystem/economy/Initialize(timeofday)
var/budget_to_hand_out = round(budget_pool / department_accounts.len)
for(var/A in department_accounts)
diff --git a/code/datums/components/pricetag.dm b/code/datums/components/pricetag.dm
new file mode 100644
index 0000000000..2ad63c6464
--- /dev/null
+++ b/code/datums/components/pricetag.dm
@@ -0,0 +1,35 @@
+/datum/component/pricetag
+ ///Payee gets 100% of the value if no ratio has been set.
+ var/default_profit_ratio = 1
+ ///List of bank accounts this pricetag pays out to. Format is payees[bank_account] = profit_ratio.
+ var/list/payees = list()
+
+
+/datum/component/pricetag/Initialize(_owner,_profit_ratio)
+ if(!isobj(parent)) //Has to account for both objects and sellable structures like crates.
+ return COMPONENT_INCOMPATIBLE
+ if(_profit_ratio)
+ payees[_owner] = _profit_ratio
+ else
+ payees[_owner] = default_profit_ratio
+ RegisterSignal(parent, COMSIG_ITEM_SOLD, .proc/split_profit)
+ RegisterSignal(parent, COMSIG_STRUCTURE_UNWRAPPED, .proc/Unwrapped)
+ RegisterSignal(parent, COMSIG_ITEM_UNWRAPPED, .proc/Unwrapped)
+ RegisterSignal(parent, COMSIG_ITEM_SPLIT_PROFIT, .proc/return_ratio)
+
+/datum/component/pricetag/proc/Unwrapped()
+ qdel(src) //Once it leaves it's wrapped container, the object in question should lose it's pricetag component.
+
+/datum/component/pricetag/proc/split_profit(var/item_value)
+ var/price = item_value
+ if(price)
+ for(var/datum/bank_account/payee in payees)
+ var/profit_ratio = payees[payee]
+ var/adjusted_value = price * profit_ratio
+ var/datum/bank_account/bank_account = payee
+ bank_account.adjust_money(adjusted_value)
+ bank_account.bank_card_talk("Sale of [parent] recorded. [adjusted_value] credits added to account.")
+ return TRUE
+
+/datum/component/pricetag/proc/return_ratio()
+ return default_profit_ratio
diff --git a/code/game/machinery/civilian_bountys.dm b/code/game/machinery/civilian_bountys.dm
new file mode 100644
index 0000000000..0395956d8b
--- /dev/null
+++ b/code/game/machinery/civilian_bountys.dm
@@ -0,0 +1,353 @@
+#define CIV_BOUNTY_SPLIT 30
+
+///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.
+ status_report += "Bounty completed! Please give your bounty cube to cargo for your automated payout shortly."
+ inserted_scan_id.registered_account.reset_bounty()
+ SSeconomy.civ_bounty_tracker++
+
+ var/obj/item/bounty_cube/reward = new /obj/item/bounty_cube(drop_location())
+ reward.set_up(curr_bounty, inserted_scan_id)
+
+ pad.visible_message(span_notice("[pad] activates!"))
+ flick(pad.sending_state,pad)
+ pad.icon_state = pad.idle_state
+ playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE)
+ sending = FALSE
+
+///Here is where cargo bounties are added to the player's bank accounts, then adjusted and scaled into a civilian bounty.
+/obj/machinery/computer/piratepad_control/civilian/proc/add_bounties()
+ 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)) || pot_acc.bounties)
+ var/curr_time = round(((pot_acc.bounty_timer + (5 MINUTES))-world.time)/ (1 MINUTES), 0.01)
+ to_chat(usr, "Internal ID network spools coiling, try again in [curr_time] minutes!")
+ return FALSE
+ if(!pot_acc.account_job)
+ to_chat(usr, "The console smartly rejects your ID card, as it lacks a job assignment!")
+ return FALSE
+ var/list/datum/bounty/crumbs = list(random_bounty(pot_acc.account_job.bounty_types), // We want to offer 2 bounties from their appropriate job catagories
+ random_bounty(pot_acc.account_job.bounty_types), // and 1 guarenteed assistant bounty if the other 2 suck.
+ random_bounty(CIV_JOB_BASIC))
+ pot_acc.bounty_timer = world.time
+ pot_acc.bounties = crumbs
+
+/obj/machinery/computer/piratepad_control/civilian/proc/pick_bounty(choice)
+ if(!inserted_scan_id?.registered_account)
+ playsound(loc, 'sound/machines/synth_no.ogg', 40 , TRUE)
+ return
+ inserted_scan_id.registered_account.civilian_bounty = inserted_scan_id.registered_account.bounties[choice]
+ inserted_scan_id.registered_account.bounties = null
+ return inserted_scan_id.registered_account.civilian_bounty
+
+/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)
+ if(inserted_scan_id.registered_account.civilian_bounty)
+ data["id_bounty_info"] = inserted_scan_id.registered_account.civilian_bounty.description
+ data["id_bounty_num"] = inserted_scan_id.registered_account.bounty_num()
+ data["id_bounty_value"] = (inserted_scan_id.registered_account.civilian_bounty.reward) * (CIV_BOUNTY_SPLIT/100)
+ if(inserted_scan_id.registered_account.bounties)
+ data["picking"] = TRUE
+ data["id_bounty_names"] = list(inserted_scan_id.registered_account.bounties[1].name,
+ inserted_scan_id.registered_account.bounties[2].name,
+ inserted_scan_id.registered_account.bounties[3].name)
+ data["id_bounty_values"] = list(inserted_scan_id.registered_account.bounties[1].reward * (CIV_BOUNTY_SPLIT/100),
+ inserted_scan_id.registered_account.bounties[2].reward * (CIV_BOUNTY_SPLIT/100),
+ inserted_scan_id.registered_account.bounties[3].reward * (CIV_BOUNTY_SPLIT/100))
+ else
+ data["picking"] = FALSE
+ 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("pick")
+ pick_bounty(params["value"])
+ if("bounty")
+ add_bounties()
+ if("eject")
+ id_eject(usr, inserted_scan_id)
+ inserted_scan_id = null
+ . = 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
+
+///Upon completion of a civilian bounty, one of these is created. It is sold to cargo to give the cargo budget bounty money, and the person who completed it cash.
+/obj/item/bounty_cube
+ name = "Bounty Cube"
+ desc = "A bundle of compressed hardlight data, containing a completed bounty. Sell this on the cargo shuttle to claim it!"
+ icon = 'icons/obj/economy.dmi'
+ icon_state = "bounty_cube"
+ ///Value of the bounty that this bounty cube sells for.
+ var/bounty_value = 0
+ ///Who completed the bounty.
+ var/bounty_holder
+ ///What the bounty was for.
+ var/bounty_name
+ ///Multiplier for the bounty payout received by the Supply budget if the cube is sent without having to nag.
+ var/speed_bonus = 0.2
+ ///Multiplier for the bounty payout received by the person who completed the bounty.
+ var/holder_cut = 0.3
+ ///Multiplier for the bounty payout received by the person who claims the handling tip.
+ var/handler_tip = 0.1
+ ///Time between nags.
+ var/nag_cooldown = 5 MINUTES
+ ///How much the time between nags extends each nag.
+ var/nag_cooldown_multiplier = 1.25
+ ///Next world tick to nag Supply listeners.
+ var/next_nag_time
+ ///What job the bounty holder had.
+ var/bounty_holder_job
+ ///Bank account of the person who receives the handling tip.
+ var/datum/bank_account/bounty_handler_account
+ ///Bank account of the person who completed the bounty.
+ var/datum/bank_account/bounty_holder_account
+ ///Our internal radio.
+ var/obj/item/radio/radio
+ ///The key our internal radio uses.
+ var/radio_key = /obj/item/encryptionkey/headset_cargo
+
+/obj/item/bounty_cube/Initialize()
+ . = ..()
+ radio = new(src)
+ radio.keyslot = new radio_key
+ radio.listening = FALSE
+ radio.recalculateChannels()
+
+/obj/item/bounty_cube/Destroy()
+ QDEL_NULL(radio)
+ . = ..()
+
+/obj/item/bounty_cube/examine()
+ . = ..()
+ if(speed_bonus)
+ . += "[time2text(next_nag_time - world.time,"mm:ss")] remains until [bounty_value * speed_bonus] credit speedy delivery bonus lost."
+ if(handler_tip && !bounty_handler_account)
+ . += "Scan this in the cargo shuttle with an export scanner to register your bank account for the [bounty_value * handler_tip] credit handling tip."
+
+/obj/item/bounty_cube/process(delta_time)
+ if(COOLDOWN_FINISHED(src, next_nag_time))
+ if(!is_centcom_level(z) && !is_reserved_level(z)) //don't send message if we're on Centcom or in transit
+ radio.talk_into(src, "Unsent in [get_area(src)].[speed_bonus ? " Speedy delivery bonus of [bounty_value * speed_bonus] credit\s lost." : ""]", RADIO_CHANNEL_SUPPLY)
+ speed_bonus = 0
+ bounty_holder_account.bank_card_talk("\The [src] is unsent in [get_area(src)].")
+ if(bounty_handler_account)
+ bounty_handler_account.bank_card_talk("\The [src] is unsent in [get_area(src)].")
+ nag_cooldown = nag_cooldown * nag_cooldown_multiplier
+ COOLDOWN_START(src, next_nag_time, nag_cooldown)
+
+/obj/item/bounty_cube/proc/set_up(datum/bounty/my_bounty, obj/item/card/id/holder_id)
+ bounty_value = my_bounty.reward
+ bounty_name = my_bounty.name
+ bounty_holder = holder_id.registered_name
+ bounty_holder_job = holder_id.assignment
+ bounty_holder_account = holder_id.registered_account
+ name = "\improper [bounty_value] cr [name]"
+ desc += " The sales tag indicates it was [bounty_holder] ([bounty_holder_job])'s reward for completing the [bounty_name] bounty."
+ AddComponent(/datum/component/pricetag, holder_id.registered_account, holder_cut)
+ START_PROCESSING(SSobj, src)
+ COOLDOWN_START(src, next_nag_time, nag_cooldown)
+ radio.talk_into(src,"Created in [get_area(src)] by [bounty_holder] ([bounty_holder_job]). Speedy delivery bonus lost in [time2text(next_nag_time - world.time,"mm:ss")].", RADIO_CHANNEL_SUPPLY)
+
+//for when you need a REAL bounty cube to test with and don't want to do a bounty each time your code changes
+/obj/item/bounty_cube/test_cube
+ name = "debug bounty cube"
+ desc = "Use in-hand to set it up with a random bounty. Requires an ID it can detect with a bank account attached. \
+ This will alert Supply over the radio with your name and location, and cargo techs will be dispatched to your location with kill on sight clearance."
+ var/set_up = FALSE
+
+/obj/item/bounty_cube/test_cube/attack_self(mob/user)
+ if(!isliving(user))
+ to_chat(user, "You aren't eligible to use this!")
+ return ..()
+
+ if(!set_up)
+ var/mob/living/squeezer = user
+ if(squeezer.get_bank_account())
+ set_up(random_bounty(), squeezer.get_idcard())
+ set_up = TRUE
+ return ..()
+ to_chat(user, "It can't detect your bank account.")
+
+ return ..()
+
+
+///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/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index cc9fc8c2b3..7033284a86 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -311,3 +311,9 @@
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
mergeable_decal = TRUE
persistent = TRUE
+
+/obj/effect/decal/cleanable/wrapping
+ name = "wrapping shreds"
+ desc = "Torn pieces of cardboard and paper, left over from a package."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "paper_shreds"
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..382764c586 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -348,9 +348,9 @@
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
/obj/item/circuitboard/computer/security/shuttle
name = "Shuttlelinking Security Cameras (Computer Board)"
@@ -581,10 +581,6 @@
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/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/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm
index 6ae63e640f..c969e2d1d4 100644
--- a/code/game/objects/items/stacks/wrap.dm
+++ b/code/game/objects/items/stacks/wrap.dm
@@ -20,6 +20,9 @@
if(QDELETED(src) && !transfer)
new /obj/item/c_tube(T)
+/obj/item/stack/wrapping_paper/small
+ desc = "Wrap packages with this festive paper to make gifts. This roll looks a bit skimpy."
+ amount = 10
/*
* Package Wrap
@@ -121,6 +124,11 @@
if(QDELETED(src) && !transfer)
new /obj/item/c_tube(T)
+/obj/item/stack/packageWrap/small
+ desc = "You can use this to wrap items in. This roll looks a bit skimpy."
+ w_class = WEIGHT_CLASS_SMALL
+ amount = 5
+
/obj/item/c_tube
name = "cardboard tube"
desc = "A tube... of cardboard."
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index 79280faca6..a2ab0c2ff4 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -1456,3 +1456,18 @@
/obj/item/storage/box/strange_seeds_5pack/PopulateContents()
for(var/i in 1 to 5)
new /obj/item/seeds/random(src)
+
+/obj/item/storage/box/shipping
+ name = "box of shipping supplies"
+ desc = "Contains several scanners and labelers for shipping things. Wrapping Paper not included."
+ illustration = "shipping"
+
+/obj/item/storage/box/shipping/PopulateContents()
+ var/static/items_inside = list(
+ /obj/item/destTagger=1,\
+ /obj/item/sales_tagger=1,\
+ /obj/item/export_scanner=1,\
+ /obj/item/stack/packageWrap/small=2,\
+ /obj/item/stack/wrapping_paper/small=1
+ )
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm
index 744c01a257..a009ef20af 100644
--- a/code/modules/cargo/bounties/assistant.dm
+++ b/code/modules/cargo/bounties/assistant.dm
@@ -102,26 +102,29 @@
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..00d07c8df1 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 && (guided != CIV_JOB_RANDOM))
+ 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/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm
deleted file mode 100644
index b2ee0e0e1a..0000000000
--- a/code/modules/cargo/bounty_console.dm
+++ /dev/null
@@ -1,65 +0,0 @@
-#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/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm
index 80fd05cf8c..dcb476c459 100644
--- a/code/modules/cargo/export_scanner.dm
+++ b/code/modules/cargo/export_scanner.dm
@@ -43,5 +43,24 @@
to_chat(user, "Scanned [O], value: [price] credits[O.contents.len ? " (contents included)" : ""].")
else
to_chat(user, "Scanned [O], no export value.")
- if(bounty_ship_item_and_contents(O, dry_run=TRUE))
- to_chat(user, "Scanned item is eligible for one or more bounties.")
+
+
+ if(ishuman(user))
+ var/mob/living/carbon/human/scan_human = user
+ if(istype(O, /obj/item/bounty_cube))
+ var/obj/item/bounty_cube/cube = O
+
+ if(!istype(get_area(cube), /area/shuttle/supply))
+ to_chat(user, "Shuttle placement not detected. Handling tip not registered.")
+
+ else if(cube.bounty_handler_account)
+ to_chat(user, "Bank account for handling tip already registered!")
+
+ else if(scan_human.get_bank_account() && cube.GetComponent(/datum/component/pricetag))
+ var/datum/component/pricetag/pricetag = cube.GetComponent(/datum/component/pricetag)
+ cube.bounty_handler_account = scan_human.get_bank_account()
+ pricetag.payees[cube.bounty_handler_account] += cube.handler_tip
+ cube.bounty_handler_account.bank_card_talk("Bank account for [price ? "[price * cube.handler_tip] credit " : ""]handling tip successfully registered.")
+ cube.bounty_holder_account.bank_card_talk("[cube] was scanned in \the [get_area(cube)] by [scan_human] ([scan_human.job]).")
+ else
+ to_chat(user, "Bank account not detected. Handling tip not registered.")
diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm
index e6ed245294..66713a3053 100644
--- a/code/modules/cargo/exports.dm
+++ b/code/modules/cargo/exports.dm
@@ -33,6 +33,8 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
if(!GLOB.exports_list.len)
setupExports()
+ var/profit_ratio = 1 //Percentage that gets sent to the seller, rest goes to cargo.
+
var/list/contents = AM.GetAllContents()
var/datum/export_report/report = external_report
@@ -47,7 +49,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
if(!E)
continue
if(E.applies_to(thing, allowed_categories, apply_elastic))
- sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic)
+ sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic, profit_ratio)
report.exported_atoms += " [thing.name]"
break
if(thing.reagents?.value_multiplier)
@@ -138,9 +140,19 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
var/the_cost = get_cost(O, allowed_categories , apply_elastic)
var/amount = get_amount(O)
+ var/profit_ratio = 0
+
if(amount <=0 || the_cost <=0)
return FALSE
+ if(dry_run == FALSE)
+ if(SEND_SIGNAL(O, COMSIG_ITEM_SOLD, item_value = get_cost(O, allowed_categories , apply_elastic)) & COMSIG_ITEM_SPLIT_VALUE)
+ profit_ratio = SEND_SIGNAL(O, COMSIG_ITEM_SPLIT_PROFIT)
+ the_cost = the_cost*((100-profit_ratio)/100)
+ else
+ profit_ratio = SEND_SIGNAL(O, COMSIG_ITEM_SPLIT_PROFIT)
+ the_cost = the_cost*((100-profit_ratio)/100)
+
report.total_value[src] += the_cost
if(istype(O, /datum/export/material))
diff --git a/code/modules/cargo/exports/civilain_bounty.dm b/code/modules/cargo/exports/civilain_bounty.dm
new file mode 100644
index 0000000000..58486f176b
--- /dev/null
+++ b/code/modules/cargo/exports/civilain_bounty.dm
@@ -0,0 +1,8 @@
+/datum/export/bounty_box
+ cost = 1
+ k_elasticity = 0 //Bounties are non-elastic funds.
+ unit_name = "completed bounty cube"
+ export_types = list(/obj/item/bounty_cube)
+
+/datum/export/bounty_box/get_cost(obj/item/bounty_cube/cube, allowed_categories, apply_elastic)
+ return cube.bounty_value + (cube.bounty_value * (cube.speed_bonus / 100))
diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm
index e8b6498c36..18fdfd2667 100644
--- a/code/modules/economy/account.dm
+++ b/code/modules/economy/account.dm
@@ -10,6 +10,9 @@
var/account_id
var/being_dumped = FALSE //pink levels are rising
var/withdrawDelay = 0
+ var/datum/bounty/civilian_bounty
+ var/list/datum/bounty/bounties
+ COOLDOWN_DECLARE(bounty_timer)
/datum/bank_account/New(newname, job)
if(add_to_accounts)
@@ -100,6 +103,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
+ COOLDOWN_RESET(src, bounty_timer)
+
/datum/bank_account/department
account_holder = "Guild Credit Agency"
var/department_id = "REPLACE_ME"
diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm
index bf6026300f..188d733cd8 100644
--- a/code/modules/events/pirates.dm
+++ b/code/modules/events/pirates.dm
@@ -251,8 +251,8 @@
/obj/machinery/piratepad
name = "cargo hold pad"
icon = 'icons/obj/telescience.dmi'
- icon_state = "lpad-idle-o"
- var/idle_state = "lpad-idle-o"
+ icon_state = "lpad-idle-off"
+ var/idle_state = "lpad-idle"
var/warmup_state = "lpad-idle"
var/sending_state = "lpad-beam"
var/cargo_hold_id
@@ -264,6 +264,17 @@
I.buffer = src
return TRUE
+/obj/machinery/piratepad/screwdriver_act(mob/living/user, obj/item/screwdriver/screw)
+ . = ..()
+ if(!.)
+ return default_deconstruction_screwdriver(user, "lpad-idle-open", "lpad-idle-off", screw)
+
+/obj/machinery/piratepad/crowbar_act(mob/living/user, obj/item/tool)
+ . = ..()
+ default_deconstruction_crowbar(tool)
+ return TRUE
+
+
/obj/machinery/computer/piratepad_control
name = "cargo hold control terminal"
var/status_report = "Ready for delivery."
@@ -274,6 +285,8 @@
var/datum/export_report/total_report
var/sending_timer
var/cargo_hold_id
+ ///Reference to the specific pad that the control computer is linked up to.
+ var/datum/weakref/pad_ref
/obj/machinery/computer/piratepad_control/Initialize(mapload)
..()
@@ -283,7 +296,7 @@
. = ..()
if (istype(I) && istype(I.buffer,/obj/machinery/piratepad))
to_chat(user, "You link [src] with [I.buffer] in [I] buffer.")
- pad = I.buffer
+ pad_ref = WEAKREF(I.buffer)
return TRUE
/obj/machinery/computer/piratepad_control/LateInitialize()
@@ -291,10 +304,11 @@
if(cargo_hold_id)
for(var/obj/machinery/piratepad/P in GLOB.machines)
if(P.cargo_hold_id == cargo_hold_id)
- pad = P
+ pad_ref = WEAKREF(P)
return
else
pad = locate() in range(4,src)
+ pad_ref = WEAKREF(pad)
/obj/machinery/computer/piratepad_control/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
@@ -305,7 +319,7 @@
/obj/machinery/computer/piratepad_control/ui_data(mob/user)
var/list/data = list()
data["points"] = points
- data["pad"] = pad ? TRUE : FALSE
+ data["pad"] = pad_ref?.resolve() ? TRUE : FALSE
data["sending"] = sending
data["status_report"] = status_report
return data
@@ -314,7 +328,7 @@
. = ..()
if(.)
return
- if(!pad)
+ if(!pad_ref?.resolve())
return
switch(action)
@@ -335,6 +349,7 @@
status_report = "Predicted value: "
var/value = 0
var/datum/export_report/ex = new
+ var/obj/machinery/piratepad/pad = pad_ref?.resolve()
for(var/atom/movable/AM in get_turf(pad))
if(AM == pad)
continue
@@ -353,6 +368,7 @@
return
var/datum/export_report/ex = new
+ var/obj/machinery/piratepad/pad = pad_ref?.resolve()
for(var/atom/movable/AM in get_turf(pad))
if(AM == pad)
@@ -390,6 +406,15 @@
sending = FALSE
/obj/machinery/computer/piratepad_control/proc/start_sending()
+ var/obj/machinery/piratepad/pad = pad_ref?.resolve()
+ if(!pad)
+ status_report = "No pad detected. Build or link a pad."
+ pad.audible_message(span_notice("[pad] beeps."))
+ return
+ if(pad?.panel_open)
+ status_report = "Please screwdrive pad closed to send. "
+ pad.audible_message(span_notice("[pad] beeps."))
+ return
if(sending)
return
sending = TRUE
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/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm
index 1f87a5265d..f8e2f74d80 100644
--- a/code/modules/jobs/job_types/cargo_technician.dm
+++ b/code/modules/jobs/job_types/cargo_technician.dm
@@ -19,6 +19,7 @@
paycheck_department = ACCOUNT_CAR
display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN
+ bounty_types = CIV_JOB_RANDOM
threat = 0.2
/datum/outfit/job/cargo_tech
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_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm
index ce05f199a2..4c38fc4cf2 100644
--- a/code/modules/jobs/job_types/head_of_personnel.dm
+++ b/code/modules/jobs/job_types/head_of_personnel.dm
@@ -33,6 +33,7 @@
ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SRV
+ bounty_types = CIV_JOB_RANDOM
display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL
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/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm
index 98343417c8..8ea7579127 100644
--- a/code/modules/jobs/job_types/quartermaster.dm
+++ b/code/modules/jobs/job_types/quartermaster.dm
@@ -27,6 +27,7 @@
ACCESS_SEC_DOORS, ACCESS_HEADS)
paycheck = PAYCHECK_HARD //They can already buy stuff using cargo budget, don't give em a command-level paycheck. //alright i'll agree to that -qweq
paycheck_department = ACCOUNT_CAR
+ bounty_types = CIV_JOB_RANDOM
display_order = JOB_DISPLAY_ORDER_QUARTERMASTER
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
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/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index a3c6294aec..2c58da29c9 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -123,17 +123,16 @@
to_chat(src, span_warning("You can't bring yourself to use a ranged weapon!"))
return FALSE
-/mob/living/carbon/human/proc/get_bank_account()
+//Returns the bank account of an ID the user may be holding.
+/mob/living/proc/get_bank_account()
RETURN_TYPE(/datum/bank_account)
var/datum/bank_account/account
var/obj/item/card/id/I = get_idcard()
- if(I && I.registered_account)
+ if(I?.registered_account)
account = I.registered_account
return account
- return FALSE
-
/mob/living/carbon/human/can_see_reagents()
. = ..()
if(.) //No need to run through all of this if it's already true.
diff --git a/code/modules/modular_computers/file_system/programs/cargobounty.dm b/code/modules/modular_computers/file_system/programs/cargobounty.dm
deleted file mode 100644
index 74ac44ade3..0000000000
--- a/code/modules/modular_computers/file_system/programs/cargobounty.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-/datum/computer_file/program/bounty
- filename = "bounty"
- filedesc = "Nanotrasen Bounty Hunter"
- program_icon_state = "bounty"
- extended_desc = "A basic interface for supply personnel to check and claim bounties."
- requires_ntnet = TRUE
- transfer_access = ACCESS_CARGO
- size = 10
- tgui_id = "NtosBountyConsole"
- ///cooldown var for printing paper sheets.
- var/printer_ready = 0
- ///The cargo account for grabbing the cargo account's credits.
- var/static/datum/bank_account/cargocash
-
-/datum/computer_file/program/bounty/proc/print_paper()
- new /obj/item/paper/bounty_printout(get_turf(computer))
-
-/datum/computer_file/program/bounty/ui_interact(mob/user, datum/tgui/ui)
- if(!GLOB.bounties_list.len)
- setup_bounties()
- printer_ready = world.time + PRINTER_TIMEOUT
- cargocash = SSeconomy.get_dep_account(ACCOUNT_CAR)
- . = ..()
-
-/datum/computer_file/program/bounty/ui_data(mob/user)
- var/list/data = get_header_data()
- 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
-
-/datum/computer_file/program/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/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 008e093b74..97a35f9312 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -7,9 +7,15 @@
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
var/giftwrapped = FALSE
var/sortTag = 0
+ var/obj/item/barcode/sticker
/obj/structure/bigDelivery/interact(mob/user)
+ to_chat(user, "You start to unwrap the package...")
+ if(!do_after(user, 15, target = user))
+ return
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ new /obj/effect/decal/cleanable/wrapping(get_turf(user))
+ unwrap_contents()
qdel(src)
/obj/structure/bigDelivery/Destroy()
@@ -18,6 +24,11 @@
AM.forceMove(T)
return ..()
+/obj/structure/bigDelivery/examine(mob/user)
+ . = ..()
+ if(sticker)
+ . += "There's a barcode attached to the side."
+
/obj/structure/bigDelivery/contents_explosion(severity, target, origin)
for(var/atom/movable/AM in contents)
AM.ex_act(severity, target, origin)
@@ -53,6 +64,47 @@
icon_state = "gift[icon_state]"
else
to_chat(user, "You need more paper!")
+ else if(istype(W, /obj/item/sales_tagger))
+ var/obj/item/sales_tagger/tagger = W
+ if(sticker)
+ to_chat(user, "This package already has a barcode attached!")
+ return
+ if(!(tagger.payments_acc))
+ to_chat(user, "Swipe an ID on [tagger] first!")
+ return
+ if(tagger.paper_count <= 0)
+ to_chat(user, "[tagger] is out of paper!")
+ return
+ user.visible_message("[user] attaches a barcode to [src].", "You attach a barcode to [src].")
+ tagger.paper_count -= 1
+ sticker = new /obj/item/barcode(src)
+ sticker.payments_acc = tagger.payments_acc //new tag gets the tagger's current account.
+ sticker.cut_multiplier = tagger.cut_multiplier //same, but for the percentage taken.
+
+ var/list/wrap_contents = src.GetAllContents()
+ for(var/obj/I in wrap_contents)
+ I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.cut_multiplier)
+ var/overlaystring = "[icon_state]_tag"
+ if(giftwrapped)
+ overlaystring = copytext(overlaystring, 5)
+ add_overlay(overlaystring)
+ else if(istype(W, /obj/item/barcode))
+ var/obj/item/barcode/stickerA = W
+ if(sticker)
+ to_chat(user, "This package already has a barcode attached!")
+ return
+ if(!(stickerA.payments_acc))
+ to_chat(user, "This barcode seems to be invalid. Guess it's trash now.")
+ return
+ if(!user.transferItemToLoc(W, src))
+ to_chat(user, "For some reason, you can't attach [W]!")
+ return
+ sticker = stickerA
+ var/overlaystring = "[icon_state]_tag"
+ if(giftwrapped)
+ overlaystring = copytext_char(overlaystring, 5) //5 == length("gift") + 1
+ add_overlay(overlaystring)
+
else
return ..()
@@ -68,11 +120,18 @@
to_chat(user, "You successfully removed [O]'s wrapping !")
O.forceMove(loc)
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ new /obj/effect/decal/cleanable/wrapping(get_turf(user))
+ unwrap_contents()
qdel(src)
else
if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
to_chat(user, "You fail to remove [O]'s wrapping!")
+/obj/structure/bigDelivery/proc/unwrap_contents()
+ if(!sticker)
+ return
+ for(var/obj/I in src.GetAllContents())
+ SEND_SIGNAL(I, COMSIG_STRUCTURE_UNWRAPPED)
/obj/item/smallDelivery
name = "parcel"
@@ -81,17 +140,23 @@
icon_state = "deliverypackage3"
var/giftwrapped = 0
var/sortTag = 0
+ var/obj/item/barcode/sticker
/obj/item/smallDelivery/contents_explosion(severity, target, origin)
for(var/atom/movable/AM in contents)
AM.ex_act(severity, target, origin)
/obj/item/smallDelivery/attack_self(mob/user)
+ to_chat(user, "You start to unwrap the package...")
+ if(!do_after(user, 15, target = user))
+ return
user.temporarilyRemoveItemFromInventory(src, TRUE)
+ unwrap_contents()
for(var/X in contents)
var/atom/movable/AM = X
user.put_in_hands(AM)
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ new /obj/effect/decal/cleanable/wrapping(get_turf(user))
qdel(src)
/obj/item/smallDelivery/attack_self_tk(mob/user)
@@ -106,6 +171,8 @@
var/atom/movable/AM = X
AM.forceMove(src.loc)
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ new /obj/effect/decal/cleanable/wrapping(get_turf(user))
+ unwrap_contents()
qdel(src)
/obj/item/smallDelivery/attackby(obj/item/W, mob/user, params)
@@ -140,6 +207,59 @@
else
to_chat(user, "You need more paper!")
+ else if(istype(W, /obj/item/sales_tagger))
+ var/obj/item/sales_tagger/tagger = W
+ if(sticker)
+ to_chat(user, "This package already has a barcode attached!")
+ return
+ if(!(tagger.payments_acc))
+ to_chat(user, "Swipe an ID on [tagger] first!")
+ return
+ if(tagger.paper_count <= 0)
+ to_chat(user, "[tagger] is out of paper!")
+ return
+ user.visible_message("[user] attaches a barcode to [src].", "You attach a barcode to [src].")
+ tagger.paper_count -= 1
+ sticker = new /obj/item/barcode(src)
+ sticker.payments_acc = tagger.payments_acc //new tag gets the tagger's current account.
+ sticker.cut_multiplier = tagger.cut_multiplier //as above, as before.
+
+ var/list/wrap_contents = src.GetAllContents()
+ for(var/obj/I in wrap_contents)
+ I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.cut_multiplier)
+ var/overlaystring = "[icon_state]_tag"
+ if(giftwrapped)
+ overlaystring = copytext(overlaystring, 5)
+ add_overlay(overlaystring)
+
+ else if(istype(W, /obj/item/barcode))
+ var/obj/item/barcode/stickerA = W
+ if(sticker)
+ to_chat(user, "This package already has a barcode attached!")
+ return
+ if(!(stickerA.payments_acc))
+ to_chat(user, "This barcode seems to be invalid. Guess it's trash now.")
+ return
+ if(!user.transferItemToLoc(W, src))
+ to_chat(user, "For some reason, you can't attach [W]!")
+ return
+ sticker = stickerA
+ var/overlaystring = "[icon_state]_tag"
+ if(giftwrapped)
+ overlaystring = copytext_char(overlaystring, 5) //5 == length("gift") + 1
+ add_overlay(overlaystring)
+
+/obj/item/smallDelivery/proc/unwrap_contents()
+ if(!sticker)
+ return
+ for(var/obj/I in src.GetAllContents())
+ SEND_SIGNAL(I, COMSIG_ITEM_UNWRAPPED)
+
+/obj/item/smallDelivery/examine(mob/user)
+ . = ..()
+ if(sticker)
+ . += "There's a barcode attached to the side."
+
/obj/item/destTagger
name = "destination tagger"
@@ -194,3 +314,98 @@
var/n = text2num(href_list["nextTag"])
currTag = n
openwindow(usr)
+
+/obj/item/sales_tagger
+ name = "sales tagger"
+ desc = "A scanner that lets you tag wrapped items for sale, splitting the profit between you and cargo."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "salestagger"
+ item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ w_class = WEIGHT_CLASS_TINY
+ slot_flags = ITEM_SLOT_BELT
+ ///The account which is recieving the split profits.
+ var/datum/bank_account/payments_acc = null
+ var/paper_count = 10
+ var/max_paper_count = 20
+ ///Details the percentage the scanned account recieves off the final sale.
+ ///The person who tagged this will receive the sale value multiplied by this number.
+ var/cut_multiplier = 0.5
+ ///Maximum value for cut_multiplier.
+ var/cut_max = 0.5
+ ///Minimum value for cut_multiplier.
+ var/cut_min = 0.01
+
+/obj/item/sales_tagger/examine(mob/user)
+ . = ..()
+ . += "[src] has [paper_count]/[max_paper_count] available barcodes. Refill with paper."
+ . += "Profit split on sale is currently set to [round(cut_multiplier*100)]%. Alt-click to change."
+ if(payments_acc)
+ . += "Ctrl-click to clear the registered account."
+
+/obj/item/sales_tagger/attackby(obj/item/I, mob/living/user, params)
+ . = ..()
+ if(istype(I, /obj/item/card/id))
+ var/obj/item/card/id/potential_acc = I
+ if(potential_acc.registered_account)
+ payments_acc = potential_acc.registered_account
+ playsound(src, 'sound/machines/ping.ogg', 40, TRUE)
+ to_chat(user, "[src] registers the ID card. Tag a wrapped item to create a barcode.")
+ else if(!potential_acc.registered_account)
+ to_chat(user, "This ID card has no account registered!")
+ return
+ else if(payments_acc != potential_acc.registered_account)
+ to_chat(user, "ID card already registered.")
+ if(istype(I, /obj/item/paper))
+ if (!(paper_count >= max_paper_count))
+ paper_count += 10
+ qdel(I)
+ if (paper_count >= max_paper_count)
+ paper_count = max_paper_count
+ to_chat(user, "[src]'s paper supply is now full.")
+ return
+ to_chat(user, "You refill [src]'s paper supply, you have [paper_count] left.")
+ return
+ else
+ to_chat(user, "[src]'s paper supply is full.")
+ return
+
+/obj/item/sales_tagger/attack_self(mob/user)
+ . = ..()
+ if(paper_count <= 0)
+ to_chat(user, "You're out of paper!'.")
+ return
+ if(!payments_acc)
+ to_chat(user, "You need to swipe [src] with an ID card first.")
+ return
+ paper_count -= 1
+ playsound(src, 'sound/machines/click.ogg', 40, TRUE)
+ to_chat(user, "You print a new barcode.")
+ var/obj/item/barcode/new_barcode = new /obj/item/barcode(src)
+ new_barcode.payments_acc = payments_acc // The sticker gets the scanner's registered account.
+ new_barcode.cut_multiplier = cut_multiplier // Also the registered percent cut.
+ user.put_in_hands(new_barcode)
+
+/obj/item/sales_tagger/CtrlClick(mob/user)
+ . = ..()
+ payments_acc = null
+ to_chat(user, "You clear the registered account.")
+
+/obj/item/sales_tagger/AltClick(mob/user)
+ . = ..()
+ var/potential_cut = input("How much would you like to pay out to the registered card?","Percentage Profit ([round(cut_min*100)]% - [round(cut_max*100)]%)") as num|null
+ if(!potential_cut)
+ cut_multiplier = initial(cut_multiplier)
+ cut_multiplier = clamp(round(potential_cut/100, cut_min), cut_min, cut_max)
+ to_chat(user, "[round(cut_multiplier*100)]% profit will be received if a package with a barcode is sold.")
+
+/obj/item/barcode
+ name = "Barcode tag"
+ desc = "A tiny tag, associated with a crewmember's account. Attach to a wrapped item to give that account a portion of the wrapped item's profit."
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "barcode"
+ w_class = WEIGHT_CLASS_TINY
+ ///All values inheirited from the sales tagger it came from.
+ var/datum/bank_account/payments_acc = null
+ var/cut_multiplier = 0.5
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm
index 78b0a365c5..fea67a921f 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm
@@ -90,3 +90,12 @@
materials = list(/datum/material/iron = 2010, /datum/material/glass = 5)
build_path = /obj/item/electronics/electrochromatic_kit
category = list("initial", "Electronics")
+
+/datum/design/salestagger
+ name = "Sales Tagger"
+ id = "salestagger"
+ build_type = AUTOLATHE | PROTOLATHE
+ materials = list(/datum/material/iron = 700, /datum/material/glass = 200)
+ build_path = /obj/item/sales_tagger
+ category = list("initial", "Electronics")
+ departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SERVICE
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..ea8e59a6b3 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,15 +17,7 @@
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."
@@ -41,3 +33,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/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm
index 8c91c09abb..92eaa2bd41 100644
--- a/code/modules/research/techweb/_techweb_node.dm
+++ b/code/modules/research/techweb/_techweb_node.dm
@@ -106,4 +106,4 @@
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand",
"space_heater", "beaker", "large_beaker", "xlarge_beaker", "bucket", "hypovial", "large_hypovial", "syringe", "pillbottle",
"sec_shellclip", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_islug", "sec_dart", "sec_38", "sec_38lethal",
- "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass")
+ "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass", "salestagger")
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/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 33cd46d15f..36402ad2d5 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 5254b53d2b..62fe5bbf92 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/economy.dmi b/icons/obj/economy.dmi
index a73f50ef7f..c8ac3c142c 100644
Binary files a/icons/obj/economy.dmi and b/icons/obj/economy.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 2c926ef639..27ad84b1a4 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi
index 1e60c01131..b342d2db71 100644
Binary files a/icons/obj/telescience.dmi and b/icons/obj/telescience.dmi differ
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 8d0bcde685..c45ca0f83f 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -564,6 +564,7 @@
#include "code\datums\components\paintable.dm"
#include "code\datums\components\pellet_cloud.dm"
#include "code\datums\components\phantomthief.dm"
+#include "code\datums\components\pricetag.dm"
#include "code\datums\components\rad_insulation.dm"
#include "code\datums\components\radioactive.dm"
#include "code\datums\components\remote_materials.dm"
@@ -900,6 +901,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"
@@ -1938,7 +1940,6 @@
#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"
@@ -1975,6 +1976,7 @@
#include "code\modules\cargo\bounties\slime.dm"
#include "code\modules\cargo\bounties\special.dm"
#include "code\modules\cargo\bounties\virus.dm"
+#include "code\modules\cargo\exports\civilain_bounty.dm"
#include "code\modules\cargo\exports\engineering.dm"
#include "code\modules\cargo\exports\food_wine.dm"
#include "code\modules\cargo\exports\gear.dm"
@@ -2517,7 +2519,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"
@@ -2975,7 +2976,6 @@
#include "code\modules\modular_computers\file_system\programs\borg_monitor.dm"
#include "code\modules\modular_computers\file_system\programs\budgetordering.dm"
#include "code\modules\modular_computers\file_system\programs\card.dm"
-#include "code\modules\modular_computers\file_system\programs\cargobounty.dm"
#include "code\modules\modular_computers\file_system\programs\configurator.dm"
#include "code\modules\modular_computers\file_system\programs\crewmanifest.dm"
#include "code\modules\modular_computers\file_system\programs\file_browser.dm"
diff --git a/tgui/packages/tgui/interfaces/CargoBountyConsole.js b/tgui/packages/tgui/interfaces/CargoBountyConsole.js
deleted file mode 100644
index ad485231eb..0000000000
--- a/tgui/packages/tgui/interfaces/CargoBountyConsole.js
+++ /dev/null
@@ -1,119 +0,0 @@
-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/CivCargoHoldTerminal.js b/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.js
index 42fc0d8bbb..fb6954a347 100644
--- a/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.js
+++ b/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.js
@@ -1,75 +1,63 @@
-import { Fragment } from 'inferno';
import { useBackend } from '../backend';
-import { Button, Flex, LabeledList, NoticeBox, Section } from '../components';
+import { Box, Button, Flex, LabeledList, NoticeBox, Section } from '../components';
import { Window } from '../layouts';
export const CivCargoHoldTerminal = (props, context) => {
const { act, data } = useBackend(context);
- const {
- pad,
- sending,
- status_report,
- id_inserted,
- id_bounty_info,
- id_bounty_value,
- id_bounty_num,
- } = data;
- const in_text = "Welcome valued employee.";
- const out_text = "To begin, insert your ID into the console.";
+ const { pad, sending, status_report, id_inserted, id_bounty_info, picking } =
+ data;
+ const in_text = 'Welcome valued employee.';
+ const out_text = 'To begin, insert your ID into the console.';
return (
-
+
-
+
{id_inserted ? in_text : out_text}
-
+
+ act('recalc')}
+ />
+ act(sending ? 'stop' : 'send')}
+ />
+ act('bounty')}
+ />
+ act('eject')}
+ />
+ >
+ }>
-
- {pad ? "Online" : "Not Found"}
+
+ {pad ? 'Online' : 'Not Found'}
{status_report}
-
-
-
-
- act('recalc')} />
- act(sending ? 'stop' : 'send')} />
- act('bounty')} />
- act('eject')} />
-
+ {picking ? : }
@@ -79,12 +67,8 @@ export const CivCargoHoldTerminal = (props, context) => {
const BountyTextBox = (props, context) => {
const { data } = useBackend(context);
- const {
- id_bounty_info,
- id_bounty_value,
- id_bounty_num,
- } = data;
- const na_text = "N/A, please add a new bounty.";
+ const { id_bounty_info, id_bounty_value, id_bounty_num } = data;
+ const na_text = 'N/A, please add a new bounty.';
return (
@@ -92,12 +76,50 @@ const BountyTextBox = (props, context) => {
{id_bounty_info ? id_bounty_info : na_text}
- {id_bounty_info ? id_bounty_num : "N/A"}
+ {id_bounty_info ? id_bounty_num : 'N/A'}
- {id_bounty_info ? id_bounty_value : "N/A"}
+ {id_bounty_info ? id_bounty_value : 'N/A'}
);
};
+
+const BountyPickBox = (props, context) => {
+ const { act, data } = useBackend(context);
+ const { id_bounty_names, id_bounty_values } = data;
+ return (
+
+
+
+ act('pick', { 'value': 1 })}>
+ Payout: {id_bounty_values[0]} cr
+
+
+
+ act('pick', { 'value': 2 })}>
+ Payout: {id_bounty_values[1]} cr
+
+
+
+ act('pick', { 'value': 3 })}>
+ Payout: {id_bounty_values[2]} cr
+
+
+
+
+ );
+};
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.
-
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/NtosBountyConsole.js b/tgui/packages/tgui/interfaces/NtosBountyConsole.js
deleted file mode 100644
index bfd2b0e4c9..0000000000
--- a/tgui/packages/tgui/interfaces/NtosBountyConsole.js
+++ /dev/null
@@ -1,119 +0,0 @@
-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'}
-
- );
-};