Coonflict fiiixeeess

This commit is contained in:
Artur
2020-05-13 12:56:17 +03:00
261 changed files with 3312 additions and 1483 deletions
@@ -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,
+14 -28
View File
@@ -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" = (
+3 -3
View File
@@ -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" = (
+6 -18
View File
@@ -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
+2 -2
View File
@@ -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" = (
+1 -10
View File
@@ -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)
+2 -2
View File
@@ -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,
+1 -1
View File
@@ -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" = (
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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"
+35
View File
@@ -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
+2
View File
@@ -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"
+2 -1
View File
@@ -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.
+2 -1
View File
@@ -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
-10
View File
@@ -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))
+2
View File
@@ -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)
+13
View File
@@ -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
+21
View File
@@ -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
+2
View File
@@ -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
+139
View File
@@ -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))
+4
View File
@@ -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
-6
View File
@@ -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
+3
View File
@@ -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
+491
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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()
+1 -1
View File
@@ -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)
+3
View File
@@ -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
+11 -2
View File
@@ -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)
+34
View File
@@ -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.
+2
View File
@@ -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(
+26 -12
View File
@@ -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
+24 -7
View File
@@ -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."
+2 -1
View File
@@ -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
+11 -3
View File
@@ -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()
+51 -44
View File
@@ -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
+1
View File
@@ -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"
+4 -2
View File
@@ -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.")
+1
View File
@@ -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)
+1
View File
@@ -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
+10 -17
View File
@@ -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)
+208 -7
View File
@@ -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)
. = ..()
+2 -1
View File
@@ -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
+229
View File
@@ -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
+107
View File
@@ -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
+2 -4
View File
@@ -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
+3
View File
@@ -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>")
+1
View File
@@ -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
+44 -1
View File
@@ -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 -2
View File
@@ -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))
+2
View File
@@ -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()
. = ..()
+1
View File
@@ -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()
. = ..()
+2
View File
@@ -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()
. = ..()
+11 -1
View File
@@ -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()
. = ..()
+3 -14
View File
@@ -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()
. = ..()
+2
View File
@@ -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
+12
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+13 -11
View File
@@ -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)
+2 -2
View File
@@ -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)
+33 -4
View File
@@ -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")
+1
View File
@@ -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)
+24 -14
View File
@@ -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)
+9 -2
View File
@@ -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)
+8 -4
View File
@@ -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)
+2 -3
View File
@@ -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)
+5 -5
View File
@@ -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
+9 -1
View File
@@ -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
+2 -2
View File
@@ -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", \
+2
View File
@@ -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()
. = ..()
+2
View File
@@ -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"
+1
View File
@@ -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