diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index b22c9787ba..dab9d0316b 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -61,8 +61,7 @@
},
/obj/structure/sign/barsign{
pixel_y = -32;
- req_access = null;
- req_access_txt = "0"
+ req_access = null
},
/turf/open/floor/wood,
/area/ruin/unpowered/syndicate_lava_base/bar)
@@ -212,7 +211,6 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/computer/arcade/orion_trail{
- icon_state = "arcade";
dir = 1
},
/turf/open/floor/plasteel/dark,
@@ -270,7 +268,6 @@
dir = 4
},
/obj/machinery/firealarm{
- dir = 2;
pixel_y = 24
},
/obj/machinery/light/small{
@@ -1501,7 +1498,6 @@
/area/ruin/unpowered/syndicate_lava_base/virology)
"fk" = (
/obj/machinery/power/apc/syndicate{
- dir = 2;
name = "Experimentation Lab APC";
pixel_y = -24
},
@@ -1565,15 +1561,10 @@
/obj/machinery/door/firedoor,
/obj/structure/table/reinforced,
/obj/machinery/door/window/southleft{
- base_state = "left";
- dir = 2;
- icon_state = "left";
name = "Chemistry"
},
/obj/machinery/door/window/southleft{
- base_state = "left";
dir = 1;
- icon_state = "left";
name = "Chemistry";
req_access_txt = "150"
},
@@ -1968,9 +1959,7 @@
/area/ruin/unpowered/syndicate_lava_base/virology)
"gs" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 2
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
/obj/machinery/light/small,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/white,
@@ -2153,9 +2142,7 @@
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 2
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-8"
},
@@ -2864,7 +2851,6 @@
/area/ruin/unpowered/syndicate_lava_base/main)
"ib" = (
/obj/effect/mob_spawn/human/lavaland_syndicate{
- icon_state = "sleeper_s";
dir = 4
},
/turf/open/floor/plasteel/grimy,
@@ -2904,8 +2890,7 @@
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"ie" = (
/obj/effect/mob_spawn/human/lavaland_syndicate/comms{
- dir = 8;
- icon_state = "sleeper_s"
+ dir = 8
},
/turf/open/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
@@ -3029,10 +3014,10 @@
dir = 1
},
/obj/machinery/turretid{
+ ailock = 1;
control_area = "/area/ruin/unpowered/syndicate_lava_base/main";
dir = 1;
icon_state = "control_kill";
- ailock = 1;
lethal = 1;
name = "Base turret controls";
pixel_y = 30;
@@ -3149,7 +3134,6 @@
dir = 1
},
/obj/machinery/firealarm{
- dir = 2;
pixel_y = 24
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
@@ -3321,9 +3305,7 @@
"iT" = (
/obj/machinery/light/small,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 2
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -3356,7 +3338,6 @@
dir = 4
},
/obj/machinery/power/apc/syndicate{
- dir = 2;
name = "Dormitories APC";
pixel_y = -24
},
@@ -3565,7 +3546,6 @@
/area/ruin/unpowered/syndicate_lava_base/main)
"jn" = (
/obj/effect/mob_spawn/human/lavaland_syndicate{
- icon_state = "sleeper_s";
dir = 4
},
/obj/machinery/airalarm/syndicate{
@@ -3591,8 +3571,7 @@
/area/ruin/unpowered/syndicate_lava_base/main)
"jq" = (
/obj/effect/mob_spawn/human/lavaland_syndicate{
- dir = 8;
- icon_state = "sleeper_s"
+ dir = 8
},
/obj/machinery/airalarm/syndicate{
pixel_y = 24
@@ -3986,9 +3965,7 @@
/area/ruin/unpowered/syndicate_lava_base/main)
"kd" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 2
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-4"
},
@@ -4059,9 +4036,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 2
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/main)
"kj" = (
@@ -4247,8 +4222,10 @@
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible,
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/visible/layer3,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible/layer3{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"kA" = (
@@ -4266,11 +4243,9 @@
/obj/structure/cable/yellow{
icon_state = "0-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
- dir = 9
- },
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"kB" = (
@@ -4285,6 +4260,7 @@
/obj/machinery/computer/atmos_control/tank{
dir = 8;
frequency = 1442;
+ input_tag = "syndie_lavaland_n2_in";
name = "Nitrogen Supply Control";
output_tag = "syndie_lavaland_n2_out";
sensors = list("syndie_lavaland_n2_sensor" = "Tank")
@@ -4477,12 +4453,19 @@
/obj/machinery/atmospherics/pipe/simple/supply/visible{
dir = 5
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{
+ dir = 1;
+ piping_layer = 3
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"kY" = (
/obj/machinery/atmospherics/pipe/manifold4w/supply/visible,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"kZ" = (
@@ -4490,6 +4473,9 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"la" = (
@@ -4503,6 +4489,9 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lb" = (
@@ -4511,6 +4500,9 @@
/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 10
+ },
/turf/open/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lc" = (
@@ -4523,6 +4515,11 @@
/turf/open/floor/plating/airless,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"ld" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/layer3{
+ dir = 4;
+ id = "syndie_lavaland_n2_in";
+ piping_layer = 3
+ },
/turf/open/floor/plating/airless,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"le" = (
@@ -4676,15 +4673,24 @@
/turf/open/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3,
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 10
+ },
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"ls" = (
/obj/machinery/atmospherics/pipe/simple/supply/visible,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lt" = (
/obj/machinery/atmospherics/pipe/simple/supplymain/visible,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lu" = (
@@ -4694,6 +4700,9 @@
/obj/machinery/portable_atmospherics/scrubber,
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 10
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lv" = (
@@ -4848,29 +4857,33 @@
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lM" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/components/unary/outlet_injector/layer3{
+ id = "syndie_lavaland_tox_in";
+ piping_layer = 3
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 4
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plating/airless,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
- dir = 9
+/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2{
+ dir = 1;
+ piping_layer = 3
},
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lO" = (
/obj/machinery/atmospherics/pipe/simple/supply/visible,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lP" = (
/obj/machinery/computer/atmos_control/tank{
dir = 8;
frequency = 1442;
+ input_tag = "syndie_lavaland_o2_in";
name = "Oxygen Supply Control";
output_tag = "syndie_lavaland_o2_out";
sensors = list("syndie_lavaland_o2_sensor" = "Tank")
@@ -4879,12 +4892,15 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 5
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"lQ" = (
/obj/machinery/air_sensor{
frequency = 1442;
- id_tag = "Syndicate_Construction_o2_sensor"
+ id_tag = "syndie_lavaland_o2_sensor"
},
/turf/open/floor/plating/airless,
/area/ruin/unpowered/syndicate_lava_base/engineering)
@@ -5083,6 +5099,9 @@
dir = 6
},
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 5
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"mj" = (
@@ -5093,11 +5112,15 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/visible,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 9
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"mk" = (
/obj/machinery/atmospherics/pipe/manifold/supplymain/visible,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3,
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"ml" = (
@@ -5170,7 +5193,6 @@
/obj/machinery/light/small,
/obj/structure/cable/yellow,
/obj/machinery/power/apc/syndicate{
- dir = 2;
name = "Bar APC";
pixel_y = -24
},
@@ -5297,6 +5319,9 @@
/obj/structure/reagent_dispensers/watertank,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 5
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"mK" = (
@@ -5304,12 +5329,16 @@
/obj/machinery/computer/atmos_control/tank{
dir = 1;
frequency = 1442;
+ input_tag = "syndie_lavaland_tox_in";
name = "Toxins Supply Control";
output_tag = "syndie_lavaland_tox_out";
sensors = list("syndie_lavaland_tox_sensor" = "Tank")
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"mM" = (
@@ -5700,9 +5729,7 @@
/area/ruin/unpowered/syndicate_lava_base/arrivals)
"nw" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
- dir = 2
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
/obj/structure/cable/yellow{
icon_state = "1-4"
},
@@ -5998,7 +6025,6 @@
dir = 4
},
/obj/machinery/firealarm{
- dir = 2;
pixel_y = 24
},
/obj/structure/cable/yellow{
@@ -6212,7 +6238,6 @@
},
/obj/structure/cable/yellow,
/obj/machinery/power/apc/syndicate{
- dir = 2;
name = "Telecommunications APC";
pixel_y = -24
},
@@ -6391,7 +6416,6 @@
"oG" = (
/obj/structure/cable,
/obj/machinery/power/turbine{
- dir = 2;
luminosity = 2
},
/turf/open/floor/engine/vacuum,
@@ -6413,6 +6437,21 @@
/obj/structure/sign/departments/chemistry,
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/testlab)
+"pC" = (
+/obj/structure/grille,
+/obj/structure/window/plastitanium,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
+"qc" = (
+/obj/machinery/atmospherics/pipe/simple/supplymain/visible,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{
+ dir = 10
+ },
+/turf/open/floor/plasteel,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
"tW" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall/mineral/plastitanium/nodiagonal,
@@ -6466,12 +6505,29 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/arrivals)
+"Gm" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
+"Go" = (
+/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{
+ dir = 1;
+ piping_layer = 3
+ },
+/turf/open/floor/plasteel,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
"IJ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
dir = 1
},
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/engineering)
+"KA" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 4
+ },
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
"Lg" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
dir = 4
@@ -6487,6 +6543,12 @@
/obj/effect/decal/cleanable/dirt,
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/circuits)
+"Ng" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 9
+ },
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
"Pa" = (
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/circuits)
@@ -6520,6 +6582,14 @@
},
/turf/open/floor/engine,
/area/ruin/unpowered/syndicate_lava_base/testlab)
+"Tt" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/layer3{
+ dir = 4;
+ id = "syndie_lavaland_o2_in";
+ piping_layer = 3
+ },
+/turf/open/floor/plating/airless,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
"TC" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
dir = 4
@@ -6529,6 +6599,24 @@
},
/turf/open/floor/engine,
/area/ruin/unpowered/syndicate_lava_base/testlab)
+"Vw" = (
+/obj/structure/grille,
+/obj/structure/window/plastitanium,
+/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
+/turf/open/floor/plating,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
+"Wq" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
+ dir = 10
+ },
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
(1,1,1) = {"
aa
@@ -8363,7 +8451,7 @@ ju
ky
kW
lq
-lM
+mh
mh
mG
nd
@@ -8412,8 +8500,8 @@ jW
kk
kz
kX
-lr
lN
+Go
mi
mH
ne
@@ -8513,13 +8601,13 @@ km
kB
kZ
lt
-lt
+qc
mk
mJ
ng
nF
-ld
-ju
+lM
+uB
ab
ab
ab
@@ -8569,7 +8657,7 @@ mK
kD
nG
og
-ju
+KA
ab
ab
ab
@@ -8612,14 +8700,14 @@ ab
ju
kD
lb
-ju
-kD
-lb
-ju
-ju
-ju
-ju
-ju
+uB
+pC
+Vw
+Wq
+Gm
+Gm
+Gm
+Ng
ab
ab
ab
@@ -8662,10 +8750,10 @@ ab
ju
kE
lc
-ju
+KA
lQ
mm
-ju
+KA
ab
ab
ab
@@ -8712,10 +8800,10 @@ ab
ju
kF
ld
-ju
+KA
lR
-ld
-ju
+Tt
+KA
ab
ab
ab
@@ -8761,11 +8849,11 @@ ab
ab
ju
ju
+lr
+Ng
ju
-ju
-ju
-ju
-ju
+lr
+Ng
ab
ab
ab
diff --git a/_maps/RandomRuins/SpaceRuinsStation/roid7.dmm b/_maps/RandomRuins/SpaceRuinsStation/roid7.dmm
index d694fc7c9f..9cc192efc7 100644
--- a/_maps/RandomRuins/SpaceRuinsStation/roid7.dmm
+++ b/_maps/RandomRuins/SpaceRuinsStation/roid7.dmm
@@ -168,7 +168,7 @@
/turf/template_noop,
/area/template_noop)
"H" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/turf/open/floor/plasteel/airless/cafeteria,
/area/ruin/space)
"I" = (
diff --git a/_maps/RandomZLevels/away_mission/TheBeach.dmm b/_maps/RandomZLevels/away_mission/TheBeach.dmm
index cc9f50d029..5430d8dd92 100644
--- a/_maps/RandomZLevels/away_mission/TheBeach.dmm
+++ b/_maps/RandomZLevels/away_mission/TheBeach.dmm
@@ -799,7 +799,7 @@
/turf/open/floor/wood,
/area/awaymission/beach)
"cn" = (
-/obj/machinery/vending/boozeomat/all_access{
+/obj/machinery/vending/boozeomat{
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts."
},
/turf/open/floor/wood,
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 75efefd8e1..9e45f23424 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -18338,7 +18338,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aQV" = (
-/obj/machinery/vending/autodrobe/all_access,
+/obj/machinery/vending/autodrobe,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -24736,9 +24736,6 @@
/obj/machinery/camera{
c_tag = "Chemistry"
},
-/obj/machinery/firealarm{
- pixel_y = 24
- },
/obj/machinery/chem_heater,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
@@ -27778,6 +27775,10 @@
/obj/machinery/light{
dir = 8
},
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = -24
+ },
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"boc" = (
@@ -39446,14 +39447,6 @@
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bPh" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/layer_manifold{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
"bPi" = (
/obj/machinery/light{
dir = 4
@@ -41478,13 +41471,6 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bUO" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bUR" = (
/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel,
@@ -55361,14 +55347,6 @@
/obj/effect/turf_decal/tile/green,
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
-"ivJ" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/layer_manifold{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
"iwB" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -56424,7 +56402,7 @@
},
/area/maintenance/bar)
"lsk" = (
-/obj/machinery/vending/autodrobe/all_access,
+/obj/machinery/vending/autodrobe,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"ltK" = (
@@ -58873,7 +58851,7 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"sXA" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/turf/closed/wall,
/area/maintenance/bar)
"sXV" = (
@@ -93957,7 +93935,7 @@ bMQ
bRC
rdl
daq
-bUO
+bUN
bOd
bOd
bOd
@@ -94214,7 +94192,7 @@ cBF
bRD
rdl
daq
-bUO
+bUN
bOd
bOd
bOd
@@ -94471,7 +94449,7 @@ bQs
cez
ceA
daq
-bUO
+bUN
bOd
bOd
bOd
@@ -96008,19 +95986,19 @@ bKH
bLK
bLK
bOf
-ivJ
+bPh
bQy
bRI
bSP
-ivJ
+bPh
jzM
bRI
cCF
-ivJ
+bPh
bQy
bRI
bQy
-ivJ
+bPh
bQy
bRI
bSP
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 02e44d0a5a..104cee0b9d 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -11361,7 +11361,7 @@
"ayW" = (
/obj/machinery/light/small,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/vending/autodrobe/all_access,
+/obj/machinery/vending/autodrobe,
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -81511,7 +81511,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/locker)
"cGO" = (
-/obj/machinery/vending/autodrobe/all_access,
+/obj/machinery/vending/autodrobe,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -108635,7 +108635,7 @@
/obj/structure/sign/poster/contraband/random{
pixel_y = -32
},
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
"dBS" = (
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index a18d3ab68e..5455070754 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -18490,7 +18490,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aQV" = (
-/obj/machinery/vending/autodrobe/all_access,
+/obj/machinery/vending/autodrobe,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -24888,9 +24888,6 @@
/obj/machinery/camera{
c_tag = "Chemistry"
},
-/obj/machinery/firealarm{
- pixel_y = 24
- },
/obj/machinery/chem_heater,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
@@ -27915,6 +27912,10 @@
/obj/machinery/light{
dir = 8
},
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = -24
+ },
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"boc" = (
@@ -56834,7 +56835,7 @@
/turf/open/floor/engine,
/area/engine/engineering)
"lsk" = (
-/obj/machinery/vending/autodrobe/all_access,
+/obj/machinery/vending/autodrobe,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"ltK" = (
@@ -59723,7 +59724,7 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"sXA" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/turf/closed/wall,
/area/maintenance/bar)
"sXV" = (
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index a87ea077b3..e3f4b18103 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -54029,7 +54029,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/machinery/vending/autodrobe/all_access,
+/obj/machinery/vending/autodrobe,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/locker)
@@ -78316,7 +78316,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/machinery/vending/autodrobe/all_access,
+/obj/machinery/vending/autodrobe,
/obj/structure/noticeboard{
dir = 4;
pixel_x = -27
@@ -84861,7 +84861,7 @@
/turf/open/floor/engine,
/area/engine/engineering)
"iLn" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/turf/open/floor/wood,
/area/maintenance/port/fore)
"iMb" = (
diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm
index 5d9018f4cc..6bb3807ea4 100644
--- a/_maps/map_files/LambdaStation/lambda.dmm
+++ b/_maps/map_files/LambdaStation/lambda.dmm
@@ -45021,7 +45021,7 @@
/turf/open/floor/wood,
/area/maintenance/bar)
"bGM" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/turf/open/floor/wood,
/area/maintenance/bar)
"bGN" = (
@@ -47241,7 +47241,6 @@
/area/hydroponics/garden/abandoned)
"bKT" = (
/obj/item/poster/random_contraband,
-/turf/open/floor/plating,
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
@@ -58598,7 +58597,7 @@
/turf/open/space,
/area/space/nearstation)
"cgJ" = (
-/obj/machinery/vending/autodrobe/all_access,
+/obj/machinery/vending/autodrobe,
/turf/open/floor/plating,
/area/maintenance/aft)
"cgK" = (
@@ -62158,7 +62157,6 @@
/obj/structure/cable{
icon_state = "0-4"
},
-/turf/open/floor/plating,
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
@@ -63619,7 +63617,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/plating,
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
@@ -72658,7 +72655,7 @@
/turf/open/floor/plasteel/grimy,
/area/bridge)
"cIV" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/obj/machinery/status_display/evac{
pixel_y = 32
},
@@ -75970,7 +75967,6 @@
},
/area/maintenance/department/medical)
"cPo" = (
-/turf/open/floor/plating,
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
@@ -76073,7 +76069,6 @@
},
/area/maintenance/fore/secondary)
"cPB" = (
-/turf/open/floor/plating,
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
@@ -76098,17 +76093,10 @@
},
/area/maintenance/department/crew_quarters/dorms)
"cPE" = (
-/turf/open/floor/plating,
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
/area/maintenance/department/crew_quarters/dorms)
-"cPF" = (
-/turf/open/floor/plating,
-/turf/open/floor/plating{
- icon_state = "platingdmg2"
- },
-/area/maintenance/aft)
"cPG" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -115439,7 +115427,7 @@ cgm
thv
uRw
boU
-cPF
+cfm
chI
cqg
cWW
@@ -118541,7 +118529,7 @@ aaA
ceG
cqt
bYa
-cPF
+cfm
ceG
aaA
aaA
@@ -119299,7 +119287,7 @@ cQK
bYa
bYa
cRQ
-cPF
+cfm
chI
cRv
bYa
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 9d36d26f6f..40a9cd9842 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -45054,7 +45054,7 @@
/turf/open/floor/plating,
/area/maintenance/port)
"bLe" = (
-/obj/machinery/vending/autodrobe/all_access,
+/obj/machinery/vending/autodrobe,
/turf/open/floor/plating,
/area/maintenance/port)
"bLf" = (
@@ -57077,7 +57077,7 @@
/turf/open/floor/plating/airless,
/area/engine/atmos)
"cjp" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/turf/open/floor/wood,
/area/maintenance/port/aft)
"cjq" = (
diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm
index feb8fc8cc0..40d02bcd0c 100644
--- a/_maps/map_files/debug/runtimestation.dmm
+++ b/_maps/map_files/debug/runtimestation.dmm
@@ -2526,7 +2526,6 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
-/turf/open/space/basic,
/turf/open/floor/carpet/blackred,
/area/crew_quarters/bar)
"gR" = (
@@ -2806,7 +2805,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/space/basic,
/turf/open/floor/carpet/blackred,
/area/crew_quarters/bar)
"vP" = (
@@ -2832,7 +2830,6 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"wf" = (
-/turf/open/space/basic,
/turf/open/floor/carpet/blackred,
/area/crew_quarters/bar)
"wS" = (
@@ -2854,7 +2851,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/space/basic,
/turf/open/floor/carpet/blackred,
/area/crew_quarters/bar)
"xh" = (
@@ -2869,7 +2865,6 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/space/basic,
/turf/open/floor/carpet/blackred,
/area/crew_quarters/bar)
"yt" = (
@@ -3002,7 +2997,7 @@
/turf/open/floor/grass,
/area/hydroponics)
"Ga" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/obj/machinery/airalarm{
dir = 8;
pixel_x = 24
@@ -3041,7 +3036,6 @@
/area/bridge)
"IB" = (
/obj/structure/chair/stool/bar,
-/turf/open/space/basic,
/turf/open/floor/carpet/blackred,
/area/crew_quarters/bar)
"JF" = (
@@ -3086,7 +3080,6 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
-/turf/open/space/basic,
/turf/open/floor/carpet/blackred,
/area/crew_quarters/bar)
"Ly" = (
@@ -3115,7 +3108,6 @@
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/space/basic,
/turf/open/floor/carpet/blackred,
/area/crew_quarters/bar)
"MS" = (
@@ -3334,7 +3326,6 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
-/turf/open/space/basic,
/turf/open/floor/carpet/blackred,
/area/crew_quarters/bar)
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index d015547ac4..633a998fdb 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -13278,7 +13278,7 @@
/turf/open/floor/engine/cult,
/area/wizard_station)
"ED" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/turf/closed/indestructible{
icon = 'icons/turf/walls/wood_wall.dmi';
icon_state = "wood";
@@ -17650,7 +17650,7 @@
/turf/open/floor/wood,
/area/syndicate_mothership)
"Sj" = (
-/obj/machinery/vending/autodrobe/all_access{
+/obj/machinery/vending/autodrobe{
extended_inventory = 1
},
/obj/machinery/light,
diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm
index 2834f0c93f..a7faface75 100644
--- a/_maps/shuttles/emergency_luxury.dmm
+++ b/_maps/shuttles/emergency_luxury.dmm
@@ -422,7 +422,7 @@
/turf/open/floor/carpet/red,
/area/shuttle/escape/luxury)
"bD" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/turf/open/floor/carpet/red,
/area/shuttle/escape/luxury)
"bE" = (
diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm
index 9bd9d335c9..f664ea2c56 100644
--- a/_maps/shuttles/pirate_default.dmm
+++ b/_maps/shuttles/pirate_default.dmm
@@ -733,7 +733,7 @@
/turf/open/floor/plasteel,
/area/shuttle/pirate)
"bH" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm
index 817f337503..84d2282c37 100644
--- a/_maps/shuttles/whiteship_delta.dmm
+++ b/_maps/shuttles/whiteship_delta.dmm
@@ -145,7 +145,7 @@
/turf/open/floor/plating,
/area/shuttle/abandoned/crew)
"ap" = (
-/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/vending/boozeomat,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm
new file mode 100644
index 0000000000..bc9534f527
--- /dev/null
+++ b/code/__DEFINES/economy.dm
@@ -0,0 +1,35 @@
+#define STARTING_PAYCHECKS 5
+
+#define PAYCHECK_ASSISTANT 25
+#define PAYCHECK_MINIMAL 75
+#define PAYCHECK_EASY 125
+#define PAYCHECK_MEDIUM 175
+#define PAYCHECK_HARD 200
+#define PAYCHECK_COMMAND 250
+
+#define MAX_GRANT_CIV 2500
+#define MAX_GRANT_ENG 3000
+#define MAX_GRANT_SCI 5000
+#define MAX_GRANT_SECMEDSRV 3000
+
+#define ACCOUNT_CIV "CIV"
+#define ACCOUNT_CIV_NAME "Civil Budget"
+#define ACCOUNT_ENG "ENG"
+#define ACCOUNT_ENG_NAME "Engineering Budget"
+#define ACCOUNT_SCI "SCI"
+#define ACCOUNT_SCI_NAME "Scientific Budget"
+#define ACCOUNT_MED "MED"
+#define ACCOUNT_MED_NAME "Medical Budget"
+#define ACCOUNT_SRV "SRV"
+#define ACCOUNT_SRV_NAME "Service Budget"
+#define ACCOUNT_CAR "CAR"
+#define ACCOUNT_CAR_NAME "Cargo Budget"
+#define ACCOUNT_SEC "SEC"
+#define ACCOUNT_SEC_NAME "Defense Budget"
+
+#define NO_FREEBIES "commies go home"
+
+//ID bank account support defines.
+#define ID_NO_BANK_ACCOUNT 0
+#define ID_FREE_BANK_ACCOUNT 1
+#define ID_LOCKED_BANK_ACCOUNT 2
diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm
index 47546cac30..c5c2dd58c2 100644
--- a/code/__DEFINES/maps.dm
+++ b/code/__DEFINES/maps.dm
@@ -41,6 +41,7 @@ require only minor tweaks.
#define ZTRAIT_ICE_RUINS "Ice Ruins"
#define ZTRAIT_ICE_RUINS_UNDERGROUND "Ice Ruins Underground"
#define ZTRAIT_ISOLATED_RUINS "Isolated Ruins" //Placing ruins on z levels with this trait will use turf reservation instead of usual placement.
+#define ZTRAIT_VIRTUAL_REALITY "Virtual Reality"
//boolean - weather types that occur on the level
#define ZTRAIT_SNOWSTORM "Weather_Snowstorm"
@@ -80,6 +81,7 @@ require only minor tweaks.
ZTRAIT_BOMBCAP_MULTIPLIER = 5, \
ZTRAIT_BASETURF = /turf/open/lava/smooth/lava_land_surface)
#define ZTRAITS_REEBE list(ZTRAIT_REEBE = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 0.5)
+#define ZTRAITS_VR list(ZTRAIT_VIRTUAL_REALITY = TRUE, ZTRAIT_AWAY = TRUE)
#define DL_NAME "name"
#define DL_TRAITS "traits"
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 06926317ee..84eed5483a 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -30,8 +30,9 @@
#define CHAT_GHOSTPDA (1<<8)
#define CHAT_GHOSTRADIO (1<<9)
#define CHAT_LOOC (1<<10)
+#define CHAT_BANKCARD (1<<11)
-#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_LOOC)
+#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_LOOC|CHAT_BANKCARD)
#define PARALLAX_INSANE -1 //for show offs
#define PARALLAX_HIGH 0 //default.
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 4e0d636ae4..b7aacee528 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -64,7 +64,8 @@
#define INIT_ORDER_TICKER 55
#define INIT_ORDER_INSTRUMENTS 53
#define INIT_ORDER_MAPPING 50
-#define INIT_ORDER_NETWORKS 45
+#define INIT_ORDER_ECONOMY 45
+#define INIT_ORDER_NETWORKS 40
#define INIT_ORDER_HOLODECK 35
#define INIT_ORDER_ATOMS 30
#define INIT_ORDER_LANGUAGE 25
diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
index 5f78aeb740..86e8d1bc2b 100644
--- a/code/__HELPERS/_cit_helpers.dm
+++ b/code/__HELPERS/_cit_helpers.dm
@@ -105,16 +105,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
if(!src.holder) return
message_admins("[key_name_admin(usr)] manually reloaded mentors")
-//LOOC toggles
-/client/verb/listen_looc()
- set name = "Show/Hide LOOC"
- set category = "Preferences"
- set desc = "Toggles seeing LocalOutOfCharacter chat"
- prefs.chat_toggles ^= CHAT_LOOC
- prefs.save_preferences()
- to_chat(src, "You will [(prefs.chat_toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.")
- SSblackbox.record_feedback("tally", "admin_verb", 1, "TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
/mob/living/carbon/proc/has_penis()
var/obj/item/organ/genital/G = getorganslot(ORGAN_SLOT_PENIS)
if(G && istype(G, /obj/item/organ/genital/penis))
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index ad977ec493..c913a8ea5c 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -629,6 +629,8 @@
L["[key]"] = "[value]"
return list2params(L)
+#define NUMLIST2TEXTLIST(list) splittext(list2params(list), "&")
+
//Picks from the list, with some safeties, and returns the "default" arg if it fails
#define DEFAULTPICK(L, default) ((islist(L) && length(L)) ? pick(L) : default)
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 170d93c31f..679f89f4d2 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -506,6 +506,19 @@
return
winset(C, "mainwindow", "flash=5")
+//Recursively checks if an item is inside a given type, even through layers of storage. Returns the atom if it finds it.
+/proc/recursive_loc_check(atom/movable/target, type)
+ var/atom/A = target
+ if(istype(A, type))
+ return A
+
+ while(!istype(A.loc, type))
+ if(!A.loc)
+ return
+ A = A.loc
+
+ return A.loc
+
/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank)
if(!SSticker.IsRoundInProgress() || QDELETED(character))
return
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 13ac820778..a22f430140 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1048,6 +1048,27 @@ B --><-- A
/proc/get_random_station_turf()
return safepick(get_area_turfs(pick(GLOB.the_station_areas)))
+/proc/get_safe_random_station_turf() //excludes dense turfs (like walls) and areas that have valid_territory set to FALSE
+ for (var/i in 1 to 5)
+ var/list/L = get_area_turfs(pick(GLOB.the_station_areas))
+ var/turf/target
+ while (L.len && !target)
+ var/I = rand(1, L.len)
+ var/turf/T = L[I]
+ var/area/X = get_area(T)
+ if(!T.density && X.valid_territory)
+ var/clear = TRUE
+ for(var/obj/O in T)
+ if(O.density)
+ clear = FALSE
+ break
+ if(clear)
+ target = T
+ if (!target)
+ L.Cut(I,I+1)
+ if (target)
+ return target
+
/proc/get_closest_atom(type, list, source)
var/closest_atom
var/closest_distance
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index aacb1737a2..df83f1b4e3 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -221,3 +221,5 @@ GLOBAL_LIST_INIT(numbers_as_words, world.file2list("strings/numbers_as_words.txt
GLOBAL_LIST_INIT(station_numerals, greek_letters + phonetic_alphabet + numbers_as_words + generate_number_strings())
GLOBAL_LIST_INIT(admiral_messages, list("Do you know how expensive these stations are?","Stop wasting my time.","I was sleeping, thanks a lot.","Stand and fight you cowards!","You knew the risks coming in.","Stop being paranoid.","Whatever's broken just build a new one.","No.", "null","Error: No comment given.", "It's a good day to die!"))
+
+GLOBAL_LIST_INIT(redacted_strings, list("\[REDACTED\]", "\[CLASSIFIED\]", "\[ARCHIVED\]", "\[EXPLETIVE DELETED\]", "\[EXPUNGED\]", "\[INFORMATION ABOVE YOUR SECURITY CLEARANCE\]", "\[MOVE ALONG CITIZEN\]", "\[NOTHING TO SEE HERE\]", "\[ACCESS DENIED\]"))
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 2eefb82f97..b35f4fe0e7 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -81,6 +81,8 @@
/datum/config_entry/flag/disable_peaceborg
+/datum/config_entry/flag/economy //money money money money money money money money money money money money
+
/datum/config_entry/number/minimum_secborg_alert //Minimum alert level for secborgs to be chosen.
config_entry_value = 3
diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm
new file mode 100644
index 0000000000..078d122aa6
--- /dev/null
+++ b/code/controllers/subsystem/economy.dm
@@ -0,0 +1,139 @@
+SUBSYSTEM_DEF(economy)
+ name = "Economy"
+ wait = 5 MINUTES
+ init_order = INIT_ORDER_ECONOMY
+ runlevels = RUNLEVEL_GAME
+ var/roundstart_paychecks = 5
+ var/budget_pool = 35000
+ var/list/department_accounts = list(ACCOUNT_CIV = ACCOUNT_CIV_NAME,
+ ACCOUNT_ENG = ACCOUNT_ENG_NAME,
+ ACCOUNT_SCI = ACCOUNT_SCI_NAME,
+ ACCOUNT_MED = ACCOUNT_MED_NAME,
+ ACCOUNT_SRV = ACCOUNT_SRV_NAME,
+ ACCOUNT_CAR = ACCOUNT_CAR_NAME,
+ ACCOUNT_SEC = ACCOUNT_SEC_NAME)
+ var/list/generated_accounts = list()
+ var/full_ancap = FALSE // Enables extra money charges for things that normally would be free, such as sleepers/cryo/cloning.
+ //Take care when enabling, as players will NOT respond well if the economy is set up for low cash flows.
+ var/alive_humans_bounty = 100
+ var/crew_safety_bounty = 1500
+ var/monster_bounty = 150
+ var/mood_bounty = 100
+ var/techweb_bounty = 250
+ var/slime_bounty = list("grey" = 10,
+ // tier 1
+ "orange" = 100,
+ "metal" = 100,
+ "blue" = 100,
+ "purple" = 100,
+ // tier 2
+ "dark purple" = 500,
+ "dark blue" = 500,
+ "green" = 500,
+ "silver" = 500,
+ "gold" = 500,
+ "yellow" = 500,
+ "red" = 500,
+ "pink" = 500,
+ // tier 3
+ "cerulean" = 750,
+ "sepia" = 750,
+ "bluespace" = 750,
+ "pyrite" = 750,
+ "light pink" = 750,
+ "oil" = 750,
+ "adamantine" = 750,
+ // tier 4
+ "rainbow" = 1000)
+ var/list/bank_accounts = list() //List of normal accounts (not department accounts)
+ var/list/dep_cards = list()
+
+/datum/controller/subsystem/economy/Initialize(timeofday)
+ var/budget_to_hand_out = round(budget_pool / department_accounts.len)
+ for(var/A in department_accounts)
+ new /datum/bank_account/department(A, budget_to_hand_out)
+ return ..()
+
+/datum/controller/subsystem/economy/fire(resumed = 0)
+ eng_payout() // Payout based on nothing. What will replace it? Surplus power, powered APC's, air alarms? Who knows.
+ sci_payout() // Payout based on slimes.
+ secmedsrv_payout() // Payout based on crew safety, health, and mood.
+ civ_payout() // Payout based on ??? Profit
+ car_payout() // Cargo's natural gain in the cash moneys.
+ for(var/A in bank_accounts)
+ var/datum/bank_account/B = A
+ B.payday(1)
+
+
+/datum/controller/subsystem/economy/proc/get_dep_account(dep_id)
+ for(var/datum/bank_account/department/D in generated_accounts)
+ if(D.department_id == dep_id)
+ return D
+
+/datum/controller/subsystem/economy/proc/eng_payout()
+ var/engineering_cash = 3000
+ var/datum/bank_account/D = get_dep_account(ACCOUNT_ENG)
+ if(D)
+ D.adjust_money(engineering_cash)
+
+
+/datum/controller/subsystem/economy/proc/car_payout()
+ var/cargo_cash = 500
+ var/datum/bank_account/D = get_dep_account(ACCOUNT_CAR)
+ if(D)
+ D.adjust_money(cargo_cash)
+
+/datum/controller/subsystem/economy/proc/secmedsrv_payout()
+ var/crew
+ var/alive_crew
+ var/dead_monsters
+ var/cash_to_grant
+ for(var/mob/m in GLOB.mob_list)
+ if(isnewplayer(m))
+ continue
+ if(m.mind)
+ if(isbrain(m) || iscameramob(m))
+ continue
+ if(ishuman(m))
+ var/mob/living/carbon/human/H = m
+ crew++
+ if(H.stat != DEAD)
+ alive_crew++
+ var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
+ var/medical_cash = (H.health / H.maxHealth) * alive_humans_bounty
+ if(mood)
+ var/datum/bank_account/D = get_dep_account(ACCOUNT_SRV)
+ if(D)
+ var/mood_dosh = (mood.mood_level / 9) * mood_bounty
+ D.adjust_money(mood_dosh)
+ medical_cash *= (mood.sanity / 100)
+
+ var/datum/bank_account/D = get_dep_account(ACCOUNT_MED)
+ if(D)
+ D.adjust_money(medical_cash)
+ if(ishostile(m))
+ var/mob/living/simple_animal/hostile/H = m
+ if(H.stat == DEAD && (H.z in SSmapping.levels_by_trait(ZTRAIT_STATION)))
+ dead_monsters++
+ CHECK_TICK
+ var/living_ratio = alive_crew / crew
+ cash_to_grant = (crew_safety_bounty * living_ratio) + (monster_bounty * dead_monsters)
+ var/datum/bank_account/D = get_dep_account(ACCOUNT_SEC)
+ if(D)
+ D.adjust_money(min(cash_to_grant, MAX_GRANT_SECMEDSRV))
+
+/datum/controller/subsystem/economy/proc/sci_payout()
+ var/science_bounty = 0
+ for(var/mob/living/simple_animal/slime/S in GLOB.mob_list)
+ if(S.stat == DEAD)
+ continue
+ science_bounty += slime_bounty[S.colour]
+ var/datum/bank_account/D = get_dep_account(ACCOUNT_SCI)
+ if(D)
+ D.adjust_money(min(science_bounty, MAX_GRANT_SCI))
+
+/datum/controller/subsystem/economy/proc/civ_payout()
+ var/civ_cash = (rand(1,5) * 500)
+ var/datum/bank_account/D = get_dep_account(ACCOUNT_CIV)
+ if(D)
+ D.adjust_money(min(civ_cash, MAX_GRANT_CIV))
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 7c48adef24..4b2cf24f1e 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -479,6 +479,10 @@ SUBSYSTEM_DEF(job)
to_chat(M, "[job.custom_spawn_text]")
if(CONFIG_GET(number/minimal_access_threshold))
to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.")
+ if(ishuman(H))
+ var/mob/living/carbon/human/wageslave = H
+ to_chat(M, "Your account ID is [wageslave.account_id].")
+ H.add_memory("Your account ID is [wageslave.account_id].")
if(job && H)
if(job.dresscodecompliant)// CIT CHANGE - dress code compliance
equip_loadout(N, H) // CIT CHANGE - allows players to spawn with loadout items
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index a3e804d541..532eb19bc9 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -35,10 +35,8 @@ SUBSYSTEM_DEF(shuttle)
//supply shuttle stuff
var/obj/docking_port/mobile/supply/supply
var/ordernum = 1 //order number given to next order
- var/points = 5000 //number of trade-points we have
var/centcom_message = "" //Remarks from CentCom on how well you checked the last order.
var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentCom, associated with their potencies
- var/passive_supply_points_per_minute = 125
var/list/supply_packs = list()
var/list/shoppinglist = list()
@@ -113,9 +111,6 @@ SUBSYSTEM_DEF(shuttle)
qdel(T, force=TRUE)
CheckAutoEvac()
- if(!(times_fired % CEILING(600/wait, 1)))
- points += passive_supply_points_per_minute
-
var/esETA = emergency?.getModeStr()
emergency_shuttle_stat_text = "[esETA? "[esETA] [emergency.getTimerStr()]" : ""]"
@@ -559,7 +554,6 @@ SUBSYSTEM_DEF(shuttle)
centcom_message = SSshuttle.centcom_message
ordernum = SSshuttle.ordernum
- points = SSshuttle.points
emergencyNoEscape = SSshuttle.emergencyNoEscape
emergencyCallAmount = SSshuttle.emergencyCallAmount
shuttle_purchased = SSshuttle.shuttle_purchased
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 8862482dc2..00e7e0ad5d 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -186,6 +186,8 @@
/datum/action/item_action/New(Target)
..()
+ if(button_icon_state)
+ use_target_appearance = FALSE
var/obj/item/I = target
LAZYINITLIST(I.actions)
I.actions += src
@@ -345,6 +347,7 @@
/datum/action/item_action/clock/quickbind
name = "Quickbind"
desc = "If you're seeing this, file a bug report."
+ use_target_appearance = FALSE
var/scripture_index = 0 //the index of the scripture we're associated with
/datum/action/item_action/toggle_helmet_flashlight
diff --git a/code/datums/components/crafting/craft.dm b/code/datums/components/crafting/craft.dm
index 8ebd52522a..3283c514b8 100644
--- a/code/datums/components/crafting/craft.dm
+++ b/code/datums/components/crafting/craft.dm
@@ -209,10 +209,9 @@
var/obj/item/reagent_containers/food/food_result = I
var/total_quality = 0
var/total_items = 0
- for(var/obj/item/ingredient in parts)
- var/obj/item/reagent_containers/food/food_ingredient = ingredient
+ for(var/obj/item/reagent_containers/food/ingredient in parts)
total_items += 1
- total_quality += food_ingredient.food_quality
+ total_quality += ingredient.food_quality
if(total_items == 0)
food_result.adjust_food_quality(50)
else
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index ae7a007321..2fc853500d 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -126,7 +126,7 @@
var/datum/reagent/R = E
M.reagents.remove_reagent(R.type, actual_power)
if(food_conversion)
- M.nutrition += 0.3
+ M.adjust_nutrition(0.3)
if(prob(2))
to_chat(M, "You feel a mild warmth as your blood purifies itself.")
return 1
@@ -164,7 +164,7 @@
C.reagents.metabolize(C, can_overdose=TRUE)
C.overeatduration = max(C.overeatduration - 2, 0)
var/lost_nutrition = 9 - (reduced_hunger * 5)
- C.nutrition = max(C.nutrition - (lost_nutrition * HUNGER_FACTOR), 0) //Hunger depletes at 10x the normal speed
+ C.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed
if(prob(2))
to_chat(C, "You feel an odd gurgle in your stomach, as if it was working much faster than normal.")
return 1
@@ -454,7 +454,7 @@
"Transmission 6" = "Additionally heals cellular damage and toxin lovers.",
"Resistance 7" = "Increases healing speed.",
)
-
+
/datum/symptom/heal/radiation/Start(datum/disease/advance/A)
if(!..())
return
diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm
index 5eab698750..bb0d9bdcf9 100644
--- a/code/datums/diseases/advance/symptoms/weight.dm
+++ b/code/datums/diseases/advance/symptoms/weight.dm
@@ -50,4 +50,4 @@ Bonus
else
to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]")
M.overeatduration = max(M.overeatduration - 100, 0)
- M.nutrition = max(M.nutrition - 100, 0)
\ No newline at end of file
+ M.adjust_nutrition(-100)
\ No newline at end of file
diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm
index 23902603ce..f59a19c7a3 100644
--- a/code/datums/diseases/tuberculosis.dm
+++ b/code/datums/diseases/tuberculosis.dm
@@ -52,7 +52,7 @@
if(prob(3))
to_chat(affected_mob, "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]")
affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0)
- affected_mob.nutrition = max(affected_mob.nutrition - 100, 0)
+ affected_mob.adjust_nutrition(-100)
if(prob(15))
to_chat(affected_mob, "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]")
affected_mob.adjust_bodytemperature(40)
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index 8f7a8ca72f..26786da776 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -152,10 +152,11 @@
return .
/datum/dna/proc/generate_dna_blocks()
- var/bonus
+ var/list/mutations_temp = GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations
if(species && species.inert_mutation)
- bonus = GET_INITIALIZED_MUTATION(species.inert_mutation)
- var/list/mutations_temp = GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations + bonus
+ var/bonus = GET_INITIALIZED_MUTATION(species.inert_mutation)
+ if(bonus)
+ mutations_temp += bonus
if(!LAZYLEN(mutations_temp))
return
mutation_index.Cut()
diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm
index d2f719c50c..22bcf0a568 100644
--- a/code/datums/wires/_wires.dm
+++ b/code/datums/wires/_wires.dm
@@ -142,7 +142,7 @@
if(level_diff > 0)
LAZYSET(current_users, user, TRUE)
to_chat(user, "You begin cutting [holder]'s [color] wire...")
- if(!do_after(user, 1.5 SECONDS * level_diff, target = holder) || !interactable(user))
+ if(!do_after(user, 0.75 SECONDS * level_diff, target = holder) || !interactable(user))
LAZYREMOVE(current_users, user)
return FALSE
LAZYREMOVE(current_users, user)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index dbb6864028..98027acc61 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -32,6 +32,9 @@
var/list/filter_data //For handling persistent filters
+ var/custom_price
+ var/custom_premium_price
+
var/datum/component/orbiter/orbiters
var/rad_flags = NONE // Will move to flags_1 when i can be arsed to
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 42904383bb..3f2edd7174 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -26,6 +26,8 @@
var/list/chem_buttons //Used when emagged to scramble which chem is used, eg: antitoxin -> morphine
var/scrambled_chems = FALSE //Are chem buttons scrambled? used as a warning
var/enter_message = "You feel cool air surround you. You go numb as your senses turn inward."
+ payment_department = ACCOUNT_MED
+ fair_market_price = 5
/obj/machinery/sleeper/Initialize()
. = ..()
@@ -205,6 +207,13 @@
ui = new(user, src, ui_key, "sleeper", name, 550, 700, master_ui, state)
ui.open()
+/obj/machinery/sleeper/process()
+ ..()
+ check_nap_violations()
+
+/obj/machinery/sleeper/nap_violation(mob/violator)
+ open_machine()
+
/obj/machinery/sleeper/ui_data()
var/list/data = list()
var/chemical_list = list()
@@ -250,7 +259,7 @@
data["occupant"]["fireLoss"] = mob_occupant.getFireLoss()
data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss()
data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN)
-
+
if(mob_occupant.reagents.reagent_list.len)
for(var/datum/reagent/R in mob_occupant.reagents.reagent_list)
chemical_list += list(list("name" = R.name, "volume" = R.volume))
@@ -290,7 +299,7 @@
if(..())
return
var/mob/living/mob_occupant = occupant
-
+ check_nap_violations()
switch(action)
if("door")
if(state_open)
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 995d11acb7..93121a0753 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -121,6 +121,10 @@ Class Procs:
var/interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE
+ var/fair_market_price = 69
+ var/market_verb = "Customer"
+ var/payment_department = ACCOUNT_ENG
+
/obj/machinery/Initialize()
if(!armor)
armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70)
@@ -248,6 +252,36 @@ Class Procs:
return FALSE
return TRUE
+/obj/machinery/proc/check_nap_violations()
+ if(!SSeconomy.full_ancap)
+ return TRUE
+ if(occupant && !state_open)
+ if(ishuman(occupant))
+ var/mob/living/carbon/human/H = occupant
+ var/obj/item/card/id/I = H.get_idcard()
+ if(I)
+ var/datum/bank_account/insurance = I.registered_account
+ if(!insurance)
+ say("[market_verb] NAP Violation: No bank account found.")
+ nap_violation()
+ return FALSE
+ else
+ if(!insurance.adjust_money(-fair_market_price))
+ say("[market_verb] NAP Violation: Unable to pay.")
+ nap_violation()
+ return FALSE
+ var/datum/bank_account/D = SSeconomy.get_dep_account(payment_department)
+ if(D)
+ D.adjust_money(fair_market_price)
+ else
+ say("[market_verb] NAP Violation: No ID card found.")
+ nap_violation()
+ return FALSE
+ return TRUE
+
+/obj/machinery/proc/nap_violation(mob/violator)
+ return
+
////////////////////////////////////////////////////////////////////////////////////////////
//Return a non FALSE value to interrupt attack_hand propagation to subtypes.
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 33560dbb8b..3b32213509 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -30,6 +30,8 @@
var/list/datum/design/matching_designs
var/selected_category
var/screen = 1
+ var/base_price = 25
+ var/hacked_price = 50
var/datum/techweb/specialized/autounlocking/stored_research = /datum/techweb/specialized/autounlocking/autolathe
var/list/categories = list(
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index 41867a8520..2b683f16a3 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -8,6 +8,7 @@
var/obj/item/radio/radio
var/radio_channel = RADIO_CHANNEL_COMMON
var/minimum_time_between_warnings = 400
+ var/syphoning_credits = 0
/obj/machinery/computer/bank_machine/Initialize()
. = ..()
@@ -25,9 +26,14 @@
if(istype(I, /obj/item/stack/spacecash))
var/obj/item/stack/spacecash/C = I
value = C.value * C.amount
+ else if(istype(I, /obj/item/holochip))
+ var/obj/item/holochip/H = I
+ value = H.credits
if(value)
- SSshuttle.points += value
- to_chat(user, "You deposit [I]. The station now has [SSshuttle.points] credits.")
+ var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
+ if(D)
+ D.adjust_money(value)
+ to_chat(user, "You deposit [I]. The Cargo Budget is now [D.account_balance] cr.")
qdel(I)
return
return ..()
@@ -38,14 +44,16 @@
if(siphoning)
if (stat & (BROKEN|NOPOWER))
say("Insufficient power. Halting siphon.")
- siphoning = FALSE
- if(SSshuttle.points < 200)
- say("Station funds depleted. Halting siphon.")
- siphoning = FALSE
- else
- new /obj/item/stack/spacecash/c200(drop_location()) // will autostack
- playsound(src.loc, 'sound/items/poster_being_created.ogg', 100, 1)
- SSshuttle.points -= 200
+ end_syphon()
+ var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
+ if(!D.has_money(200))
+ say("Cargo budget depleted. Halting siphon.")
+ end_syphon()
+ return
+
+ playsound(src.loc, 'sound/items/poster_being_created.ogg', 100, 1)
+ syphoning_credits += 200
+ D.adjust_money(-200)
if(next_warning < world.time && prob(15))
var/area/A = get_area(loc)
var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!"
@@ -61,7 +69,8 @@
/obj/machinery/computer/bank_machine/ui_data(mob/user)
var/list/data = list()
- data["current_balance"] = SSshuttle.points
+ var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
+ data["current_balance"] = D.account_balance
data["siphoning"] = siphoning
data["station_name"] = station_name()
@@ -78,5 +87,10 @@
. = TRUE
if("halt")
say("Station credit withdrawal halted.")
- siphoning = FALSE
+ end_syphon()
. = TRUE
+
+/obj/machinery/computer/bank_machine/proc/end_syphon()
+ siphoning = FALSE
+ new /obj/item/holochip(drop_location(), syphoning_credits) //get the loot
+ syphoning_credits = 0
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 3f4b389b77..cfe9d14663 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -37,6 +37,9 @@
var/list/unattached_flesh
var/flesh_number = 0
+ var/datum/bank_account/current_insurance
+ fair_market_price = 5 // He nodded, because he knew I was right. Then he swiped his credit card to pay me for arresting him.
+ payment_department = ACCOUNT_MED
/obj/machinery/clonepod/Initialize()
. = ..()
@@ -131,7 +134,7 @@
return examine(user)
//Start growing a human clone in the pod!
-/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks)
+/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance)
if(panel_open)
return FALSE
if(mess || attempting)
@@ -161,7 +164,7 @@
mess = TRUE
update_icon()
return FALSE
-
+ current_insurance = insurance
attempting = TRUE //One at a time!!
countdown.start()
@@ -224,15 +227,29 @@
connected_message("Clone Ejected: Loss of power.")
else if(mob_occupant && (mob_occupant.loc == src))
- if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes.
- connected_message("Clone Rejected: Deceased.")
+ if(SSeconomy.full_ancap)
+ if(!current_insurance)
+ go_out()
+ connected_message("Clone Ejected: No bank account.")
+ if(internal_radio)
+ SPEAK("The cloning of [mob_occupant.real_name] has been terminated due to no bank account to draw payment from.")
+ else if(!current_insurance.adjust_money(-fair_market_price))
+ go_out()
+ connected_message("Clone Ejected: Out of Money.")
+ if(internal_radio)
+ SPEAK("The cloning of [mob_occupant.real_name] has been ended prematurely due to being unable to pay.")
+ else
+ var/datum/bank_account/D = SSeconomy.get_dep_account(payment_department)
+ if(D)
+ D.adjust_money(fair_market_price)
+ if(mob_occupant && (mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes. connected_message("Clone Rejected: Deceased.")
if(internal_radio)
SPEAK("The cloning has been \
aborted due to unrecoverable tissue failure.")
go_out()
mob_occupant.copy_from_prefs_vr()
- else if(mob_occupant.cloneloss > (100 - heal_level))
+ else if(mob_occupant && mob_occupant.cloneloss > (100 - heal_level))
mob_occupant.Unconscious(80)
var/dmg_mult = CONFIG_GET(number/damage_multiplier)
//Slowly get that clone healed and finished.
@@ -259,7 +276,7 @@
use_power(7500) //This might need tweaking.
- else if((mob_occupant.cloneloss <= (100 - heal_level)))
+ else if((mob_occupant && mob_occupant.cloneloss <= (100 - heal_level)))
connected_message("Cloning Process Complete.")
if(internal_radio)
SPEAK("The cloning cycle is complete.")
@@ -368,7 +385,7 @@
if(!mob_occupant)
return
-
+ current_insurance = null
REMOVE_TRAIT(mob_occupant, TRAIT_STABLEHEART, CLONING_POD_TRAIT)
REMOVE_TRAIT(mob_occupant, TRAIT_MUTATION_STASIS, CLONING_POD_TRAIT)
REMOVE_TRAIT(mob_occupant, TRAIT_STABLELIVER, CLONING_POD_TRAIT)
diff --git a/code/game/machinery/computer/arcade/orion_trail.dm b/code/game/machinery/computer/arcade/orion_trail.dm
index 2304312953..8b81c69ed2 100644
--- a/code/game/machinery/computer/arcade/orion_trail.dm
+++ b/code/game/machinery/computer/arcade/orion_trail.dm
@@ -117,7 +117,7 @@
if(food <= 0)
dat += "
You ran out of food and starved."
if(obj_flags & EMAGGED)
- user.nutrition = 0 //yeah you pretty hongry
+ user.set_nutrition(0) //yeah you pretty hongry
to_chat(user, "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor.")
if(fuel <= 0)
dat += "
You ran out of fuel, and drift, slowly, into a star."
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index b0e80b63d2..74cceacd12 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -467,7 +467,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
to_chat(usr, "No log exists for this job.")
updateUsrDialog()
return
-
+ if(inserted_modify_id.registered_account)
+ inserted_modify_id.registered_account.account_job = jobdatum // this is a terrible idea and people will grief but sure whatever
inserted_modify_id.access = ( istype(src, /obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : jobdatum.get_access() )
if (inserted_modify_id)
inserted_modify_id.assignment = t1
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 07cc252b87..981a5643a8 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -73,7 +73,7 @@
if(pod.occupant)
continue //how though?
- if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"]))
+ if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"]))
temp = "[R.fields["name"]] => Cloning cycle in progress..."
records -= R
@@ -415,7 +415,7 @@
else if(pod.occupant)
temp = "Cloning cycle already in progress."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
- else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"]))
+ else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"], C.fields["bank_account"]))
temp = "[C.fields["name"]] => Cloning cycle in progress..."
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
records.Remove(C)
@@ -441,9 +441,13 @@
/obj/machinery/computer/cloning/proc/scan_occupant(occupant)
var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
var/datum/dna/dna
+ var/datum/bank_account/has_bank_account
if(ishuman(mob_occupant))
var/mob/living/carbon/C = mob_occupant
dna = C.has_dna()
+ var/obj/item/card/id/I = C.get_idcard()
+ if(I)
+ has_bank_account = I.registered_account
if(isbrain(mob_occupant))
var/mob/living/brain/B = mob_occupant
dna = B.stored_dna
@@ -468,7 +472,10 @@
scantemp = "Subject already in database."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
-
+ if(SSeconomy.full_ancap && !has_bank_account)
+ scantemp = "Subject is either missing an ID card with a bank account on it, or does not have an account to begin with. Please ensure the ID card is on the body before attempting to scan."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
var/datum/data/record/R = new()
if(dna.species)
// We store the instance rather than the path, because some
@@ -490,6 +497,7 @@
R.fields["features"] = dna.features
R.fields["factions"] = mob_occupant.faction
R.fields["quirks"] = list()
+ R.fields["bank_account"] = has_bank_account
for(var/V in mob_occupant.roundstart_quirks)
var/datum/quirk/T = V
R.fields["quirks"][T.type] = T.clone_data()
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 6eb06e3be4..22bea14381 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -163,11 +163,15 @@
else if(!S.prerequisites_met())
to_chat(usr, "You have not met the requirements for purchasing this shuttle.")
else
- if(SSshuttle.points >= S.credit_cost)
+ var/points_to_check
+ var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
+ if(D)
+ points_to_check = D.account_balance
+ if(points_to_check >= S.credit_cost)
var/obj/machinery/shuttle_manipulator/M = locate() in GLOB.machines
if(M)
SSshuttle.shuttle_purchased = TRUE
- SSshuttle.points -= S.credit_cost
+ D.adjust_money(-S.credit_cost)
minor_announce("[usr.real_name] has purchased [S.name] for [S.credit_cost] credits." , "Shuttle Purchase")
message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [S.name].")
SSblackbox.record_feedback("text", "shuttle_purchase", 1, "[S.name]")
@@ -576,7 +580,8 @@
dat += "
Lift access restrictions on maintenance and external airlocks?
\[ OK | Cancel \]"
if(STATE_PURCHASE)
- dat += "Budget: [SSshuttle.points] Credits.
"
+ var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
+ dat += "Budget: [D.account_balance] Credits.
"
dat += "
"
dat += "Caution: Purchasing dangerous shuttles may lead to mutiny and/or death.
"
dat += "
"
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 7b90715f2b..fed54f55f8 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -1,6 +1,7 @@
/obj/item/electronics/airlock
name = "airlock electronics"
req_access = list(ACCESS_MAINT_TUNNELS)
+ custom_price = 50
var/list/accesses = list()
var/one_access = 0
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index eed6f2a040..c5e27ce9a2 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -351,6 +351,7 @@
/obj/item/electronics/firelock
name = "firelock circuitry"
+ custom_price = 50
desc = "A circuit board used in construction of firelocks."
icon_state = "mainboard"
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index db806ef3ac..a9c411c634 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -174,9 +174,11 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
else
linked_techweb.largest_bomb_value = TECHWEB_BOMB_POINTCAP
point_gain = 1000
-
+ var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_SCI)
+ if(D)
+ D.adjust_money(point_gain)
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, point_gain)
- say("Gained [point_gain] points from explosion dataset.")
+ say("Explosion details and mixture analyzed and sold to the highest bidder for [point_gain] cr, with a reward of [point_gain] points.")
else //you've made smaller bombs
say("Data already captured. Aborting.")
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 4a0042e1da..6501a5b45e 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -2,6 +2,7 @@
/obj/item/electronics/firealarm
name = "fire alarm electronics"
+ custom_price = 50
desc = "A fire alarm circuit. Can handle heat levels up to 40 degrees celsius."
/obj/item/wallframe/firealarm
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index 910c4f4609..e06c172519 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -133,7 +133,7 @@
if(reagents)
for(var/datum/reagent/consumable/R in reagents.reagent_list)
if(R.nutriment_factor > 0)
- H.nutrition += R.nutriment_factor * R.volume
+ H.adjust_nutrition(R.nutriment_factor * R.volume)
reagents.del_reagent(R.type)
reagents.trans_to(H, reagents.total_volume)
qdel(src)
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index d248556a9c..7f6e561f55 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -154,6 +154,7 @@ RLD
icon_state = "rcd"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
+ custom_price = 900
max_matter = 160
item_flags = NO_MAT_REDEMPTION | NOBLUDGEON
has_ammobar = TRUE
diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm
index ba0766de00..35843c1030 100644
--- a/code/game/objects/items/RSF.dm
+++ b/code/game/objects/items/RSF.dm
@@ -41,24 +41,21 @@ RSF
/obj/item/rsf/attack_self(mob/user)
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
switch(mode)
+ if(5)
+ mode = 1
+ to_chat(user, "Changed dispensing mode to 'Drinking Glass'")
if(1)
mode = 2
- to_chat(user, "Changed dispensing mode to 'Drinking Glass'")
+ to_chat(user, "Changed dispensing mode to 'Paper'")
if(2)
mode = 3
- to_chat(user, "Changed dispensing mode to 'Paper'")
+ to_chat(user, "Changed dispensing mode to 'Pen'")
if(3)
mode = 4
- to_chat(user, "Changed dispensing mode to 'Pen'")
+ to_chat(user, "Changed dispensing mode to 'Dice Pack'")
if(4)
mode = 5
- to_chat(user, "Changed dispensing mode to 'Dice Pack'")
- if(5)
- mode = 6
to_chat(user, "Changed dispensing mode to 'Cigarette'")
- if(6)
- mode = 1
- to_chat(user, "Changed dispensing mode to 'Dosh'")
// Change mode
/obj/item/rsf/afterattack(atom/A, mob/user, proximity)
@@ -81,26 +78,22 @@ RSF
playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
switch(mode)
if(1)
- to_chat(user, "Dispensing Dosh...")
- new /obj/item/stack/spacecash/c10(T)
- use_matter(200, user)
- if(2)
to_chat(user, "Dispensing Drinking Glass...")
new /obj/item/reagent_containers/food/drinks/drinkingglass(T)
use_matter(20, user)
- if(3)
+ if(2)
to_chat(user, "Dispensing Paper Sheet...")
new /obj/item/paper(T)
use_matter(10, user)
- if(4)
+ if(3)
to_chat(user, "Dispensing Pen...")
new /obj/item/pen(T)
use_matter(50, user)
- if(5)
+ if(4)
to_chat(user, "Dispensing Dice Pack...")
new /obj/item/storage/pill_bottle/dice(T)
use_matter(200, user)
- if(6)
+ if(5)
to_chat(user, "Dispensing Cigarette...")
new /obj/item/clothing/mask/cigarette(T)
use_matter(10, user)
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index c23bc2bd5b..8a5723e894 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -6,8 +6,6 @@
* FINGERPRINT CARD
*/
-
-
/*
* DATA CARDS - Used for the IC data card reader
*/
@@ -173,13 +171,22 @@
var/registered_name = null // The name registered_name on the card
var/assignment = null
var/access_txt // mapping aid
-
-
+ var/bank_support = ID_FREE_BANK_ACCOUNT
+ var/datum/bank_account/registered_account
+ var/obj/machinery/paystand/my_store
/obj/item/card/id/Initialize(mapload)
. = ..()
if(mapload && access_txt)
access = text2access(access_txt)
+ switch(bank_support)
+ if(ID_FREE_BANK_ACCOUNT)
+ var/turf/T = get_turf(src)
+ if(T && is_vr_level(T.z)) //economy is exploitable on VR in so many ways.
+ bank_support = ID_NO_BANK_ACCOUNT
+ if(ID_LOCKED_BANK_ACCOUNT)
+ registered_account = new /datum/bank_account/remote/non_transferable(pick(GLOB.redacted_strings))
+
/obj/item/card/id/vv_edit_var(var_name, var_value)
. = ..()
@@ -193,12 +200,150 @@
user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", \
"You show \the [src.name].")
add_fingerprint(user)
+
+/obj/item/card/id/attackby(obj/item/W, mob/user, params)
+ if(!bank_support)
+ return ..()
+ if(istype(W, /obj/item/holochip))
+ insert_money(W, user)
+ else if(istype(W, /obj/item/stack/spacecash) || istype(W, /obj/item/coin))
+ insert_money(W, user, TRUE)
+ else if(istype(W, /obj/item/storage/bag/money))
+ var/obj/item/storage/bag/money/money_bag = W
+ var/list/money_contained = money_bag.contents
+ var/money_added = mass_insert_money(money_contained, user)
+ if (money_added)
+ to_chat(user, "You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of credits to the linked account.")
+ else
+ return ..()
+
+/obj/item/card/id/proc/insert_money(obj/item/I, mob/user, physical_currency)
+ var/cash_money = I.get_item_credit_value()
+ if(!cash_money)
+ to_chat(user, "[I] doesn't seem to be worth anything!")
return
+ if(!registered_account)
+ to_chat(user, "[src] doesn't have a linked account to deposit [I] into!")
+ return
+
+ registered_account.adjust_money(cash_money)
+ if(physical_currency)
+ to_chat(user, "You stuff [I] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] credits to the linked account.")
+ else
+ to_chat(user, "You insert [I] into [src], adding [cash_money] credits to the linked account.")
+
+ to_chat(user, "The linked account now reports a balance of [registered_account.account_balance] cr.")
+ qdel(I)
+
+/obj/item/card/id/proc/mass_insert_money(list/money, mob/user)
+ if (!money || !money.len)
+ return FALSE
+
+ var/total = 0
+
+ for (var/obj/item/physical_money in money)
+ var/cash_money = physical_money.get_item_credit_value()
+
+ total += cash_money
+
+ registered_account.adjust_money(cash_money)
+
+ QDEL_LIST(money)
+
+ return total
+
+/obj/item/card/id/proc/alt_click_can_use_id(mob/living/user)
+ if(!isliving(user))
+ return
+ if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ return
+
+ return TRUE
+
+// Returns true if new account was set.
+/obj/item/card/id/proc/set_new_account(mob/living/user)
+ if(bank_support != ID_FREE_BANK_ACCOUNT)
+ to_chat(user, "This ID has no modular banking support whatsover, must be an older model...")
+ return
+ . = FALSE
+ var/datum/bank_account/old_account = registered_account
+
+ var/new_bank_id = input(user, "Enter your account ID number.", "Account Reclamation", 111111) as num | null
+
+ if (isnull(new_bank_id))
+ return
+
+ if(!alt_click_can_use_id(user))
+ return
+ if(!new_bank_id || new_bank_id < 111111 || new_bank_id > 999999)
+ to_chat(user, "The account ID number needs to be between 111111 and 999999.")
+ return
+ if (registered_account && registered_account.account_id == new_bank_id)
+ to_chat(user, "The account ID was already assigned to this card.")
+ return
+
+ for(var/A in SSeconomy.bank_accounts)
+ var/datum/bank_account/B = A
+ if(B.account_id == new_bank_id)
+ if (old_account)
+ old_account.bank_cards -= src
+
+ B.bank_cards += src
+ registered_account = B
+ to_chat(user, "The provided account has been linked to this ID card.")
+
+ return TRUE
+
+ to_chat(user, "The account ID number provided is invalid.")
+ return
+
+/obj/item/card/id/AltClick(mob/living/user)
+ . = ..()
+ if(!bank_support || !alt_click_can_use_id(user))
+ return
+
+ if(!registered_account && bank_support == ID_FREE_BANK_ACCOUNT)
+ set_new_account(user)
+ return
+
+ if (world.time < registered_account.withdrawDelay)
+ registered_account.bank_card_talk("ERROR: UNABLE TO LOGIN DUE TO SCHEDULED MAINTENANCE. MAINTENANCE IS SCHEDULED TO COMPLETE IN [(registered_account.withdrawDelay - world.time)/10] SECONDS.", TRUE)
+ return
+
+ var/amount_to_remove = FLOOR(input(user, "How much do you want to withdraw? Current Balance: [registered_account.account_balance]", "Withdraw Funds", 5) as num|null, 1)
+
+ if(!amount_to_remove || amount_to_remove < 0)
+ return
+ if(!alt_click_can_use_id(user))
+ return
+ if(registered_account.adjust_money(-amount_to_remove))
+ var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove)
+ user.put_in_hands(holochip)
+ to_chat(user, "You withdraw [amount_to_remove] credits into a holochip.")
+ return
+ else
+ var/difference = amount_to_remove - registered_account.account_balance
+ registered_account.bank_card_talk("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal.", TRUE)
+
/obj/item/card/id/examine(mob/user)
. = ..()
if(mining_points)
. += "There's [mining_points] mining equipment redemption point\s loaded onto this card."
+ if(!bank_support || (bank_support == ID_LOCKED_BANK_ACCOUNT && !registered_account))
+ . += "This ID has no banking support whatsover, must be an older model..."
+ else if(registered_account)
+ . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr."
+ if(registered_account.account_job)
+ var/datum/bank_account/D = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department)
+ if(D)
+ . += "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.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
+ . += "There is no registered account linked to this card. Alt-Click to add one."
/obj/item/card/id/GetAccess()
return access
@@ -280,8 +425,12 @@ update_label("John Doe", "Clowny")
else
return ..()
- var/popup_input = alert(user, "Choose Action", "Agent ID", "Show", "Forge/Reset")
- if(user.incapacitated())
+ var/popup_input
+ if(bank_support == ID_FREE_BANK_ACCOUNT)
+ popup_input = alert(user, "Choose Action", "Agent ID", "Show", "Forge/Reset", "Change Account ID")
+ else
+ popup_input = alert(user, "Choose Action", "Agent ID", "Show", "Forge/Reset")
+ if(!user.canUseTopic(src, BE_CLOSE, FALSE))
return
if(popup_input == "Forge/Reset" && !forged)
var/input_name = stripped_input(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN)
@@ -304,6 +453,18 @@ update_label("John Doe", "Clowny")
forged = TRUE
to_chat(user, "You successfully forge the ID card.")
log_game("[key_name(user)] has forged \the [initial(name)] with name \"[registered_name]\" and occupation \"[assignment]\".")
+
+ // First time use automatically sets the account id to the user.
+ if (first_use && !registered_account)
+ if(ishuman(user))
+ var/mob/living/carbon/human/accountowner = user
+
+ for(var/bank_account in SSeconomy.bank_accounts)
+ var/datum/bank_account/account = bank_account
+ if(account.account_id == accountowner.account_id)
+ account.bank_cards += src
+ registered_account = account
+ to_chat(user, "Your account number has been automatically assigned.")
return
else if (popup_input == "Forge/Reset" && forged)
registered_name = initial(registered_name)
@@ -313,6 +474,9 @@ update_label("John Doe", "Clowny")
forged = FALSE
to_chat(user, "You successfully reset the ID card.")
return
+ else if (popup_input == "Change Account ID")
+ set_new_account(user)
+ return
return ..()
/obj/item/card/id/syndicate/anyone
@@ -329,6 +493,15 @@ update_label("John Doe", "Clowny")
assignment = "Syndicate Overlord"
access = list(ACCESS_SYNDICATE)
+/obj/item/card/id/no_banking
+ bank_support = ID_NO_BANK_ACCOUNT
+
+/obj/item/card/id/locked_banking
+ bank_support = ID_LOCKED_BANK_ACCOUNT
+
+/obj/item/card/id/syndicate/locked_banking
+ bank_support = ID_LOCKED_BANK_ACCOUNT
+
/obj/item/card/id/captains_spare
name = "captain's spare ID"
desc = "The spare ID of the High Lord himself."
@@ -516,6 +689,34 @@ update_label("John Doe", "Clowny")
desc = "A special ID card that allows access to APC terminals."
access = list(ACCESS_ENGINE_EQUIP)
+/obj/item/card/id/departmental_budget
+ name = "departmental card (FUCK)"
+ desc = "Provides access to the departmental budget."
+ var/department_ID = ACCOUNT_CIV
+ var/department_name = ACCOUNT_CIV_NAME
+
+/obj/item/card/id/departmental_budget/Initialize()
+ . = ..()
+ var/datum/bank_account/B = SSeconomy.get_dep_account(department_ID)
+ if(B)
+ registered_account = B
+ if(!B.bank_cards.Find(src))
+ B.bank_cards += src
+ name = "departmental card ([department_name])"
+ desc = "Provides access to the [department_name]."
+ SSeconomy.dep_cards += src
+
+/obj/item/card/id/departmental_budget/Destroy()
+ SSeconomy.dep_cards -= src
+ return ..()
+
+/obj/item/card/id/departmental_budget/update_label()
+ return
+
+/obj/item/card/id/departmental_budget/car
+ department_ID = ACCOUNT_CAR
+ department_name = ACCOUNT_CAR_NAME
+
//Polychromatic Knight Badge
/obj/item/card/id/knight
@@ -578,5 +779,5 @@ update_label("John Doe", "Clowny")
/obj/item/card/id/debug/Initialize()
access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access()
+ registered_account = SSeconomy.get_dep_account(ACCOUNT_CAR)
. = ..()
-
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 2303278f5c..6ebeffe90f 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -506,6 +506,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
resistance_flags = FIRE_PROOF
light_color = LIGHT_COLOR_FIRE
grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/oil = 5)
+ custom_price = 55
/obj/item/lighter/Initialize()
. = ..()
@@ -710,7 +711,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
item_state = "black_vape"
w_class = WEIGHT_CLASS_TINY
var/chem_volume = 100
- var/vapetime = FALSE //this so it won't puff out clouds every tick
+ var/vapetime = FALSE //this so it won't puff out clouds every tick
var/screw = FALSE // kinky
var/super = FALSE //for the fattest vapes dude.
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index b788c3fcba..0e3744cd84 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -229,10 +229,11 @@
def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial)
/obj/item/circuitboard/machine/vendor
- name = "Booze-O-Mat Vendor (Machine Board)"
+ name = "Custom Vendor (Machine Board)"
desc = "You can turn the \"brand selection\" dial using a screwdriver."
- build_path = /obj/machinery/vending/boozeomat
- req_components = list(/obj/item/vending_refill/boozeomat = 1)
+ custom_premium_price = 100
+ build_path = /obj/machinery/vending/custom
+ req_components = list(/obj/item/vending_refill/custom = 1)
var/static/list/vending_names_paths = list(
/obj/machinery/vending/boozeomat = "Booze-O-Mat",
@@ -269,7 +270,8 @@
/obj/machinery/vending/wardrobe/viro_wardrobe = "ViroDrobe",
/obj/machinery/vending/clothing = "ClothesMate",
/obj/machinery/vending/medical = "NanoMed Plus",
- /obj/machinery/vending/wallmed = "NanoMed")
+ /obj/machinery/vending/wallmed = "NanoMed",
+ /obj/machinery/vending/custom = "Custom Vendor")
/obj/item/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/screwdriver))
@@ -1040,6 +1042,11 @@
build_path = /obj/machinery/ore_silo
req_components = list()
+/obj/item/circuitboard/machine/paystand
+ name = "Pay Stand (Machine Board)"
+ build_path = /obj/machinery/paystand
+ req_components = list()
+
/obj/item/circuitboard/machine/autobottler
name = "Auto-Bottler (Machine Board)"
build_path = /obj/machinery/rnd/production/protolathe/department/autobottler //Manips make you print things cheaper, even chems
diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm
new file mode 100644
index 0000000000..8d55d3d5a2
--- /dev/null
+++ b/code/game/objects/items/crab17.dm
@@ -0,0 +1,229 @@
+/obj/item/suspiciousphone
+ name = "suspicious phone"
+ desc = "This device raises pink levels to unknown highs."
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "suspiciousphone"
+ w_class = WEIGHT_CLASS_SMALL
+ attack_verb = list("dumped")
+ var/dumped = FALSE
+
+/obj/item/suspiciousphone/attack_self(mob/user)
+ if(!ishuman(user))
+ to_chat(user, "This device is too advanced for you!")
+ return
+ if(dumped)
+ to_chat(user, "You already activated Protocol CRAB-17.")
+ return FALSE
+ if(alert(user, "Are you sure you want to crash this market with no survivors?", "Protocol CRAB-17", "Yes", "No") == "Yes")
+ if(dumped || QDELETED(src)) //Prevents fuckers from cheesing alert
+ return FALSE
+ var/turf/targetturf = get_safe_random_station_turf()
+ if (!targetturf)
+ return FALSE
+ new /obj/effect/dumpeetTarget(targetturf, user)
+ dumped = TRUE
+
+/obj/structure/checkoutmachine
+ name = "\improper Nanotrasen Space-Coin Market"
+ desc = "This is good for spacecoin because"
+ icon = 'icons/obj/money_machine.dmi'
+ icon_state = "bogdanoff"
+ layer = LARGE_MOB_LAYER
+ armor = list("melee" = 80, "bullet" = 30, "laser" = 30, "energy" = 60, "bomb" = 90, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80)
+ density = TRUE
+ pixel_z = -8
+ max_integrity = 5000
+ var/list/accounts_to_rob
+ var/mob/living/carbon/human/bogdanoff
+ var/canwalk = FALSE
+
+/obj/structure/checkoutmachine/examine(mob/living/user)
+ . = ..()
+ . += "It's integrated integrity meter reads: HEALTH: [obj_integrity]."
+
+/obj/structure/checkoutmachine/proc/check_if_finished()
+ for(var/i in accounts_to_rob)
+ var/datum/bank_account/B = i
+ if (B.being_dumped)
+ return FALSE
+ return TRUE
+
+/obj/structure/checkoutmachine/attackby(obj/item/W, mob/user, params)
+ if(check_if_finished())
+ qdel(src)
+ return
+ if(istype(W, /obj/item/card/id))
+ var/obj/item/card/id/card = W
+ if(!card.registered_account)
+ to_chat(user, "This card does not have a registered account!")
+ return
+ if(!card.registered_account.being_dumped)
+ to_chat(user, "It appears that your funds are safe from draining!")
+ return
+ if(do_after(user, 40, target = src))
+ if(!card.registered_account.being_dumped)
+ return
+ to_chat(user, "You quickly cash out your funds to a more secure banking location. Funds are safu.") // This is a reference and not a typo
+ card.registered_account.being_dumped = FALSE
+ card.registered_account.withdrawDelay = 0
+ if(check_if_finished())
+ qdel(src)
+ return
+ else
+ return ..()
+
+/obj/structure/checkoutmachine/Initialize(mapload, mob/living/user)
+ . = ..()
+ bogdanoff = user
+ add_overlay("flaps")
+ add_overlay("hatch")
+ add_overlay("legs_retracted")
+ addtimer(CALLBACK(src, .proc/startUp), 50)
+ QDEL_IN(src, 8 MINUTES) //Self destruct after 8 min
+
+
+/obj/structure/checkoutmachine/proc/startUp() //very VERY snowflake code that adds a neat animation when the pod lands.
+ start_dumping() //The machine doesnt move during this time, giving people close by a small window to grab their funds before it starts running around
+ sleep(10)
+ if(QDELETED(src))
+ return
+ playsound(src, 'sound/machines/click.ogg', 15, TRUE, -3)
+ cut_overlay("flaps")
+ sleep(10)
+ if(QDELETED(src))
+ return
+ playsound(src, 'sound/machines/click.ogg', 15, TRUE, -3)
+ cut_overlay("hatch")
+ sleep(30)
+ if(QDELETED(src))
+ return
+ playsound(src,'sound/machines/twobeep.ogg',50,FALSE)
+ var/mutable_appearance/hologram = mutable_appearance(icon, "hologram")
+ hologram.pixel_y = 16
+ add_overlay(hologram)
+ var/mutable_appearance/holosign = mutable_appearance(icon, "holosign")
+ holosign.pixel_y = 16
+ add_overlay(holosign)
+ add_overlay("legs_extending")
+ cut_overlay("legs_retracted")
+ pixel_z += 4
+ sleep(5)
+ if(QDELETED(src))
+ return
+ add_overlay("legs_extended")
+ cut_overlay("legs_extending")
+ pixel_z += 4
+ sleep(20)
+ if(QDELETED(src))
+ return
+ add_overlay("screen_lines")
+ sleep(5)
+ if(QDELETED(src))
+ return
+ cut_overlay("screen_lines")
+ sleep(5)
+ if(QDELETED(src))
+ return
+ add_overlay("screen_lines")
+ add_overlay("screen")
+ sleep(5)
+ if(QDELETED(src))
+ return
+ playsound(src,'sound/machines/triple_beep.ogg',50,FALSE)
+ add_overlay("text")
+ sleep(10)
+ if(QDELETED(src))
+ return
+ add_overlay("legs")
+ cut_overlay("legs_extended")
+ cut_overlay("screen")
+ add_overlay("screen")
+ cut_overlay("screen_lines")
+ add_overlay("screen_lines")
+ cut_overlay("text")
+ add_overlay("text")
+ canwalk = TRUE
+ START_PROCESSING(SSfastprocess, src)
+
+/obj/structure/checkoutmachine/Destroy()
+ stop_dumping()
+ STOP_PROCESSING(SSfastprocess, src)
+ priority_announce("The credit deposit machine at [get_area(src)] has been destroyed. Station funds have stopped draining!", sender_override = "CRAB-17 Protocol")
+ explosion(src, 0,0,1, flame_range = 2)
+ return ..()
+
+/obj/structure/checkoutmachine/proc/start_dumping()
+ accounts_to_rob = SSeconomy.bank_accounts.Copy()
+ accounts_to_rob -= bogdanoff.get_bank_account()
+ for(var/i in accounts_to_rob)
+ var/datum/bank_account/B = i
+ B.dumpeet()
+ dump()
+
+/obj/structure/checkoutmachine/proc/dump()
+ var/percentage_lost = (rand(5, 15) / 100)
+ for(var/i in accounts_to_rob)
+ var/datum/bank_account/B = i
+ if(!B.being_dumped)
+ continue
+ var/amount = B.account_balance * percentage_lost
+ var/datum/bank_account/account = bogdanoff.get_bank_account()
+ if (account) // get_bank_account() may return FALSE
+ account.transfer_money(B, amount)
+ B.bank_card_talk("You have lost [percentage_lost * 100]% of your funds! A spacecoin credit deposit machine is located at: [get_area(src)].")
+ addtimer(CALLBACK(src, .proc/dump), 150) //Drain every 15 seconds
+
+/obj/structure/checkoutmachine/process()
+ var/anydir = pick(GLOB.cardinals)
+ if(Process_Spacemove(anydir))
+ Move(get_step(src, anydir), anydir)
+
+/obj/structure/checkoutmachine/proc/stop_dumping()
+ for(var/i in accounts_to_rob)
+ var/datum/bank_account/B = i
+ B.being_dumped = FALSE
+
+/obj/effect/dumpeetFall //Falling pod
+ name = ""
+ icon = 'icons/obj/money_machine_64.dmi'
+ pixel_z = 300
+ desc = "Get out of the way!"
+ layer = FLY_LAYER//that wasnt flying, that was falling with style!
+ icon_state = "missile_blur"
+
+/obj/effect/dumpeetTarget
+ name = "Landing Zone Indicator"
+ desc = "A holographic projection designating the landing zone of something. It's probably best to stand back."
+ icon = 'icons/mob/actions/actions_items.dmi'
+ icon_state = "sniper_zoom"
+ layer = PROJECTILE_HIT_THRESHHOLD_LAYER
+ light_range = 2
+ var/obj/effect/dumpeetFall/DF
+ var/obj/structure/checkoutmachine/dump
+ var/mob/living/carbon/human/bogdanoff
+
+/obj/effect/ex_act()
+ return
+
+/obj/effect/dumpeetTarget/Initialize(mapload, user)
+ . = ..()
+ bogdanoff = user
+ addtimer(CALLBACK(src, .proc/startLaunch), 100)
+ sound_to_playing_players('sound/items/dump_it.ogg', 20)
+ deadchat_broadcast("Protocol CRAB-17 has been activated. A space-coin market has been launched at the station!", turf_target = get_turf(src))
+
+/obj/effect/dumpeetTarget/proc/startLaunch()
+ DF = new /obj/effect/dumpeetFall(drop_location())
+ dump = new /obj/structure/checkoutmachine(null, bogdanoff)
+ priority_announce("The spacecoin bubble has popped! Get to the credit deposit machine at [get_area(src)] and cash out before you lose all of your funds!", sender_override = "CRAB-17 Protocol")
+ animate(DF, pixel_z = -8, time = 5, , easing = LINEAR_EASING)
+ playsound(src, 'sound/weapons/mortar_whistle.ogg', 70, TRUE, 6)
+ addtimer(CALLBACK(src, .proc/endLaunch), 5, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation
+
+
+
+/obj/effect/dumpeetTarget/proc/endLaunch()
+ QDEL_NULL(DF) //Delete the falling machine effect, because at this point its animation is over. We dont use temp_visual because we want to manually delete it as soon as the pod appears
+ playsound(src, "explosion", 80, TRUE)
+ dump.forceMove(get_turf(src))
+ qdel(src) //The target's purpose is complete. It can rest easy now
diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm
new file mode 100644
index 0000000000..0acb225772
--- /dev/null
+++ b/code/game/objects/items/credit_holochip.dm
@@ -0,0 +1,107 @@
+/obj/item/holochip
+ name = "credit holochip"
+ desc = "A hard-light chip encoded with an amount of credits. It is a modern replacement for physical money that can be directly converted to virtual currency and viceversa. Keep away from magnets."
+ icon = 'icons/obj/economy.dmi'
+ icon_state = "holochip"
+ throwforce = 0
+ force = 0
+ w_class = WEIGHT_CLASS_TINY
+ var/credits = 0
+
+/obj/item/holochip/Initialize(mapload, amount)
+ . = ..()
+ credits = amount
+ update_icon()
+
+/obj/item/holochip/examine(mob/user)
+ . = ..()
+ . += "It's loaded with [credits] credit[( credits > 1 ) ? "s" : ""]\n"+\
+ "Alt-Click to split."
+
+/obj/item/holochip/get_item_credit_value()
+ return credits
+
+/obj/item/holochip/update_icon()
+ name = "\improper [credits] credit holochip"
+ var/rounded_credits = credits
+ switch(credits)
+ if(1 to 999)
+ icon_state = "holochip"
+ if(1000 to 999999)
+ icon_state = "holochip_kilo"
+ rounded_credits = round(rounded_credits * 0.001)
+ if(1000000 to 999999999)
+ icon_state = "holochip_mega"
+ rounded_credits = round(rounded_credits * 0.000001)
+ if(1000000000 to INFINITY)
+ icon_state = "holochip_giga"
+ rounded_credits = round(rounded_credits * 0.000000001)
+ var/overlay_color = "#914792"
+ switch(rounded_credits)
+ if(0 to 4)
+ overlay_color = "#8E2E38"
+ if(5 to 9)
+ overlay_color = "#914792"
+ if(10 to 19)
+ overlay_color = "#BF5E0A"
+ if(20 to 49)
+ overlay_color = "#358F34"
+ if(50 to 99)
+ overlay_color = "#676767"
+ if(100 to 199)
+ overlay_color = "#009D9B"
+ if(200 to 499)
+ overlay_color = "#0153C1"
+ if(500 to INFINITY)
+ overlay_color = "#2C2C2C"
+ cut_overlays()
+ var/mutable_appearance/holochip_overlay = mutable_appearance('icons/obj/economy.dmi', "[icon_state]-color")
+ holochip_overlay.color = overlay_color
+ add_overlay(holochip_overlay)
+
+/obj/item/holochip/proc/spend(amount, pay_anyway = FALSE)
+ if(credits >= amount)
+ credits -= amount
+ if(credits == 0)
+ qdel(src)
+ update_icon()
+ return amount
+ else if(pay_anyway)
+ qdel(src)
+ return credits
+ else
+ return 0
+
+/obj/item/holochip/attackby(obj/item/I, mob/user, params)
+ ..()
+ if(istype(I, /obj/item/holochip))
+ var/obj/item/holochip/H = I
+ credits += H.credits
+ to_chat(user, "You insert the credits into [src].")
+ update_icon()
+ qdel(H)
+
+/obj/item/holochip/AltClick(mob/user)
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+ var/split_amount = round(input(user,"How many credits do you want to extract from the holochip?") as null|num)
+ if(split_amount == null || split_amount <= 0 || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+ else
+ var/new_credits = spend(split_amount, TRUE)
+ var/obj/item/holochip/H = new(user ? user : drop_location(), new_credits)
+ if(user)
+ if(!user.put_in_hands(H))
+ H.forceMove(user.drop_location())
+ add_fingerprint(user)
+ H.add_fingerprint(user)
+ to_chat(user, "You extract [split_amount] credits into a new holochip.")
+
+/obj/item/holochip/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ var/wipe_chance = 60 / severity
+ if(prob(wipe_chance))
+ visible_message("[src] fizzles and disappears!")
+ qdel(src) //rip cash
diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm
index 2614775906..41a12136ef 100644
--- a/code/game/objects/items/devices/dogborg_sleeper.dm
+++ b/code/game/objects/items/devices/dogborg_sleeper.dm
@@ -3,7 +3,7 @@
/obj/item/dogborg/sleeper
name = "hound sleeper"
desc = "nothing should see this."
- icon = 'icons/mob/dogborg.dmi'
+ icon = 'icons/mob/robot_items.dmi'
icon_state = "sleeper"
w_class = WEIGHT_CLASS_TINY
var/mob/living/carbon/patient
@@ -418,29 +418,15 @@
var/units = round(patient.reagents.get_reagent_amount(chem))
to_chat(hound, "Injecting [units] unit\s of [chem] into occupant.") //If they were immersed, the reagents wouldn't leave with them.
-/obj/item/dogborg/sleeper/medihound //Medihound sleeper
- name = "Mobile Sleeper"
- desc = "Equipment for medical hound. A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves."
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "sleeper"
- breakout_time = 30 //Medical sleepers should be designed to be as easy as possible to get out of.
-
/obj/item/dogborg/sleeper/K9 //The K9 portabrig
name = "Mobile Brig"
desc = "Equipment for a K9 unit. A mounted portable-brig that holds criminals."
- icon = 'icons/mob/dogborg.dmi'
icon_state = "sleeperb"
inject_amount = 0
min_health = -100
injection_chems = null //So they don't have all the same chems as the medihound!
breakout_time = 300
-/obj/item/storage/attackby(obj/item/dogborg/sleeper/K9, mob/user, proximity)
- if(istype(K9))
- K9.afterattack(src, user ,1)
- else
- . = ..()
-
/obj/item/dogborg/sleeper/K9/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity)
var/mob/living/silicon/robot/hound = get_host()
if(!hound || !istype(target) || !proximity || target.anchored)
@@ -462,70 +448,6 @@
user.visible_message("[hound.name]'s mobile brig clunks in series as [target] slips inside.", "Your mobile brig groans lightly as [target] slips inside.")
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) // Really don't need ERP sound effects for robots
-
-/obj/item/dogborg/sleeper/compactor //Janihound gut.
- name = "garbage processor"
- desc = "A mounted garbage compactor unit with fuel processor."
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "compactor"
- inject_amount = 0
- min_health = -100
- injection_chems = null //So they don't have all the same chems as the medihound!
- var/max_item_count = 30
-
-/obj/item/storage/attackby(obj/item/dogborg/sleeper/compactor, mob/user, proximity) //GIT CIRCUMVENTED YO!
- if(istype(compactor))
- compactor.afterattack(src, user ,1)
- else
- . = ..()
-
-/obj/item/dogborg/sleeper/compactor/afterattack(atom/movable/target, mob/living/silicon/user, proximity)//GARBO NOMS
- var/mob/living/silicon/robot/hound = get_host()
- if(!hound || !istype(target) || !proximity || target.anchored)
- return
- if(length(contents) > (max_item_count - 1))
- to_chat(user,"Your [src] is full. Eject or process contents to continue.")
- return
- if(isitem(target))
- var/obj/item/I = target
- if(CheckAccepted(I))
- to_chat(user,"[I] registers an error code to your [src]")
- return
- if(I.w_class > WEIGHT_CLASS_NORMAL)
- to_chat(user,"[I] is too large to fit into your [src]")
- return
- user.visible_message("[hound.name] is ingesting [I] into their [src.name].", "You start ingesting [target] into your [src.name]...")
- if(do_after(user, 15, target = target) && length(contents) < max_item_count)
- I.forceMove(src)
- I.visible_message("[hound.name]'s garbage processor groans lightly as [I] slips inside.", "Your garbage compactor groans lightly as [I] slips inside.")
- playsound(hound, 'sound/machines/disposalflush.ogg', 50, 1)
- if(length(contents) > 11) //grow that tum after a certain junk amount
- hound.sleeper_r = 1
- hound.update_icons()
- else
- hound.sleeper_r = 0
- hound.update_icons()
- return
-
- if(iscarbon(target) || issilicon(target))
- var/mob/living/trashman = target
- if(!CHECK_BITFIELD(trashman.vore_flags,DEVOURABLE))
- to_chat(user, "[target] registers an error code to your [src]")
- return
- if(patient)
- to_chat(user,"Your [src] is already occupied.")
- return
- if(trashman.buckled)
- to_chat(user,"[trashman] is buckled and can not be put into your [src].")
- return
- user.visible_message("[hound.name] is ingesting [trashman] into their [src].", "You start ingesting [trashman] into your [src.name]...")
- if(do_after(user, 30, target = trashman) && !patient && !trashman.buckled && length(contents) < max_item_count)
- trashman.forceMove(src)
- trashman.reset_perspective(src)
- update_gut()
- user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.")
- playsound(hound, 'sound/effects/bin_close.ogg', 80, 1)
-
/obj/item/dogborg/sleeper/K9/flavour
name = "Recreational Sleeper"
desc = "A mounted, underslung sleeper, intended for holding willing occupants for leisurely purposes."
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 7329db0679..aa8c61ae0c 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -1,6 +1,7 @@
/obj/item/flashlight
name = "flashlight"
desc = "A hand-held emergency light."
+ custom_price = 100
icon = 'icons/obj/lighting.dmi'
icon_state = "flashlight"
item_state = "flashlight"
@@ -428,6 +429,7 @@
/obj/item/flashlight/glowstick
name = "glowstick"
desc = "A military-grade glowstick."
+ custom_price = 50
w_class = WEIGHT_CLASS_SMALL
brightness_on = 4
color = LIGHT_COLOR_GREEN
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index d8f1790dec..a6b2673a5a 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -11,6 +11,7 @@ SLIME SCANNER
/obj/item/t_scanner
name = "\improper T-ray scanner"
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
+ custom_price = 150
icon = 'icons/obj/device.dmi'
icon_state = "t-ray0"
var/on = FALSE
diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm
index 79d26776a9..a92d9221c2 100644
--- a/code/game/objects/items/devices/sensor_device.dm
+++ b/code/game/objects/items/devices/sensor_device.dm
@@ -5,6 +5,7 @@
icon_state = "scanner"
w_class = WEIGHT_CLASS_SMALL
slot_flags = ITEM_SLOT_BELT
+ custom_price = 900
/obj/item/sensor_device/attack_self(mob/user)
GLOB.crewmonitor.show(user,src) //Proc already exists, just had to call it
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 0a705df91c..bafffa18e3 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -249,10 +249,8 @@
/obj/item/book/granter/spell/smoke/recoil(mob/user)
..()
to_chat(user,"Your stomach rumbles...")
- if(user.nutrition)
- user.nutrition = 200
- if(user.nutrition <= 0)
- user.nutrition = 0
+ if(user.nutrition > NUTRITION_LEVEL_STARVING + 50)
+ user.set_nutrition(NUTRITION_LEVEL_STARVING + 50)
/obj/item/book/granter/spell/blind
spell = /obj/effect/proc_holder/spell/targeted/trigger/blind
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index f6e52181ef..168bca0b9a 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -71,6 +71,7 @@
sharpness = IS_SHARP_ACCURATE
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/bayonet = FALSE //Can this be attached to a gun?
+ custom_price = 250
/obj/item/kitchen/knife/Initialize()
. = ..()
@@ -130,6 +131,7 @@
custom_materials = list(/datum/material/iron=18000)
attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
w_class = WEIGHT_CLASS_NORMAL
+ custom_price = 600
/obj/item/kitchen/knife/combat
name = "combat knife"
@@ -197,6 +199,7 @@
throw_range = 7
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
+ custom_price = 200
/obj/item/kitchen/rollingpin/suicide_act(mob/living/carbon/user)
user.visible_message("[user] begins flattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm
index 090c2f6d57..a1652fd211 100644
--- a/code/game/objects/items/pinpointer.dm
+++ b/code/game/objects/items/pinpointer.dm
@@ -78,6 +78,7 @@
name = "crew pinpointer"
desc = "A handheld tracking device that points to crew suit sensors."
icon_state = "pinpointer_crew"
+ custom_price = 600
var/has_owner = FALSE
var/pinpointer_owner = null
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index a5ed113e4c..1ca314f749 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -902,4 +902,47 @@
name = "mining point card"
desc = "A robotic ID strip used for claiming and transferring mining points. Must be held in an active slot to transfer points."
access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
- icon_state = "data_1"
\ No newline at end of file
+ icon_state = "data_1"
+
+
+///Mere cosmetic dogborg items, remnants of what were once the most annoying cyborg modules.
+/obj/item/dogborg_tongue
+ name = "synthetic tongue"
+ desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
+ icon = 'icons/mob/robot_items.dmi'
+ icon_state = "synthtongue"
+ hitsound = 'sound/effects/attackblob.ogg'
+ desc = "For giving affectionate kisses."
+ item_flags = NOBLUDGEON
+
+/obj/item/dogborg_tongue/afterattack(atom/target, mob/user, proximity)
+ . = ..()
+ if(!proximity || !isliving(target))
+ return
+ var/mob/living/silicon/robot/R = user
+ var/mob/living/L = target
+ if(L.ckey && !(L.client?.prefs.vore_flags & LICKABLE))
+ to_chat(R, "ERROR ERROR: Target not lickable. Aborting display-of-affection subroutine.")
+ return
+
+ if(check_zone(R.zone_selected) == "head")
+ R.visible_message("\the [R] affectionally licks \the [L]'s face!", "You affectionally lick \the [L]'s face!")
+ playsound(R, 'sound/effects/attackblob.ogg', 50, 1)
+ else
+ R.visible_message("\the [R] affectionally licks \the [L]!", "You affectionally lick \the [L]!")
+ playsound(R, 'sound/effects/attackblob.ogg', 50, 1)
+
+/obj/item/dogborg_nose
+ name = "boop module"
+ desc = "The BOOP module"
+ icon = 'icons/mob/robot_items.dmi'
+ icon_state = "nose"
+ flags_1 = CONDUCT_1|NOBLUDGEON
+ force = 0
+
+/obj/item/dogborg_nose/afterattack(atom/target, mob/user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+ do_attack_animation(target, null, src)
+ user.visible_message("[user] [pick("nuzzles", "pushes", "boops")] \the [target.name] with their nose!")
diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm
index 94f6fca28c..a06b96ad9c 100644
--- a/code/game/objects/items/stacks/cash.dm
+++ b/code/game/objects/items/stacks/cash.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/economy.dmi'
icon_state = "spacecash"
amount = 1
- max_amount = 20
+ max_amount = INFINITY
throwforce = 0
throw_speed = 2
throw_range = 2
@@ -18,9 +18,11 @@
update_desc()
/obj/item/stack/spacecash/proc/update_desc()
- var/total_worth = amount*value
+ var/total_worth = get_item_credit_value()
desc = "It's worth [total_worth] credit[( total_worth > 1 ) ? "s" : ""]"
+/obj/item/stack/spacecash/get_item_credit_value()
+ return (amount*value)
/obj/item/stack/spacecash/merge(obj/item/stack/S)
. = ..()
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 19c15b309b..59a993ad96 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -96,6 +96,7 @@
var/stop_bleeding = 1800
var/heal_brute = 5
self_delay = 10
+ custom_price = 100
/obj/item/stack/medical/gauze/heal(mob/living/M, mob/user)
if(ishuman(M))
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 97b7ee8a38..82ae274012 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -43,6 +43,7 @@
icon_state = "utilitybelt"
item_state = "utility"
content_overlays = TRUE
+ custom_premium_price = 300
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //because this is easier than trying to have showers wash all contents.
/obj/item/storage/belt/utility/ComponentInitialize()
@@ -712,6 +713,7 @@
icon_state = "fannypack_leather"
item_state = "fannypack_leather"
dying_key = DYE_REGISTRY_FANNYPACK
+ custom_price = 100
/obj/item/storage/belt/fannypack/ComponentInitialize()
. = ..()
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index 9dbbb35862..c5b48164a0 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -622,6 +622,7 @@
item_state = "zippo"
w_class = WEIGHT_CLASS_TINY
slot_flags = ITEM_SLOT_BELT
+ custom_price = 20
/obj/item/storage/box/matches/ComponentInitialize()
. = ..()
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index f32532537b..685a3b59f6 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -136,6 +136,7 @@
slot_flags = ITEM_SLOT_BELT
icon_type = "cigarette"
spawn_type = /obj/item/clothing/mask/cigarette/space_cigarette
+ custom_price = 75
/obj/item/storage/fancy/cigarettes/ComponentInitialize()
. = ..()
@@ -277,6 +278,7 @@
///The value in here has NOTHING to do with icons. It needs to be this for the proper examine.
icon_type = "rolling paper"
spawn_type = /obj/item/rollingpaper
+ custom_price = 25
/obj/item/storage/fancy/rollingpapers/ComponentInitialize()
. = ..()
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index 01193d0e21..de98963693 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -373,7 +373,7 @@
/////////////
/obj/item/storage/belt/organbox
- name = "Organ Storge"
+ name = "Organ Storage"
desc = "A compact box that helps hold massive amounts of implants, organs, and some tools. Has a belt clip for easy carrying"
w_class = WEIGHT_CLASS_BULKY
icon = 'icons/obj/mysterybox.dmi'
@@ -392,6 +392,12 @@
STR.can_hold = typecacheof(list(
/obj/item/storage/pill_bottle,
/obj/item/reagent_containers/hypospray,
+ /obj/item/pinpointer/crew,
+ /obj/item/tele_iv,
+ /obj/item/sequence_scanner,
+ /obj/item/sensor_device,
+ /obj/item/bodybag,
+ /obj/item/surgicaldrill/advanced,
/obj/item/healthanalyzer,
/obj/item/reagent_containers/syringe,
/obj/item/clothing/glasses/hud/health,
@@ -407,6 +413,8 @@
/obj/item/implantcase,
/obj/item/implanter,
/obj/item/circuitboard/computer/operating,
+ /obj/item/circuitboard/computer/crew,
+ /obj/item/stack/sheet/glass,
/obj/item/stack/sheet/mineral/silver,
/obj/item/organ_storage
))
@@ -422,6 +430,8 @@
throw_range = 7
var/empty = FALSE
item_state = "firstaid"
+ custom_price = 300
+ custom_premium_price = 500
/obj/item/storage/hypospraykit/ComponentInitialize()
. = ..()
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index 3aa9911d97..0b4b6f54f3 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -16,6 +16,7 @@
STR.cant_hold = typecacheof(list(/obj/item/screwdriver/power))
STR.can_hold = typecacheof(list(
/obj/item/stack/spacecash,
+ /obj/item/holochip,
/obj/item/card,
/obj/item/clothing/mask/cigarette,
/obj/item/flashlight/pen,
@@ -101,17 +102,5 @@
icon_state = "random_wallet"
/obj/item/storage/wallet/random/PopulateContents()
- var/item1_type = /obj/effect/spawner/lootdrop/space_cash/no_turf
- var/item2_type
- if(prob(50))
- item2_type = /obj/effect/spawner/lootdrop/space_cash/no_turf
- var/item3_type = /obj/effect/spawner/lootdrop/coin/no_turf
-
- spawn(2)
- if(item1_type)
- new item1_type(src)
- if(item2_type)
- new item2_type(src)
- if(item3_type)
- new item3_type(src)
- update_icon()
+ new /obj/item/holochip(src, rand(5,30))
+ icon_state = "wallet"
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index 6ff5dfc8ad..57e9ea9aaa 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -145,6 +145,7 @@
desc = "A janitorial watertank backpack with nozzle to clean dirt and graffiti."
icon_state = "waterbackpackjani"
item_state = "waterbackpackjani"
+ custom_price = 1000
/obj/item/watertank/janitor/Initialize()
. = ..()
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 2d132e4eef..d34daf5c75 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -524,6 +524,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
icon_state = "skateboard2"
item_state = "skateboard2"
board_item_type = /obj/vehicle/ridden/scooter/skateboard/pro
+ custom_premium_price = 500
/obj/item/melee/skateboard/hoverboard
name = "hoverboard"
@@ -531,6 +532,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
icon_state = "hoverboard_red"
item_state = "hoverboard_red"
board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard
+ custom_premium_price = 2015
/obj/item/melee/skateboard/hoverboard/admin
name = "\improper Board Of Directors"
diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm
index 4ac69253d3..2c923c1905 100644
--- a/code/game/objects/structures/crates_lockers/crates/secure.dm
+++ b/code/game/objects/structures/crates_lockers/crates/secure.dm
@@ -74,4 +74,43 @@
/obj/structure/closet/crate/secure/medical
desc = "A secure medical crate."
name = "medical crate"
- icon_state = "medical_secure_crate"
\ No newline at end of file
+ icon_state = "medical_secure_crate"
+
+/obj/structure/closet/crate/secure/owned
+ name = "private crate"
+ desc = "A crate cover designed to only open for who purchased its contents."
+ icon_state = "privatecrate"
+ var/datum/bank_account/buyer_account
+ var/privacy_lock = TRUE
+
+/obj/structure/closet/crate/secure/owned/examine(mob/user)
+ . = ..()
+ to_chat(user, "It's locked with a privacy lock, and can only be unlocked by the buyer's ID.")
+
+/obj/structure/closet/crate/secure/owned/Initialize(mapload, datum/bank_account/_buyer_account)
+ . = ..()
+ buyer_account = _buyer_account
+
+/obj/structure/closet/crate/secure/owned/togglelock(mob/living/user, silent)
+ if(privacy_lock)
+ if(!broken)
+ var/obj/item/card/id/id_card = user.get_idcard(TRUE)
+ if(id_card)
+ if(id_card.registered_account)
+ if(id_card.registered_account == buyer_account)
+ if(iscarbon(user))
+ add_fingerprint(user)
+ locked = !locked
+ user.visible_message("[user] unlocks [src]'s privacy lock.",
+ "You unlock [src]'s privacy lock.")
+ privacy_lock = FALSE
+ update_icon()
+ else if(!silent)
+ to_chat(user, "Bank account does not match with buyer!")
+ else if(!silent)
+ to_chat(user, "No linked bank account detected!")
+ else if(!silent)
+ to_chat(user, "No ID detected!")
+ else if(!silent)
+ to_chat(user, "[src] is broken!")
+ else ..()
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 082c4bd723..86aff44e02 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -686,7 +686,7 @@
name = "ID, jumpsuit and shoes"
uniform = /obj/item/clothing/under/color/random
shoes = /obj/item/clothing/shoes/sneakers/black
- id = /obj/item/card/id
+ id = /obj/item/card/id/no_banking
r_hand = /obj/item/storage/box/syndie_kit/chameleon/ghostcafe
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index c70db70ee8..a06b674e42 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -63,6 +63,7 @@
There can only be one! (40-second delay)
Make all players stupid
Egalitarian Station Mode
+ Anarcho-Capitalist Station Mode
Break all lights
Fix all lights
The floor is lava! (DANGEROUS: extremely lame)
@@ -478,6 +479,17 @@
usr.client.ak47s()
sound_to_playing_players('sound/misc/ak47s.ogg')
+ if("ancap")
+ if(!check_rights(R_FUN))
+ return
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Anarcho-capitalist Station"))
+ SSeconomy.full_ancap = !SSeconomy.full_ancap
+ message_admins("[key_name_admin(usr)] toggled Anarcho-capitalist mode")
+ if(SSeconomy.full_ancap)
+ priority_announce("The NAP is now in full effect.", null, "commandreport")
+ else
+ priority_announce("The NAP has been revoked.", null, "commandreport")
+
if("guns")
if(!check_rights(R_FUN))
return
diff --git a/code/modules/antagonists/blob/blob/blob_report.dm b/code/modules/antagonists/blob/blob/blob_report.dm
index 4385b732c3..d532121e12 100644
--- a/code/modules/antagonists/blob/blob/blob_report.dm
+++ b/code/modules/antagonists/blob/blob/blob_report.dm
@@ -8,6 +8,13 @@
var/mach = 0
/datum/station_state/proc/count()
+ floor = 0
+ wall = 0
+ r_wall = 0
+ window = 0
+ door = 0
+ grille = 0
+ mach = 0
for(var/Z in SSmapping.levels_by_trait(ZTRAIT_STATION))
for(var/turf/T in block(locate(1,1,Z), locate(world.maxx,world.maxy,Z)))
// don't count shuttles since they may have just left
@@ -48,6 +55,10 @@
else if(ismachinery(O))
mach += 1
+ CHECK_TICK
+ CHECK_TICK
+ CHECK_TICK
+
/datum/station_state/proc/score(datum/station_state/result)
if(!result)
return 0
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
index 1867be1594..8425309b6c 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
@@ -177,7 +177,7 @@
if(owner.current.blood_volume < BLOOD_VOLUME_BAD / 2)
owner.current.blur_eyes(8 - 8 * (owner.current.blood_volume / BLOOD_VOLUME_BAD))
// Nutrition
- owner.current.nutrition = clamp(owner.current.blood_volume, 545, 0) //The amount of blood is how full we are.
+ owner.current.set_nutrition(min(owner.current.blood_volume, NUTRITION_LEVEL_FULL)) //The amount of blood is how full we are.
//A bit higher regeneration based on blood volume
if(owner.current.blood_volume < 700)
additional_regen = 0.4
@@ -331,7 +331,7 @@
return
var/mob/living/carbon/C = owner.current
// Remove Nutrition, Give Bad Food
- C.nutrition -= food_nutrition
+ C.adjust_nutrition(-food_nutrition)
foodInGut += food_nutrition
// Already ate some bad clams? Then we can back out, because we're already sick from it.
if(foodInGut != food_nutrition)
diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm
index 2d5b38a456..3e2ff6f3dd 100644
--- a/code/modules/antagonists/changeling/powers/absorb.dm
+++ b/code/modules/antagonists/changeling/powers/absorb.dm
@@ -59,7 +59,7 @@
changeling.trueabsorbs++
if(user.nutrition < NUTRITION_LEVEL_WELL_FED)
- user.nutrition = min((user.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED)
+ user.adjust_nutrition(target.nutrition, NUTRITION_LEVEL_WELL_FED)
// Absorb a lizard, speak Draconic.
user.copy_languages(target, LANGUAGE_ABSORB)
diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm
index e20203d9e6..c12259778e 100644
--- a/code/modules/antagonists/devil/devil.dm
+++ b/code/modules/antagonists/devil/devil.dm
@@ -183,7 +183,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
if(soulsOwned.Find(soul))
return
soulsOwned += soul
- owner.current.nutrition = NUTRITION_LEVEL_FULL
+ owner.current.set_nutrition(NUTRITION_LEVEL_FULL)
to_chat(owner.current, "You feel satiated as you received a new soul.")
update_hud()
switch(SOULVALUE)
diff --git a/code/modules/antagonists/traitor/syndicate_contract.dm b/code/modules/antagonists/traitor/syndicate_contract.dm
index daa9127591..70ff59eee0 100644
--- a/code/modules/antagonists/traitor/syndicate_contract.dm
+++ b/code/modules/antagonists/traitor/syndicate_contract.dm
@@ -78,14 +78,28 @@
var/mob/living/carbon/human/target = M // After we remove items, at least give them what they need to live.
target.dna.species.give_important_for_life(target)
handleVictimExperience(M) // After pod is sent we start the victim narrative/heal.
- var/points_to_check = SSshuttle.points // This is slightly delayed because of the sleep calls above to handle the narrative. We don't want to tell the station instantly.
- if(points_to_check >= ransom)
- SSshuttle.points -= ransom
- else
- SSshuttle.points -= points_to_check
+ var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
+ var/points_to_check = min(D.account_balance, ransom)
+ D.adjust_money(min(points_to_check, ransom))
priority_announce("One of your crew was captured by a rival organisation - we've needed to pay their ransom to bring them back. \
As is policy we've taken a portion of the station's funds to offset the overall cost.", null, "attention", null, "Nanotrasen Asset Protection")
+ sleep(30)
+
+ // Pay contractor their portion of ransom
+ if (status == CONTRACT_STATUS_COMPLETE)
+ var/mob/living/carbon/human/H
+ var/obj/item/card/id/C
+ if(ishuman(contract.owner.current))
+ H = contract.owner.current
+ C = H.get_idcard(TRUE)
+
+ if(C && C.registered_account)
+ C.registered_account.adjust_money(points_to_check * 0.35)
+
+ C.registered_account.bank_card_talk("We've processed the ransom, agent. Here's your cut - your balance is now \
+ [C.registered_account.account_balance] cr.", TRUE)
+
/datum/syndicate_contract/proc/handleVictimExperience(var/mob/living/M) // They're off to holding - handle the return timer and give some text about what's going on.
addtimer(CALLBACK(src, .proc/returnVictim, M), 4 MINUTES) // Ship 'em back - dead or alive... 4 minutes wait.
if(M.stat != DEAD) //Even if they weren't the target, we're still treating them the same.
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 85a668debc..616de2dc53 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -36,6 +36,7 @@
/obj/item/electronics/airalarm
name = "air alarm electronics"
icon_state = "airalarm_electronics"
+ custom_price = 50
/obj/item/wallframe/airalarm
name = "air alarm frame"
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 881537cb0e..c189224f49 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -33,6 +33,9 @@
var/message_cooldown
var/breakout_time = 300
+ fair_market_price = 10
+ payment_department = ACCOUNT_MED
+
/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize()
. = ..()
initialize_directions = dir
@@ -149,6 +152,9 @@
add_overlay("cover-on")
addtimer(CALLBACK(src, .proc/run_anim, anim_up, occupant_overlay), 7, TIMER_UNIQUE)
+/obj/machinery/atmospherics/components/unary/cryo_cell/nap_violation(mob/violator)
+ open_machine()
+
/obj/machinery/atmospherics/components/unary/cryo_cell/process()
..()
@@ -162,7 +168,8 @@
return
var/mob/living/mob_occupant = occupant
-
+ if(!check_nap_violations())
+ return
if(mob_occupant.stat == DEAD) // We don't bother with dead people.
return
diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm
index ad03b2f393..a4632f7ed0 100644
--- a/code/modules/cargo/bounties/science.dm
+++ b/code/modules/cargo/bounties/science.dm
@@ -55,7 +55,7 @@
/datum/bounty/item/science/advanced_mop
name = "Advanced Mop"
- description = "Excuse me. I'd like to request 17 credits for a push broom rebristling. Either that, or an advanced mop."
+ description = "Excuse me. I'd like to request 17 cr for a push broom rebristling. Either that, or an advanced mop."
reward = 3000
wanted_types = list(/obj/item/mop/advanced)
diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm
index bfd97e4d1f..b888dc1a28 100644
--- a/code/modules/cargo/bounty.dm
+++ b/code/modules/cargo/bounty.dm
@@ -21,7 +21,9 @@ GLOBAL_LIST_EMPTY(bounties_list)
// Called when the claim button is clicked. Override to provide fancy rewards.
/datum/bounty/proc/claim()
if(can_claim())
- SSshuttle.points += reward
+ var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
+ if(D)
+ D.adjust_money(reward)
claimed = TRUE
// If an item sent in the cargo shuttle can satisfy the bounty.
@@ -126,11 +128,11 @@ GLOBAL_LIST_EMPTY(bounties_list)
/proc/setup_bounties()
var/pick // instead of creating it a bunch let's go ahead and toss it here, we know we're going to use it for dynamics and subtypes!
-
+
/********************************Subtype Gens********************************/
var/list/easy_add_list_subtypes = list(/datum/bounty/item/assistant = 2,
- /datum/bounty/item/mech = 1,
- /datum/bounty/item/chef = 2,
+ /datum/bounty/item/mech = 1,
+ /datum/bounty/item/chef = 2,
/datum/bounty/item/security = 1,
/datum/bounty/virus = 1,
/datum/bounty/item/engineering = 1,
@@ -139,30 +141,30 @@ GLOBAL_LIST_EMPTY(bounties_list)
/datum/bounty/item/botany = 2,
/datum/bounty/item/silly = 1,
/datum/bounty/item/gardencook = 1)
-
+
for(var/the_type in easy_add_list_subtypes)
for(var/i in 1 to easy_add_list_subtypes[the_type])
pick = pick(subtypesof(the_type))
try_add_bounty(new pick)
-
+
/********************************Strict Type Gens********************************/
var/list/easy_add_list_strict_types = list(/datum/bounty/reagent/simple_drink = 1,
/datum/bounty/reagent/complex_drink = 1,
/datum/bounty/reagent/chemical = 1)
-
+
for(var/the_strict_type in easy_add_list_strict_types)
for(var/i in 1 to easy_add_list_strict_types[the_strict_type])
try_add_bounty(new the_strict_type)
-
+
/********************************Dynamic Gens********************************/
-
+
for(var/i in 0 to 1)
if(prob(50))
pick = pick(subtypesof(/datum/bounty/item/slime))
else
pick = pick(subtypesof(/datum/bounty/item/science))
try_add_bounty(new pick)
-
+
/********************************Cutoff for Non-Low Priority Bounties********************************/
var/datum/bounty/B = pick(GLOB.bounties_list)
B.mark_high_priority()
@@ -172,7 +174,7 @@ GLOBAL_LIST_EMPTY(bounties_list)
/datum/bounty/item/syndicate_documents,
/datum/bounty/item/adamantine,
/datum/bounty/more_bounties)
-
+
for(var/low_priority_bounty in low_priority_strict_type_list)
try_add_bounty(new low_priority_bounty)
diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm
index 45260f4926..f499c38090 100644
--- a/code/modules/cargo/bounty_console.dm
+++ b/code/modules/cargo/bounty_console.dm
@@ -35,10 +35,10 @@
if(!GLOB.bounties_list.len)
setup_bounties()
-
+ var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
var/list/dat = list({"Refresh
Print Paper
-
Credits: [SSshuttle.points]
+Credits: [D.account_balance]