mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-28 22:47:59 +01:00
Merge branch 'master' into event_timing
This commit is contained in:
@@ -3,7 +3,9 @@
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/floodlight,
|
||||
/obj/machinery/floodlight{
|
||||
anchored = 1
|
||||
},
|
||||
/turf/simulated/floor/bluegrid{
|
||||
name = "Mainframe Base";
|
||||
nitrogen = 400;
|
||||
@@ -113,7 +115,9 @@
|
||||
/turf/simulated/floor/catwalk,
|
||||
/area/ruin/space/telecomms)
|
||||
"cz" = (
|
||||
/obj/machinery/floodlight,
|
||||
/obj/machinery/floodlight{
|
||||
anchored = 1
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
dir = 1;
|
||||
icon_state = "vault";
|
||||
@@ -389,7 +393,9 @@
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation/no_teleport)
|
||||
"hU" = (
|
||||
/obj/machinery/computer/teleporter,
|
||||
/obj/machinery/computer/teleporter{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/ruin/space/telecomms/tele)
|
||||
@@ -979,6 +985,9 @@
|
||||
/obj/structure/sign/nosmoking_2{
|
||||
pixel_x = -32
|
||||
},
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/bluegrid{
|
||||
name = "Mainframe Base";
|
||||
nitrogen = 400;
|
||||
|
||||
@@ -11773,7 +11773,8 @@
|
||||
/area/station/maintenance/fpmaint2)
|
||||
"aPZ" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 1 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/hallway/secondary/entry/north)
|
||||
@@ -15267,6 +15268,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/nitrogen{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/n2,
|
||||
/area/station/engineering/atmos)
|
||||
"bbN" = (
|
||||
@@ -15281,6 +15285,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/oxygen{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "o2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/o2,
|
||||
/area/station/engineering/atmos)
|
||||
"bbP" = (
|
||||
@@ -15905,6 +15912,10 @@
|
||||
/obj/machinery/atmospherics/portable/canister/air{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "air_sensor";
|
||||
output = 127
|
||||
},
|
||||
/turf/simulated/floor/engine/air,
|
||||
/area/station/engineering/atmos)
|
||||
"bdH" = (
|
||||
@@ -37652,7 +37663,12 @@
|
||||
},
|
||||
/area/station/command/office/ce)
|
||||
"cIf" = (
|
||||
/obj/machinery/atmospherics/portable/canister/sleeping_agent,
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2o_sensor"
|
||||
},
|
||||
/obj/machinery/atmospherics/portable/canister/sleeping_agent{
|
||||
anchored = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/n20,
|
||||
/area/station/engineering/atmos)
|
||||
"cIg" = (
|
||||
@@ -38601,7 +38617,12 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/maintenance/aft)
|
||||
"cLV" = (
|
||||
/obj/machinery/atmospherics/portable/canister/toxins,
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "tox_sensor"
|
||||
},
|
||||
/obj/machinery/atmospherics/portable/canister/toxins{
|
||||
anchored = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/plasma,
|
||||
/area/station/engineering/atmos)
|
||||
"cLW" = (
|
||||
@@ -39933,7 +39954,12 @@
|
||||
},
|
||||
/area/station/engineering/smes)
|
||||
"cRi" = (
|
||||
/obj/machinery/atmospherics/portable/canister/carbon_dioxide,
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "co2_sensor"
|
||||
},
|
||||
/obj/machinery/atmospherics/portable/canister/carbon_dioxide{
|
||||
anchored = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/co2,
|
||||
/area/station/engineering/atmos)
|
||||
"cRj" = (
|
||||
@@ -49985,7 +50011,8 @@
|
||||
/area/station/engineering/break_room)
|
||||
"ePc" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 4 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/storage)
|
||||
@@ -55232,9 +55259,8 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/asmaint)
|
||||
"hrg" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "air_sensor";
|
||||
output = 127
|
||||
/obj/effect/turf_decal/alphanumeric/air{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/air,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -56369,7 +56395,8 @@
|
||||
/area/station/security/permabrig)
|
||||
"hVu" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 3 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/fore)
|
||||
@@ -58674,8 +58701,8 @@
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/station/command/office/captain)
|
||||
"jeG" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2o_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/nitrous_oxide{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/engine/n20,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -59429,6 +59456,13 @@
|
||||
icon_state = "cafeteria"
|
||||
},
|
||||
/area/station/science/break_room)
|
||||
"jxK" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod 2 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/hallway/secondary/entry/north)
|
||||
"jyo" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/mob/living/simple_animal/slime,
|
||||
@@ -60816,8 +60850,8 @@
|
||||
/turf/simulated/floor/engine/n2,
|
||||
/area/station/engineering/atmos)
|
||||
"khY" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "o2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/oxygen{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/o2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -66613,8 +66647,8 @@
|
||||
},
|
||||
/area/station/medical/sleeper)
|
||||
"mVr" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/nitrogen{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/n2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -72607,8 +72641,8 @@
|
||||
/turf/simulated/floor/carpet,
|
||||
/area/station/command/office/hop)
|
||||
"pUX" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "co2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/carbon_dioxide{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/engine/co2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -76551,6 +76585,12 @@
|
||||
icon_state = "darkred"
|
||||
},
|
||||
/area/station/hallway/secondary/exit)
|
||||
"rLI" = (
|
||||
/obj/effect/turf_decal/alphanumeric/mix{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/engine/vacuum,
|
||||
/area/station/engineering/atmos)
|
||||
"rLK" = (
|
||||
/obj/machinery/newscaster/directional/west,
|
||||
/obj/structure/sink/directional/east,
|
||||
@@ -82970,8 +83010,8 @@
|
||||
/turf/simulated/wall,
|
||||
/area/station/maintenance/disposal)
|
||||
"vdD" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "tox_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/plasma{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/engine/plasma,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -99933,7 +99973,7 @@ aLf
|
||||
aMt
|
||||
aNy
|
||||
ygg
|
||||
aPZ
|
||||
jxK
|
||||
kmm
|
||||
foj
|
||||
ksJ
|
||||
@@ -125964,7 +126004,7 @@ cxO
|
||||
cQp
|
||||
cZS
|
||||
olG
|
||||
pRS
|
||||
rLI
|
||||
ecy
|
||||
cZS
|
||||
gMP
|
||||
@@ -126221,7 +126261,7 @@ cxO
|
||||
cQp
|
||||
cZS
|
||||
cSs
|
||||
cSw
|
||||
pRS
|
||||
cSw
|
||||
cZS
|
||||
cWZ
|
||||
|
||||
@@ -12135,6 +12135,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/nitrogen{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/n2,
|
||||
/area/station/engineering/atmos)
|
||||
"bOl" = (
|
||||
@@ -12849,11 +12852,14 @@
|
||||
/obj/machinery/atmospherics/portable/canister/oxygen{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "o2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/o2,
|
||||
/area/station/engineering/atmos)
|
||||
"bSo" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "o2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/oxygen{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/engine/o2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -13354,6 +13360,10 @@
|
||||
/obj/machinery/atmospherics/portable/canister/air{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "air_sensor";
|
||||
output = 127
|
||||
},
|
||||
/turf/simulated/floor/engine/air,
|
||||
/area/station/engineering/atmos)
|
||||
"bUT" = (
|
||||
@@ -13803,8 +13813,8 @@
|
||||
/turf/simulated/floor/engine/co2,
|
||||
/area/station/engineering/atmos)
|
||||
"bWO" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "co2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/carbon_dioxide{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/co2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -13823,8 +13833,8 @@
|
||||
/turf/simulated/floor/engine/plasma,
|
||||
/area/station/engineering/atmos)
|
||||
"bWR" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "tox_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/plasma{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/plasma,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -13843,8 +13853,8 @@
|
||||
/turf/simulated/floor/engine/n20,
|
||||
/area/station/engineering/atmos)
|
||||
"bWU" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2o_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/nitrous_oxide{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/n20,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -13979,6 +13989,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/carbon_dioxide{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "co2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/co2,
|
||||
/area/station/engineering/atmos)
|
||||
"bXx" = (
|
||||
@@ -13988,6 +14001,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/toxins{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "tox_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/plasma,
|
||||
/area/station/engineering/atmos)
|
||||
"bXz" = (
|
||||
@@ -13997,6 +14013,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/sleeping_agent{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2o_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/n20,
|
||||
/area/station/engineering/atmos)
|
||||
"bXB" = (
|
||||
@@ -19323,7 +19342,8 @@
|
||||
/area/station/hallway/primary/central/north)
|
||||
"cOo" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 1 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/maintenance/port)
|
||||
@@ -29931,8 +29951,8 @@
|
||||
},
|
||||
/area/station/service/chapel/office)
|
||||
"eMF" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/nitrogen{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/engine/n2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -37037,9 +37057,8 @@
|
||||
/turf/simulated/floor/plating/asteroid/ancient,
|
||||
/area/station/maintenance/port2)
|
||||
"gtA" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "air_sensor";
|
||||
output = 127
|
||||
/obj/effect/turf_decal/alphanumeric/air{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/engine/air,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -45288,7 +45307,8 @@
|
||||
/area/station/engineering/smes)
|
||||
"ieY" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 2 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/maintenance/apmaint)
|
||||
@@ -56561,7 +56581,8 @@
|
||||
/area/station/maintenance/port2)
|
||||
"kuw" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 3 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/starboard)
|
||||
@@ -78859,7 +78880,8 @@
|
||||
/area/station/maintenance/command/fore)
|
||||
"pjm" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 4 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/command/fore)
|
||||
@@ -90601,7 +90623,7 @@
|
||||
/area/station/maintenance/fsmaint)
|
||||
"rNH" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 5 Airlock"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/locked,
|
||||
/turf/simulated/floor/plating,
|
||||
@@ -106177,6 +106199,12 @@
|
||||
/obj/effect/turf_decal/box,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/disposal/external/southeast)
|
||||
"vaB" = (
|
||||
/obj/effect/turf_decal/alphanumeric/mix{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/vacuum,
|
||||
/area/station/engineering/atmos)
|
||||
"vaC" = (
|
||||
/obj/effect/spawner/random/maintenance,
|
||||
/obj/structure/table,
|
||||
@@ -154435,8 +154463,8 @@ bUW
|
||||
anq
|
||||
bWc
|
||||
fuk
|
||||
vaB
|
||||
bWX
|
||||
bXB
|
||||
bYf
|
||||
bDR
|
||||
ilx
|
||||
|
||||
@@ -466,7 +466,8 @@
|
||||
/area/shuttle/pod_4)
|
||||
"aeM" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 4 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/hallway/secondary/entry/east)
|
||||
@@ -3090,6 +3091,12 @@
|
||||
icon_state = "redyellowfull"
|
||||
},
|
||||
/area/station/maintenance/fore2)
|
||||
"arn" = (
|
||||
/obj/effect/turf_decal/alphanumeric/mix{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/engine/vacuum,
|
||||
/area/station/engineering/atmos)
|
||||
"aro" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/spawner/random/maintenance,
|
||||
@@ -11923,6 +11930,10 @@
|
||||
/obj/machinery/atmospherics/portable/canister/air{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "air_sensor";
|
||||
output = 127
|
||||
},
|
||||
/turf/simulated/floor/engine/air,
|
||||
/area/station/engineering/atmos)
|
||||
"aVU" = (
|
||||
@@ -12683,6 +12694,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/carbon_dioxide{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "co2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/co2,
|
||||
/area/station/engineering/atmos)
|
||||
"aYy" = (
|
||||
@@ -13473,6 +13487,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/oxygen{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "o2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/o2,
|
||||
/area/station/engineering/atmos)
|
||||
"bca" = (
|
||||
@@ -13920,6 +13937,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/toxins{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "tox_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/plasma,
|
||||
/area/station/engineering/atmos)
|
||||
"beI" = (
|
||||
@@ -14511,6 +14531,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/nitrogen{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/n2,
|
||||
/area/station/engineering/atmos)
|
||||
"bhu" = (
|
||||
@@ -15385,6 +15408,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/sleeping_agent{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2o_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/n20,
|
||||
/area/station/engineering/atmos)
|
||||
"bkB" = (
|
||||
@@ -17647,7 +17673,10 @@
|
||||
/turf/simulated/wall,
|
||||
/area/station/hallway/primary/central)
|
||||
"bsA" = (
|
||||
/obj/machinery/door/airlock/external,
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod 3 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/security/prisonershuttle)
|
||||
"bsB" = (
|
||||
@@ -64176,8 +64205,8 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/supply/storage)
|
||||
"jKW" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "tox_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/plasma{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/engine/plasma,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -70662,8 +70691,8 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/fore)
|
||||
"mIh" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/nitrogen{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/engine/n2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -80611,8 +80640,8 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/maintenance/fore)
|
||||
"qWZ" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "o2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/oxygen{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/engine/o2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -88767,7 +88796,8 @@
|
||||
/area/station/science/genetics)
|
||||
"ueB" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 2 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/port)
|
||||
@@ -91535,9 +91565,8 @@
|
||||
},
|
||||
/area/station/engineering/atmos)
|
||||
"vom" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "air_sensor";
|
||||
output = 127
|
||||
/obj/effect/turf_decal/alphanumeric/air{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/engine/air,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -93115,8 +93144,8 @@
|
||||
/turf/simulated/floor/engine,
|
||||
/area/station/medical/chemistry)
|
||||
"vXf" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2o_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/nitrous_oxide{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/engine/n20,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -93166,8 +93195,8 @@
|
||||
},
|
||||
/area/station/engineering/gravitygenerator)
|
||||
"vYt" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "co2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/carbon_dioxide{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/engine/co2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -95930,7 +95959,8 @@
|
||||
/area/station/maintenance/apmaint)
|
||||
"xcL" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 1 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/hallway/secondary/entry/south)
|
||||
@@ -117899,7 +117929,7 @@ bkw
|
||||
biK
|
||||
aOg
|
||||
bpw
|
||||
bpv
|
||||
jGV
|
||||
bpv
|
||||
aOg
|
||||
abj
|
||||
@@ -118156,7 +118186,7 @@ vXf
|
||||
tnu
|
||||
aOg
|
||||
ibK
|
||||
jGV
|
||||
arn
|
||||
xBO
|
||||
aOg
|
||||
abj
|
||||
|
||||
@@ -7978,7 +7978,12 @@
|
||||
},
|
||||
/area/station/medical/reception)
|
||||
"bDz" = (
|
||||
/obj/machinery/atmospherics/portable/canister/carbon_dioxide,
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "co2_sensor"
|
||||
},
|
||||
/obj/machinery/atmospherics/portable/canister/carbon_dioxide{
|
||||
anchored = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/co2,
|
||||
/area/station/engineering/atmos)
|
||||
"bDA" = (
|
||||
@@ -10711,6 +10716,10 @@
|
||||
},
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/engineering/atmos)
|
||||
"cdH" = (
|
||||
/obj/effect/turf_decal/alphanumeric/mix,
|
||||
/turf/simulated/floor/engine/airless,
|
||||
/area/station/engineering/atmos)
|
||||
"cdM" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "2-8"
|
||||
@@ -16898,6 +16907,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/nitrogen{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/n2,
|
||||
/area/station/engineering/atmos)
|
||||
"dst" = (
|
||||
@@ -17947,8 +17959,9 @@
|
||||
/area/station/science/toxins/mixing)
|
||||
"dCN" = (
|
||||
/obj/structure/cable,
|
||||
/obj/structure/computerframe{
|
||||
dir = 4
|
||||
/obj/machinery/power/solar_control{
|
||||
dir = 4;
|
||||
name = "Aft Port Solar Control"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/solar_maintenance/fore_port)
|
||||
@@ -22272,6 +22285,28 @@
|
||||
/obj/structure/fermenting_barrel,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/abandoned_garden)
|
||||
"exH" = (
|
||||
/obj/structure/closet/crate{
|
||||
name = "solar pack crate"
|
||||
},
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/solar_assembly,
|
||||
/obj/item/circuitboard/solar_control,
|
||||
/obj/item/tracker_electronics,
|
||||
/obj/item/paper/solar,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/solar_maintenance/fore_port)
|
||||
"exL" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/station/command/office/captain/bedroom)
|
||||
@@ -24048,6 +24083,10 @@
|
||||
icon_state = "cafeteria"
|
||||
},
|
||||
/area/station/security/permabrig)
|
||||
"ePR" = (
|
||||
/obj/effect/turf_decal/alphanumeric/mix,
|
||||
/turf/simulated/floor/engine/airless/nodecay,
|
||||
/area/station/engineering/atmos/asteroid_filtering)
|
||||
"ePU" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/item/circuitboard/thermomachine,
|
||||
@@ -27978,8 +28017,9 @@
|
||||
/turf/simulated/floor/grass,
|
||||
/area/station/public/park)
|
||||
"fBf" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
name = "Escape Pod"
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod 2 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/asmaint)
|
||||
@@ -29491,7 +29531,12 @@
|
||||
},
|
||||
/area/station/hallway/secondary/entry)
|
||||
"fPw" = (
|
||||
/obj/machinery/atmospherics/portable/canister/sleeping_agent,
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2o_sensor"
|
||||
},
|
||||
/obj/machinery/atmospherics/portable/canister/sleeping_agent{
|
||||
anchored = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/n20,
|
||||
/area/station/engineering/atmos)
|
||||
"fPx" = (
|
||||
@@ -40457,9 +40502,7 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/public/storage/tools/auxiliary)
|
||||
"ibf" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2o_sensor"
|
||||
},
|
||||
/obj/effect/turf_decal/alphanumeric/nitrous_oxide,
|
||||
/turf/simulated/floor/engine/n20,
|
||||
/area/station/engineering/atmos)
|
||||
"ibh" = (
|
||||
@@ -40766,8 +40809,9 @@
|
||||
},
|
||||
/area/station/security/storage)
|
||||
"iek" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
name = "Escape Pod"
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod 3 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/storage)
|
||||
@@ -44904,6 +44948,10 @@
|
||||
/obj/machinery/atmospherics/portable/canister/air{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "air_sensor";
|
||||
output = 127
|
||||
},
|
||||
/turf/simulated/floor/engine/air,
|
||||
/area/station/engineering/atmos)
|
||||
"iTx" = (
|
||||
@@ -47646,9 +47694,7 @@
|
||||
},
|
||||
/area/station/medical/storage)
|
||||
"jwh" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2_sensor"
|
||||
},
|
||||
/obj/effect/turf_decal/alphanumeric/nitrogen,
|
||||
/turf/simulated/floor/engine/n2,
|
||||
/area/station/engineering/atmos)
|
||||
"jwm" = (
|
||||
@@ -51263,10 +51309,7 @@
|
||||
},
|
||||
/area/station/medical/surgery/secondary)
|
||||
"kgz" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "air_sensor";
|
||||
output = 127
|
||||
},
|
||||
/obj/effect/turf_decal/alphanumeric/air,
|
||||
/turf/simulated/floor/engine/air,
|
||||
/area/station/engineering/atmos)
|
||||
"kgB" = (
|
||||
@@ -57292,8 +57335,9 @@
|
||||
},
|
||||
/area/station/medical/virology)
|
||||
"luf" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
name = "Escape Pod"
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod 4 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/security/fore)
|
||||
@@ -70667,7 +70711,8 @@
|
||||
/area/station/medical/virology)
|
||||
"ocI" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Airlock"
|
||||
name = "Escape Pod 1 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/hallway/secondary/entry/west)
|
||||
@@ -98148,7 +98193,12 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/public/fitness)
|
||||
"twp" = (
|
||||
/obj/machinery/atmospherics/portable/canister/toxins,
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "tox_sensor"
|
||||
},
|
||||
/obj/machinery/atmospherics/portable/canister/toxins{
|
||||
anchored = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/airless/nodecay,
|
||||
/area/station/engineering/atmos/asteroid_filtering)
|
||||
"twq" = (
|
||||
@@ -102629,6 +102679,8 @@
|
||||
/area/station/service/theatre)
|
||||
"usw" = (
|
||||
/obj/effect/spawner/random/cobweb/right/rare,
|
||||
/obj/structure/closet/toolcloset,
|
||||
/obj/effect/spawner/random/maintenance,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/solar_maintenance/fore_port)
|
||||
"usF" = (
|
||||
@@ -103105,6 +103157,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/oxygen{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "o2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/o2,
|
||||
/area/station/engineering/atmos)
|
||||
"uwZ" = (
|
||||
@@ -105264,9 +105319,7 @@
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/station/maintenance/apmaint2)
|
||||
"uSE" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "co2_sensor"
|
||||
},
|
||||
/obj/effect/turf_decal/alphanumeric/carbon_dioxide,
|
||||
/turf/simulated/floor/engine/co2,
|
||||
/area/station/engineering/atmos)
|
||||
"uSH" = (
|
||||
@@ -111893,9 +111946,7 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/engineering/tech_storage)
|
||||
"wiU" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "tox_sensor"
|
||||
},
|
||||
/obj/effect/turf_decal/alphanumeric/plasma,
|
||||
/turf/simulated/floor/engine/airless/nodecay,
|
||||
/area/station/engineering/atmos/asteroid_filtering)
|
||||
"wiW" = (
|
||||
@@ -116214,9 +116265,7 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/abandonedservers)
|
||||
"xgu" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "o2_sensor"
|
||||
},
|
||||
/obj/effect/turf_decal/alphanumeric/oxygen,
|
||||
/turf/simulated/floor/engine/o2,
|
||||
/area/station/engineering/atmos)
|
||||
"xgv" = (
|
||||
@@ -134994,8 +135043,8 @@ jnP
|
||||
aZS
|
||||
mjs
|
||||
cyu
|
||||
rjt
|
||||
fbb
|
||||
ePR
|
||||
eGJ
|
||||
aZS
|
||||
wXG
|
||||
@@ -139156,8 +139205,8 @@ jnP
|
||||
aZS
|
||||
cEY
|
||||
wKB
|
||||
pSq
|
||||
jNm
|
||||
cdH
|
||||
lkm
|
||||
iZC
|
||||
mrw
|
||||
@@ -146081,7 +146130,7 @@ dGi
|
||||
cqY
|
||||
hOC
|
||||
dCN
|
||||
dXx
|
||||
exH
|
||||
dGi
|
||||
sik
|
||||
sik
|
||||
|
||||
@@ -395,8 +395,8 @@
|
||||
},
|
||||
/area/station/hallway/secondary/entry/west)
|
||||
"aeZ" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/nitrogen{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/n2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -18714,6 +18714,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/sleeping_agent{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2o_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/n20,
|
||||
/area/station/engineering/atmos)
|
||||
"bRl" = (
|
||||
@@ -20010,6 +20013,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/toxins{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "tox_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/plasma,
|
||||
/area/station/engineering/atmos)
|
||||
"bXB" = (
|
||||
@@ -20950,6 +20956,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/carbon_dioxide{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "co2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/co2,
|
||||
/area/station/engineering/atmos)
|
||||
"ccj" = (
|
||||
@@ -24167,6 +24176,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/nitrogen{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/n2,
|
||||
/area/station/engineering/atmos)
|
||||
"cqM" = (
|
||||
@@ -24180,6 +24192,9 @@
|
||||
/obj/machinery/atmospherics/portable/canister/oxygen{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "o2_sensor"
|
||||
},
|
||||
/turf/simulated/floor/engine/o2,
|
||||
/area/station/engineering/atmos)
|
||||
"cqP" = (
|
||||
@@ -24199,6 +24214,10 @@
|
||||
/obj/machinery/atmospherics/portable/canister/air{
|
||||
anchored = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "air_sensor";
|
||||
output = 127
|
||||
},
|
||||
/turf/simulated/floor/engine/air,
|
||||
/area/station/engineering/atmos)
|
||||
"cqS" = (
|
||||
@@ -25971,8 +25990,8 @@
|
||||
},
|
||||
/area/station/hallway/supply/aft)
|
||||
"czb" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "n2o_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/nitrous_oxide{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/engine/n20,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -35206,8 +35225,9 @@
|
||||
},
|
||||
/area/station/hallway/primary/central/north)
|
||||
"ejj" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
name = "Escape Pod"
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod 1 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/hallway/secondary/entry/west)
|
||||
@@ -43922,8 +43942,8 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/security/main)
|
||||
"hnm" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "co2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/carbon_dioxide{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/engine/co2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -49012,7 +49032,8 @@
|
||||
/area/station/security/permabrig)
|
||||
"jfm" = (
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod Four"
|
||||
name = "Escape Pod 4 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/engimaint)
|
||||
@@ -52434,8 +52455,8 @@
|
||||
},
|
||||
/area/station/engineering/break_room)
|
||||
"knx" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "tox_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/plasma{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/engine/plasma,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -55059,8 +55080,8 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/command/office/hop)
|
||||
"liL" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "o2_sensor"
|
||||
/obj/effect/turf_decal/alphanumeric/oxygen{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/o2,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -57749,9 +57770,8 @@
|
||||
/turf/simulated/floor/wood,
|
||||
/area/station/medical/psych)
|
||||
"mgZ" = (
|
||||
/obj/machinery/atmospherics/air_sensor{
|
||||
autolink_id = "air_sensor";
|
||||
output = 127
|
||||
/obj/effect/turf_decal/alphanumeric/air{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/engine/air,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -63757,8 +63777,9 @@
|
||||
/turf/space,
|
||||
/area/space/nearstation)
|
||||
"onD" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
name = "Escape Pod"
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod 2 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/hallway/secondary/entry/east)
|
||||
@@ -68976,8 +68997,9 @@
|
||||
},
|
||||
/area/station/supply/break_room)
|
||||
"qid" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
name = "Escape Pod Three"
|
||||
/obj/machinery/door/airlock/external/glass{
|
||||
name = "Escape Pod 3 Airlock";
|
||||
id_tag = "emergency_home"
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/station/maintenance/fore)
|
||||
@@ -86934,6 +86956,12 @@
|
||||
"wUa" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/station/maintenance/engimaint)
|
||||
"wUc" = (
|
||||
/obj/effect/turf_decal/alphanumeric/mix{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/engine/vacuum,
|
||||
/area/station/engineering/atmos)
|
||||
"wUe" = (
|
||||
/obj/structure/closet/crate,
|
||||
/turf/simulated/floor/plating,
|
||||
@@ -136885,7 +136913,7 @@ pqT
|
||||
abq
|
||||
bCM
|
||||
sHu
|
||||
rLw
|
||||
wUc
|
||||
cAX
|
||||
bCM
|
||||
mkK
|
||||
@@ -137142,7 +137170,7 @@ ffA
|
||||
abq
|
||||
bCM
|
||||
bIx
|
||||
bOO
|
||||
rLw
|
||||
bOO
|
||||
bCM
|
||||
bPE
|
||||
|
||||
@@ -104,9 +104,6 @@
|
||||
|
||||
#define TORADIANS(degrees) ((degrees) * 0.0174532925)
|
||||
|
||||
/// Gets shift x that would be required the bitflag (1<<x)
|
||||
#define TOBITSHIFT(bit) ( log(2, bit) )
|
||||
|
||||
// Will filter out extra rotations and negative rotations
|
||||
// E.g: 540 becomes 180. -180 becomes 180.
|
||||
#define SIMPLIFY_DEGREES(degrees) (MODULUS((degrees), 360))
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#define ITEM_SLOT_AMOUNT 24 // IF YOU ADD ANY NEW CLOTHING SLOTS, MAKE SURE TO UPDATE THIS TO THE AMOUNT OF SLOTS.
|
||||
|
||||
/// Translates an ITEM_SLOT back to an index that can be looked up in inv_slots. e.g. (1<<19) becomes 19.
|
||||
#define ITEM_SLOT_2_INDEX(slot) (log(2, slot) + 1)
|
||||
#define ITEM_SLOT_2_INDEX(slot) (round(log(2, slot), 1) + 1)
|
||||
|
||||
//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses.
|
||||
#define HIDEGLOVES (1<<0) //APPLIES ONLY TO THE EXTERIOR SUIT!!
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
#define EMOTE_ACT_STOP_EXECUTION 1
|
||||
|
||||
/// List of emotes useable by ghosties
|
||||
#define USABLE_DEAD_EMOTES list("*flip", "*spin")
|
||||
#define USABLE_DEAD_EMOTES list("*flip", "*spin", "*jump")
|
||||
|
||||
// Strings used for the rock paper scissors emote and status effect
|
||||
#define RPS_EMOTE_ROCK "rock"
|
||||
|
||||
@@ -252,7 +252,7 @@
|
||||
#define isbot(A) (istype((A), /mob/living/simple_animal/bot))
|
||||
#define isguardian(A) (istype((A), /mob/living/simple_animal/hostile/guardian))
|
||||
#define isnymph(A) (istype((A), /mob/living/simple_animal/diona))
|
||||
#define iscaterpillar(A) (istype((A), /mob/living/simple_animal/nian_caterpillar))
|
||||
#define iscaterpillar(A) (istype((A), /mob/living/basic/nian_caterpillar))
|
||||
#define ishostile(A) (istype((A), /mob/living/simple_animal/hostile))
|
||||
#define isretaliate(A) (istype((A), /mob/living/simple_animal/hostile/retaliate))
|
||||
#define isterrorspider(A) (istype((A), /mob/living/simple_animal/hostile/poison/terror_spider))
|
||||
|
||||
@@ -151,7 +151,8 @@
|
||||
for(var/depth in 1 to recursion_limit)
|
||||
var/list/layer = next_layer
|
||||
next_layer = list()
|
||||
for(var/thing in layer)
|
||||
for(var/atom/thing in layer)
|
||||
next_layer += thing.contents
|
||||
if(!ismob(thing))
|
||||
continue
|
||||
var/mob/this_mob = thing
|
||||
|
||||
@@ -5,6 +5,7 @@ GLOBAL_LIST_EMPTY(language_keys) // Table of say codes for all languages
|
||||
GLOBAL_LIST_EMPTY(all_superheroes)
|
||||
|
||||
GLOBAL_LIST_EMPTY(clients) //list of all clients
|
||||
GLOBAL_LIST_EMPTY(persistent_clients) // list of all persistent clients, used for reattaching when someone reconnects
|
||||
GLOBAL_LIST_EMPTY(admins) //list of all clients whom are admins
|
||||
GLOBAL_LIST_EMPTY(de_admins) //list of all admins who have used the de-admin verb.
|
||||
GLOBAL_LIST_EMPTY(de_mentors) //list of all mentors who have used the de-admin verb.
|
||||
|
||||
@@ -195,7 +195,7 @@
|
||||
static_inventory += using
|
||||
|
||||
var/mob/camera/blob/B = user
|
||||
if(!B.is_offspring) // Checks if the blob is an offspring, to not create split button if it is
|
||||
if(!B.is_offspring && (length(GLOB.clients) > GLOB.configuration.event.blob_highpop_trigger)) // Checks if the blob is an offspring or below a population value, to not create split button if it is
|
||||
using = new /atom/movable/screen/blob/split()
|
||||
using.screen_loc = ui_acti
|
||||
static_inventory += using
|
||||
|
||||
@@ -27,6 +27,9 @@
|
||||
/// Expected time of a round in deciseconds
|
||||
var/expected_round_length = 120 MINUTES // This macro is equivilent to 72,000 deciseconds
|
||||
|
||||
/// the population needed to allow blobs to split consciousness
|
||||
var/blob_highpop_trigger = 60
|
||||
|
||||
/datum/configuration_section/event_configuration/load_data(list/data)
|
||||
// Use the load wrappers here. That way the default isnt made 'null' if you comment out the config line
|
||||
CONFIG_LOAD_BOOL(enable_random_events, data["allow_random_events"])
|
||||
@@ -66,4 +69,5 @@
|
||||
ASSERT(target in list(EVENT_LEVEL_MUNDANE, EVENT_LEVEL_MODERATE, EVENT_LEVEL_MAJOR, EVENT_LEVEL_DISASTER))
|
||||
first_run_times[target] = list("lower" = assoclist["lower_bound"] MINUTES, "upper" = assoclist["upper_bound"] MINUTES)
|
||||
*/
|
||||
CONFIG_LOAD_NUM(blob_highpop_trigger, data["blob_highpop_trigger"])
|
||||
|
||||
|
||||
@@ -691,10 +691,10 @@ SUBSYSTEM_DEF(ticker)
|
||||
// Besides, what's another loop over the /entire player list/
|
||||
var/kudos_message
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
var/kudos = M.mind?.kudos_received_from
|
||||
var/kudos = M.client?.persistent.kudos_received_from
|
||||
if(length(kudos))
|
||||
kudos_message = pick(length(kudos) > 5 ? special_encouragement_messages : base_encouragement_messages)
|
||||
to_chat(M, "<span class='green big'>You received <b>[length(M.mind.kudos_received_from)]</b> kudos from other players this round! [kudos_message]</span>")
|
||||
to_chat(M, "<span class='green big'>You received <b>[length(kudos)]</b> kudos from other players this round! [kudos_message]</span>")
|
||||
|
||||
// Seal the blackbox, stop collecting info
|
||||
SSblackbox.Seal()
|
||||
|
||||
@@ -576,8 +576,8 @@ UI STUFF
|
||||
|
||||
dat += "</table></div>"
|
||||
var/client/C = get_client_by_ckey(T.client_ckey)
|
||||
for(var/key in C?.pm_tracker.pms)
|
||||
var/datum/pm_convo/convo = C.pm_tracker.pms[key]
|
||||
for(var/key in C?.persistent.pm_tracker.pms)
|
||||
var/datum/pm_convo/convo = C.persistent.pm_tracker.pms[key]
|
||||
if(convo.typing)
|
||||
dat += "<i><span class='typing'>[key] is typing</span></i><br />"
|
||||
|
||||
@@ -587,10 +587,10 @@ UI STUFF
|
||||
continue
|
||||
if(!check_rights_client(rights_needed, FALSE, X))
|
||||
continue
|
||||
for(var/key in X.pm_tracker.pms)
|
||||
for(var/key in X.persistent.pm_tracker.pms)
|
||||
if(ckey(key) != ckey(T.client_ckey))
|
||||
continue
|
||||
var/datum/pm_convo/convo = X.pm_tracker.pms[key]
|
||||
var/datum/pm_convo/convo = X.persistent.pm_tracker.pms[key]
|
||||
if(convo.typing)
|
||||
dat += "<i><span class='typing'>[key] is typing</span></i><br />"
|
||||
found_typing = TRUE
|
||||
|
||||
@@ -26,3 +26,7 @@
|
||||
hunt_targets = list(/turf/simulated/floor/plasteel)
|
||||
hunt_range = 8
|
||||
hunt_chance = 50
|
||||
|
||||
/datum/ai_planning_subtree/find_and_hunt_target/prowl/lavaland
|
||||
hunt_targets = list(/turf/simulated/floor/plating/asteroid)
|
||||
hunt_chance = 15
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
var/ignore_sight = FALSE
|
||||
/// Blackboard key containing the minimum stat of a living mob to target
|
||||
var/minimum_stat_key = BB_TARGET_MINIMUM_STAT
|
||||
/// Blackboard key for the maximum aggro range of the mob
|
||||
var/aggro_range_key = BB_AGGRO_RANGE
|
||||
/// If this blackboard key is TRUE, makes us only target wounded mobs
|
||||
var/target_wounded_key
|
||||
|
||||
@@ -36,6 +38,10 @@
|
||||
if(vision_range && get_dist(living_mob, the_target) > vision_range)
|
||||
return FALSE
|
||||
|
||||
var/aggro_range = our_controller.blackboard[aggro_range_key]
|
||||
if(aggro_range && get_dist(living_mob, the_target) > aggro_range)
|
||||
return FALSE
|
||||
|
||||
if(!ignore_sight && !can_see(living_mob, the_target, vision_range)) //Target has moved behind cover and we have lost line of sight to it
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -33,5 +33,10 @@
|
||||
if(!victim.ai_controller)
|
||||
return
|
||||
|
||||
if(isanimal_or_basicmob(attacker)) // Don't retaliate on nuzzles
|
||||
var/mob/living/M = attacker
|
||||
if(M.a_intent == INTENT_HELP)
|
||||
return
|
||||
|
||||
victim.ai_controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker)
|
||||
post_retaliate_callback?.InvokeAsync(attacker)
|
||||
|
||||
@@ -24,4 +24,8 @@
|
||||
|
||||
if(victim == attacker)
|
||||
return
|
||||
if(isanimal_or_basicmob(attacker)) // Don't retaliate on nuzzles
|
||||
var/mob/living/M = attacker
|
||||
if(M.a_intent == INTENT_HELP)
|
||||
return
|
||||
victim.ai_controller?.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker)
|
||||
|
||||
@@ -17,6 +17,10 @@
|
||||
linked_emote = /datum/emote/spin
|
||||
name = "Spin"
|
||||
|
||||
/datum/keybinding/emote/jump
|
||||
linked_emote = /datum/emote/jump
|
||||
name = "Jump"
|
||||
|
||||
/datum/keybinding/emote/blush
|
||||
linked_emote = /datum/emote/living/blush
|
||||
name = "Blush"
|
||||
@@ -41,10 +45,6 @@
|
||||
linked_emote = /datum/emote/living/dance
|
||||
name = "Dance"
|
||||
|
||||
/datum/keybinding/emote/jump
|
||||
linked_emote = /datum/emote/living/jump
|
||||
name = "Jump"
|
||||
|
||||
/datum/keybinding/emote/deathgasp
|
||||
linked_emote = /datum/emote/living/deathgasp
|
||||
name = "Deathgasp"
|
||||
|
||||
+29
-11
@@ -23,6 +23,8 @@
|
||||
var/key
|
||||
var/name //replaces mob/var/original_name
|
||||
var/mob/living/current
|
||||
/// A serialized copy of this mind's body when it was destroyed, for admin respawn usage.
|
||||
var/destroyed_body_json
|
||||
/// The original mob's UID. Used for example to see if a silicon with antag status is actually malf. Or just an antag put in a borg
|
||||
var/original_mob_UID
|
||||
/// The original mob's name. Used in Dchat messages
|
||||
@@ -75,9 +77,6 @@
|
||||
|
||||
var/list/learned_recipes //List of learned recipe TYPES.
|
||||
|
||||
/// List of people who we've received kudos from.
|
||||
var/list/kudos_received_from = list()
|
||||
|
||||
/datum/mind/New(new_key)
|
||||
key = new_key
|
||||
objective_holder = new(src)
|
||||
@@ -86,8 +85,7 @@
|
||||
SSticker.minds -= src
|
||||
remove_all_antag_datums()
|
||||
qdel(objective_holder)
|
||||
current = null
|
||||
kudos_received_from.Cut()
|
||||
unbind()
|
||||
return ..()
|
||||
|
||||
/datum/mind/proc/set_original_mob(mob/original)
|
||||
@@ -126,13 +124,30 @@
|
||||
|
||||
return out_ckey
|
||||
|
||||
/datum/mind/proc/archive_deleted_body()
|
||||
SIGNAL_HANDLER // COMSIG_PARENT_QDELETING
|
||||
if(isliving(current))
|
||||
destroyed_body_json = json_encode(current.serialize())
|
||||
|
||||
/datum/mind/proc/bind_to(mob/living/new_character)
|
||||
current = new_character
|
||||
new_character.mind = src
|
||||
RegisterSignal(current, COMSIG_PARENT_QDELETING, PROC_REF(archive_deleted_body), override = TRUE)
|
||||
|
||||
/datum/mind/proc/unbind()
|
||||
if(isnull(current))
|
||||
return
|
||||
UnregisterSignal(current, COMSIG_PARENT_QDELETING)
|
||||
if(current.mind == src)
|
||||
current.mind = null
|
||||
current = null
|
||||
|
||||
/datum/mind/proc/transfer_to(mob/living/new_character)
|
||||
var/datum/atom_hud/antag/hud_to_transfer = antag_hud //we need this because leave_hud() will clear this list
|
||||
var/mob/living/old_current = current
|
||||
if(!istype(new_character))
|
||||
stack_trace("transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob.")
|
||||
if(current) //remove ourself from our old body's mind variable
|
||||
current.mind = null
|
||||
if(isliving(current))
|
||||
current.med_hud_set_status()
|
||||
leave_all_huds() //leave all the huds in the old body, so it won't get huds if somebody else enters it
|
||||
@@ -141,11 +156,13 @@
|
||||
|
||||
new_character.job = current.job //transfer our job over to the new body
|
||||
|
||||
if(new_character.mind) //remove any mind currently in our new body's mind variable
|
||||
new_character.mind.current = null
|
||||
unbind()
|
||||
|
||||
if(new_character.mind) //remove any mind currently in our new body's mind variable
|
||||
new_character.mind.unbind()
|
||||
|
||||
bind_to(new_character)
|
||||
|
||||
current = new_character //link ourself to our new body
|
||||
new_character.mind = src //and link our new body to ourself
|
||||
for(var/a in antag_datums) //Makes sure all antag datums effects are applied in the new body
|
||||
var/datum/antagonist/A = a
|
||||
A.on_body_transfer(old_current, current)
|
||||
@@ -1858,7 +1875,7 @@
|
||||
error("mind_initialize(): No ticker ready yet! Please inform Carn")
|
||||
if(!mind.name)
|
||||
mind.name = real_name
|
||||
mind.current = src
|
||||
mind.bind_to(src)
|
||||
SEND_SIGNAL(src, COMSIG_MIND_INITIALIZE)
|
||||
|
||||
//HUMAN
|
||||
@@ -1870,6 +1887,7 @@
|
||||
/mob/proc/sync_mind()
|
||||
mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist)
|
||||
mind.active = TRUE //indicates that the mind is currently synced with a client
|
||||
client.persistent.minds |= mind
|
||||
|
||||
//slime
|
||||
/mob/living/simple_animal/slime/mind_initialize()
|
||||
|
||||
@@ -586,8 +586,8 @@
|
||||
return
|
||||
H.real_name = "[capitalize(pick(GLOB.first_names_soviet))] [capitalize(pick(GLOB.last_names_soviet))]"
|
||||
H.name = H.real_name
|
||||
H.add_language("Zvezhan")
|
||||
H.set_default_language(GLOB.all_languages["Zvezhan"])
|
||||
H.add_language("Cygni Standard")
|
||||
H.set_default_language(GLOB.all_languages["Cygni Standard"])
|
||||
var/obj/item/card/id/I = H.wear_id
|
||||
if(istype(I))
|
||||
apply_to_card(I, H, list(ACCESS_MAINT_TUNNELS), name)
|
||||
@@ -886,7 +886,7 @@
|
||||
. = ..()
|
||||
if(visualsOnly)
|
||||
return
|
||||
H.add_language("Zvezhan")
|
||||
H.add_language("Cygni Standard")
|
||||
|
||||
/datum/outfit/admin/trader/unathi
|
||||
name = "Glint-Scales Trader"
|
||||
|
||||
@@ -249,6 +249,7 @@
|
||||
volume = 50000
|
||||
spray_maxrange = 10
|
||||
spray_currentrange = 10
|
||||
spray_minrange = 5
|
||||
list_reagents = list("cleaner" = 50000)
|
||||
delay = 0.1 SECONDS // it costs 1000 reagents to fire this cleaner... for 12 seconds.
|
||||
|
||||
|
||||
@@ -241,8 +241,7 @@
|
||||
S.boost = world.time + 6 SECONDS
|
||||
var/old_color = L.color
|
||||
L.color = A.color
|
||||
addtimer(VARSET_CALLBACK(L, color, old_color), 6 SECONDS)
|
||||
|
||||
animate(L, 6 SECONDS, color = old_color, easing = EASE_IN|CIRCULAR_EASING, flags = ANIMATION_PARALLEL)
|
||||
|
||||
/datum/spell/bloodcrawl/proc/phasein(atom/A, mob/living/L)
|
||||
|
||||
|
||||
@@ -1411,7 +1411,7 @@
|
||||
refresh_overlay()
|
||||
|
||||
if(foam_level == 5)
|
||||
owner.Paralyse(4 SECONDS)
|
||||
owner.Immobilize(5 SECONDS)
|
||||
|
||||
/datum/status_effect/c_foamed/proc/refresh_overlay()
|
||||
// Refresh overlay
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
traitor_count += 1
|
||||
continue
|
||||
if(ishuman(player) || is_ai(player))
|
||||
if((ROLE_TRAITOR in player.client.prefs.be_special) && !player.client.skip_antag && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, ROLE_SYNDICATE))
|
||||
if((ROLE_TRAITOR in player.client.prefs.be_special) && !player.client.persistent.skip_antag && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, ROLE_SYNDICATE))
|
||||
possible_traitors += player.mind
|
||||
for(var/datum/mind/player in possible_traitors)
|
||||
for(var/job in restricted_jobs)
|
||||
@@ -119,7 +119,7 @@
|
||||
if(SSshuttle.emergency.mode >= SHUTTLE_ESCAPE)
|
||||
return
|
||||
|
||||
if(character.client && (ROLE_TRAITOR in character.client.prefs.be_special) && !character.client.skip_antag && !jobban_isbanned(character, ROLE_TRAITOR) && !jobban_isbanned(character, ROLE_SYNDICATE))
|
||||
if(character.client && (ROLE_TRAITOR in character.client.prefs.be_special) && !character.client.persistent.skip_antag && !jobban_isbanned(character, ROLE_TRAITOR) && !jobban_isbanned(character, ROLE_SYNDICATE))
|
||||
var/player_count = 0
|
||||
var/traitor_count = 0
|
||||
for(var/mob/living/player in GLOB.mob_list)
|
||||
|
||||
@@ -146,7 +146,7 @@
|
||||
if(jobban_isbanned(player, ROLE_SYNDICATE) || jobban_isbanned(player, antagonist_type::job_rank))
|
||||
continue
|
||||
// Make sure they want to play antag, and that they're not already something (off station or antag)
|
||||
if(player.client.skip_antag || player.mind.offstation_role || player.mind.special_role)
|
||||
if(player.client.persistent.skip_antag || player.mind.offstation_role || player.mind.special_role)
|
||||
continue
|
||||
// Make sure they actually want to be this antagonist
|
||||
if(!(antagonist_type::job_rank in player.client.prefs.be_special))
|
||||
|
||||
@@ -299,7 +299,7 @@
|
||||
players = shuffle(players)
|
||||
// Get a list of all the people who want to be the antagonist for this round
|
||||
for(var/mob/eligible_player in players)
|
||||
if(!eligible_player.client.skip_antag)
|
||||
if(!eligible_player.client.persistent.skip_antag)
|
||||
if(species_exclusive && (eligible_player.client.prefs.active_character.species != species_exclusive))
|
||||
continue
|
||||
if(role in eligible_player.client.prefs.be_special)
|
||||
@@ -339,7 +339,7 @@
|
||||
|
||||
// Get a list of all the people who want to be the antagonist for this round, except those with incompatible species, and those who are already antagonists
|
||||
for(var/mob/living/carbon/human/player in players)
|
||||
if(player.client.skip_antag || !(allow_offstation_roles || !player.mind?.offstation_role) || player.mind?.special_role)
|
||||
if(player.client.persistent.skip_antag || !(allow_offstation_roles || !player.mind?.offstation_role) || player.mind?.special_role)
|
||||
continue
|
||||
|
||||
if(!(role in player.client.prefs.be_special) || (player.client.prefs.active_character.species in species_to_mindflayer))
|
||||
|
||||
@@ -183,6 +183,8 @@
|
||||
to_chat(owner, "<span class='notice'>You feel very stretchy.</span>")
|
||||
owner.ventcrawler = VENTCRAWLER_ALWAYS
|
||||
|
||||
/obj/item/organ/internal/heart/gland/ventcrawling/remove(mob/living/carbon/M, special = 0)
|
||||
owner.ventcrawler = initial(owner.ventcrawler)
|
||||
|
||||
/obj/item/organ/internal/heart/gland/viral
|
||||
cooldown_low = 1800
|
||||
|
||||
@@ -385,35 +385,8 @@
|
||||
/datum/spell/aoe/revenant/haunt_object/proc/make_spooky(obj/item/item_to_possess, mob/living/simple_animal/revenant/user)
|
||||
new /obj/effect/temp_visual/revenant(get_turf(item_to_possess)) // Thematic spooky visuals
|
||||
var/mob/living/basic/possessed_object/revenant/possessed_object = new(item_to_possess) // Begin haunting object
|
||||
set_outline(possessed_object)
|
||||
ADD_TRAIT(possessed_object, TRAIT_DODGE_ALL_OBJECTS, "Revenant")
|
||||
addtimer(CALLBACK(src, PROC_REF(begin_poltergheist), possessed_object, user), 1 SECONDS, TIMER_UNIQUE) // Short warm-up for floaty ambience
|
||||
addtimer(CALLBACK(possessed_object, TYPE_PROC_REF(/mob/living/basic/possessed_object, death)), 70 SECONDS, TIMER_UNIQUE) // De-haunt the object
|
||||
|
||||
/// Gives it AI
|
||||
/datum/spell/aoe/revenant/haunt_object/proc/begin_poltergheist(mob/living/basic/possessed_object/possessed_object, mob/living/simple_animal/revenant/user)
|
||||
possessed_object.ai_controller = new /datum/ai_controller/basic_controller/revenant(possessed_object)
|
||||
|
||||
/datum/ai_controller/basic_controller/revenant
|
||||
blackboard = list(
|
||||
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||
)
|
||||
|
||||
ai_movement = /datum/ai_movement/basic_avoidance
|
||||
idle_behavior = null
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/simple_find_target,
|
||||
/datum/ai_planning_subtree/attack_obstacle_in_path,
|
||||
/datum/ai_planning_subtree/swirl_around_target,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
||||
)
|
||||
|
||||
/// Sets the glow on the haunted object, scales up based on throwforce
|
||||
/datum/spell/aoe/revenant/haunt_object/proc/set_outline(mob/living/basic/possessed_object/possessed_object)
|
||||
possessed_object.remove_filter("haunt_glow")
|
||||
var/outline_size = min((possessed_object.possessed_item.throwforce / 15) * 3, 3)
|
||||
possessed_object.add_filter("haunt_glow", 2, list("type" = "outline", "color" = "#7A4FA9", "size" = outline_size)) // Give it spooky purple outline
|
||||
|
||||
/// Stop all attack timers cast by the previous spell use
|
||||
/datum/spell/aoe/revenant/haunt_object/proc/stop_timers()
|
||||
for(var/I in attack_timers)
|
||||
|
||||
@@ -643,7 +643,7 @@
|
||||
desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state."
|
||||
normal_integrity = 150
|
||||
damage_deflection = 5
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
armor = null
|
||||
|
||||
//////////////////////////////////
|
||||
/*
|
||||
|
||||
+4
-2
@@ -260,8 +260,10 @@
|
||||
/obj/item/stack/medical/ointment/advanced = 2,
|
||||
/obj/item/reagent_containers/patch/styptic = 3,
|
||||
/obj/item/reagent_containers/patch/silver_sulf = 3,
|
||||
/obj/item/reagent_containers/applicator/brute = 2,
|
||||
/obj/item/reagent_containers/applicator/burn = 2,
|
||||
/obj/item/stack/medical/suture/medicated = 3,
|
||||
/obj/item/stack/medical/suture = 5,
|
||||
/obj/item/stack/medical/suture/regen_mesh/advanced = 3,
|
||||
/obj/item/stack/medical/suture/regen_mesh = 5,
|
||||
/obj/item/stack/medical/bruise_pack = 2,
|
||||
/obj/item/stack/medical/splint = 3,
|
||||
/obj/item/reagent_containers/syringe = 6,
|
||||
|
||||
@@ -1371,6 +1371,7 @@
|
||||
density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude
|
||||
tiltable = FALSE
|
||||
products = list(/obj/item/stack/medical/bruise_pack = 2,
|
||||
/obj/item/stack/medical/suture/emergency = 2,
|
||||
/obj/item/stack/medical/ointment = 2,
|
||||
/obj/item/reagent_containers/syringe/charcoal = 4,
|
||||
/obj/item/reagent_containers/hypospray/autoinjector/epinephrine = 4,
|
||||
|
||||
@@ -455,6 +455,30 @@
|
||||
projectile_energy_cost = 100
|
||||
harmful = FALSE
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/dropwall
|
||||
name = "\improper DWDL-04 Dropwall Launcher"
|
||||
desc = "A large, semi-automatic launcher designed by Shellguard Munitions to fire dropwall shield generators."
|
||||
icon_state = "mecha_grenadelnchr"
|
||||
origin_tech = "combat=4;engineering=4"
|
||||
projectile = /obj/item/grenade/barrier/dropwall
|
||||
missile_speed = 1.5
|
||||
projectile_energy_cost = 750
|
||||
projectiles = 4
|
||||
size = 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/dropwall/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
set_ready_state(0)
|
||||
var/obj/item/grenade/barrier/dropwall/DW = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
DW.mode = angle2dir_cardinal(get_angle(get_turf(src), get_turf(target)))
|
||||
DW.throw_at(target, missile_range, missile_speed)
|
||||
DW.active = TRUE
|
||||
projectiles--
|
||||
log_message("Fired from [name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar/can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "rsf"
|
||||
item_state = "rsf"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
var/atom/currently_dispensing
|
||||
var/power_mode = POWER_NONE
|
||||
|
||||
|
||||
@@ -783,13 +783,19 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
|
||||
/obj/item/radio/headset/deadsay
|
||||
name = "spectral radio"
|
||||
ks2type = /obj/item/encryptionkey/centcom
|
||||
var/datum/action/item_action/chameleon_change/chameleon_action
|
||||
|
||||
/obj/item/radio/headset/deadsay/New()
|
||||
..()
|
||||
/obj/item/radio/headset/deadsay/Initialize(mapload)
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/radio/headset
|
||||
chameleon_action.chameleon_name = "Headset"
|
||||
chameleon_action.initialize_disguises()
|
||||
GLOB.deadsay_radio_systems.Add(src)
|
||||
make_syndie()
|
||||
|
||||
/obj/item/radio/headset/deadsay/Destroy()
|
||||
QDEL_NULL(chameleon_action)
|
||||
GLOB.deadsay_radio_systems.Remove(src)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -712,22 +712,22 @@ SLIME SCANNER
|
||||
* Used in chat-based gas scans.
|
||||
*/
|
||||
/proc/atmos_scan(mob/user, atom/target, silent = FALSE, print = TRUE, milla_turf_details = FALSE, detailed = FALSE)
|
||||
var/datum/gas_mixture/gasmix
|
||||
var/list/airs
|
||||
var/list/milla = null
|
||||
if(milla_turf_details && istype(target, /turf))
|
||||
// This is one of the few times when it's OK to call MILLA directly, as we need more information than we normally keep, aren't trying to modify it, and don't need it to be synchronized with anything.
|
||||
milla = new/list(MILLA_TILE_SIZE)
|
||||
get_tile_atmos(target, milla)
|
||||
gasmix = new()
|
||||
gasmix.copy_from_milla(milla)
|
||||
airs += gasmix
|
||||
|
||||
var/datum/gas_mixture/air = new()
|
||||
air.copy_from_milla(milla)
|
||||
airs = list(air)
|
||||
else
|
||||
gasmix = target.return_analyzable_air()
|
||||
if(!istype(gasmix, /list))
|
||||
gasmix = list(gasmix)
|
||||
airs += gasmix
|
||||
if(!gasmix)
|
||||
airs = target.return_analyzable_air()
|
||||
if(!airs)
|
||||
return FALSE
|
||||
if(!islist(airs))
|
||||
airs = list(airs)
|
||||
|
||||
var/list/message = list()
|
||||
if(!silent && isliving(user))
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
desc = "A base rootkit for ai upgrades. If you are seeing this, report where you found it on the github issues."
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "datadisk3"
|
||||
drop_sound = 'sound/items/handling/disk_drop.ogg'
|
||||
pickup_sound = 'sound/items/handling/disk_pickup.ogg'
|
||||
new_attack_chain = TRUE
|
||||
|
||||
/obj/item/ai_upgrade/interact_with_atom(atom/target, mob/living/user, list/modifiers)
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
|
||||
/obj/item/salvage/loot/soviet
|
||||
name = "\improper Cygni manifesto"
|
||||
desc = "A small book, written in Zvezhan, detailing the manifesto of Malfoy Ames, father of The Cygni Rebellion. Banned in Federation space, it may fetch a decent price on the black market."
|
||||
desc = "A small book, written in Cygni Standard, detailing the manifesto of Malfoy Ames, father of The Cygni Rebellion. Banned in Federation space, it may fetch a decent price on the black market."
|
||||
icon_state = "ussp_manual"
|
||||
hitsound = 'sound/items/handling/paper_pickup.ogg'
|
||||
pickup_sound = 'sound/items/handling/paper_pickup.ogg'
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
parent_stack = TRUE
|
||||
var/heal_brute = 0
|
||||
var/heal_burn = 0
|
||||
var/self_delay = 20
|
||||
var/delay = 20
|
||||
var/unique_handling = FALSE //some things give a special prompt, do we want to bypass some checks in parent?
|
||||
var/stop_bleeding = 0
|
||||
var/healverb = "bandage"
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
if(M == user && !unique_handling)
|
||||
user.visible_message("<span class='notice'>[user] starts to apply [src] on [H]...</span>")
|
||||
if(!do_mob(user, H, self_delay))
|
||||
if(!do_mob(user, H, delay))
|
||||
return TRUE
|
||||
return
|
||||
|
||||
@@ -308,7 +308,7 @@
|
||||
singular_name = "medical splint"
|
||||
icon_state = "splint"
|
||||
unique_handling = TRUE
|
||||
self_delay = 100
|
||||
delay = 100
|
||||
merge_type = /obj/item/stack/medical/splint
|
||||
var/other_delay = 0
|
||||
|
||||
@@ -333,12 +333,12 @@
|
||||
to_chat(user, "<span class='notice'>You remove the splint from [H]'s [limb].</span>")
|
||||
return TRUE
|
||||
|
||||
if((M == user && self_delay > 0) || (M != user && other_delay > 0))
|
||||
if((M == user && delay > 0) || (M != user && other_delay > 0))
|
||||
user.visible_message("<span class='notice'>[user] starts to apply [src] to [H]'s [limb].</span>", \
|
||||
"<span class='notice'>You start to apply [src] to [H]'s [limb].</span>", \
|
||||
"<span class='notice'>You hear something being wrapped.</span>")
|
||||
|
||||
if(M == user && !do_mob(user, H, self_delay))
|
||||
if(M == user && !do_mob(user, H, delay))
|
||||
return TRUE
|
||||
else if(!do_mob(user, H, other_delay))
|
||||
return TRUE
|
||||
@@ -362,3 +362,172 @@
|
||||
name = "tribal splints"
|
||||
icon_state = "tribal_splint"
|
||||
other_delay = 50
|
||||
|
||||
// Sutures and burn meshes
|
||||
|
||||
/obj/item/stack/medical/suture
|
||||
name = "sutures"
|
||||
singular_name = "suture"
|
||||
desc = "A bundle of sterilized sutures used for sealing up minor cuts and lacerations."
|
||||
icon_state = "suture"
|
||||
gender = PLURAL
|
||||
merge_type = /obj/item/stack/medical/suture
|
||||
healverb = "suturing"
|
||||
amount = 10
|
||||
max_amount = 10
|
||||
heal_brute = 10
|
||||
stop_bleeding = 1200
|
||||
dynamic_icon_state = TRUE
|
||||
delay = 1 SECONDS
|
||||
var/self_delay = 3 SECONDS
|
||||
var/applying = FALSE
|
||||
|
||||
/obj/item/stack/medical/suture/apply(mob/living/carbon/human/target, mob/user)
|
||||
. = TRUE
|
||||
if(applying)
|
||||
to_chat(user, "<span class='warning'>You're already applying [src].</span>")
|
||||
return
|
||||
if(!ishuman(target) || !target.can_inject(user, TRUE))
|
||||
return
|
||||
var/heal_type = (heal_brute ? BRUTE : BURN)
|
||||
var/heal_display = (heal_brute ? BRUTE : "burn")
|
||||
if(!target.get_damage_amount(heal_type))
|
||||
if(target == user)
|
||||
to_chat(user, "<span class='warning'>You don't have any [heal_display] damage.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>They don't have any [heal_display] damage.</span>")
|
||||
return
|
||||
|
||||
var/obj/item/organ/external/current_limb = target.get_organ(user.zone_selected)
|
||||
if(!current_limb)
|
||||
to_chat(user, "<span class='danger'>That limb is missing!</span>")
|
||||
return
|
||||
if(current_limb.is_robotic())
|
||||
to_chat(user, "<span class='danger'>This can't be used on a robotic limb.</span>")
|
||||
return
|
||||
if((heal_brute > 0 && !current_limb.brute_dam) || (heal_burn > 0 && !current_limb.burn_dam))
|
||||
if(!do_after(user, delay / 2, target = target))
|
||||
return
|
||||
current_limb = most_damaged_limb(target)
|
||||
|
||||
var/mend_time = delay
|
||||
if(target == user)
|
||||
target.visible_message("[user] begins [healverb] [user.p_themselves()] with [src].", "<span class='notice'>You begin [healverb] your [current_limb.name] with [src].</span>")
|
||||
mend_time = self_delay
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] begins [healverb] [target] with [src].</span>", "<span class='notice'>You begin [healverb] [target.p_their()] [current_limb.name] with [src].</span>")
|
||||
|
||||
applying = TRUE
|
||||
while(do_after(user, mend_time, target = target))
|
||||
if(!target.can_inject(user, TRUE))
|
||||
break
|
||||
var/cut_open = FALSE
|
||||
if(stop_bleeding)
|
||||
for(var/obj/item/organ/external/E in target.bodyparts)
|
||||
if(E.open >= ORGAN_ORGANIC_OPEN)
|
||||
cut_open = TRUE
|
||||
to_chat(user, "<span class='warning'>[target]'s [E.name] is cut open, you'll need more than some [name] to stop their bleeding.</span>")
|
||||
break
|
||||
if(!apply_to(target, user, current_limb, !cut_open))
|
||||
break
|
||||
if(is_zero_amount(TRUE))
|
||||
break
|
||||
if((heal_brute > 0 && !current_limb.brute_dam) || (heal_burn > 0 && !current_limb.burn_dam))
|
||||
if(!target.get_damage_amount(heal_type))
|
||||
if(target == user)
|
||||
target.visible_message("[user] finishes [healverb] [user.p_themselves()] with [src].", "<span class='notice'>You finish [healverb] yourself with [src].</span>")
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] finishes [healverb] [target] with [src].</span>", "<span class='notice'>You finish [healverb] [target] with [src].</span>")
|
||||
break
|
||||
if(!do_after(user, delay / 2, target = target))
|
||||
break
|
||||
current_limb = most_damaged_limb(target)
|
||||
to_chat(user, "<span class='notice'>You begin [healverb] [target == user ? "your" : target.p_their()] [current_limb.name] with [src].</span>")
|
||||
if(!target.can_inject(user, TRUE))
|
||||
break
|
||||
applying = FALSE
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
|
||||
/obj/item/stack/medical/suture/proc/apply_to(mob/living/carbon/human/target, mob/user, obj/item/organ/external/current_limb, allow_stop_bleeding = TRUE)
|
||||
if(!use(1))
|
||||
return FALSE
|
||||
|
||||
current_limb.heal_damage(heal_brute, heal_burn, FALSE, FALSE, updating_health = TRUE)
|
||||
|
||||
if(stop_bleeding && !target.bleedsuppress && allow_stop_bleeding)
|
||||
target.suppress_bloodloss(stop_bleeding)
|
||||
return TRUE
|
||||
|
||||
/obj/item/stack/medical/suture/proc/most_damaged_limb(mob/living/carbon/human/target)
|
||||
var/obj/item/organ/external/most_damaged
|
||||
var/most_damaged_amount = 0
|
||||
var/focus_brute = (heal_brute > 0)
|
||||
for(var/obj/item/organ/external/E in target.bodyparts)
|
||||
if(focus_brute)
|
||||
if(E.brute_dam > most_damaged_amount)
|
||||
most_damaged = E
|
||||
most_damaged_amount = E.brute_dam
|
||||
else if(E.burn_dam > most_damaged_amount)
|
||||
most_damaged = E
|
||||
most_damaged_amount = E.burn_dam
|
||||
return most_damaged
|
||||
|
||||
/obj/item/stack/medical/suture/emergency
|
||||
name = "emergency sutures"
|
||||
singular_name = "emergency suture"
|
||||
desc = "A small bundle of cheap sutures. They're not pretty, but still quite effective at keeping the blood inside your body."
|
||||
merge_type = /obj/item/stack/medical/suture/emergency
|
||||
heal_brute = 5
|
||||
|
||||
/obj/item/stack/medical/suture/medicated
|
||||
name = "medicated sutures"
|
||||
singular_name = "medicated suture"
|
||||
desc = "A bundle of sterilized sutures used for sealing up minor cuts and lacerations. These have been treated with potent healing chemicals, dramatically improving their wound-sealing capability."
|
||||
icon_state = "suture_medicated"
|
||||
merge_type = /obj/item/stack/medical/suture/medicated
|
||||
heal_brute = 15
|
||||
stop_bleeding = 2000
|
||||
|
||||
/obj/item/stack/medical/suture/regen_mesh
|
||||
name = "regenerative mesh"
|
||||
desc = "A sheet of bacteriostatic mesh used to graft minor burns, housed in a sterile packet."
|
||||
singular_name = "mesh piece"
|
||||
icon_state = "regen_mesh"
|
||||
merge_type = /obj/item/stack/medical/suture/regen_mesh
|
||||
healverb = "grafting"
|
||||
heal_brute = 0
|
||||
heal_burn = 10
|
||||
/// This var determines if the sterile packaging of the mesh has been opened.
|
||||
var/is_open = TRUE
|
||||
|
||||
/obj/item/stack/medical/suture/regen_mesh/Initialize(mapload, new_amount, merge)
|
||||
. = ..()
|
||||
if(amount == max_amount) // only seal full mesh packs
|
||||
is_open = FALSE
|
||||
update_appearance()
|
||||
|
||||
/obj/item/stack/medical/suture/regen_mesh/update_icon_state()
|
||||
if(is_open)
|
||||
return ..()
|
||||
icon_state = "[initial(icon_state)]_closed"
|
||||
|
||||
/obj/item/stack/medical/suture/regen_mesh/apply(mob/living/carbon/human/target, mob/user)
|
||||
open_mesh()
|
||||
. = ..()
|
||||
|
||||
/obj/item/stack/medical/suture/regen_mesh/change_stack(mob/user, amount)
|
||||
open_mesh()
|
||||
. = ..()
|
||||
|
||||
/obj/item/stack/medical/suture/regen_mesh/proc/open_mesh()
|
||||
if(!is_open)
|
||||
is_open = TRUE
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
playsound(src, 'sound/items/poster_ripped.ogg', 20, TRUE)
|
||||
|
||||
/obj/item/stack/medical/suture/regen_mesh/advanced
|
||||
name = "advanced regenerative mesh"
|
||||
desc = "A sheet of medically-treated bacteriostatic mesh used to graft moderate burns, housed in a sterile packet."
|
||||
icon_state = "advanced_mesh"
|
||||
merge_type = /obj/item/stack/medical/suture/regen_mesh/advanced
|
||||
heal_burn = 15
|
||||
|
||||
@@ -65,7 +65,8 @@
|
||||
icon_state = pick("ointment", "firefirstaid")
|
||||
|
||||
/obj/item/storage/firstaid/fire/populate_contents()
|
||||
new /obj/item/reagent_containers/applicator/burn(src)
|
||||
new /obj/item/stack/medical/suture/regen_mesh/advanced(src)
|
||||
new /obj/item/stack/medical/suture/regen_mesh(src)
|
||||
new /obj/item/reagent_containers/patch/silver_sulf/small(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector/epinephrine(src)
|
||||
@@ -123,7 +124,8 @@
|
||||
icon_state = pick("brute", "brute2")
|
||||
|
||||
/obj/item/storage/firstaid/brute/populate_contents()
|
||||
new /obj/item/reagent_containers/applicator/brute(src)
|
||||
new /obj/item/stack/medical/suture/medicated(src)
|
||||
new /obj/item/stack/medical/suture(src)
|
||||
new /obj/item/reagent_containers/patch/styptic/small(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector/epinephrine(src)
|
||||
|
||||
@@ -122,7 +122,6 @@
|
||||
return INITIALIZE_HINT_QDEL
|
||||
tank = loc
|
||||
reagents = tank.reagents //This mister is really just a proxy for the tank's reagents
|
||||
RegisterSignal(src, COMSIG_ACTIVATE_SELF, TYPE_PROC_REF(/datum, signal_cancel_activate_self))
|
||||
return ..()
|
||||
|
||||
/obj/item/reagent_containers/spray/mister/Destroy()
|
||||
@@ -170,20 +169,13 @@
|
||||
item_state = "misterjani"
|
||||
spray_maxrange = 4
|
||||
spray_currentrange = 4
|
||||
spray_minrange = 2
|
||||
amount_per_transfer_from_this = 10
|
||||
possible_transfer_amounts = null
|
||||
|
||||
/obj/item/watertank/janitor/make_noz()
|
||||
return new /obj/item/reagent_containers/spray/mister/janitor(src)
|
||||
|
||||
/obj/item/reagent_containers/spray/mister/janitor/activate_self(mob/user)
|
||||
if(..())
|
||||
return FINISH_ATTACK
|
||||
|
||||
amount_per_transfer_from_this = (amount_per_transfer_from_this == 5 ? 10 : 5)
|
||||
spray_currentrange = (spray_currentrange == 2 ? spray_maxrange : 2)
|
||||
to_chat(user, "<span class='notice'>You [amount_per_transfer_from_this == 5 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.</span>")
|
||||
|
||||
//ATMOS FIRE FIGHTING BACKPACK
|
||||
|
||||
#define EXTINGUISHER 0
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
desc = "If you can see this, make an issue report on GitHub. Something has gone wrong!"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
icon_state = "borg-default"
|
||||
spray_maxrange = 3
|
||||
spray_currentrange = 3
|
||||
|
||||
/obj/item/reagent_containers/spray/alien/smoke
|
||||
name = "smokescreen module"
|
||||
|
||||
@@ -160,7 +160,7 @@
|
||||
materials = list()
|
||||
origin_tech = "biotech=3;combat=2"
|
||||
attack_verb = list("shanked", "shivved")
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
armor = null
|
||||
|
||||
/obj/item/kitchen/knife/butcher
|
||||
name = "butcher's cleaver"
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
/obj/item/shield/riot/roman/fake
|
||||
desc = "Bears an inscription on the inside: <i>\"Romanes venio domus\"</i>. It appears to be a bit flimsy."
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, rad = 0, fire = 0, acid = 0)
|
||||
armor = null
|
||||
|
||||
/obj/item/shield/riot/roman/fake/add_parry_component()
|
||||
return
|
||||
|
||||
@@ -528,7 +528,7 @@
|
||||
|
||||
/obj/item/storage/box/syndie_kit/stechkin
|
||||
name = "\improper FK-69 Stechkin kit"
|
||||
desc = "A box marked with Zvezhan characters. It appears to contain a 10mm pistol and two magazines."
|
||||
desc = "A box marked with Cygni Standard characters. It appears to contain a 10mm pistol and two magazines."
|
||||
|
||||
/obj/item/storage/box/syndie_kit/stechkin/populate_contents()
|
||||
new /obj/item/gun/projectile/automatic/pistol(src)
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
|
||||
/obj/structure/closet/critter/nian_caterpillar
|
||||
name = "nian caterpillar crate"
|
||||
content_mob = /mob/living/simple_animal/nian_caterpillar
|
||||
content_mob = /mob/living/basic/nian_caterpillar
|
||||
|
||||
/obj/structure/closet/critter/deer
|
||||
name = "deer crate"
|
||||
|
||||
@@ -37,6 +37,12 @@
|
||||
|
||||
/obj/structure/largecrate/crowbar_act(mob/living/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(!I.use_tool(src, user, 20, volume = I.tool_volume))
|
||||
return TRUE
|
||||
break_open()
|
||||
user.visible_message("<span class='notice'>[user] pries [src] open.</span>", \
|
||||
"<span class='notice'>You pry open [src].</span>", \
|
||||
"<span class='notice'>You hear splitting wood.</span>")
|
||||
if(manifest)
|
||||
manifest.forceMove(loc)
|
||||
manifest = null
|
||||
@@ -46,11 +52,11 @@
|
||||
for(var/O in contents)
|
||||
var/atom/movable/A = O
|
||||
A.forceMove(T)
|
||||
user.visible_message("<span class='notice'>[user] pries [src] open.</span>", \
|
||||
"<span class='notice'>You pry open [src].</span>", \
|
||||
"<span class='notice'>You hear splitting wood.</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/largecrate/proc/break_open()
|
||||
return
|
||||
|
||||
/obj/structure/largecrate/Destroy()
|
||||
var/turf/src_turf = get_turf(src)
|
||||
for(var/obj/O in contents)
|
||||
@@ -62,60 +68,42 @@
|
||||
/obj/structure/largecrate/lisa
|
||||
icon_state = "lisacrate"
|
||||
|
||||
/obj/structure/largecrate/lisa/crowbar_act(mob/living/user, obj/item/I)
|
||||
if(!I.use_tool(src, user, I.tool_volume))
|
||||
return
|
||||
/obj/structure/largecrate/lisa/break_open()
|
||||
new /mob/living/simple_animal/pet/dog/corgi/lisa(loc)
|
||||
return ..()
|
||||
|
||||
/obj/structure/largecrate/cow
|
||||
name = "cow crate"
|
||||
icon_state = "lisacrate"
|
||||
|
||||
/obj/structure/largecrate/cow/crowbar_act(mob/living/user, obj/item/I)
|
||||
if(!I.use_tool(src, user, I.tool_volume))
|
||||
return
|
||||
/obj/structure/largecrate/cow/break_open()
|
||||
new /mob/living/basic/cow(loc)
|
||||
return ..()
|
||||
|
||||
/obj/structure/largecrate/goat
|
||||
name = "goat crate"
|
||||
icon_state = "lisacrate"
|
||||
|
||||
/obj/structure/largecrate/goat/crowbar_act(mob/living/user, obj/item/I)
|
||||
if(!I.use_tool(src, user, I.tool_volume))
|
||||
return
|
||||
/obj/structure/largecrate/goat/break_open()
|
||||
new /mob/living/simple_animal/hostile/retaliate/goat(loc)
|
||||
return ..()
|
||||
|
||||
/obj/structure/largecrate/chick
|
||||
name = "chicken crate"
|
||||
icon_state = "lisacrate"
|
||||
|
||||
/obj/structure/largecrate/chick/crowbar_act(mob/living/user, obj/item/I)
|
||||
if(!I.use_tool(src, user, I.tool_volume))
|
||||
return
|
||||
/obj/structure/largecrate/chick/break_open()
|
||||
var/num = rand(4, 6)
|
||||
for(var/i in 1 to num)
|
||||
new /mob/living/simple_animal/chick(loc)
|
||||
return ..()
|
||||
|
||||
/obj/structure/largecrate/cat
|
||||
name = "cat crate"
|
||||
icon_state = "lisacrate"
|
||||
|
||||
/obj/structure/largecrate/cat/crowbar_act(mob/living/user, obj/item/I)
|
||||
if(!I.use_tool(src, user, I.tool_volume))
|
||||
return
|
||||
/obj/structure/largecrate/cat/break_open()
|
||||
new /mob/living/simple_animal/pet/cat(loc)
|
||||
return ..()
|
||||
|
||||
/obj/structure/largecrate/secway
|
||||
name = "secway crate"
|
||||
|
||||
/obj/structure/largecrate/secway/crowbar_act(mob/living/user, obj/item/I)
|
||||
if(!I.use_tool(src, user, I.tool_volume))
|
||||
return
|
||||
/obj/structure/largecrate/secway/break_open()
|
||||
new /obj/vehicle/secway(loc)
|
||||
new /obj/item/key/security(loc)
|
||||
return ..()
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
alpha = 150
|
||||
flags_2 = RAD_PROTECT_CONTENTS_2 | RAD_NO_CONTAMINATE_2
|
||||
rad_insulation_beta = RAD_LIGHT_INSULATION
|
||||
resistance_flags = UNACIDABLE | ACID_PROOF
|
||||
|
||||
/obj/structure/holosign/barrier/atmos/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -181,7 +181,7 @@
|
||||
falling_atoms -= AM
|
||||
|
||||
/turf/simulated/floor/chasm/can_cross_safely(atom/movable/crossing)
|
||||
return locate(/obj/structure/bridge_walkway) in src
|
||||
return (locate(/obj/structure/bridge_walkway) in src) || HAS_TRAIT(crossing, TRAIT_FLYING)
|
||||
|
||||
/turf/simulated/floor/chasm/straight_down
|
||||
var/obj/effect/abstract/chasm_storage/storage
|
||||
|
||||
@@ -172,7 +172,10 @@
|
||||
return
|
||||
|
||||
/turf/simulated/floor/lava/can_cross_safely(atom/movable/crossing)
|
||||
return locate(/obj/structure/bridge_walkway) in src
|
||||
if(isliving(crossing))
|
||||
var/mob/living/crosser = crossing
|
||||
return (locate(/obj/structure/bridge_walkway) in src) || HAS_TRAIT(crossing, TRAIT_FLYING) || ("lava" in crosser.weather_immunities)
|
||||
return locate(/obj/structure/bridge_walkway) in src || HAS_TRAIT(crossing, TRAIT_FLYING)
|
||||
|
||||
/turf/simulated/floor/lava/lava_land_surface
|
||||
oxygen = LAVALAND_OXYGEN
|
||||
|
||||
@@ -1746,18 +1746,29 @@
|
||||
to_chat(usr, "<span class='warning'>This will only work on /mob/dead/observer</span>")
|
||||
return
|
||||
|
||||
var/posttransformoutfit = usr.client.robust_dress_shop()
|
||||
var/list/potential_minds = list()
|
||||
for(var/datum/mind/mind in G.client.persistent.minds)
|
||||
if(ckey(mind.key) == G.ckey && isnull(mind.current) && mind.destroyed_body_json)
|
||||
potential_minds += mind
|
||||
var/outfit = usr.client.robust_dress_shop(potential_minds)
|
||||
|
||||
if(!posttransformoutfit)
|
||||
if(!outfit)
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = G.incarnate_ghost()
|
||||
var/mob/M
|
||||
if(istype(outfit, /datum/mind))
|
||||
M = G.incarnate_ghost(outfit)
|
||||
|
||||
if(posttransformoutfit && istype(H))
|
||||
H.equipOutfit(posttransformoutfit)
|
||||
log_admin("[key_name(M)] was rebuilt from a mind backup by [key_name(owner)]")
|
||||
message_admins("[key_name_admin(M)] was rebuilt from a mind backup by [key_name_admin(owner)]")
|
||||
else
|
||||
M = G.incarnate_ghost()
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.equipOutfit(outfit)
|
||||
|
||||
log_admin("[key_name(G)] was incarnated by [key_name(owner)]")
|
||||
message_admins("[key_name_admin(G)] was incarnated by [key_name_admin(owner)]")
|
||||
log_admin("[key_name(M)] was incarnated by [key_name(owner)]")
|
||||
message_admins("[key_name_admin(M)] was incarnated by [key_name_admin(owner)]")
|
||||
|
||||
else if(href_list["togmutate"])
|
||||
if(!check_rights(R_SPAWN)) return
|
||||
|
||||
@@ -7,8 +7,6 @@
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM: You cannot send adminhelps (Muted).</font>", MESSAGE_TYPE_ADMINPM, confidential = TRUE)
|
||||
return
|
||||
|
||||
adminhelped = TRUE //Determines if they get the message to reply by clicking the name.
|
||||
|
||||
var/msg
|
||||
var/list/type = list("Mentorhelp", "Adminhelp")
|
||||
var/selected_type = input("Pick a category.", "Admin Help") as null|anything in type
|
||||
|
||||
@@ -158,15 +158,15 @@
|
||||
|
||||
var/receive_message = ""
|
||||
|
||||
pm_tracker.add_message(C, src, msg, mob)
|
||||
C.pm_tracker.add_message(src, src, msg, C.mob)
|
||||
persistent.pm_tracker.add_message(C, src, msg, mob)
|
||||
C.persistent.pm_tracker.add_message(src, src, msg, C.mob)
|
||||
|
||||
if(holder && !C.holder)
|
||||
receive_message = "<span class='[receive_span]' size='3'>-- Click the [receive_pm_type]'s name to reply --</span>\n"
|
||||
if(C.adminhelped)
|
||||
to_chat(C, receive_message)
|
||||
if(message_type == MESSAGE_TYPE_ADMINPM)
|
||||
// Try to get their attention if they're alt-tabbed.
|
||||
window_flash(C)
|
||||
to_chat(C, receive_message)
|
||||
C.adminhelped = 0
|
||||
|
||||
//AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
|
||||
if(GLOB.configuration.general.popup_admin_pm)
|
||||
@@ -181,9 +181,9 @@
|
||||
adminhelp(reply) //sender has left, adminhelp instead
|
||||
return
|
||||
|
||||
var/ping_link = check_rights(R_ADMIN, 0, mob) ? "(<a href='byond://?src=[pm_tracker.UID()];ping=[C.key]'>PING</a>)" : ""
|
||||
var/ping_link = check_rights(R_ADMIN, 0, mob) ? "(<a href='byond://?src=[persistent.pm_tracker.UID()];ping=[C.key]'>PING</a>)" : ""
|
||||
var/ticket_link
|
||||
var/alert_link = check_rights(R_ADMIN, FALSE, mob) ? "(<a href='byond://?src=[pm_tracker.UID()];adminalert=[C.mob.UID()]'>ALERT</a>)" : ""
|
||||
var/alert_link = check_rights(R_ADMIN, FALSE, mob) ? "(<a href='byond://?src=[persistent.pm_tracker.UID()];adminalert=[C.mob.UID()]'>ALERT</a>)" : ""
|
||||
var/observe_link = check_rights(R_MENTOR, FALSE, mob) ? "([ADMIN_OBS(C, "OBS")])" : ""
|
||||
if(ticket_id != -1)
|
||||
if(message_type == MESSAGE_TYPE_MENTORPM)
|
||||
@@ -192,7 +192,7 @@
|
||||
ticket_link = "(<a href='byond://?_src_=holder;openticket=[ticket_id]'>TICKET</a>)"
|
||||
|
||||
var/emoji_msg = "<span class='emoji_enabled'>[msg]</span>"
|
||||
var/receive_window_link = "(<a href='byond://?src=[C.pm_tracker.UID()];newtitle=[key]'>WINDOW</a>)"
|
||||
var/receive_window_link = "(<a href='byond://?src=[C.persistent.pm_tracker.UID()];newtitle=[key]'>WINDOW</a>)"
|
||||
if(message_type == MESSAGE_TYPE_MENTORPM && check_rights(R_ADMIN|R_MENTOR, 0, C.mob))
|
||||
receive_window_link = ticket_link
|
||||
else if(message_type == MESSAGE_TYPE_ADMINPM && check_rights(R_ADMIN, 0, C.mob))
|
||||
@@ -204,7 +204,7 @@
|
||||
receive_message = chat_box_ahelp(receive_message)
|
||||
to_chat(C, receive_message)
|
||||
if(C != src)
|
||||
var/send_window_link = "(<a href='byond://?src=[pm_tracker.UID()];newtitle=[C.key]'>WINDOW</a>)"
|
||||
var/send_window_link = "(<a href='byond://?src=[persistent.pm_tracker.UID()];newtitle=[C.key]'>WINDOW</a>)"
|
||||
if(message_type == MESSAGE_TYPE_MENTORPM && check_rights(R_ADMIN|R_MENTOR, 0, mob))
|
||||
send_window_link = ticket_link
|
||||
else if(message_type == MESSAGE_TYPE_ADMINPM && check_rights(R_ADMIN, 0, mob))
|
||||
@@ -285,18 +285,18 @@
|
||||
/client/verb/open_pms_ui()
|
||||
set name = "My PMs"
|
||||
set category = "OOC"
|
||||
pm_tracker.show_ui(usr)
|
||||
persistent.pm_tracker.show_ui(usr)
|
||||
|
||||
/client/proc/set_typing(client/target, value)
|
||||
if(!target)
|
||||
return
|
||||
var/datum/pm_convo/convo = target.pm_tracker.pms[key]
|
||||
var/datum/pm_convo/convo = target.persistent.pm_tracker.pms[key]
|
||||
if(!convo)
|
||||
convo = new /datum/pm_convo(src)
|
||||
target.pm_tracker.pms[key] = convo
|
||||
target.persistent.pm_tracker.pms[key] = convo
|
||||
convo.typing = value
|
||||
if(target.pm_tracker.open && target.pm_tracker.current_title == key)
|
||||
target.pm_tracker.show_ui(target.mob)
|
||||
if(target.persistent.pm_tracker.open && target.persistent.pm_tracker.current_title == key)
|
||||
target.persistent.pm_tracker.show_ui(target.mob)
|
||||
|
||||
/datum/pm_tracker
|
||||
var/ckey
|
||||
@@ -449,10 +449,10 @@
|
||||
if(href_list["ping"])
|
||||
var/client/C = pms[href_list["ping"]].client
|
||||
if(C)
|
||||
C.pm_tracker.current_title = usr.key
|
||||
C.pm_tracker.forced = TRUE // We forced it open
|
||||
C.persistent.pm_tracker.current_title = usr.key
|
||||
C.persistent.pm_tracker.forced = TRUE // We forced it open
|
||||
window_flash(C)
|
||||
C.pm_tracker.show_ui(C.mob)
|
||||
C.persistent.pm_tracker.show_ui(C.mob)
|
||||
to_chat(usr, "<span class='notice'>Forced open [C]'s messages window.</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@ GLOBAL_VAR_INIT(deathsquad_sent, FALSE)
|
||||
R.custom_name = borgname
|
||||
R.real_name = R.name
|
||||
R.mind = new
|
||||
R.mind.current = R
|
||||
R.mind.bind_to(R)
|
||||
R.mind.set_original_mob(R)
|
||||
R.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD
|
||||
R.mind.special_role = SPECIAL_ROLE_DEATHSQUAD
|
||||
|
||||
@@ -621,12 +621,14 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].</span>", 1)
|
||||
|
||||
/client/proc/robust_dress_shop()
|
||||
/client/proc/robust_dress_shop(list/potential_minds)
|
||||
var/list/special_outfits = list(
|
||||
"Naked",
|
||||
"As Job...",
|
||||
"Custom..."
|
||||
)
|
||||
if(length(potential_minds))
|
||||
special_outfits += "Recover destroyed body..."
|
||||
|
||||
var/list/outfits = list()
|
||||
var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job) - list(/datum/outfit/varedit, /datum/outfit/admin)
|
||||
@@ -665,6 +667,9 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
dresscode = custom_names[selected_name]
|
||||
if(isnull(dresscode))
|
||||
return
|
||||
|
||||
if(dresscode == "Recover destroyed body...")
|
||||
dresscode = input("Select body to rebuild", "Robust quick dress shop") as null|anything in potential_minds
|
||||
|
||||
return dresscode
|
||||
|
||||
|
||||
@@ -411,7 +411,7 @@ GLOBAL_PROTECT(VVmaint_only)
|
||||
L[var_value] = mod_list_add_ass(O) //hehe
|
||||
if(O)
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
to_chat(src, "<span class='warning'>Your edit was rejected by the object.</span>")
|
||||
return
|
||||
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: ADDED=[var_value]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
|
||||
@@ -454,7 +454,7 @@ GLOBAL_PROTECT(VVmaint_only)
|
||||
L = L.Copy()
|
||||
listclearnulls(L)
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
to_chat(src, "<span class='warning'>Your edit was rejected by the object.</span>")
|
||||
return
|
||||
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR NULLS")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: CLEAR NULLS")
|
||||
@@ -464,7 +464,7 @@ GLOBAL_PROTECT(VVmaint_only)
|
||||
if(variable == "(CLEAR DUPES)")
|
||||
L = uniqueList(L)
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
to_chat(src, "<span class='warning'>Your edit was rejected by the object.</span>")
|
||||
return
|
||||
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR DUPES")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: CLEAR DUPES")
|
||||
@@ -474,7 +474,7 @@ GLOBAL_PROTECT(VVmaint_only)
|
||||
if(variable == "(SHUFFLE)")
|
||||
L = shuffle(L)
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
to_chat(src, "<span class='warning'>Your edit was rejected by the object.</span>")
|
||||
return
|
||||
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: SHUFFLE")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: SHUFFLE")
|
||||
@@ -551,7 +551,7 @@ GLOBAL_PROTECT(VVmaint_only)
|
||||
L.Cut(index, index+1)
|
||||
if(O)
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
to_chat(src, "<span class='warning'>Your edit was rejected by the object.</span>")
|
||||
return
|
||||
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[original_var]")]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: REMOVED=[original_var]")
|
||||
@@ -570,7 +570,7 @@ GLOBAL_PROTECT(VVmaint_only)
|
||||
L[index] = new_var
|
||||
if(O)
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
to_chat(src, "<span class='warning'>Your edit was rejected by the object.</span>")
|
||||
return
|
||||
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: [original_var]=[new_var]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]")
|
||||
@@ -708,7 +708,7 @@ GLOBAL_PROTECT(VVmaint_only)
|
||||
var_new = replacetext(var_new,"\[[V]]","[O.vars[V]]")
|
||||
|
||||
if(!O.vv_edit_var(variable, var_new))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
to_chat(src, "<span class='warning'>Your edit was rejected by the object.</span>")
|
||||
return
|
||||
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_VAR_EDIT, args)
|
||||
log_world("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")] (Type: [class])")
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
if((M.mind.assigned_role in temp.restricted_jobs) || (M.client.prefs.active_character.species in temp.species_to_mindflayer))
|
||||
return FALSE
|
||||
if(role) // Don't even bother evaluating if there's no role
|
||||
if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && !M.client.skip_antag && (!jobban_isbanned(M, role)))
|
||||
if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && !M.client.persistent.skip_antag && (!jobban_isbanned(M, role)))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
try_to_sting(owner)
|
||||
|
||||
/datum/action/changeling/proc/try_to_sting(mob/user, mob/target)
|
||||
. = TRUE // Value doesn't appear to matter here, but it matters for the middle-click override in AltClickOn inside click.dm
|
||||
user.changeNext_click(5)
|
||||
if(!can_sting(user, target))
|
||||
return
|
||||
|
||||
@@ -35,9 +35,9 @@
|
||||
to_chat(user, "<span class='warning'>We are already regenerating.</span>")
|
||||
return FALSE
|
||||
if(!user.stat)//Confirmation for living changelings if they want to fake their death
|
||||
switch(tgui_alert(user, "Are we sure we wish to fake our death?", "Fake Death", list("Yes", "No")))
|
||||
if("No")
|
||||
return FALSE
|
||||
var/death_confirmation = tgui_alert(user, "Are we sure we wish to fake our death?", "Fake Death", list("Yes", "No"))
|
||||
if(death_confirmation != "Yes")
|
||||
return FALSE
|
||||
// Do the checks again since we had user input
|
||||
if(cling.owner != user.mind)
|
||||
return FALSE
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
|
||||
if(length(unreceived))
|
||||
if(length(unreceived) >= ASSET_CACHE_TELL_CLIENT_AMOUNT)
|
||||
to_chat(client, "Sending Resources...")
|
||||
to_chat(client, "<span class='debug'>Sending Resources...</span>")
|
||||
|
||||
for(var/asset_name in unreceived)
|
||||
var/new_asset_name = asset_name
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
pull_force = MOVE_FORCE_VERY_STRONG
|
||||
deathmessage = "collapses into a pile of gibs. From the looks of it this is the deadest it can get... "
|
||||
butcher_results = list(/obj/item/regen_mesh)
|
||||
butcher_results = list(/obj/item/regen_mesh = 1)
|
||||
/// Is the boss charging right now?
|
||||
var/charging = FALSE
|
||||
/// Did our boss die?
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
else if(!isnull(obj_holder))
|
||||
//we only want to set the direction of mobs or objects, not turfs or areas.
|
||||
var/atom/movable/A = new obj_holder(get_turf(object))
|
||||
A.admin_spawned = TRUE
|
||||
if(istype(A))
|
||||
A.setDir(BM.build_dir)
|
||||
log_admin("Build Mode: [key_name(user)] modified [A]'s ([A.x],[A.y],[A.z]) dir to [BM.build_dir]")
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
if(!area_name || !length(area_name))
|
||||
return
|
||||
stored_area = new area_type
|
||||
stored_area.admin_spawned = TRUE
|
||||
stored_area.powernet.equipment_powered = FALSE
|
||||
stored_area.powernet.lighting_powered = FALSE
|
||||
stored_area.powernet.environment_powered = FALSE
|
||||
|
||||
@@ -42,8 +42,10 @@
|
||||
qdel(object)
|
||||
else if(isturf(object) && alt_click && left_click)
|
||||
log_admin("Build Mode: [key_name(user)] built an airlock at ([object.x],[object.y],[object.z])")
|
||||
new/obj/machinery/door/airlock(get_turf(object))
|
||||
var/obj/machinery/door/airlock/A = new /obj/machinery/door/airlock(get_turf(object))
|
||||
A.admin_spawned = TRUE
|
||||
else if(isturf(object) && ctrl_click && left_click)
|
||||
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
|
||||
WIN.admin_spawned = TRUE
|
||||
WIN.setDir(BM.build_dir)
|
||||
log_admin("Build Mode: [key_name(user)] built a window at ([object.x],[object.y],[object.z])")
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
if(left_click)
|
||||
var/turf/T = get_turf(object)
|
||||
if(stored)
|
||||
DuplicateObject(stored, perfectcopy=1, sameloc=0,newloc=T)
|
||||
var/obj/O = DuplicateObject(stored, perfectcopy=1, sameloc=0,newloc=T)
|
||||
O.admin_spawned = TRUE
|
||||
else if(right_click)
|
||||
if(ismovable(object)) // No copying turfs for now.
|
||||
to_chat(user, "<span class='notice'>[object] set as template.</span>")
|
||||
|
||||
@@ -56,4 +56,5 @@
|
||||
T.ChangeTurf(objholder)
|
||||
else
|
||||
var/obj/A = new objholder(T)
|
||||
A.admin_spawned = TRUE
|
||||
A.setDir(BM.build_dir)
|
||||
|
||||
@@ -134,6 +134,7 @@
|
||||
// Spawns a portal between given origin and destination.
|
||||
/datum/buildmode_mode/portal/proc/spawn_portal(turf/origin, turf/destination, mob/user)
|
||||
var/obj/effect/portal/advanced/bmportal = new /obj/effect/portal/advanced(origin, destination, null, lifetime)
|
||||
bmportal.admin_spawned = TRUE
|
||||
bmportal.icon = portal_icon
|
||||
bmportal.icon_state = portal_icon_state
|
||||
return bmportal
|
||||
|
||||
@@ -6,31 +6,27 @@
|
||||
////////////////
|
||||
/// hides the byond verb panel as we use our own custom version
|
||||
show_verb_panel = FALSE
|
||||
|
||||
var/datum/persistent_client/persistent
|
||||
|
||||
var/datum/admins/holder = null
|
||||
|
||||
var/last_message = "" //contains the last message sent by this client - used to protect against copy-paste spamming.
|
||||
var/last_message_count = 0 //contains a number of how many times a message identical to last_message was sent.
|
||||
var/last_message_time = 0 //holds the last time (based on world.time) a message was sent
|
||||
var/datum/pm_tracker/pm_tracker
|
||||
|
||||
/////////
|
||||
//OTHER//
|
||||
/////////
|
||||
var/datum/preferences/prefs = null
|
||||
var/skip_antag = FALSE //TRUE when a player declines to be included for the selection process of game mode antagonists.
|
||||
///The visual delay to use for the current client.Move(), mostly used for making a client based move look like it came from some other slower source
|
||||
var/visual_delay = 0
|
||||
var/move_delay = 1
|
||||
var/moving = null
|
||||
var/area = null
|
||||
|
||||
// why the hell do we track this when you can just file > reconnect to bypass it
|
||||
var/time_died_as_mouse = null //when the client last died as a mouse
|
||||
|
||||
var/typing = FALSE // Prevents typing window stacking
|
||||
|
||||
var/adminhelped = 0
|
||||
|
||||
///////////////
|
||||
//SOUND STUFF//
|
||||
///////////////
|
||||
@@ -235,3 +231,15 @@
|
||||
|
||||
/// If this client has any windows scaling applied
|
||||
var/window_scaling
|
||||
|
||||
/datum/persistent_client
|
||||
/// Holds admin/mentor PM history.
|
||||
var/datum/pm_tracker/pm_tracker
|
||||
/// The Global Antag Candidacy setting from the new player menu.
|
||||
var/skip_antag = FALSE
|
||||
/// Used to prevent rapid mouse spamming.
|
||||
var/time_died_as_mouse = null
|
||||
/// All of the minds this client has been associated with.
|
||||
var/list/minds = list()
|
||||
/// Ckeys that sent us kudos.
|
||||
var/list/kudos_received_from = list()
|
||||
|
||||
@@ -278,8 +278,10 @@
|
||||
stat_panel = new(src, "statbrowser")
|
||||
stat_panel.subscribe(src, PROC_REF(on_stat_panel_message))
|
||||
|
||||
// Create a PM tracker bound to this ckey.
|
||||
pm_tracker = new(ckey)
|
||||
persistent = GLOB.persistent_clients[ckey]
|
||||
if(!persistent)
|
||||
persistent = new(ckey)
|
||||
GLOB.persistent_clients[ckey] = persistent
|
||||
|
||||
tgui_panel = new(src, "chat_panel")
|
||||
tgui_say = new(src, "tgui_say")
|
||||
@@ -1340,6 +1342,9 @@
|
||||
|
||||
src << link("https://secure.byond.com/download/")
|
||||
|
||||
/datum/persistent_client/New(ckey)
|
||||
// Create a PM tracker bound to this ckey.
|
||||
pm_tracker = new(ckey)
|
||||
|
||||
#undef LIMITER_SIZE
|
||||
#undef CURRENT_SECOND
|
||||
|
||||
@@ -755,7 +755,6 @@
|
||||
name = "suit"
|
||||
icon = 'icons/obj/clothing/suits.dmi'
|
||||
allowed = list(/obj/item/tank/internals/emergency_oxygen)
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
drop_sound = 'sound/items/handling/cloth_drop.ogg'
|
||||
pickup_sound = 'sound/items/handling/cloth_pickup.ogg'
|
||||
slot_flags = ITEM_SLOT_OUTER_SUIT
|
||||
@@ -1012,7 +1011,6 @@
|
||||
name = "under"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
slot_flags = ITEM_SLOT_JUMPSUIT
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
equip_sound = 'sound/items/equip/jumpsuit_equip.ogg'
|
||||
drop_sound = 'sound/items/handling/cloth_drop.ogg'
|
||||
pickup_sound = 'sound/items/handling/cloth_pickup.ogg'
|
||||
|
||||
@@ -109,3 +109,17 @@
|
||||
"Drask" = 'icons/mob/clothing/species/drask/head/utility.dmi',
|
||||
"Kidan" = 'icons/mob/clothing/species/kidan/head/utility.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/hardhat/durathread
|
||||
name = "durathread hard hat"
|
||||
icon_state = "hardhat0_durathread"
|
||||
item_state = "hardhat0_durathread"
|
||||
item_color = "durathread"
|
||||
desc = "A hard hat made from durathread, leather, and light fixture components."
|
||||
armor = list(MELEE = 10, BULLET = 5, LASER = 20, ENERGY = 5, BOMB = 10, RAD = 0, FIRE = 35, ACID = 50)
|
||||
sprite_sheets = list(
|
||||
"Drask" = 'icons/mob/clothing/species/drask/head.dmi',
|
||||
"Grey" = 'icons/mob/clothing/species/grey/head.dmi',
|
||||
"Kidan" = 'icons/mob/clothing/species/kidan/head.dmi',
|
||||
"Vox" = 'icons/mob/clothing/species/vox/head.dmi'
|
||||
)
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/roman/fake
|
||||
desc = "A shoddily-crafted cosplay helmet made of plastic. Protects against jack and shit, if you're lucky."
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
armor = null
|
||||
|
||||
/obj/item/clothing/head/helmet/roman/legionaire
|
||||
name = "centurion helmet"
|
||||
@@ -182,7 +182,7 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/roman/legionaire/fake
|
||||
desc = "A shoddily-crafted cosplay helmet made of plastic. This particular specimen has what appears to be the head of a broom crudely taped to the top."
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
armor = null
|
||||
|
||||
/obj/item/clothing/head/helmet/gladiator
|
||||
name = "gladiator helmet"
|
||||
@@ -268,6 +268,13 @@
|
||||
icon_state = "durathread"
|
||||
item_state = "durathread"
|
||||
armor = list(MELEE = 10, BULLET = 5, LASER = 20, ENERGY = 5, BOMB = 10, RAD = 0, FIRE = 35, ACID = 50)
|
||||
sprite_sheets = list(
|
||||
"Drask" = 'icons/mob/clothing/species/drask/helmet.dmi',
|
||||
"Grey" = 'icons/mob/clothing/species/grey/helmet.dmi',
|
||||
"Kidan" = 'icons/mob/clothing/species/kidan/helmet.dmi',
|
||||
"Vox" = 'icons/mob/clothing/species/vox/helmet.dmi'
|
||||
)
|
||||
|
||||
|
||||
/obj/item/clothing/head/helmet/street_judge
|
||||
name = "judge's helmet"
|
||||
@@ -287,7 +294,7 @@
|
||||
/obj/item/clothing/head/helmet/fake
|
||||
name = "replica helmet"
|
||||
desc = "A replica of a mass-produced protective helmet used by security personnel across the sector. Made of cheap plastic and provides no protection."
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
armor = null
|
||||
cold_protection = FALSE
|
||||
heat_protection = FALSE
|
||||
|
||||
|
||||
@@ -61,7 +61,6 @@
|
||||
desc = "It's tasty looking!"
|
||||
icon_state = "cake0"
|
||||
flags_cover = HEADCOVERSEYES
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
var/onfire = FALSE
|
||||
var/status = 0
|
||||
var/fire_resist = T0C+1300 //this is the max temp it can stand before you start to cook. although it might not burn away, you take damage
|
||||
@@ -151,7 +150,7 @@
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
dog_fashion = null
|
||||
light_color = "#fff2bf"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
armor = null
|
||||
brightness_on = 2 //luminosity when on
|
||||
|
||||
/obj/item/clothing/head/hardhat/pumpkinhead/blumpkin
|
||||
@@ -169,7 +168,7 @@
|
||||
icon_state = "hardhat0_reindeer"
|
||||
item_state = "hardhat0_reindeer"
|
||||
item_color = "reindeer"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
armor = null
|
||||
brightness_on = 1 //luminosity when on
|
||||
dog_fashion = /datum/dog_fashion/head/reindeer
|
||||
|
||||
|
||||
@@ -181,7 +181,6 @@
|
||||
flags_cover = MASKCOVERSMOUTH
|
||||
gas_transfer_coefficient = 0.90
|
||||
permeability_coefficient = 0.01
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
can_toggle = TRUE
|
||||
|
||||
|
||||
@@ -400,7 +400,6 @@
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/clothing/species/grey/suit.dmi',
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
icon_state = "wizard-fake"
|
||||
gas_transfer_coefficient = 1
|
||||
permeability_coefficient = 1
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
armor = null
|
||||
magical = FALSE
|
||||
resistance_flags = FLAMMABLE
|
||||
sprite_sheets = list(
|
||||
@@ -153,21 +153,21 @@
|
||||
icon_state = "wizard-fake"
|
||||
gas_transfer_coefficient = 1
|
||||
permeability_coefficient = 1
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
armor = null
|
||||
resistance_flags = FLAMMABLE
|
||||
magical = FALSE
|
||||
|
||||
/obj/item/clothing/head/wizard/marisa/fake
|
||||
gas_transfer_coefficient = 1
|
||||
permeability_coefficient = 1
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
armor = null
|
||||
resistance_flags = FLAMMABLE
|
||||
magical = FALSE
|
||||
|
||||
/obj/item/clothing/suit/wizrobe/marisa/fake
|
||||
gas_transfer_coefficient = 1
|
||||
permeability_coefficient = 1
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
armor = null
|
||||
resistance_flags = FLAMMABLE
|
||||
magical = FALSE
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/obj/item/clothing/under/rank/medical
|
||||
icon = 'icons/obj/clothing/under/medical.dmi'
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/clothing/under/medical.dmi',
|
||||
@@ -17,7 +16,6 @@
|
||||
item_state = "cmo"
|
||||
item_color = "cmo"
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/cmo/skirt
|
||||
name = "chief medical officer's skirt"
|
||||
@@ -41,7 +39,6 @@
|
||||
item_state = "medical"
|
||||
item_color = "medical"
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/doctor/sensor
|
||||
sensor_mode = SENSOR_COORDS
|
||||
@@ -61,7 +58,6 @@
|
||||
item_state = "virology"
|
||||
item_color = "virology"
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/virologist/skirt
|
||||
name = "virologist's jumpskirt"
|
||||
@@ -76,7 +72,6 @@
|
||||
item_state = "nursesuit"
|
||||
item_color = "nursesuit"
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/nurse
|
||||
name = "nurse's dress"
|
||||
@@ -85,7 +80,6 @@
|
||||
item_state = "nurse"
|
||||
item_color = "nurse"
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/orderly
|
||||
name = "orderly's uniform"
|
||||
@@ -94,7 +88,6 @@
|
||||
item_state = "orderly"
|
||||
item_color = "orderly"
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/scrubs
|
||||
name = "blue medical scrubs"
|
||||
@@ -173,4 +166,3 @@
|
||||
item_state = "medicalgown"
|
||||
item_color = "medicalgown"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
|
||||
@@ -74,7 +74,6 @@
|
||||
item_state = "genetics"
|
||||
item_color = "genetics"
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/rnd/geneticist/skirt
|
||||
name = "geneticist's jumpskirt"
|
||||
|
||||
@@ -21,6 +21,16 @@
|
||||
time = 4 SECONDS
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/durathread_hardhat
|
||||
name = "Durathread Hard Hat"
|
||||
result = list(/obj/item/clothing/head/hardhat/durathread)
|
||||
reqs = list(/obj/item/clothing/head/helmet/durathread = 1,
|
||||
/obj/item/mounted/frame/light_fixture/small = 1,
|
||||
/obj/item/stack/cable_coil = 5,
|
||||
/obj/item/light/bulb = 1)
|
||||
time = 4 SECONDS
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/durathread_jumpsuit
|
||||
name = "Durathread Jumpsuit"
|
||||
result = list(/obj/item/clothing/under/misc/durathread)
|
||||
|
||||
@@ -6,32 +6,31 @@ do {\
|
||||
qdel(src);\
|
||||
} while(FALSE)
|
||||
|
||||
/obj/item/food/sliced/bread/attackby__legacy__attackchain(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/food) && !(W.flags & NODROP))
|
||||
MAKE_CUSTOM_FOOD(W, user, /obj/item/food/customizable/sandwich)
|
||||
return
|
||||
/obj/item/food/sliced/bread/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(istype(used, /obj/item/food) && !(used.flags & NODROP))
|
||||
MAKE_CUSTOM_FOOD(used, user, /obj/item/food/customizable/sandwich)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
..()
|
||||
|
||||
/obj/item/food/bun/attackby__legacy__attackchain(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/food) && !(W.flags & NODROP))
|
||||
MAKE_CUSTOM_FOOD(W, user, /obj/item/food/customizable/burger)
|
||||
return
|
||||
/obj/item/food/bun/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(istype(used, /obj/item/food) && !(used.flags & NODROP))
|
||||
MAKE_CUSTOM_FOOD(used, user, /obj/item/food/customizable/burger)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
..()
|
||||
|
||||
/obj/item/food/sliceable/flatdough/attackby__legacy__attackchain(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/food) && !(W.flags & NODROP))
|
||||
MAKE_CUSTOM_FOOD(W, user, /obj/item/food/customizable/pizza)
|
||||
return
|
||||
/obj/item/food/sliceable/flatdough/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
|
||||
if(istype(used, /obj/item/food) && !(used.flags & NODROP))
|
||||
MAKE_CUSTOM_FOOD(used, user, /obj/item/food/customizable/pizza)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/food/boiledspaghetti/attackby__legacy__attackchain(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/food) && !(W.flags & NODROP))
|
||||
MAKE_CUSTOM_FOOD(W, user, /obj/item/food/customizable/pasta)
|
||||
return
|
||||
/obj/item/food/boiledspaghetti/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(istype(used, /obj/item/food) && !(used.flags & NODROP))
|
||||
MAKE_CUSTOM_FOOD(used, user, /obj/item/food/customizable/pasta)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/trash/plate/attackby__legacy__attackchain(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/food) && !(W.flags & NODROP))
|
||||
MAKE_CUSTOM_FOOD(W, user, /obj/item/food/customizable/fullycustom)
|
||||
@@ -49,7 +48,7 @@ do {\
|
||||
/obj/item/trash/bowl/attackby__legacy__attackchain(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/food) && !(I.flags & NODROP))
|
||||
var/obj/item/food/customizable/soup/S = new(get_turf(user))
|
||||
S.attackby__legacy__attackchain(I, user, params)
|
||||
S.item_interaction(I, user, params)
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
@@ -322,17 +321,16 @@ do {\
|
||||
tastes = list("bun" = 4)
|
||||
|
||||
|
||||
/obj/item/food/customizable/attackby__legacy__attackchain(obj/item/I, mob/user, params)
|
||||
..()
|
||||
/obj/item/food/customizable/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(istype(used, /obj/item/kitchen/utensil) || is_pen(used))
|
||||
return ..()
|
||||
|
||||
if(istype(I, /obj/item/kitchen/utensil) || is_pen(I))
|
||||
return
|
||||
if(!istype(used, /obj/item/food))
|
||||
to_chat(user, "<span class='warning'>[used] isn't exactly something that you would want to eat.</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(!istype(I, /obj/item/food))
|
||||
to_chat(user, "<span class='warning'>[I] isn't exactly something that you would want to eat.</span>")
|
||||
return
|
||||
|
||||
add_ingredient(I, user)
|
||||
add_ingredient(used, user)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/**
|
||||
* Tries to add one ingredient and it's ingredients, if any and applicable, to this snack
|
||||
|
||||
@@ -189,16 +189,17 @@
|
||||
tastes = list("dough" = 1)
|
||||
|
||||
// Dough + rolling pin = flat dough
|
||||
/obj/item/food/dough/attackby__legacy__attackchain(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/kitchen/rollingpin))
|
||||
if(isturf(loc))
|
||||
new /obj/item/food/sliceable/flatdough(loc)
|
||||
to_chat(user, "<span class='notice'>You flatten [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You need to put [src] on a surface to roll it out!</span>")
|
||||
/obj/item/food/dough/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(!istype(used, /obj/item/kitchen/rollingpin))
|
||||
return NONE
|
||||
|
||||
if(isturf(loc))
|
||||
new /obj/item/food/sliceable/flatdough(loc)
|
||||
to_chat(user, "<span class='notice'>You flatten [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>You need to put [src] on a surface to roll it out!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
// slicable into 3xdoughslices
|
||||
/obj/item/food/sliceable/flatdough
|
||||
@@ -244,23 +245,34 @@
|
||||
icon_state = "cookiedough"
|
||||
|
||||
// Dough + rolling pin = flat cookie dough // Flat dough + circular cutter = unbaked cookies
|
||||
/obj/item/food/cookiedough/attackby__legacy__attackchain(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/kitchen/rollingpin) && !flat)
|
||||
/obj/item/food/cookiedough/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(istype(used, /obj/item/kitchen/rollingpin))
|
||||
if(flat)
|
||||
to_chat(user, "<span class='warning'>[src] doesn't need to be flattened any further!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(isturf(loc))
|
||||
to_chat(user, "<span class='notice'>You flatten [src].</span>")
|
||||
flat = TRUE
|
||||
update_appearance(UPDATE_NAME|UPDATE_ICON_STATE)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You need to put [src] on a surface to roll it out!</span>")
|
||||
else if(istype(I, /obj/item/kitchen/cutter) && flat)
|
||||
to_chat(user, "<span class='warning'>You need to put [src] on a surface to roll it out!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(istype(used, /obj/item/kitchen/cutter))
|
||||
if(!flat)
|
||||
to_chat(user, "<span class='warning'>[src] needs to be flattened first!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(isturf(loc))
|
||||
new /obj/item/food/rawcookies(loc)
|
||||
to_chat(user, "<span class='notice'>You cut [src] into cookies.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You need to put [src] on a surface to cut it out!</span>")
|
||||
else
|
||||
return ..()
|
||||
to_chat(user, "<span class='warning'>You need to put [src] on a surface to cut it out!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
return NONE
|
||||
|
||||
|
||||
/obj/item/food/rawcookies
|
||||
@@ -270,17 +282,19 @@
|
||||
icon_state = "unbaked_cookies"
|
||||
list_reagents = list("nutriment" = 5, "sugar" = 5)
|
||||
|
||||
/obj/item/food/rawcookies/attackby__legacy__attackchain(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/food/choc_pile))
|
||||
/obj/item/food/rawcookies/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(istype(used, /obj/item/food/choc_pile))
|
||||
if(isturf(loc))
|
||||
new /obj/item/food/rawcookies/chocochips(loc)
|
||||
to_chat(user, "<span class='notice'>You sprinkle [I] all over the cookies.</span>")
|
||||
to_chat(user, "<span class='notice'>You sprinkle [used] all over the cookies.</span>")
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
qdel(used)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You need to put [src] on a surface to add this</span>")
|
||||
else
|
||||
return ..()
|
||||
to_chat(user, "<span class='warning'>You need to put [src] on a surface to add [used]!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
return NONE
|
||||
|
||||
|
||||
/obj/item/food/rawcookies/chocochips
|
||||
desc = "Ready for oven! They have little pieces of chocolate all over them"
|
||||
@@ -302,16 +316,17 @@
|
||||
goal_difficulty = FOOD_GOAL_EASY
|
||||
|
||||
///Chocolate crumbles/pile
|
||||
/obj/item/food/chocolatebar/attackby__legacy__attackchain(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/kitchen/knife))
|
||||
if(isturf(loc))
|
||||
new /obj/item/food/choc_pile(loc)
|
||||
to_chat(user, "<span class='notice'>You cut [src] into little crumbles.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You need to put [src] on a surface to cut it out!</span>")
|
||||
/obj/item/food/chocolatebar/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(!istype(used, /obj/item/kitchen/knife))
|
||||
return NONE
|
||||
|
||||
if(isturf(loc))
|
||||
new /obj/item/food/choc_pile(loc)
|
||||
to_chat(user, "<span class='notice'>You cut [src] into little crumbles.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
to_chat(user, "<span class='warning'>You need to put [src] on a surface to cut it out!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
|
||||
/// for reagent chocolate being spilled on turfs
|
||||
|
||||
@@ -111,7 +111,10 @@
|
||||
list_reagents = list("nutriment" = 2, "sugar" = 10)
|
||||
tastes = list("sweetness" = 3, "liquorice" = 2)
|
||||
|
||||
/obj/item/food/twimsts/attack_self__legacy__attackchain(mob/user)
|
||||
/obj/item/food/twimsts/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
var/obj/item/restraints/handcuffs/twimsts/L = new /obj/item/restraints/handcuffs/twimsts
|
||||
L.create_reagents(100)
|
||||
reagents.copy_to(L, reagents.total_volume)
|
||||
@@ -120,6 +123,7 @@
|
||||
user.drop_item_to_ground(trash_item)
|
||||
user.put_in_hands(L)
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/deluxe_chocolate_bar
|
||||
name = "Deluxe Chocolate-bar"
|
||||
|
||||
@@ -15,18 +15,19 @@
|
||||
ingredient_name = "slab of meat"
|
||||
ingredient_name_plural = "slabs of meat"
|
||||
|
||||
/obj/item/food/meat/attackby__legacy__attackchain(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/kitchen/knife) || istype(W, /obj/item/scalpel))
|
||||
new /obj/item/food/rawcutlet(src)
|
||||
new /obj/item/food/rawcutlet(src)
|
||||
new /obj/item/food/rawcutlet(src)
|
||||
user.visible_message( \
|
||||
"<span class ='notice'>[user] cuts [src] with [W]!</span>", \
|
||||
"<span class ='notice'>You cut [src] with [W]!</span>" \
|
||||
)
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
/obj/item/food/meat/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(!istype(used, /obj/item/kitchen/knife) && !istype(used, /obj/item/scalpel))
|
||||
return NONE
|
||||
|
||||
new /obj/item/food/rawcutlet(src)
|
||||
new /obj/item/food/rawcutlet(src)
|
||||
new /obj/item/food/rawcutlet(src)
|
||||
user.visible_message(
|
||||
"<span class ='notice'>[user] cuts [src] with [used]!</span>",
|
||||
"<span class ='notice'>You cut [src] with [used]!</span>"
|
||||
)
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/meat/syntiflesh
|
||||
name = "synthetic meat"
|
||||
@@ -97,21 +98,22 @@
|
||||
bitesize = 1
|
||||
list_reagents = list("protein" = 1)
|
||||
|
||||
/obj/item/food/rawcutlet/attackby__legacy__attackchain(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/kitchen/knife) || istype(W, /obj/item/scalpel))
|
||||
user.visible_message( \
|
||||
"<span class ='notice'>[user] cuts the raw cutlet with [W]!</span>", \
|
||||
"<span class ='notice'>You cut the raw cutlet with [W]!</span>" \
|
||||
)
|
||||
var/obj/item/food/raw_bacon/bacon = new(get_turf(src))
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
qdel(src)
|
||||
H.put_in_hands(bacon)
|
||||
else
|
||||
qdel(src)
|
||||
/obj/item/food/rawcutlet/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(!istype(used, /obj/item/kitchen/knife) && !istype(used, /obj/item/scalpel))
|
||||
return NONE
|
||||
|
||||
return ..()
|
||||
user.visible_message(
|
||||
"<span class ='notice'>[user] cuts the raw cutlet with [used]!</span>",
|
||||
"<span class ='notice'>You cut the raw cutlet with [used]!</span>"
|
||||
)
|
||||
var/obj/item/food/raw_bacon/bacon = new(get_turf(src))
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
qdel(src)
|
||||
H.put_in_hands(bacon)
|
||||
else
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
//////////////////////////
|
||||
// Monster Meat //
|
||||
@@ -270,7 +272,10 @@
|
||||
. = ..()
|
||||
. += "<span class='notice'>Use it in hand to shape it into a raw meatball.</span>"
|
||||
|
||||
/obj/item/food/meat/patty_raw/attack_self__legacy__attackchain(mob/user)
|
||||
/obj/item/food/meat/patty_raw/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] shapes [src] into a raw meatball.</span>",
|
||||
"<span class='notice'>You shape [src] into a raw meatball.</span>"
|
||||
@@ -280,7 +285,7 @@
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
user.put_in_hands(M)
|
||||
return 1
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/ground_meat
|
||||
name = "ground meat"
|
||||
@@ -296,7 +301,10 @@
|
||||
. += "<span class='notice'>Use it in hand to shape it into a raw meatball.</span>"
|
||||
. += "<span class='notice'>Use it in hand again to flatten it into a raw patty.</span>"
|
||||
|
||||
/obj/item/food/ground_meat/attack_self__legacy__attackchain(mob/living/user)
|
||||
/obj/item/food/ground_meat/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] shapes [src] into a ball.</span>",
|
||||
"<span class='notice'>You shape [src] into a ball of raw ground meat.</span>"
|
||||
@@ -306,7 +314,7 @@
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
user.put_in_hands(M)
|
||||
return TRUE
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/meat/raw_meatball
|
||||
name = "raw meatball"
|
||||
@@ -320,7 +328,10 @@
|
||||
. = ..()
|
||||
. += "<span class='notice'>Use it in hand to flatten it into a raw patty.</span>"
|
||||
|
||||
/obj/item/food/meat/raw_meatball/attack_self__legacy__attackchain(mob/user)
|
||||
/obj/item/food/meat/raw_meatball/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] flattens [src] into a patty.</span>",
|
||||
"<span class='notice'>You flatten [src] into a raw patty.</span>"
|
||||
@@ -330,7 +341,7 @@
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
user.put_in_hands(M)
|
||||
return TRUE
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/meatball
|
||||
name = "meatball"
|
||||
@@ -505,20 +516,20 @@
|
||||
reagents.reaction(hit_atom, REAGENT_TOUCH)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/food/egg/attackby__legacy__attackchain(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/toy/crayon))
|
||||
var/obj/item/toy/crayon/C = W
|
||||
var/clr = C.dye_color
|
||||
/obj/item/food/egg/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(!istype(used, /obj/item/toy/crayon))
|
||||
return NONE
|
||||
|
||||
if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow")))
|
||||
to_chat(usr, "<span class ='notice'>The egg refuses to take on this color!</span>")
|
||||
return
|
||||
var/obj/item/toy/crayon/C = used
|
||||
var/clr = C.dye_color
|
||||
if(!(clr in list("red", "orange", "yellow", "green", "blue", "purple", "rainbow", "mime")))
|
||||
to_chat(usr, "<span class ='warning'>The egg refuses to take on this color!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
to_chat(usr, "<span class ='notice'>You color \the [src] [clr]</span>")
|
||||
icon_state = "egg-[clr]"
|
||||
item_color = clr
|
||||
else
|
||||
..()
|
||||
to_chat(usr, "<span class ='notice'>You color \the [src] [clr]</span>")
|
||||
icon_state = "egg-[clr]"
|
||||
item_color = clr
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/egg/blue
|
||||
icon_state = "egg-blue"
|
||||
|
||||
@@ -117,16 +117,19 @@
|
||||
tastes = list("rice" = 1)
|
||||
goal_difficulty = FOOD_GOAL_NORMAL
|
||||
|
||||
/obj/item/food/boiledrice/attackby__legacy__attackchain(obj/item/I, mob/user, params)
|
||||
if(!istype(I, /obj/item/stack/seaweed))
|
||||
return ..()
|
||||
var/obj/item/stack/seaweed/S = I
|
||||
/obj/item/food/boiledrice/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(!istype(used, /obj/item/stack/seaweed))
|
||||
return NONE
|
||||
|
||||
var/obj/item/stack/seaweed/S = used
|
||||
if(!S.use(1))
|
||||
return ..()
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
var/obj/item/food/onigiri/O = new(get_turf(user))
|
||||
reagents.trans_to(O, reagents.total_volume)
|
||||
qdel(src)
|
||||
user.put_in_active_hand(O)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/roastparsnip
|
||||
name = "roast parsnip"
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
resistance_flags = FLAMMABLE
|
||||
container_type = INJECTABLE
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
new_attack_chain = TRUE
|
||||
var/filling_color = "#FFFFFF" //Used by sandwiches.
|
||||
var/junkiness = 0 //for junk food. used to lower human satiety.
|
||||
var/bitesize = 2
|
||||
@@ -171,51 +172,47 @@
|
||||
/obj/item/food/proc/Post_Consume(mob/living/M)
|
||||
return
|
||||
|
||||
/obj/item/food/attack_self__legacy__attackchain(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/food/attack__legacy__attackchain(mob/M, mob/user, def_zone)
|
||||
/obj/item/food/interact_with_atom(atom/target, mob/living/user, list/modifiers)
|
||||
if(user.a_intent == INTENT_HARM && force)
|
||||
return ..()
|
||||
return NONE
|
||||
|
||||
if(reagents && !reagents.total_volume) // Shouldn't be needed but it checks to see if it has anything left in it.
|
||||
to_chat(user, "<span class='warning'>None of [src] left, oh no!</span>")
|
||||
qdel(src)
|
||||
return FALSE
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
if(C.eat(src, user))
|
||||
bitecount++
|
||||
On_Consume(C, user)
|
||||
return TRUE
|
||||
return FALSE
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/attackby__legacy__attackchain(obj/item/W, mob/user, params)
|
||||
if(is_pen(W))
|
||||
rename_interactive(user, W, use_prefix = FALSE, prompt = "What would you like to name this dish?")
|
||||
return
|
||||
if(isstorage(W))
|
||||
..() // -> item/attackby(, params)
|
||||
return NONE
|
||||
|
||||
else if(istype(W,/obj/item/kitchen/utensil))
|
||||
/obj/item/food/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(is_pen(used))
|
||||
rename_interactive(user, used, use_prefix = FALSE, prompt = "What would you like to name this dish?")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
var/obj/item/kitchen/utensil/U = W
|
||||
if(isstorage(used))
|
||||
return NONE
|
||||
|
||||
if(istype(used, /obj/item/kitchen/utensil))
|
||||
var/obj/item/kitchen/utensil/U = used
|
||||
if(length(U.contents) >= U.max_contents)
|
||||
to_chat(user, "<span class='warning'>You cannot fit anything else on your [U].")
|
||||
return
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
user.visible_message( \
|
||||
"[user] scoops up some [name] with [U]!", \
|
||||
"<span class='notice'>You scoop up some [name] with [U]!" \
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] scoops up some [name] with [U]!</span>",
|
||||
"<span class='notice'>You scoop up some [name] with [U]!</span>"
|
||||
)
|
||||
|
||||
bitecount++
|
||||
U.overlays.Cut()
|
||||
var/image/I = new(U.icon, "loadedfood")
|
||||
I.color = filling_color
|
||||
U.overlays += I
|
||||
|
||||
var/obj/item/food/collected = new type
|
||||
collected.name = name
|
||||
collected.loc = U
|
||||
@@ -233,9 +230,9 @@
|
||||
TrashItem = trash
|
||||
TrashItem.forceMove(loc)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
else
|
||||
return ..()
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
return NONE
|
||||
|
||||
/obj/item/food/proc/generate_trash(atom/location)
|
||||
if(trash)
|
||||
@@ -278,7 +275,7 @@
|
||||
N.adjustHealth(-2)
|
||||
N.taste(reagents)
|
||||
else if(iscaterpillar(M))
|
||||
var/mob/living/simple_animal/nian_caterpillar/W = M
|
||||
var/mob/living/basic/nian_caterpillar/W = M
|
||||
W.taste(reagents)
|
||||
W.consume(src)
|
||||
|
||||
@@ -331,32 +328,38 @@
|
||||
add_fingerprint(user)
|
||||
I.forceMove(src)
|
||||
|
||||
/obj/item/food/sliceable/attackby__legacy__attackchain(obj/item/I, mob/user, params)
|
||||
/obj/item/food/sliceable/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if((slices_num <= 0 || !slices_num) || !slice_path)
|
||||
return FALSE
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(!used.sharp)
|
||||
return NONE
|
||||
|
||||
var/inaccurate = TRUE
|
||||
if(I.sharp)
|
||||
if(istype(I, /obj/item/kitchen/knife) || istype(I, /obj/item/scalpel))
|
||||
inaccurate = FALSE
|
||||
else
|
||||
return ..()
|
||||
if(istype(used, /obj/item/kitchen/knife) || istype(used, /obj/item/scalpel))
|
||||
inaccurate = FALSE
|
||||
|
||||
if(!isturf(loc) || !(locate(/obj/structure/table) in loc) && \
|
||||
!(locate(/obj/machinery/optable) in loc) && !(locate(/obj/item/storage/bag/tray) in loc))
|
||||
to_chat(user, "<span class='warning'>You cannot slice [src] here! You need a table or at least a tray to do it.</span>")
|
||||
return TRUE
|
||||
var/slices_lost = 0
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
var/initial_volume = 0 // the total some of reagents this food had initially
|
||||
for(var/ingredient in list_reagents)
|
||||
initial_volume += list_reagents[ingredient]
|
||||
// we want to account for how much has been eaten already, reduce slices by how is left vs. how much food we started with
|
||||
slices_num = clamp(slices_num * (reagents.total_volume / initial_volume), 1, slices_num)
|
||||
var/slices_lost
|
||||
if(!inaccurate)
|
||||
user.visible_message("<span class='notice'>[user] slices [src]!</span>",
|
||||
"<span class='notice'>You slice [src]!</span>")
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] slices [src] with [used].</span>",
|
||||
"<span class='notice'>You slice [src] with [used].</span>"
|
||||
)
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] crudely slices [src] with [I]!</span>",
|
||||
"<span class='notice'>You crudely slice [src] with your [I]</span>!")
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] crudely slices [src] with [used], destroying some in the process!</span>",
|
||||
"<span class='notice'>You crudely slice [src] with [used], destroying some in the process!</span>"
|
||||
)
|
||||
slices_lost = rand(1, min(1, round(slices_num / 2)))
|
||||
var/reagents_per_slice = reagents.total_volume/slices_num
|
||||
for(var/i in 1 to (slices_num - slices_lost))
|
||||
@@ -364,7 +367,7 @@
|
||||
reagents.trans_to(slice,reagents_per_slice)
|
||||
slice.scatter_atom()
|
||||
qdel(src)
|
||||
return ..()
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/badrecipe
|
||||
name = "burned mess"
|
||||
|
||||
@@ -67,4 +67,3 @@
|
||||
icon_state = "xmashat"
|
||||
desc = "A crappy paper hat that you are REQUIRED to wear."
|
||||
flags_inv = 0
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
|
||||
@@ -67,23 +67,28 @@
|
||||
if(T.examine_line)
|
||||
. += T.examine_line
|
||||
|
||||
/obj/item/food/grown/attackby__legacy__attackchain(obj/item/O, mob/user, params)
|
||||
..()
|
||||
/obj/item/food/grown/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(slices_num && slice_path)
|
||||
var/inaccurate = TRUE
|
||||
if(O.sharp)
|
||||
if(istype(O, /obj/item/kitchen/knife) || istype(O, /obj/item/scalpel))
|
||||
if(used.sharp)
|
||||
if(istype(used, /obj/item/kitchen/knife) || istype(used, /obj/item/scalpel))
|
||||
inaccurate = FALSE
|
||||
|
||||
if(!isturf(loc) || !(locate(/obj/structure/table) in loc) && !(locate(/obj/machinery/optable) in loc) && !(locate(/obj/item/storage/bag/tray) in loc))
|
||||
to_chat(user, "<span class='warning'>You cannot slice [src] here! You need a table or at least a tray to do it.</span>")
|
||||
return TRUE
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
var/slices_lost = 0
|
||||
if(!inaccurate)
|
||||
user.visible_message("<span class='notice'>[user] slices [src] with [O]!</span>", "<span class='notice'>You slice [src]!</span>")
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] slices [src] with [used].</span>",
|
||||
"<span class='notice'>You slice [src] with [used].</span>"
|
||||
)
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] crudely slices [src] with [O]!</span>", "<span class='notice'>You crudely slice [src] with your [O]!</span>")
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] crudely slices [src] with [used], destroying some in the process!</span>",
|
||||
"<span class='notice'>You crudely slice [src] with [used], destroying some in the process!</span>"
|
||||
)
|
||||
slices_lost = rand(1, min(1, round(slices_num / 2)))
|
||||
|
||||
var/reagents_per_slice = reagents.total_volume/slices_num
|
||||
@@ -92,21 +97,27 @@
|
||||
reagents.trans_to(slice, reagents_per_slice)
|
||||
slice.scatter_atom()
|
||||
qdel(src)
|
||||
return ..()
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(istype(O, /obj/item/plant_analyzer))
|
||||
if(istype(used, /obj/item/plant_analyzer))
|
||||
send_plant_details(user)
|
||||
else
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_attackby(src, O, user)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_attackby(src, used, user)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
return NONE
|
||||
|
||||
|
||||
// Various gene procs
|
||||
/obj/item/food/grown/attack_self__legacy__attackchain(mob/user)
|
||||
/obj/item/food/grown/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(seed && seed.get_gene(/datum/plant_gene/trait/squash))
|
||||
squash(user)
|
||||
..()
|
||||
|
||||
/obj/item/food/grown/throw_impact(atom/hit_atom)
|
||||
if(!..()) //was it caught by a mob?
|
||||
@@ -171,15 +182,20 @@
|
||||
return ..()
|
||||
|
||||
// For item-containing growns such as eggy or gatfruit
|
||||
/obj/item/food/grown/shell/attack_self__legacy__attackchain(mob/user)
|
||||
/obj/item/food/grown/shell/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(!do_after(user, 1.5 SECONDS, target = user))
|
||||
return
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
user.unequip(src)
|
||||
if(trash)
|
||||
var/obj/item/T = generate_trash()
|
||||
user.put_in_hands(T)
|
||||
to_chat(user, "<span class='notice'>You open [src]\'s shell, revealing \a [T].</span>")
|
||||
to_chat(user, "<span class='notice'>You deshell [src], revealing \a [T].</span>")
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
// Diona Nymphs can eat these as well as weeds to gain nutrition.
|
||||
/obj/item/food/grown/attack_animal(mob/living/simple_animal/M)
|
||||
|
||||
@@ -89,11 +89,17 @@
|
||||
tastes = list("meatwheat" = 1)
|
||||
can_distill = FALSE
|
||||
|
||||
/obj/item/food/grown/meatwheat/attack_self__legacy__attackchain(mob/living/user)
|
||||
user.visible_message("<span class='notice'>[user] crushes [src] into meat.</span>", "<span class='notice'>You crush [src] into something that resembles meat.</span>")
|
||||
/obj/item/food/grown/meatwheat/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] crushes [src] into meat.</span>",
|
||||
"<span class='notice'>You crush [src] into something that resembles meat.</span>"
|
||||
)
|
||||
playsound(user, 'sound/effects/blobattack.ogg', 50, 1)
|
||||
var/obj/item/food/meat/meatwheat/M = new(get_turf(user))
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
user.put_in_hands(M)
|
||||
return 1
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
@@ -111,9 +111,15 @@
|
||||
tastes = list("burning lemon" = 1)
|
||||
wine_flavor = "fire"
|
||||
|
||||
/obj/item/food/grown/firelemon/attack_self__legacy__attackchain(mob/living/user)
|
||||
/obj/item/food/grown/firelemon/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
var/area/A = get_area(user)
|
||||
user.visible_message("<span class='warning'>[user] primes [src]!</span>", "<span class='userdanger'>You prime [src]!</span>")
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user] primes [src]!</span>",
|
||||
"<span class='userdanger'>You prime [src]!</span>"
|
||||
)
|
||||
investigate_log("[key_name(user)] primed a combustible lemon for detonation at [A] [COORD(user)].", INVESTIGATE_BOMB)
|
||||
add_attack_logs(user, src, "primed a combustible lemon for detonation", ATKLOG_FEW)
|
||||
log_game("[key_name(user)] primed a combustible lemon for detonation at [A] [COORD(user)].")
|
||||
@@ -123,6 +129,7 @@
|
||||
icon_state = "firelemon_active"
|
||||
playsound(loc, 'sound/weapons/armbomb.ogg', 75, TRUE, -3)
|
||||
addtimer(CALLBACK(src, PROC_REF(prime)), rand(10, 60))
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/grown/firelemon/burn()
|
||||
prime()
|
||||
|
||||
@@ -30,7 +30,10 @@
|
||||
tastes = list("grass" = 1)
|
||||
wine_power = 0.15
|
||||
|
||||
/obj/item/food/grown/grass/attack_self__legacy__attackchain(mob/user)
|
||||
/obj/item/food/grown/grass/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
to_chat(user, "<span class='notice'>You prepare the astroturf.</span>")
|
||||
var/grassAmt = 1 + round(seed.potency * tile_coefficient) // The grass we're holding
|
||||
for(var/obj/item/food/grown/grass/G in user.loc) // The grass on the floor
|
||||
@@ -40,6 +43,7 @@
|
||||
qdel(G)
|
||||
new stacktype(user.drop_location(), grassAmt)
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
// Carpet
|
||||
/obj/item/seeds/grass/carpet
|
||||
|
||||
@@ -20,12 +20,16 @@
|
||||
tastes = list("comfrey" = 1)
|
||||
bitesize_mod = 2
|
||||
|
||||
/obj/item/food/grown/comfrey/attack_self__legacy__attackchain(mob/user)
|
||||
/obj/item/food/grown/comfrey/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
var/obj/item/stack/medical/bruise_pack/comfrey/C = new(get_turf(user))
|
||||
C.heal_brute = seed.potency
|
||||
to_chat(user, "<span class='notice'>You mash [src] into a poultice.</span>")
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/seeds/aloe
|
||||
name = "pack of aloe seeds"
|
||||
@@ -47,12 +51,16 @@
|
||||
tastes = list("aloe" = 1)
|
||||
bitesize_mod = 2
|
||||
|
||||
/obj/item/food/grown/aloe/attack_self__legacy__attackchain(mob/user)
|
||||
/obj/item/food/grown/aloe/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
var/obj/item/stack/medical/ointment/aloe/A = new(get_turf(user))
|
||||
A.heal_burn = seed.potency
|
||||
to_chat(user, "<span class='notice'>You mash [src] into a poultice.</span>")
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
// mint
|
||||
/obj/item/seeds/mint
|
||||
|
||||
@@ -191,15 +191,22 @@
|
||||
max_integrity = 40
|
||||
wine_power = 0.8
|
||||
|
||||
/obj/item/food/grown/cherry_bomb/attack_self__legacy__attackchain(mob/living/user)
|
||||
/obj/item/food/grown/cherry_bomb/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
var/area/A = get_area(user)
|
||||
user.visible_message("<span class='warning'>[user] plucks the stem from [src]!</span>", "<span class='userdanger'>You pluck the stem from [src], which begins to hiss loudly!</span>")
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user] plucks the stem from [src]!</span>",
|
||||
"<span class='userdanger'>You pluck the stem from [src], which begins to hiss loudly!</span>"
|
||||
)
|
||||
message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) <A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>(JMP)</a>")
|
||||
log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.throw_mode_on()
|
||||
prime()
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/grown/cherry_bomb/deconstruct(disassembled = TRUE)
|
||||
if(!disassembled)
|
||||
|
||||
@@ -173,9 +173,14 @@
|
||||
tastes = list("walking mushroom" = 1, "motion" = 1)
|
||||
can_distill = FALSE
|
||||
|
||||
/obj/item/food/grown/mushroom/walkingmushroom/attack_self__legacy__attackchain(mob/user)
|
||||
/obj/item/food/grown/mushroom/walkingmushroom/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(isspaceturf(user.loc))
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You need a solid floor to plant [src] on!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
var/mob/living/simple_animal/hostile/mushroom/M = new /mob/living/simple_animal/hostile/mushroom(user.loc)
|
||||
M.maxHealth += round(seed.endurance / 4)
|
||||
M.melee_damage_lower += round(seed.potency / 20)
|
||||
@@ -245,12 +250,18 @@
|
||||
tastes = list("warmth" = 1, "light" = 1, "glowshroom" = 1)
|
||||
wine_power = 0.5
|
||||
|
||||
/obj/item/food/grown/mushroom/glowshroom/attack_self__legacy__attackchain(mob/user)
|
||||
/obj/item/food/grown/mushroom/glowshroom/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(isspaceturf(user.loc))
|
||||
return FALSE
|
||||
to_chat(user, "<span class='warning'>You need a solid floor or wall to plant [src] on!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
if(!isturf(user.loc))
|
||||
to_chat(user, "<span class='warning'>You need more space to plant [src].</span>")
|
||||
return FALSE
|
||||
to_chat(user, "<span class='warning'>You need more space to plant [src]!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
var/count = 0
|
||||
var/maxcount = 1
|
||||
for(var/tempdir in GLOB.cardinal)
|
||||
@@ -260,13 +271,13 @@
|
||||
for(var/obj/structure/glowshroom/G in user.loc)
|
||||
count++
|
||||
if(count >= maxcount)
|
||||
to_chat(user, "<span class='warning'>There are too many shrooms here to plant [src].</span>")
|
||||
return FALSE
|
||||
to_chat(user, "<span class='warning'>There are too many shrooms here to plant [src]!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
new effect_path(user.loc, seed)
|
||||
to_chat(user, "<span class='notice'>You plant [src].</span>")
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
// Glowcap
|
||||
/obj/item/seeds/glowshroom/glowcap
|
||||
|
||||
@@ -19,8 +19,12 @@
|
||||
icon_state = "mushy"
|
||||
bitesize_mod = 2
|
||||
|
||||
/obj/item/food/grown/nymph_pod/attack_self__legacy__attackchain(mob/user)
|
||||
/obj/item/food/grown/nymph_pod/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
new /mob/living/simple_animal/diona(get_turf(user))
|
||||
to_chat(user, "<span class='notice'>You crack open [src] letting the nymph out.</span>")
|
||||
to_chat(user, "<span class='notice'>You crack open [src], letting the nymph out.</span>")
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
@@ -35,18 +35,17 @@
|
||||
tastes = list("potato" = 1)
|
||||
distill_reagent = "sbiten"
|
||||
|
||||
/obj/item/food/grown/potato/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(!used.sharp)
|
||||
return NONE
|
||||
|
||||
/obj/item/food/grown/potato/attackby__legacy__attackchain(obj/item/W, mob/user, params)
|
||||
if(W.sharp)
|
||||
to_chat(user, "<span class='notice'>You cut the potato into wedges with [W].</span>")
|
||||
var/obj/item/food/grown/potato/wedges/Wedges = new /obj/item/food/grown/potato/wedges
|
||||
if(!remove_item_from_storage(user))
|
||||
user.unequip(src)
|
||||
user.put_in_hands(Wedges)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
to_chat(user, "<span class='notice'>You cut the potato into wedges with [used].</span>")
|
||||
var/obj/item/food/grown/potato/wedges/W = new /obj/item/food/grown/potato/wedges
|
||||
if(!remove_item_from_storage(user))
|
||||
user.unequip(src)
|
||||
user.put_in_hands(W)
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
// Sweet Potato
|
||||
/obj/item/seeds/potato/sweet
|
||||
|
||||
@@ -28,14 +28,14 @@
|
||||
wine_power = 0.2
|
||||
var/carved_type = /obj/item/clothing/head/hardhat/pumpkinhead
|
||||
|
||||
/obj/item/food/grown/pumpkin/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params)
|
||||
if(W.sharp)
|
||||
user.show_message("<span class='notice'>You carve a face into [src]!</span>", 1)
|
||||
new carved_type(user.loc)
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
/obj/item/food/grown/pumpkin/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(!used.sharp)
|
||||
return NONE
|
||||
|
||||
to_chat(user, "<span class='notice'>You carve a face into [src] with [used].</span>")
|
||||
new carved_type(user.loc)
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
// Blumpkin
|
||||
/obj/item/seeds/pumpkin/blumpkin
|
||||
|
||||
@@ -29,16 +29,17 @@
|
||||
desc = "Slices of neatly cut carrot."
|
||||
icon_state = "carrot_wedges"
|
||||
|
||||
/obj/item/food/grown/carrot/attackby__legacy__attackchain(obj/item/I, mob/user, params)
|
||||
if(I.sharp)
|
||||
to_chat(user, "<span class='notice'>You sharpen the carrot into a shiv with [I].</span>")
|
||||
var/obj/item/kitchen/knife/shiv/carrot/Shiv = new ()
|
||||
if(!remove_item_from_storage(user))
|
||||
user.unequip(src)
|
||||
user.put_in_hands(Shiv)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
/obj/item/food/grown/carrot/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(!used.sharp)
|
||||
return NONE
|
||||
|
||||
to_chat(user, "<span class='notice'>You sharpen [src] into a shiv with [used].</span>")
|
||||
var/obj/item/kitchen/knife/shiv/carrot/shiv = new ()
|
||||
if(!remove_item_from_storage(user))
|
||||
user.unequip(src)
|
||||
user.put_in_hands(shiv)
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
|
||||
// Parsnip
|
||||
|
||||
@@ -128,16 +128,21 @@
|
||||
origin_tech = "biotech=4;combat=5"
|
||||
distill_reagent = "demonsblood"
|
||||
|
||||
/obj/item/food/grown/tomato/killer/attack__legacy__attackchain(mob/M, mob/user, def_zone)
|
||||
if(awakening)
|
||||
to_chat(user, "<span class='warning'>The tomato is twitching and shaking, preventing you from eating it.</span>")
|
||||
return
|
||||
..()
|
||||
/obj/item/food/grown/tomato/killer/interact_with_atom(atom/target, mob/living/user, list/modifiers)
|
||||
if(!awakening)
|
||||
return ..()
|
||||
|
||||
to_chat(user, "<span class='warning'>The tomato is squirming and shaking too much to do anything with it!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/grown/tomato/killer/activate_self(mob/user)
|
||||
if(..())
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/obj/item/food/grown/tomato/killer/attack_self__legacy__attackchain(mob/user)
|
||||
if(awakening || isspaceturf(user.loc))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You begin to awaken the Killer Tomato...</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
to_chat(user, "<span class='notice'>You begin to awaken [src]...</span>")
|
||||
awakening = 1
|
||||
|
||||
spawn(30)
|
||||
@@ -155,3 +160,5 @@
|
||||
message_admins("[key_name_admin(user)] released a killer tomato at [ADMIN_COORDJMP(T)]")
|
||||
log_game("[key_name(user)] released a killer tomato at [COORD(T)]")
|
||||
qdel(src)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user