Coonflict fiiixeeess
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -723,7 +723,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,
|
||||
|
||||
@@ -18261,7 +18261,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
|
||||
},
|
||||
@@ -24659,9 +24659,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)
|
||||
@@ -27701,6 +27698,10 @@
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/chemistry)
|
||||
"boc" = (
|
||||
@@ -41401,13 +41402,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,
|
||||
@@ -55284,14 +55278,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
|
||||
@@ -56347,7 +56333,7 @@
|
||||
},
|
||||
/area/maintenance/bar)
|
||||
"lsk" = (
|
||||
/obj/machinery/vending/autodrobe/all_access,
|
||||
/obj/machinery/vending/autodrobe,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/crew_quarters/fitness)
|
||||
"ltK" = (
|
||||
@@ -58796,7 +58782,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" = (
|
||||
@@ -93880,7 +93866,7 @@ bMQ
|
||||
bRC
|
||||
rdl
|
||||
daq
|
||||
bUO
|
||||
bUN
|
||||
bOd
|
||||
bOd
|
||||
bOd
|
||||
@@ -94137,7 +94123,7 @@ cBF
|
||||
bRD
|
||||
rdl
|
||||
daq
|
||||
bUO
|
||||
bUN
|
||||
bOd
|
||||
bOd
|
||||
bOd
|
||||
@@ -94394,7 +94380,7 @@ bQs
|
||||
cez
|
||||
ceA
|
||||
daq
|
||||
bUO
|
||||
bUN
|
||||
bOd
|
||||
bOd
|
||||
bOd
|
||||
@@ -95931,19 +95917,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
|
||||
|
||||
@@ -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
|
||||
},
|
||||
@@ -81477,7 +81477,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
|
||||
},
|
||||
@@ -108601,7 +108601,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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -54042,7 +54042,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)
|
||||
@@ -78313,7 +78313,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
|
||||
@@ -84858,7 +84858,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" = (
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -45045,7 +45045,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" = (
|
||||
@@ -57013,7 +57013,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" = (
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -527,6 +527,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.", "<i>null</i>","<i>Error: No comment given.</i>", "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\]"))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
@@ -479,6 +479,10 @@ SUBSYSTEM_DEF(job)
|
||||
to_chat(M, "<b>[job.custom_spawn_text]</b>")
|
||||
if(CONFIG_GET(number/minimal_access_threshold))
|
||||
to_chat(M, "<span class='notice'><B>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.</B></span>")
|
||||
if(ishuman(H))
|
||||
var/mob/living/carbon/human/wageslave = H
|
||||
to_chat(M, "<b><span class = 'big'>Your account ID is [wageslave.account_id].</span></b>")
|
||||
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
|
||||
|
||||
@@ -34,10 +34,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()
|
||||
@@ -118,9 +116,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()]" : ""]"
|
||||
|
||||
@@ -573,7 +568,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,491 @@
|
||||
/datum/component/personal_crafting/Initialize()
|
||||
if(!ismob(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, .proc/create_mob_button)
|
||||
|
||||
/datum/component/personal_crafting/proc/create_mob_button(mob/user, client/CL)
|
||||
var/datum/hud/H = user.hud_used
|
||||
var/obj/screen/craft/C = new()
|
||||
C.icon = H.ui_style
|
||||
H.static_inventory += C
|
||||
if(!CL.prefs.widescreenpref)
|
||||
C.screen_loc = ui_boxcraft
|
||||
CL.screen += C
|
||||
RegisterSignal(C, COMSIG_CLICK, .proc/component_ui_interact)
|
||||
|
||||
/datum/component/personal_crafting
|
||||
var/busy
|
||||
var/viewing_category = 1
|
||||
var/viewing_subcategory = 1
|
||||
var/list/categories = list(
|
||||
CAT_WEAPONRY = list(
|
||||
CAT_WEAPON,
|
||||
CAT_AMMO,
|
||||
),
|
||||
CAT_ROBOT = CAT_NONE,
|
||||
CAT_MISC = list(
|
||||
CAT_MISCELLANEOUS,
|
||||
CAT_TOOL,
|
||||
CAT_FURNITURE,
|
||||
),
|
||||
CAT_PRIMAL = CAT_NONE,
|
||||
CAT_FOOD = list(
|
||||
CAT_BREAD,
|
||||
CAT_BURGER,
|
||||
CAT_CAKE,
|
||||
CAT_DONUT,
|
||||
CAT_EGG,
|
||||
CAT_ICE,
|
||||
CAT_MEAT,
|
||||
CAT_MEXICAN,
|
||||
CAT_MISCFOOD,
|
||||
CAT_PASTRY,
|
||||
CAT_PIE,
|
||||
CAT_PIZZA,
|
||||
CAT_SEAFOOD,
|
||||
CAT_SALAD,
|
||||
CAT_SANDWICH,
|
||||
CAT_SOUP,
|
||||
CAT_SPAGHETTI,
|
||||
),
|
||||
CAT_DRINK = CAT_NONE,
|
||||
CAT_CLOTHING = CAT_NONE,
|
||||
)
|
||||
|
||||
var/cur_category = CAT_NONE
|
||||
var/cur_subcategory = CAT_NONE
|
||||
var/datum/action/innate/crafting/button
|
||||
var/display_craftable_only = FALSE
|
||||
var/display_compact = TRUE
|
||||
|
||||
|
||||
|
||||
|
||||
/* This is what procs do:
|
||||
get_environment - gets a list of things accessable for crafting by user
|
||||
get_surroundings - takes a list of things and makes a list of key-types to values-amounts of said type in the list
|
||||
check_contents - takes a recipe and a key-type list and checks if said recipe can be done with available stuff
|
||||
check_tools - takes recipe, a key-type list, and a user and checks if there are enough tools to do the stuff, checks bugs one level deep
|
||||
construct_item - takes a recipe and a user, call all the checking procs, calls do_after, checks all the things again, calls del_reqs, creates result, calls CheckParts of said result with argument being list returned by deel_reqs
|
||||
del_reqs - takes recipe and a user, loops over the recipes reqs var and tries to find everything in the list make by get_environment and delete it/add to parts list, then returns the said list
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Check that the contents of the recipe meet the requirements.
|
||||
*
|
||||
* user: The /mob that initated the crafting.
|
||||
* R: The /datum/crafting_recipe being attempted.
|
||||
* contents: List of items to search for R's reqs.
|
||||
*/
|
||||
/datum/component/personal_crafting/proc/check_contents(mob/user, datum/crafting_recipe/R, list/contents)
|
||||
var/list/item_instances = contents["instances"]
|
||||
contents = contents["other"]
|
||||
|
||||
var/list/requirements_list = list()
|
||||
|
||||
// Process all requirements
|
||||
for(var/requirement_path in R.reqs)
|
||||
// Check we have the appropriate amount available in the contents list
|
||||
var/needed_amount = R.reqs[requirement_path]
|
||||
for(var/content_item_path in contents)
|
||||
// Right path and not blacklisted
|
||||
if(!ispath(content_item_path, requirement_path) || R.blacklist.Find(requirement_path))
|
||||
continue
|
||||
|
||||
needed_amount -= contents[content_item_path]
|
||||
if(needed_amount <= 0)
|
||||
break
|
||||
|
||||
if(needed_amount > 0)
|
||||
return FALSE
|
||||
|
||||
// Store the instances of what we will use for R.check_requirements() for requirement_path
|
||||
var/list/instances_list = list()
|
||||
for(var/instance_path in item_instances)
|
||||
if(ispath(instance_path, requirement_path))
|
||||
instances_list += item_instances[instance_path]
|
||||
|
||||
requirements_list[requirement_path] = instances_list
|
||||
|
||||
for(var/requirement_path in R.chem_catalysts)
|
||||
if(contents[requirement_path] < R.chem_catalysts[requirement_path])
|
||||
return FALSE
|
||||
|
||||
return R.check_requirements(user, requirements_list)
|
||||
|
||||
/datum/component/personal_crafting/proc/get_environment(mob/user)
|
||||
. = list()
|
||||
for(var/obj/item/I in user.held_items)
|
||||
. += I
|
||||
if(!isturf(user.loc))
|
||||
return
|
||||
var/list/L = block(get_step(user, SOUTHWEST), get_step(user, NORTHEAST))
|
||||
for(var/A in L)
|
||||
var/turf/T = A
|
||||
if(T.Adjacent(user))
|
||||
for(var/B in T)
|
||||
var/atom/movable/AM = B
|
||||
if(AM.flags_1 & HOLOGRAM_1)
|
||||
continue
|
||||
. += AM
|
||||
for(var/slot in list(SLOT_R_STORE, SLOT_L_STORE))
|
||||
. += user.get_item_by_slot(slot)
|
||||
|
||||
/datum/component/personal_crafting/proc/get_surroundings(mob/user)
|
||||
. = list()
|
||||
.["tool_behaviour"] = list()
|
||||
.["other"] = list()
|
||||
.["instances"] = list()
|
||||
for(var/obj/item/I in get_environment(user))
|
||||
if(I.flags_1 & HOLOGRAM_1)
|
||||
continue
|
||||
if(.["instances"][I.type])
|
||||
.["instances"][I.type] += I
|
||||
else
|
||||
.["instances"][I.type] = list(I)
|
||||
if(istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/S = I
|
||||
.["other"][I.type] += S.amount
|
||||
else if(I.tool_behaviour)
|
||||
.["tool_behaviour"] += I.tool_behaviour
|
||||
.["other"][I.type] += 1
|
||||
else
|
||||
if(istype(I, /obj/item/reagent_containers))
|
||||
var/obj/item/reagent_containers/RC = I
|
||||
if(RC.is_drainable())
|
||||
for(var/datum/reagent/A in RC.reagents.reagent_list)
|
||||
.["other"][A.type] += A.volume
|
||||
.["other"][I.type] += 1
|
||||
|
||||
/datum/component/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents)
|
||||
if(!R.tools.len)
|
||||
return TRUE
|
||||
var/list/possible_tools = list()
|
||||
var/list/present_qualities = list()
|
||||
present_qualities |= contents["tool_behaviour"]
|
||||
for(var/obj/item/I in user.contents)
|
||||
if(istype(I, /obj/item/storage))
|
||||
for(var/obj/item/SI in I.contents)
|
||||
possible_tools += SI.type
|
||||
if(SI.tool_behaviour)
|
||||
present_qualities.Add(SI.tool_behaviour)
|
||||
|
||||
possible_tools += I.type
|
||||
|
||||
if(I.tool_behaviour)
|
||||
present_qualities.Add(I.tool_behaviour)
|
||||
|
||||
possible_tools |= contents["other"]
|
||||
|
||||
main_loop:
|
||||
for(var/A in R.tools)
|
||||
if(A in present_qualities)
|
||||
continue
|
||||
else
|
||||
for(var/I in possible_tools)
|
||||
if(ispath(I, A))
|
||||
continue main_loop
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/component/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R)
|
||||
var/list/contents = get_surroundings(user)
|
||||
var/send_feedback = TRUE
|
||||
if(check_contents(user, R, contents))
|
||||
if(check_tools(user, R, contents))
|
||||
if(do_after(user, R.time, target = user))
|
||||
contents = get_surroundings(user)
|
||||
if(!check_contents(user, R, contents))
|
||||
return ", missing component."
|
||||
if(!check_tools(user, R, contents))
|
||||
return ", missing tool."
|
||||
var/list/parts = del_reqs(R, user)
|
||||
var/atom/movable/I = new R.result (get_turf(user.loc))
|
||||
I.CheckParts(parts, R)
|
||||
if(isitem(I))
|
||||
if(isfood(I))
|
||||
var/obj/item/reagent_containers/food/food_result = I
|
||||
var/total_quality = 0
|
||||
var/total_items = 0
|
||||
for(var/obj/item/reagent_containers/food/ingredient in parts)
|
||||
total_items += 1
|
||||
total_quality += ingredient.food_quality
|
||||
if(total_items == 0)
|
||||
food_result.adjust_food_quality(50)
|
||||
else
|
||||
food_result.adjust_food_quality(total_quality / total_items)
|
||||
user.put_in_hands(I)
|
||||
if(send_feedback)
|
||||
SSblackbox.record_feedback("tally", "object_crafted", 1, I.type)
|
||||
log_craft("[I] crafted by [user] at [loc_name(I.loc)]")
|
||||
return FALSE
|
||||
return "."
|
||||
return ", missing tool."
|
||||
return ", missing component."
|
||||
|
||||
|
||||
/*Del reqs works like this:
|
||||
|
||||
Loop over reqs var of the recipe
|
||||
Set var amt to the value current cycle req is pointing to, its amount of type we need to delete
|
||||
Get var/surroundings list of things accessable to crafting by get_environment()
|
||||
Check the type of the current cycle req
|
||||
If its reagent then do a while loop, inside it try to locate() reagent containers, inside such containers try to locate needed reagent, if there isnt remove thing from surroundings
|
||||
If there is enough reagent in the search result then delete the needed amount, create the same type of reagent with the same data var and put it into deletion list
|
||||
If there isnt enough take all of that reagent from the container, put into deletion list, substract the amt var by the volume of reagent, remove the container from surroundings list and keep searching
|
||||
While doing above stuff check deletion list if it already has such reagnet, if yes merge instead of adding second one
|
||||
If its stack check if it has enough amount
|
||||
If yes create new stack with the needed amount and put in into deletion list, substract taken amount from the stack
|
||||
If no put all of the stack in the deletion list, substract its amount from amt and keep searching
|
||||
While doing above stuff check deletion list if it already has such stack type, if yes try to merge them instead of adding new one
|
||||
If its anything else just locate() in in the list in a while loop, each find --s the amt var and puts the found stuff in deletion loop
|
||||
|
||||
Then do a loop over parts var of the recipe
|
||||
Do similar stuff to what we have done above, but now in deletion list, until the parts conditions are satisfied keep taking from the deletion list and putting it into parts list for return
|
||||
|
||||
After its done loop over deletion list and delete all the shit that wasnt taken by parts loop
|
||||
|
||||
del_reqs return the list of parts resulting object will receive as argument of CheckParts proc, on the atom level it will add them all to the contents, on all other levels it calls ..() and does whatever is needed afterwards but from contents list already
|
||||
*/
|
||||
|
||||
/datum/component/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, mob/user)
|
||||
var/list/surroundings
|
||||
var/list/Deletion = list()
|
||||
. = list()
|
||||
var/data
|
||||
var/amt
|
||||
main_loop:
|
||||
for(var/A in R.reqs)
|
||||
amt = R.reqs[A]
|
||||
surroundings = get_environment(user)
|
||||
surroundings -= Deletion
|
||||
if(ispath(A, /datum/reagent))
|
||||
var/datum/reagent/RG = new A
|
||||
var/datum/reagent/RGNT
|
||||
while(amt > 0)
|
||||
var/obj/item/reagent_containers/RC = locate() in surroundings
|
||||
RG = RC.reagents.get_reagent(A)
|
||||
if(RG)
|
||||
if(!locate(RG.type) in Deletion)
|
||||
Deletion += new RG.type()
|
||||
if(RG.volume > amt)
|
||||
RG.volume -= amt
|
||||
data = RG.data
|
||||
RC.reagents.conditional_update(RC)
|
||||
RG = locate(RG.type) in Deletion
|
||||
RG.volume = amt
|
||||
RG.data += data
|
||||
continue main_loop
|
||||
else
|
||||
surroundings -= RC
|
||||
amt -= RG.volume
|
||||
RC.reagents.reagent_list -= RG
|
||||
RC.reagents.conditional_update(RC)
|
||||
RGNT = locate(RG.type) in Deletion
|
||||
RGNT.volume += RG.volume
|
||||
RGNT.data += RG.data
|
||||
qdel(RG)
|
||||
RC.on_reagent_change()
|
||||
else
|
||||
surroundings -= RC
|
||||
else if(ispath(A, /obj/item/stack))
|
||||
var/obj/item/stack/S
|
||||
var/obj/item/stack/SD
|
||||
while(amt > 0)
|
||||
S = locate(A) in surroundings
|
||||
if(S.amount >= amt)
|
||||
if(!locate(S.type) in Deletion)
|
||||
SD = new S.type()
|
||||
Deletion += SD
|
||||
S.use(amt)
|
||||
SD = locate(S.type) in Deletion
|
||||
SD.amount += amt
|
||||
continue main_loop
|
||||
else
|
||||
amt -= S.amount
|
||||
if(!locate(S.type) in Deletion)
|
||||
Deletion += S
|
||||
else
|
||||
data = S.amount
|
||||
S = locate(S.type) in Deletion
|
||||
S.add(data)
|
||||
surroundings -= S
|
||||
else
|
||||
var/atom/movable/I
|
||||
while(amt > 0)
|
||||
I = locate(A) in surroundings
|
||||
Deletion += I
|
||||
surroundings -= I
|
||||
amt--
|
||||
var/list/partlist = list(R.parts.len)
|
||||
for(var/M in R.parts)
|
||||
partlist[M] = R.parts[M]
|
||||
for(var/A in R.parts)
|
||||
if(istype(A, /datum/reagent))
|
||||
var/datum/reagent/RG = locate(A) in Deletion
|
||||
if(RG.volume > partlist[A])
|
||||
RG.volume = partlist[A]
|
||||
. += RG
|
||||
Deletion -= RG
|
||||
continue
|
||||
else if(istype(A, /obj/item/stack))
|
||||
var/obj/item/stack/ST = locate(A) in Deletion
|
||||
if(ST.amount > partlist[A])
|
||||
ST.amount = partlist[A]
|
||||
. += ST
|
||||
Deletion -= ST
|
||||
continue
|
||||
else
|
||||
while(partlist[A] > 0)
|
||||
var/atom/movable/AM = locate(A) in Deletion
|
||||
. += AM
|
||||
Deletion -= AM
|
||||
partlist[A] -= 1
|
||||
while(Deletion.len)
|
||||
var/DL = Deletion[Deletion.len]
|
||||
Deletion.Cut(Deletion.len)
|
||||
qdel(DL)
|
||||
|
||||
/datum/component/personal_crafting/proc/component_ui_interact(obj/screen/craft/image, location, control, params, user)
|
||||
if(user == parent)
|
||||
ui_interact(user)
|
||||
|
||||
/datum/component/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_turf_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
cur_category = categories[1]
|
||||
if(islist(categories[cur_category]))
|
||||
var/list/subcats = categories[cur_category]
|
||||
cur_subcategory = subcats[1]
|
||||
else
|
||||
cur_subcategory = CAT_NONE
|
||||
ui = new(user, src, ui_key, "personal_crafting", "Crafting Menu", 700, 800, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
|
||||
/datum/component/personal_crafting/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["busy"] = busy
|
||||
data["category"] = cur_category
|
||||
data["subcategory"] = cur_subcategory
|
||||
data["display_craftable_only"] = display_craftable_only
|
||||
data["display_compact"] = display_compact
|
||||
|
||||
var/list/surroundings = get_surroundings(user)
|
||||
var/list/craftability = list()
|
||||
for(var/rec in GLOB.crafting_recipes)
|
||||
var/datum/crafting_recipe/R = rec
|
||||
|
||||
if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this.
|
||||
continue
|
||||
|
||||
if((R.category != cur_category) || (R.subcategory != cur_subcategory))
|
||||
continue
|
||||
|
||||
craftability["[REF(R)]"] = check_contents(user, R, surroundings)
|
||||
|
||||
data["craftability"] = craftability
|
||||
return data
|
||||
|
||||
/datum/component/personal_crafting/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
var/list/crafting_recipes = list()
|
||||
for(var/rec in GLOB.crafting_recipes)
|
||||
var/datum/crafting_recipe/R = rec
|
||||
|
||||
if(R.name == "") //This is one of the invalid parents that sneaks in
|
||||
continue
|
||||
|
||||
if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this.
|
||||
continue
|
||||
|
||||
if(isnull(crafting_recipes[R.category]))
|
||||
crafting_recipes[R.category] = list()
|
||||
|
||||
if(R.subcategory == CAT_NONE)
|
||||
crafting_recipes[R.category] += list(build_recipe_data(R))
|
||||
else
|
||||
if(isnull(crafting_recipes[R.category][R.subcategory]))
|
||||
crafting_recipes[R.category][R.subcategory] = list()
|
||||
crafting_recipes[R.category]["has_subcats"] = TRUE
|
||||
crafting_recipes[R.category][R.subcategory] += list(build_recipe_data(R))
|
||||
|
||||
data["crafting_recipes"] = crafting_recipes
|
||||
return data
|
||||
|
||||
|
||||
/datum/component/personal_crafting/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
if("make")
|
||||
var/datum/crafting_recipe/TR = locate(params["recipe"]) in GLOB.crafting_recipes
|
||||
ui_interact(usr)
|
||||
if(busy)
|
||||
to_chat(usr, "<span class='warning'>You are already making something!</span>")
|
||||
return
|
||||
busy = TRUE
|
||||
var/fail_msg = construct_item(usr, TR)
|
||||
if(!fail_msg)
|
||||
to_chat(usr, "<span class='notice'>[TR.name] constructed.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Construction failed[fail_msg]</span>")
|
||||
busy = FALSE
|
||||
if("toggle_recipes")
|
||||
display_craftable_only = !display_craftable_only
|
||||
. = TRUE
|
||||
if("toggle_compact")
|
||||
display_compact = !display_compact
|
||||
. = TRUE
|
||||
if("set_category")
|
||||
if(!isnull(params["category"]))
|
||||
cur_category = params["category"]
|
||||
if(!isnull(params["subcategory"]))
|
||||
if(params["subcategory"] == "0")
|
||||
cur_subcategory = ""
|
||||
else
|
||||
cur_subcategory = params["subcategory"]
|
||||
. = TRUE
|
||||
|
||||
/datum/component/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R)
|
||||
var/list/data = list()
|
||||
data["name"] = R.name
|
||||
data["ref"] = "[REF(R)]"
|
||||
var/req_text = ""
|
||||
var/tool_text = ""
|
||||
var/catalyst_text = ""
|
||||
|
||||
for(var/a in R.reqs)
|
||||
//We just need the name, so cheat-typecast to /atom for speed (even tho Reagents are /datum they DO have a "name" var)
|
||||
//Also these are typepaths so sadly we can't just do "[a]"
|
||||
var/atom/A = a
|
||||
req_text += " [R.reqs[A]] [initial(A.name)],"
|
||||
req_text = replacetext(req_text,",","",-1)
|
||||
data["req_text"] = req_text
|
||||
|
||||
for(var/a in R.chem_catalysts)
|
||||
var/atom/A = a //cheat-typecast
|
||||
catalyst_text += " [R.chem_catalysts[A]] [initial(A.name)],"
|
||||
catalyst_text = replacetext(catalyst_text,",","",-1)
|
||||
data["catalyst_text"] = catalyst_text
|
||||
|
||||
for(var/a in R.tools)
|
||||
if(ispath(a, /obj/item))
|
||||
var/obj/item/b = a
|
||||
tool_text += " [initial(b.name)],"
|
||||
else
|
||||
tool_text += " [a],"
|
||||
tool_text = replacetext(tool_text,",","",-1)
|
||||
data["tool_text"] = tool_text
|
||||
|
||||
return data
|
||||
|
||||
//Mind helpers
|
||||
|
||||
/datum/mind/proc/teach_crafting_recipe(R)
|
||||
if(!learned_recipes)
|
||||
learned_recipes = list()
|
||||
learned_recipes |= R
|
||||
@@ -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, "<span class='notice'>You feel a mild warmth as your blood purifies itself.</span>")
|
||||
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, "<span class='notice'>You feel an odd gurgle in your stomach, as if it was working much faster than normal.</span>")
|
||||
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
|
||||
|
||||
@@ -50,4 +50,4 @@ Bonus
|
||||
else
|
||||
to_chat(M, "<span class='warning'><i>[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]</i></span>")
|
||||
M.overeatduration = max(M.overeatduration - 100, 0)
|
||||
M.nutrition = max(M.nutrition - 100, 0)
|
||||
M.adjust_nutrition(-100)
|
||||
@@ -52,7 +52,7 @@
|
||||
if(prob(3))
|
||||
to_chat(affected_mob, "<span class='warning'><i>[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]</i></span>")
|
||||
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, "<span class='danger'>[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]</span>")
|
||||
affected_mob.adjust_bodytemperature(40)
|
||||
|
||||
+4
-3
@@ -155,10 +155,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()
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
if(level_diff > 0)
|
||||
LAZYSET(current_users, user, TRUE)
|
||||
to_chat(user, "<span class='notice'>You begin cutting [holder]'s [color] wire...</span>")
|
||||
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = "<span class='notice'><b>You feel cool air surround you. You go numb as your senses turn inward.</b></span>"
|
||||
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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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, "<span class='notice'>You deposit [I]. The station now has [SSshuttle.points] credits.</span>")
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
D.adjust_money(value)
|
||||
to_chat(user, "<span class='notice'>You deposit [I]. The Cargo Budget is now [D.account_balance] cr.</span>")
|
||||
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
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
@@ -106,7 +109,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)
|
||||
@@ -136,7 +139,7 @@
|
||||
mess = TRUE
|
||||
update_icon()
|
||||
return FALSE
|
||||
|
||||
current_insurance = insurance
|
||||
attempting = TRUE //One at a time!!
|
||||
countdown.start()
|
||||
|
||||
@@ -199,15 +202,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.
|
||||
@@ -234,7 +251,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.")
|
||||
@@ -343,7 +360,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)
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
if(food <= 0)
|
||||
dat += "<br>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, "<span class='userdanger'>Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor.</span>")
|
||||
if(fuel <= 0)
|
||||
dat += "<br>You ran out of fuel, and drift, slowly, into a star."
|
||||
|
||||
@@ -467,7 +467,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
|
||||
to_chat(usr, "<span class='alert'>No log exists for this job.</span>")
|
||||
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
|
||||
|
||||
@@ -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"]] => <font class='good'>Cloning cycle in progress...</font>"
|
||||
records -= R
|
||||
|
||||
@@ -415,7 +415,7 @@
|
||||
else if(pod.occupant)
|
||||
temp = "<font class='bad'>Cloning cycle already in progress.</font>"
|
||||
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"]] => <font class='good'>Cloning cycle in progress...</font>"
|
||||
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 = "<font class='average'>Subject already in database.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
return
|
||||
|
||||
if(SSeconomy.full_ancap && !has_bank_account)
|
||||
scantemp = "<font class='average'>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.</font>"
|
||||
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()
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
// main interface
|
||||
if("main")
|
||||
state = STATE_DEFAULT
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
|
||||
if("login")
|
||||
var/mob/M = usr
|
||||
|
||||
@@ -71,21 +71,21 @@
|
||||
if(check_access(I))
|
||||
authenticated = 1
|
||||
auth_id = "[I.registered_name] ([I.assignment])"
|
||||
if((ACCESS_CAPTAIN in I.access))
|
||||
if((20 in I.access))
|
||||
authenticated = 2
|
||||
playsound(src, 'sound/machines/terminal_on.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE)
|
||||
if(obj_flags & EMAGGED)
|
||||
authenticated = 2
|
||||
auth_id = "Unknown"
|
||||
to_chat(M, "<span class='warning'>[src] lets out a quiet alarm as its login is overridden.</span>")
|
||||
playsound(src, 'sound/machines/terminal_on.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 25, 0)
|
||||
playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE)
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 25, FALSE)
|
||||
if(prob(25))
|
||||
for(var/mob/living/silicon/ai/AI in active_ais())
|
||||
SEND_SOUND(AI, sound('sound/machines/terminal_alert.ogg', volume = 10)) //Very quiet for balance reasons
|
||||
if("logout")
|
||||
authenticated = 0
|
||||
playsound(src, 'sound/machines/terminal_off.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE)
|
||||
|
||||
if("swipeidseclevel")
|
||||
var/mob/M = usr
|
||||
@@ -109,7 +109,7 @@
|
||||
security_level_cd = world.time + 15 SECONDS
|
||||
if(GLOB.security_level != old_level)
|
||||
to_chat(usr, "<span class='notice'>Authorization confirmed. Modifying security level.</span>")
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
|
||||
//Only notify people if an actual change happened
|
||||
var/security_level = NUM2SECLEVEL(GLOB.security_level)
|
||||
log_game("[key_name(usr)] has changed the security level to [security_level] with [src] at [AREACOORD(usr)].")
|
||||
@@ -118,29 +118,34 @@
|
||||
tmp_alertlevel = 0
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You are not authorized to do this!</span>")
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
|
||||
tmp_alertlevel = 0
|
||||
state = STATE_DEFAULT
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You need to swipe your ID!</span>")
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
|
||||
|
||||
if("announce")
|
||||
if(authenticated==2)
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE)
|
||||
make_announcement(usr)
|
||||
|
||||
if("crossserver")
|
||||
if(authenticated==2)
|
||||
var/dest = href_list["cross_dest"]
|
||||
if(!checkCCcooldown())
|
||||
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
|
||||
return
|
||||
var/input = stripped_multiline_input(usr, "Please choose a message to transmit to allied stations. Please be aware that this process is very expensive, and abuse will lead to... termination.", "Send a message to an allied station.", "")
|
||||
var/warning = dest == "all" ? "Please choose a message to transmit to allied stations." : "Please choose a message to transmit to [dest] sector station."
|
||||
var/input = stripped_multiline_input(usr, "[warning] Please be aware that this process is very expensive, and abuse will lead to... termination.", "Send a message to an allied station.", "")
|
||||
if(!input || !(usr in view(1,src)) || !checkCCcooldown())
|
||||
return
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
send2otherserver("[station_name()]", input,"Comms_Console")
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
|
||||
if(dest == "all")
|
||||
send2otherserver("[station_name()]", input,"Comms_Console")
|
||||
else
|
||||
send2otherserver("[station_name()]", input,"Comms_Console", list(dest))
|
||||
minor_announce(input, title = "Outgoing message to allied station")
|
||||
usr.log_talk(input, LOG_SAY, tag="message to the other server")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] has sent a message to the other server.")
|
||||
@@ -156,30 +161,34 @@
|
||||
var/datum/map_template/shuttle/S = locate(href_list["chosen_shuttle"]) in shuttles
|
||||
if(S && istype(S))
|
||||
if(SSshuttle.emergency.mode != SHUTTLE_RECALL && SSshuttle.emergency.mode != SHUTTLE_IDLE)
|
||||
to_chat(usr, "It's a bit late to buy a new shuttle, don't you think?")
|
||||
to_chat(usr, "<span class='alert'>It's a bit late to buy a new shuttle, don't you think?</span>")
|
||||
return
|
||||
if(SSshuttle.shuttle_purchased)
|
||||
to_chat(usr, "A replacement shuttle has already been purchased.")
|
||||
to_chat(usr, "<span class='alert'>A replacement shuttle has already been purchased.</span>")
|
||||
else if(!S.prerequisites_met())
|
||||
to_chat(usr, "You have not met the requirements for purchasing this shuttle.")
|
||||
to_chat(usr, "<span class='alert'>You have not met the requirements for purchasing this shuttle.</span>")
|
||||
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)
|
||||
SSshuttle.shuttle_purchased = TRUE
|
||||
SSshuttle.unload_preview()
|
||||
SSshuttle.load_template(S)
|
||||
SSshuttle.existing_shuttle = SSshuttle.emergency
|
||||
SSshuttle.action_load(S)
|
||||
SSshuttle.points -= S.credit_cost
|
||||
minor_announce("[usr.real_name] has purchased [S.name] for [S.credit_cost] credits." , "Shuttle Purchase")
|
||||
D.adjust_money(-S.credit_cost)
|
||||
minor_announce("[usr.real_name] has purchased [S.name] for [S.credit_cost] credits.[S.extra_desc ? " [S.extra_desc]" : ""]" , "Shuttle Purchase")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [S.name].")
|
||||
log_shuttle("[key_name(usr)] has purchased [S.name].")
|
||||
SSblackbox.record_feedback("text", "shuttle_purchase", 1, "[S.name]")
|
||||
else
|
||||
to_chat(usr, "Not enough credits.")
|
||||
to_chat(usr, "<span class='alert'>Insufficient credits.</span>")
|
||||
|
||||
if("callshuttle")
|
||||
state = STATE_DEFAULT
|
||||
if(authenticated)
|
||||
if(authenticated && SSshuttle.canEvac(usr))
|
||||
state = STATE_CALLSHUTTLE
|
||||
if("callshuttle2")
|
||||
if(authenticated)
|
||||
@@ -260,7 +269,7 @@
|
||||
|
||||
// Status display stuff
|
||||
if("setstat")
|
||||
playsound(src, "terminal_type", 50, 0)
|
||||
playsound(src, "terminal_type", 50, FALSE)
|
||||
switch(href_list["statdisp"])
|
||||
if("message")
|
||||
post_status("message", stat_msg1, stat_msg2)
|
||||
@@ -280,12 +289,12 @@
|
||||
if("MessageCentCom")
|
||||
if(authenticated)
|
||||
if(!checkCCcooldown())
|
||||
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
|
||||
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
|
||||
return
|
||||
var/input = stripped_input(usr, "Please choose a message to transmit to CentCom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to CentCom.", "")
|
||||
if(!input || !(usr in view(1,src)) || !checkCCcooldown())
|
||||
return
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
|
||||
CentCom_announce(input, usr)
|
||||
to_chat(usr, "<span class='notice'>Message transmitted to Central Command.</span>")
|
||||
for(var/client/X in GLOB.admins)
|
||||
@@ -298,15 +307,15 @@
|
||||
|
||||
// OMG SYNDICATE ...LETTERHEAD
|
||||
if("MessageSyndicate")
|
||||
if((authenticated==2) && (obj_flags & EMAGGED))
|
||||
if((authenticated) && (obj_flags & EMAGGED))
|
||||
if(!checkCCcooldown())
|
||||
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
|
||||
return
|
||||
var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING COORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to /??????/.", "")
|
||||
if(!input || !(usr in view(1,src)) || !checkCCcooldown())
|
||||
return
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
|
||||
Syndicate_announce(input, usr)
|
||||
to_chat(usr, "<span class='danger'>SYSERR @l(19833)of(transmit.dm): !@$ MESSAGE TRANSMITTED TO SYNDICATE COMMAND.</span>")
|
||||
for(var/client/X in GLOB.admins)
|
||||
@@ -319,7 +328,7 @@
|
||||
|
||||
if("RestoreBackup")
|
||||
to_chat(usr, "<span class='notice'>Backup routing data restored!</span>")
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
|
||||
obj_flags &= ~EMAGGED
|
||||
updateDialog()
|
||||
|
||||
@@ -333,8 +342,8 @@
|
||||
return
|
||||
Nuke_request(input, usr)
|
||||
to_chat(usr, "<span class='notice'>Request sent.</span>")
|
||||
usr.log_message("has requested the nuclear codes from CentCom", LOG_SAY)
|
||||
priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested","commandreport")
|
||||
usr.log_message("has requested the nuclear codes from CentCom with reason \"[input]\"", LOG_SAY)
|
||||
priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/ai/commandreport.ogg')
|
||||
CM.lastTimeUsed = world.time
|
||||
|
||||
|
||||
@@ -440,8 +449,7 @@
|
||||
if(authenticated == 1)
|
||||
authenticated = 2
|
||||
to_chat(user, "<span class='danger'>You scramble the communication routing circuits!</span>")
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
|
||||
return TRUE
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE)
|
||||
|
||||
/obj/machinery/computer/communications/ui_interact(mob/user)
|
||||
. = ..()
|
||||
@@ -506,16 +514,16 @@
|
||||
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=login'>Log In</A> \]"
|
||||
if(STATE_CALLSHUTTLE)
|
||||
dat += get_call_shuttle_form()
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE)
|
||||
if(STATE_CANCELSHUTTLE)
|
||||
dat += get_cancel_shuttle_form()
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE)
|
||||
if(STATE_MESSAGELIST)
|
||||
dat += "Messages:"
|
||||
for(var/i in 1 to messages.len)
|
||||
var/datum/comm_message/M = messages[i]
|
||||
dat += "<BR><A HREF='?src=[REF(src)];operation=viewmessage;message-num=[i]'>[M.title]</A>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
|
||||
if(STATE_VIEWMESSAGE)
|
||||
if (currmsg)
|
||||
dat += "<B>[currmsg.title]</B><BR><BR>[currmsg.content]"
|
||||
@@ -549,13 +557,12 @@
|
||||
dat += " <A HREF='?src=[REF(src)];operation=setstat;statdisp=alert;alert=redalert'>Red Alert</A> |"
|
||||
dat += " <A HREF='?src=[REF(src)];operation=setstat;statdisp=alert;alert=lockdown'>Lockdown</A> |"
|
||||
dat += " <A HREF='?src=[REF(src)];operation=setstat;statdisp=alert;alert=biohazard'>Biohazard</A> \]<BR><HR>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
|
||||
if(STATE_ALERT_LEVEL)
|
||||
dat += "Current alert level: [NUM2SECLEVEL(GLOB.security_level)]<BR>"
|
||||
if(GLOB.security_level == SEC_LEVEL_DELTA)
|
||||
dat += "<font color='red'><b>The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate.</b></font>"
|
||||
else
|
||||
dat += "<A HREF='?src=[REF(src)];operation=securitylevel;newalertlevel=[SEC_LEVEL_AMBER]'>Amber</A><BR>"
|
||||
dat += "<A HREF='?src=[REF(src)];operation=securitylevel;newalertlevel=[SEC_LEVEL_BLUE]'>Blue</A><BR>"
|
||||
dat += "<A HREF='?src=[REF(src)];operation=securitylevel;newalertlevel=[SEC_LEVEL_GREEN]'>Green</A>"
|
||||
if(STATE_CONFIRM_LEVEL)
|
||||
@@ -563,7 +570,7 @@
|
||||
dat += "Confirm the change to: [NUM2SECLEVEL(tmp_alertlevel)]<BR>"
|
||||
dat += "<A HREF='?src=[REF(src)];operation=swipeidseclevel'>Swipe ID</A> to confirm change.<BR>"
|
||||
if(STATE_TOGGLE_EMERGENCY)
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE)
|
||||
if(GLOB.emergency_access == 1)
|
||||
dat += "<b>Emergency Maintenance Access is currently <font color='red'>ENABLED</font></b>"
|
||||
dat += "<BR>Restore maintenance access restrictions? <BR>\[ <A HREF='?src=[REF(src)];operation=disableemergency'>OK</A> | <A HREF='?src=[REF(src)];operation=viewmessage'>Cancel</A> \]"
|
||||
@@ -572,7 +579,8 @@
|
||||
dat += "<BR>Lift access restrictions on maintenance and external airlocks? <BR>\[ <A HREF='?src=[REF(src)];operation=enableemergency'>OK</A> | <A HREF='?src=[REF(src)];operation=viewmessage'>Cancel</A> \]"
|
||||
|
||||
if(STATE_PURCHASE)
|
||||
dat += "Budget: [SSshuttle.points] Credits.<BR>"
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
dat += "Budget: [D.account_balance] Credits.<BR>"
|
||||
dat += "<BR>"
|
||||
dat += "<b>Caution: Purchasing dangerous shuttles may lead to mutiny and/or death.</b><br>"
|
||||
dat += "<BR>"
|
||||
@@ -696,7 +704,6 @@
|
||||
if(GLOB.security_level == SEC_LEVEL_DELTA)
|
||||
dat += "<font color='red'><b>The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate.</b></font>"
|
||||
else
|
||||
dat += "<A HREF='?src=[REF(src)];operation=ai-securitylevel;newalertlevel=[SEC_LEVEL_AMBER]'>Amber</A><BR>"
|
||||
dat += "<A HREF='?src=[REF(src)];operation=ai-securitylevel;newalertlevel=[SEC_LEVEL_BLUE]'>Blue</A><BR>"
|
||||
dat += "<A HREF='?src=[REF(src)];operation=ai-securitylevel;newalertlevel=[SEC_LEVEL_GREEN]'>Green</A>"
|
||||
|
||||
@@ -713,7 +720,7 @@
|
||||
|
||||
/obj/machinery/computer/communications/proc/make_announcement(mob/living/user, is_silicon)
|
||||
if(!SScommunications.can_announce(user, is_silicon))
|
||||
to_chat(user, "Intercomms recharging. Please stand by.")
|
||||
to_chat(user, "<span class='alert'>Intercomms recharging. Please stand by.</span>")
|
||||
return
|
||||
var/input = stripped_input(user, "Please choose a message to announce to the station crew.", "What?")
|
||||
if(!input || !user.canUseTopic(src))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -260,6 +260,7 @@
|
||||
|
||||
/obj/item/electronics/firelock
|
||||
name = "firelock circuitry"
|
||||
custom_price = 50
|
||||
desc = "A circuit board used in construction of firelocks."
|
||||
icon_state = "mainboard"
|
||||
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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("<span class='notice'>[user] shows you: [icon2html(src, viewers(user))] [src.name].</span>", \
|
||||
"<span class='notice'>You show \the [src.name].</span>")
|
||||
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, "<span class='notice'>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.</span>")
|
||||
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, "<span class='warning'>[I] doesn't seem to be worth anything!</span>")
|
||||
return
|
||||
|
||||
if(!registered_account)
|
||||
to_chat(user, "<span class='warning'>[src] doesn't have a linked account to deposit [I] into!</span>")
|
||||
return
|
||||
|
||||
registered_account.adjust_money(cash_money)
|
||||
if(physical_currency)
|
||||
to_chat(user, "<span class='notice'>You stuff [I] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] credits to the linked account.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You insert [I] into [src], adding [cash_money] credits to the linked account.</span>")
|
||||
|
||||
to_chat(user, "<span class='notice'>The linked account now reports a balance of [registered_account.account_balance] cr.</span>")
|
||||
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, "<span class='warning'>This ID has no modular banking support whatsover, must be an older model...</span>")
|
||||
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, "<span class='warning'>The account ID number needs to be between 111111 and 999999.</span>")
|
||||
return
|
||||
if (registered_account && registered_account.account_id == new_bank_id)
|
||||
to_chat(user, "<span class='warning'>The account ID was already assigned to this card.</span>")
|
||||
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, "<span class='notice'>The provided account has been linked to this ID card.</span>")
|
||||
|
||||
return TRUE
|
||||
|
||||
to_chat(user, "<span class='warning'>The account ID number provided is invalid.</span>")
|
||||
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("<span class='warning'>ERROR: UNABLE TO LOGIN DUE TO SCHEDULED MAINTENANCE. MAINTENANCE IS SCHEDULED TO COMPLETE IN [(registered_account.withdrawDelay - world.time)/10] SECONDS.</span>", 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, "<span class='notice'>You withdraw [amount_to_remove] credits into a holochip.</span>")
|
||||
return
|
||||
else
|
||||
var/difference = amount_to_remove - registered_account.account_balance
|
||||
registered_account.bank_card_talk("<span class='warning'>ERROR: The linked account requires [difference] more credit\s to perform that withdrawal.</span>", 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))
|
||||
. += "<span class='info'>This ID has no banking support whatsover, must be an older model...</span>"
|
||||
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."
|
||||
. += "<span class='info'>Alt-Click the ID to pull money from the linked account in the form of holochips.</span>"
|
||||
. += "<span class='info'>You can insert credits into the linked account by pressing holochips, cash, or coins against the ID.</span>"
|
||||
if(registered_account.account_holder == user.real_name)
|
||||
. += "<span class='boldnotice'>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.</span>"
|
||||
else
|
||||
. += "<span class='info'>There is no registered account linked to this card. Alt-Click to add one.</span>"
|
||||
|
||||
/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, "<span class='notice'>You successfully forge the ID card.</span>")
|
||||
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, "<span class='notice'>Your account number has been automatically assigned.</span>")
|
||||
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, "<span class='notice'>You successfully reset the ID card.</span>")
|
||||
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)
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, "<span class='warning'>This device is too advanced for you!</span>")
|
||||
return
|
||||
if(dumped)
|
||||
to_chat(user, "<span class='warning'>You already activated Protocol CRAB-17.</span>")
|
||||
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)
|
||||
. = ..()
|
||||
. += "<span class='info'>It's integrated integrity meter reads: <b>HEALTH: [obj_integrity]</b>.</span>"
|
||||
|
||||
/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, "<span class='warning'>This card does not have a registered account!</span>")
|
||||
return
|
||||
if(!card.registered_account.being_dumped)
|
||||
to_chat(user, "<span class='warning'>It appears that your funds are safe from draining!</span>")
|
||||
return
|
||||
if(do_after(user, 40, target = src))
|
||||
if(!card.registered_account.being_dumped)
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You quickly cash out your funds to a more secure banking location. Funds are safu.</span>") // 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("<span class='game deadsay'>Protocol CRAB-17 has been activated. A space-coin market has been launched at the station!</span>", 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
|
||||
@@ -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)
|
||||
. = ..()
|
||||
. += "<span class='notice'>It's loaded with [credits] credit[( credits > 1 ) ? "s" : ""]</span>\n"+\
|
||||
"<span class='notice'>Alt-Click to split.</span>"
|
||||
|
||||
/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, "<span class='notice'>You insert the credits into [src].</span>")
|
||||
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, "<span class='notice'>You extract [split_amount] credits into a new holochip.</span>")
|
||||
|
||||
/obj/item/holochip/emp_act(severity)
|
||||
. = ..()
|
||||
if(. & EMP_PROTECT_SELF)
|
||||
return
|
||||
var/wipe_chance = 60 / severity
|
||||
if(prob(wipe_chance))
|
||||
visible_message("<span class='warning'>[src] fizzles and disappears!</span>")
|
||||
qdel(src) //rip cash
|
||||
@@ -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, "<span class='notice'>Injecting [units] unit\s of [chem] into occupant.</span>") //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("<span class='warning'>[hound.name]'s mobile brig clunks in series as [target] slips inside.</span>", "<span class='notice'>Your mobile brig groans lightly as [target] slips inside.</span>")
|
||||
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,"<span class='warning'>Your [src] is full. Eject or process contents to continue.</span>")
|
||||
return
|
||||
if(isitem(target))
|
||||
var/obj/item/I = target
|
||||
if(CheckAccepted(I))
|
||||
to_chat(user,"<span class='warning'>[I] registers an error code to your [src]</span>")
|
||||
return
|
||||
if(I.w_class > WEIGHT_CLASS_NORMAL)
|
||||
to_chat(user,"<span class='warning'>[I] is too large to fit into your [src]</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[hound.name] is ingesting [I] into their [src.name].</span>", "<span class='notice'>You start ingesting [target] into your [src.name]...</span>")
|
||||
if(do_after(user, 15, target = target) && length(contents) < max_item_count)
|
||||
I.forceMove(src)
|
||||
I.visible_message("<span class='warning'>[hound.name]'s garbage processor groans lightly as [I] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [I] slips inside.</span>")
|
||||
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, "<span class='warning'>[target] registers an error code to your [src]</span>")
|
||||
return
|
||||
if(patient)
|
||||
to_chat(user,"<span class='warning'>Your [src] is already occupied.</span>")
|
||||
return
|
||||
if(trashman.buckled)
|
||||
to_chat(user,"<span class='warning'>[trashman] is buckled and can not be put into your [src].</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[hound.name] is ingesting [trashman] into their [src].</span>", "<span class='notice'>You start ingesting [trashman] into your [src.name]...</span>")
|
||||
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("<span class='warning'>[hound.name]'s garbage processor groans lightly as [trashman] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [trashman] slips inside.</span>")
|
||||
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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -249,10 +249,8 @@
|
||||
/obj/item/book/granter/spell/smoke/recoil(mob/user)
|
||||
..()
|
||||
to_chat(user,"<span class='caution'>Your stomach rumbles...</span>")
|
||||
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
|
||||
|
||||
@@ -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("<span class='suicide'>[user] begins flattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
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, "<span class='danger'>ERROR ERROR: Target not lickable. Aborting display-of-affection subroutine.</span>")
|
||||
return
|
||||
|
||||
if(check_zone(R.zone_selected) == "head")
|
||||
R.visible_message("<span class='warning'>\the [R] affectionally licks \the [L]'s face!</span>", "<span class='notice'>You affectionally lick \the [L]'s face!</span>")
|
||||
playsound(R, 'sound/effects/attackblob.ogg', 50, 1)
|
||||
else
|
||||
R.visible_message("<span class='warning'>\the [R] affectionally licks \the [L]!</span>", "<span class='notice'>You affectionally lick \the [L]!</span>")
|
||||
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("<span class='notice'>[user] [pick("nuzzles", "pushes", "boops")] \the [target.name] with their nose!</span>")
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -74,4 +74,43 @@
|
||||
/obj/structure/closet/crate/secure/medical
|
||||
desc = "A secure medical crate."
|
||||
name = "medical crate"
|
||||
icon_state = "medical_secure_crate"
|
||||
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, "<span class='notice'>It's locked with a privacy lock, and can only be unlocked by the buyer's ID.</span>")
|
||||
|
||||
/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("<span class='notice'>[user] unlocks [src]'s privacy lock.</span>",
|
||||
"<span class='notice'>You unlock [src]'s privacy lock.</span>")
|
||||
privacy_lock = FALSE
|
||||
update_icon()
|
||||
else if(!silent)
|
||||
to_chat(user, "<span class='notice'>Bank account does not match with buyer!</span>")
|
||||
else if(!silent)
|
||||
to_chat(user, "<span class='notice'>No linked bank account detected!</span>")
|
||||
else if(!silent)
|
||||
to_chat(user, "<span class='notice'>No ID detected!</span>")
|
||||
else if(!silent)
|
||||
to_chat(user, "<span class='warning'>[src] is broken!</span>")
|
||||
else ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=delayed_onlyone'>There can only be one! (40-second delay)</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=stupify'>Make all players stupid</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=eagles'>Egalitarian Station Mode</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=ancap'>Anarcho-Capitalist Station Mode</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=blackout'>Break all lights</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=whiteout'>Fix all lights</A><BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];secrets=floorlava'>The floor is lava! (DANGEROUS: extremely lame)</A><BR>
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, "<span class='warning'>You feel satiated as you received a new soul.</span>")
|
||||
update_hud()
|
||||
switch(SOULVALUE)
|
||||
|
||||
@@ -118,30 +118,33 @@
|
||||
|
||||
// After we remove items, at least give them what they need to live.
|
||||
target.dna.species.give_important_for_life(target)
|
||||
|
||||
// After pod is sent we start the victim narrative/heal.
|
||||
handleVictimExperience(M)
|
||||
|
||||
// This is slightly delayed because of the sleep calls above to handle the narrative.
|
||||
// We don't want to tell the station instantly.
|
||||
var/points_to_check
|
||||
if(points_to_check >= ransom)
|
||||
SSshuttle.points -= ransom
|
||||
else
|
||||
SSshuttle.points -= points_to_check
|
||||
|
||||
handleVictimExperience(M) // After pod is sent we start the victim narrative/heal.
|
||||
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")
|
||||
|
||||
// They're off to holding - handle the return timer and give some text about what's going on.
|
||||
/datum/syndicate_contract/proc/handleVictimExperience(var/mob/living/M)
|
||||
// Ship 'em back - dead or alive, 4 minutes wait.
|
||||
// Even if they weren't the target, we're still treating them the same.
|
||||
addtimer(CALLBACK(src, .proc/returnVictim, M), (60 * 10) * 4)
|
||||
sleep(30)
|
||||
|
||||
if (M.stat != DEAD)
|
||||
M.reagents.add_reagent(/datum/reagent/medicine/regen_jelly, 20)
|
||||
// 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.
|
||||
M.reagents.add_reagent(/datum/reagent/medicine/regen_jelly, 20) // Heal them up - gets them out of crit/soft crit. -- now 100% toxinlover friendly!!
|
||||
M.flash_act()
|
||||
M.confused += 10
|
||||
M.blur_eyes(5)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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({"<a href='?src=[REF(src)];refresh=1'>Refresh</a>
|
||||
<a href='?src=[REF(src)];refresh=1;choice=Print'>Print Paper</a>
|
||||
<p>Credits: <b>[SSshuttle.points]</b></p>
|
||||
<p>Credits: <b>[D.account_balance]</b></p>
|
||||
<table style="text-align:center;" border="1" cellspacing="0" width="100%">
|
||||
<tr><th>Name</th><th>Description</th><th>Reward</th><th>Completion</th><th>Status</th></tr>"})
|
||||
for(var/datum/bounty/B in GLOB.bounties_list)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "Used to order supplies, approve requests, and control the shuttle."
|
||||
icon_screen = "supply"
|
||||
circuit = /obj/item/circuitboard/computer/cargo
|
||||
req_access = list(ACCESS_CARGO)
|
||||
ui_x = 780
|
||||
ui_y = 750
|
||||
|
||||
@@ -25,6 +26,7 @@
|
||||
desc = "Used to request supplies from cargo."
|
||||
icon_screen = "request"
|
||||
circuit = /obj/item/circuitboard/computer/cargo/request
|
||||
req_access = list()
|
||||
requestonly = TRUE
|
||||
|
||||
/obj/machinery/computer/cargo/Initialize()
|
||||
@@ -49,6 +51,7 @@
|
||||
. |= EXPORT_EMAG
|
||||
|
||||
/obj/machinery/computer/cargo/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
if(user)
|
||||
@@ -62,7 +65,9 @@
|
||||
var/obj/item/circuitboard/computer/cargo/board = circuit
|
||||
board.contraband = TRUE
|
||||
board.obj_flags |= EMAGGED
|
||||
req_access = list()
|
||||
update_static_data(user)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
@@ -74,9 +79,12 @@
|
||||
/obj/machinery/computer/cargo/ui_data()
|
||||
var/list/data = list()
|
||||
data["location"] = SSshuttle.supply.getStatusText()
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
data["points"] = D.account_balance
|
||||
data["away"] = SSshuttle.supply.getDockedId() == "supply_away"
|
||||
data["self_paid"] = self_paid
|
||||
data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE
|
||||
data["points"] = SSshuttle.points
|
||||
data["loan"] = !!SSshuttle.shuttle_loan
|
||||
data["loan_dispatched"] = SSshuttle.shuttle_loan && SSshuttle.shuttle_loan.dispatched
|
||||
var/message = "Remember to stamp and send back the supply manifests."
|
||||
@@ -92,6 +100,7 @@
|
||||
"cost" = SO.pack.cost,
|
||||
"id" = SO.id,
|
||||
"orderer" = SO.orderer,
|
||||
"paid" = !isnull(SO.paying_account) //paid by requester
|
||||
))
|
||||
|
||||
data["requests"] = list()
|
||||
@@ -131,6 +140,9 @@
|
||||
/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui)
|
||||
if(..())
|
||||
return
|
||||
if(!allowed(usr))
|
||||
to_chat(usr, "<span class='notice'>Access denied.</span>")
|
||||
return
|
||||
switch(action)
|
||||
if("send")
|
||||
if(!SSshuttle.supply.canMove())
|
||||
@@ -182,19 +194,33 @@
|
||||
name = usr.real_name
|
||||
rank = "Silicon"
|
||||
|
||||
var/datum/bank_account/account
|
||||
if(self_paid && ishuman(usr))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
var/obj/item/card/id/id_card = H.get_idcard(TRUE)
|
||||
if(!istype(id_card))
|
||||
say("No ID card detected.")
|
||||
return
|
||||
account = id_card.registered_account
|
||||
if(!istype(account))
|
||||
say("Invalid bank account.")
|
||||
return
|
||||
|
||||
var/reason = ""
|
||||
if(requestonly)
|
||||
if(requestonly && !self_paid)
|
||||
reason = stripped_input("Reason:", name, "")
|
||||
if(isnull(reason) || ..())
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason)
|
||||
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account)
|
||||
SO.generateRequisition(T)
|
||||
if(requestonly)
|
||||
if(requestonly && !self_paid)
|
||||
SSshuttle.requestlist += SO
|
||||
else
|
||||
SSshuttle.shoppinglist += SO
|
||||
if(self_paid)
|
||||
say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.")
|
||||
. = TRUE
|
||||
if("remove")
|
||||
var/id = text2num(params["id"])
|
||||
@@ -224,6 +250,9 @@
|
||||
if("denyall")
|
||||
SSshuttle.requestlist.Cut()
|
||||
. = TRUE
|
||||
if("toggleprivate")
|
||||
self_paid = !self_paid
|
||||
. = TRUE
|
||||
if(.)
|
||||
post_signal("supply")
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
|
||||
var/list/total_value = list() //export instance => total value of sold objects
|
||||
var/list/reagents_volume = list()//export reagents => into the total volume of the object sold
|
||||
var/list/reagents_value = list()//export reagents => into the reagent type total value.
|
||||
var/list/exported_atoms_ref = list() //if they're not deleted they go in here for use.
|
||||
|
||||
// external_report works as "transaction" object, pass same one in if you're doing more than one export in single go
|
||||
/proc/export_item_and_contents(atom/movable/AM, allowed_categories = EXPORT_CARGO, apply_elastic = TRUE, delete_unsold = TRUE, dry_run=FALSE, datum/export_report/external_report)
|
||||
|
||||
@@ -98,17 +98,19 @@
|
||||
/obj/machinery/computer/cargo/express/ui_data(mob/user)
|
||||
var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location?
|
||||
var/list/data = list()
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
data["points"] = D.account_balance
|
||||
data["locked"] = locked//swipe an ID to unlock
|
||||
data["siliconUser"] = hasSiliconAccessInArea(user)
|
||||
data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui
|
||||
data["usingBeacon"] = usingBeacon //is the mode set to deliver to the beacon or the cargobay?
|
||||
data["canBeacon"] = !usingBeacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location?
|
||||
data["canBuyBeacon"] = cooldown <= 0 && SSshuttle.points >= BEACON_COST
|
||||
data["canBuyBeacon"] = cooldown <= 0 && D.account_balance >= BEACON_COST
|
||||
data["beaconError"] = usingBeacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary
|
||||
data["hasBeacon"] = beacon != null//is there a linked beacon?
|
||||
data["beaconName"] = beacon ? beacon.name : "No Beacon Found"
|
||||
data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons
|
||||
data["points"] = SSshuttle.points
|
||||
data["supplies"] = list()
|
||||
message = "Sales are near-instantaneous - please choose carefully."
|
||||
if(SSshuttle.supplyBlocked)
|
||||
@@ -129,6 +131,9 @@
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui)
|
||||
if(!allowed(usr))
|
||||
to_chat(usr, "<span class='notice'>Access denied.</span>")
|
||||
return
|
||||
switch(action)
|
||||
if("LZCargo")
|
||||
usingBeacon = FALSE
|
||||
@@ -139,13 +144,14 @@
|
||||
if (beacon)
|
||||
beacon.update_status(SP_READY) //turns on the beacon's ready light
|
||||
if("printBeacon")
|
||||
if (SSshuttle.points >= BEACON_COST)
|
||||
cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam
|
||||
var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location())
|
||||
C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc)
|
||||
printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1
|
||||
beacon.name = "Supply Pod Beacon #[printed_beacons]"
|
||||
SSshuttle.points -= BEACON_COST
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
if(D.adjust_money(-BEACON_COST))
|
||||
cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam
|
||||
var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location())
|
||||
C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc)
|
||||
printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1
|
||||
beacon.name = "Supply Pod Beacon #[printed_beacons]"
|
||||
|
||||
if("add")//Generate Supply Order first
|
||||
var/id = text2path(params["id"])
|
||||
@@ -165,8 +171,12 @@
|
||||
var/reason = ""
|
||||
var/list/empty_turfs
|
||||
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason)
|
||||
var/points_to_check
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
if(D)
|
||||
points_to_check = D.account_balance
|
||||
if(!(obj_flags & EMAGGED))
|
||||
if(SO.pack.cost <= SSshuttle.points)
|
||||
if(SO.pack.cost <= points_to_check)
|
||||
var/LZ
|
||||
if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay
|
||||
LZ = get_turf(beacon)
|
||||
@@ -183,14 +193,14 @@
|
||||
CHECK_TICK
|
||||
if(empty_turfs && empty_turfs.len)
|
||||
LZ = pick(empty_turfs)
|
||||
if (SO.pack.cost <= SSshuttle.points && LZ)//we need to call the cost check again because of the CHECK_TICK call
|
||||
SSshuttle.points -= SO.pack.cost
|
||||
if (SO.pack.cost <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call
|
||||
D.adjust_money(-SO.pack.cost)
|
||||
SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.cost]", "[SO.pack.name]"))
|
||||
new /obj/effect/abstract/DPtarget(LZ, podType, SO)
|
||||
. = TRUE
|
||||
update_icon()
|
||||
else
|
||||
if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= SSshuttle.points) // bulk discount :^)
|
||||
if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= points_to_check) // bulk discount :^)
|
||||
landingzone = GLOB.areas_by_type[pick(GLOB.the_station_areas)] //override default landing zone
|
||||
for(var/turf/open/floor/T in landingzone.contents)
|
||||
if(is_blocked_turf(T))
|
||||
@@ -198,7 +208,7 @@
|
||||
LAZYADD(empty_turfs, T)
|
||||
CHECK_TICK
|
||||
if(empty_turfs && empty_turfs.len)
|
||||
SSshuttle.points -= SO.pack.cost * (0.72*MAX_EMAG_ROCKETS)
|
||||
D.adjust_money(-(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS)))
|
||||
SSblackbox.record_feedback("nested tally", "cargo_imports", MAX_EMAG_ROCKETS, list("[SO.pack.cost * 0.72]", "[SO.pack.name]"))
|
||||
SO.generateRequisition(get_turf(src))
|
||||
for(var/i in 1 to MAX_EMAG_ROCKETS)
|
||||
|
||||
@@ -28,14 +28,16 @@
|
||||
var/orderer_ckey
|
||||
var/reason
|
||||
var/datum/supply_pack/pack
|
||||
var/datum/bank_account/paying_account
|
||||
|
||||
/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason)
|
||||
/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason, paying_account)
|
||||
id = SSshuttle.ordernum++
|
||||
src.pack = pack
|
||||
src.orderer = orderer
|
||||
src.orderer_rank = orderer_rank
|
||||
src.orderer_ckey = orderer_ckey
|
||||
src.reason = reason
|
||||
src.paying_account = paying_account
|
||||
|
||||
/datum/supply_order/proc/generateRequisition(turf/T)
|
||||
var/obj/item/paper/P = new(T)
|
||||
@@ -47,6 +49,8 @@
|
||||
P.info += "Item: [pack.name]<br/>"
|
||||
P.info += "Access Restrictions: [get_access_desc(pack.access)]<br/>"
|
||||
P.info += "Requested by: [orderer]<br/>"
|
||||
if(paying_account)
|
||||
P.info += "Paid by: [paying_account.account_holder]<br/>"
|
||||
P.info += "Rank: [orderer_rank]<br/>"
|
||||
P.info += "Comment: [reason]<br/>"
|
||||
|
||||
@@ -61,6 +65,9 @@
|
||||
P.name = "shipping manifest - #[id] ([pack.name])"
|
||||
P.info += "<h2>[command_name()] Shipping Manifest</h2>"
|
||||
P.info += "<hr/>"
|
||||
if(paying_account)
|
||||
P.info += "Direct purchase from [paying_account.account_holder]<br/>"
|
||||
P.name += " - Purchased by [paying_account.account_holder]"
|
||||
P.info += "Order #[id]<br/>"
|
||||
P.info += "Destination: [station_name]<br/>"
|
||||
P.info += "Item: [pack.name]<br/>"
|
||||
@@ -81,7 +88,7 @@
|
||||
return P
|
||||
|
||||
/datum/supply_order/proc/generate(atom/A)
|
||||
var/obj/structure/closet/crate/C = pack.generate(A)
|
||||
var/obj/structure/closet/crate/C = pack.generate(A, paying_account)
|
||||
var/obj/item/paper/fluff/jobs/cargo/manifest/M = generateManifest(C)
|
||||
|
||||
if(M.errors & MANIFEST_ERROR_ITEM)
|
||||
|
||||
@@ -16,16 +16,20 @@
|
||||
var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console
|
||||
var/admin_spawned = FALSE //Can only an admin spawn this crate?
|
||||
|
||||
/datum/supply_pack/proc/generate(atom/A)
|
||||
var/obj/structure/closet/crate/C = new crate_type(A)
|
||||
C.name = crate_name
|
||||
/datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account)
|
||||
var/obj/structure/closet/crate/C
|
||||
if(paying_account)
|
||||
C = new /obj/structure/closet/crate/secure/owned(A, paying_account)
|
||||
C.name = "[crate_name] - Purchased by [paying_account.account_holder]"
|
||||
else
|
||||
C = new crate_type(A)
|
||||
C.name = crate_name
|
||||
if(access)
|
||||
C.req_access = list(access)
|
||||
if(access_any)
|
||||
C.req_one_access = access_any
|
||||
|
||||
fill(C)
|
||||
|
||||
return C
|
||||
|
||||
/datum/supply_pack/proc/fill(obj/structure/closet/crate/C)
|
||||
|
||||
@@ -170,8 +170,7 @@
|
||||
cost = 7500
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/rationpack,
|
||||
/obj/item/ammo_box/a762,
|
||||
/obj/item/storage/toolbox/ammo,
|
||||
/obj/item/ammo_box/magazine/m10mm/rifle,
|
||||
/obj/item/clothing/suit/armor/vest/russian,
|
||||
/obj/item/clothing/head/helmet/rus_helmet,
|
||||
/obj/item/clothing/shoes/russian,
|
||||
@@ -181,7 +180,7 @@
|
||||
/obj/item/clothing/mask/russian_balaclava,
|
||||
/obj/item/clothing/head/helmet/rus_ushanka,
|
||||
/obj/item/clothing/suit/armor/vest/russian_coat,
|
||||
/obj/item/gun/ballistic/shotgun/boltaction)
|
||||
/obj/item/gun/ballistic/automatic/surplus)
|
||||
crate_name = "surplus military crate"
|
||||
|
||||
/datum/supply_pack/security/armory/russian/fill(obj/structure/closet/crate/C)
|
||||
|
||||
@@ -99,11 +99,11 @@
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
/datum/supply_pack/security/russianmosin
|
||||
name = "Russian Minutemen Gear"
|
||||
desc = "An old russian Minutemen crate, comes with a full russian outfit, a mosin and a stripper clip."
|
||||
name = "Russian Partisan Gear"
|
||||
desc = "An old russian partisan equipment crate, comes with a full russian outfit, a loaded surplus rifle and a second magazine."
|
||||
contraband = TRUE
|
||||
access = FALSE
|
||||
cost = 6500 //
|
||||
cost = 6500
|
||||
contains = list(/obj/item/clothing/suit/armor/navyblue/russian,
|
||||
/obj/item/clothing/shoes/combat,
|
||||
/obj/item/clothing/head/ushanka,
|
||||
@@ -111,8 +111,8 @@
|
||||
/obj/item/clothing/head/helmet/alt,
|
||||
/obj/item/clothing/gloves/tackler/combat/insulated,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/gun/ballistic/shotgun/boltaction,
|
||||
/obj/item/ammo_box/a762)
|
||||
/obj/item/ammo_box/magazine/m10mm/rifle,
|
||||
/obj/item/gun/ballistic/automatic/surplus)
|
||||
crate_name = "surplus russian gear"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
|
||||
@@ -918,7 +918,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
dat += "<b>Ghosts of Others:</b> <a href='?_src_=prefs;task=input;preference=ghostothers'>[button_name]</a><br>"
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<b>FPS:</b> <a href='?_src_=prefs;preference=clientfps;task=input'>[clientfps]</a><br>"
|
||||
|
||||
dat += "<b>Income Updates:</b> <a href='?_src_=prefs;preference=income_pings'>[(chat_toggles & CHAT_BANKCARD) ? "Allowed" : "Muted"]</a><br>"
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<b>Parallax (Fancy Space):</b> <a href='?_src_=prefs;preference=parallaxdown' oncontextmenu='window.location.href=\"?_src_=prefs;preference=parallaxup\";return false;'>"
|
||||
switch (parallax)
|
||||
if (PARALLAX_LOW)
|
||||
@@ -1522,7 +1527,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["flavor_text"] = html_decode(msg)
|
||||
|
||||
if("ooc_notes")
|
||||
var/msg = stripped_multiline_input(usr, "Set always-visible OOC notes related to content preferences. THIS IS NOT FOR CHARACTE DESCRIPTIONS!!", "OOC notes", features["ooc_notes"], MAX_FLAVOR_LEN, TRUE)
|
||||
var/msg = stripped_multiline_input(usr, "Set always-visible OOC notes related to content preferences. THIS IS NOT FOR CHARACTER DESCRIPTIONS!", "OOC notes", features["ooc_notes"], MAX_FLAVOR_LEN, TRUE)
|
||||
if(!isnull(msg))
|
||||
features["ooc_notes"] = html_decode(msg)
|
||||
|
||||
@@ -2319,6 +2324,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("ghost_pda")
|
||||
chat_toggles ^= CHAT_GHOSTPDA
|
||||
|
||||
if("income_pings")
|
||||
chat_toggles ^= CHAT_BANKCARD
|
||||
|
||||
if("pull_requests")
|
||||
chat_toggles ^= CHAT_PULLR
|
||||
|
||||
|
||||
@@ -290,7 +290,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
buttons_locked = sanitize_integer(buttons_locked, 0, 1, initial(buttons_locked))
|
||||
windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing))
|
||||
default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot))
|
||||
toggles = sanitize_integer(toggles, 0, 65535, initial(toggles))
|
||||
toggles = sanitize_integer(toggles, 0, 16777215, initial(toggles))
|
||||
clientfps = sanitize_integer(clientfps, 0, 1000, 0)
|
||||
parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null)
|
||||
ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion))
|
||||
@@ -312,7 +312,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake))
|
||||
widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref))
|
||||
autostand = sanitize_integer(autostand, 0, 1, initial(autostand))
|
||||
cit_toggles = sanitize_integer(cit_toggles, 0, 65535, initial(cit_toggles))
|
||||
cit_toggles = sanitize_integer(cit_toggles, 0, 16777215, initial(cit_toggles))
|
||||
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
|
||||
no_tetris_storage = sanitize_integer(no_tetris_storage, 0, 1, initial(no_tetris_storage))
|
||||
|
||||
|
||||
@@ -250,6 +250,27 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_ooc)()
|
||||
/datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_OOC
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_looc)()
|
||||
set name = "Show/Hide LOOC"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggles seeing LocalOutOfCharacter chat"
|
||||
usr.client.prefs.chat_toggles ^= CHAT_LOOC
|
||||
usr.client.prefs.save_preferences()
|
||||
to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.")
|
||||
SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Seeing LOOC", "[usr.client.prefs.chat_toggles & CHAT_LOOC ? "Enabled" : "Disabled"]"))
|
||||
/datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_LOOC
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_bank_card)()
|
||||
set name = "Show/Hide Income Updates"
|
||||
set category = "Preferences"
|
||||
set desc = "Show or hide updates to your income"
|
||||
usr.client.prefs.chat_toggles ^= CHAT_BANKCARD
|
||||
usr.client.prefs.save_preferences()
|
||||
to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_BANKCARD) ? "now" : "no longer"] be notified when you get paid.")
|
||||
SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Income Notifications", "[(usr.client.prefs.chat_toggles & CHAT_BANKCARD) ? "Enabled" : "Disabled"]"))
|
||||
/datum/verbs/menu/Settings/listen_bank_card/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_BANKCARD
|
||||
|
||||
GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \
|
||||
"ghost_blue","ghost_yellow","ghost_green","ghost_pink", \
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
throwforce = 0
|
||||
slot_flags = ITEM_SLOT_EARS
|
||||
resistance_flags = NONE
|
||||
custom_price = 250
|
||||
|
||||
/obj/item/clothing/ears/earmuffs
|
||||
name = "earmuffs"
|
||||
@@ -30,6 +31,7 @@
|
||||
slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD | ITEM_SLOT_NECK //Fluff item, put it whereever you want!
|
||||
actions_types = list(/datum/action/item_action/toggle_headphones)
|
||||
var/headphones_on = FALSE
|
||||
custom_price = 125
|
||||
|
||||
/obj/item/clothing/ears/headphones/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
permeability_coefficient = 0.05
|
||||
resistance_flags = NONE
|
||||
var/can_be_cut = 1
|
||||
custom_price = 1200
|
||||
custom_premium_price = 1200
|
||||
|
||||
/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
|
||||
desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly."
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
cold_protection = HANDS
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
strip_mod = 0.9
|
||||
custom_price = 75
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist
|
||||
name = "armwraps"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
name = "white beanie"
|
||||
desc = "A stylish beanie. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their heads."
|
||||
icon_state = "beanie" //Default white
|
||||
custom_price = 60
|
||||
|
||||
/obj/item/clothing/head/beanie/black
|
||||
name = "black beanie"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user