Merge branch 'master' into event_timing

This commit is contained in:
Migratingcocofruit
2025-08-20 00:36:06 +03:00
155 changed files with 1449 additions and 780 deletions
@@ -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;
+62 -22
View File
@@ -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
+47 -19
View File
@@ -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
+49 -19
View File
@@ -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
+83 -34
View File
@@ -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
+50 -22
View File
@@ -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
-3
View File
@@ -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))
+1 -1
View File
@@ -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!!
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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))
+2 -1
View File
@@ -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
+1
View File
@@ -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.
+1 -1
View File
@@ -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"])
+2 -2
View File
@@ -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)
+4
View File
@@ -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)
+4 -4
View File
@@ -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
View File
@@ -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()
+3 -3
View File
@@ -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"
+1
View File
@@ -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.
+1 -2
View File
@@ -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)
+1 -1
View File
@@ -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))
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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,
+1
View File
@@ -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))
-1
View File
@@ -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 ..()
+9 -9
View File
@@ -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)
+1 -1
View File
@@ -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'
+174 -5
View File
@@ -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
+4 -2
View File
@@ -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)
+1 -9
View File
@@ -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"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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)
. = ..()
+1 -1
View File
@@ -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
+4 -1
View File
@@ -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
+18 -7
View File
@@ -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
-2
View File
@@ -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
+17 -17
View File
@@ -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
+1 -1
View File
@@ -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
+6 -1
View File
@@ -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
+7 -7
View File
@@ -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])")
+1 -1
View File
@@ -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
+3 -1
View File
@@ -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])")
+2 -1
View File
@@ -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>")
+1
View File
@@ -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
+15 -7
View File
@@ -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()
+7 -2
View File
@@ -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
-2
View File
@@ -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'
+14
View File
@@ -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'
)
+10 -3
View File
@@ -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
+2 -3
View File
@@ -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',
+4 -4
View File
@@ -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)
-1
View File
@@ -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"
+10
View File
@@ -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"
+55 -44
View File
@@ -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"
+45 -42
View File
@@ -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"
-1
View File
@@ -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)
+34 -18
View File
@@ -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)
+9 -3
View File
@@ -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
+9 -2
View File
@@ -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
+10 -2
View File
@@ -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
+9 -2
View File
@@ -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)
+21 -10
View File
@@ -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
+6 -2
View File
@@ -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
+10 -11
View File
@@ -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
+8 -8
View File
@@ -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
+11 -10
View File
@@ -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
+15 -8
View File
@@ -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