diff --git a/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm b/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm
index 8fcfc730121..512adf52460 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm
@@ -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;
diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm
index 5e0852a2712..27030d3834e 100644
--- a/_maps/map_files/stations/boxstation.dmm
+++ b/_maps/map_files/stations/boxstation.dmm
@@ -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
diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm
index 8e41d47d8f1..645f5f7376d 100644
--- a/_maps/map_files/stations/cerestation.dmm
+++ b/_maps/map_files/stations/cerestation.dmm
@@ -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
diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm
index cf5470ca38b..0986b947734 100644
--- a/_maps/map_files/stations/deltastation.dmm
+++ b/_maps/map_files/stations/deltastation.dmm
@@ -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
diff --git a/_maps/map_files/stations/emeraldstation.dmm b/_maps/map_files/stations/emeraldstation.dmm
index c38a7c6dbc7..933383d7f08 100644
--- a/_maps/map_files/stations/emeraldstation.dmm
+++ b/_maps/map_files/stations/emeraldstation.dmm
@@ -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
diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm
index fb3c62109f4..e75d16f466e 100644
--- a/_maps/map_files/stations/metastation.dmm
+++ b/_maps/map_files/stations/metastation.dmm
@@ -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
diff --git a/code/__DEFINES/_math.dm b/code/__DEFINES/_math.dm
index f3cdb06cbdb..6ce1dddaf1b 100644
--- a/code/__DEFINES/_math.dm
+++ b/code/__DEFINES/_math.dm
@@ -104,9 +104,6 @@
#define TORADIANS(degrees) ((degrees) * 0.0174532925)
-/// Gets shift x that would be required the bitflag (1< Global Antag Candidacy"
else
output += " Global Antag Candidacy"
- output += "
"
@@ -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 += "[key] is typing
"
found_typing = TRUE
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/prowl.dm b/code/datums/ai/basic_mobs/basic_subtrees/prowl.dm
index 24706ba16eb..e67c607da8b 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/prowl.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/prowl.dm
@@ -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
diff --git a/code/datums/ai/targeting_strategy/basic_targeting_strategy.dm b/code/datums/ai/targeting_strategy/basic_targeting_strategy.dm
index b867dd8b68a..ef80c889f4b 100644
--- a/code/datums/ai/targeting_strategy/basic_targeting_strategy.dm
+++ b/code/datums/ai/targeting_strategy/basic_targeting_strategy.dm
@@ -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
diff --git a/code/datums/components/ai_retaliate_advanced.dm b/code/datums/components/ai_retaliate_advanced.dm
index c06617b938f..b9492f8bc54 100644
--- a/code/datums/components/ai_retaliate_advanced.dm
+++ b/code/datums/components/ai_retaliate_advanced.dm
@@ -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)
diff --git a/code/datums/elements/ai_retaliate.dm b/code/datums/elements/ai_retaliate.dm
index 837b9747ebc..627d489bb81 100644
--- a/code/datums/elements/ai_retaliate.dm
+++ b/code/datums/elements/ai_retaliate.dm
@@ -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)
diff --git a/code/datums/keybindings/emote_keybinds.dm b/code/datums/keybindings/emote_keybinds.dm
index bde88ae0da9..97da98e7915 100644
--- a/code/datums/keybindings/emote_keybinds.dm
+++ b/code/datums/keybindings/emote_keybinds.dm
@@ -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"
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 635634fddba..ee22a686fc5 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -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()
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index 953697795ad..ab7e0b92e5c 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -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"
diff --git a/code/datums/outfits/outfit_debug.dm b/code/datums/outfits/outfit_debug.dm
index 75677e86a8a..e6b3356df05 100644
--- a/code/datums/outfits/outfit_debug.dm
+++ b/code/datums/outfits/outfit_debug.dm
@@ -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.
diff --git a/code/datums/spells/bloodcrawl.dm b/code/datums/spells/bloodcrawl.dm
index 6307a50f95c..425a1721f8b 100644
--- a/code/datums/spells/bloodcrawl.dm
+++ b/code/datums/spells/bloodcrawl.dm
@@ -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)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 253f08e4500..917a8b81983 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -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
diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm
index cb4e4048bca..2c45f347277 100644
--- a/code/game/gamemodes/autotraitor/autotraitor.dm
+++ b/code/game/gamemodes/autotraitor/autotraitor.dm
@@ -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)
diff --git a/code/game/gamemodes/dynamic/antag_rulesets.dm b/code/game/gamemodes/dynamic/antag_rulesets.dm
index 0e6945fb8c1..73b68a855a3 100644
--- a/code/game/gamemodes/dynamic/antag_rulesets.dm
+++ b/code/game/gamemodes/dynamic/antag_rulesets.dm
@@ -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))
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 0e77fe92352..000bbb9cc52 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -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))
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index 8ed9784337a..0d7d3dd816a 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -183,6 +183,8 @@
to_chat(owner, "You feel very stretchy.")
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
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index 9bf615333f6..0198e183df2 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -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)
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 2f2c2418354..78e35cda0a2 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -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
//////////////////////////////////
/*
diff --git a/code/game/machinery/vendors/departmental_vendors.dm b/code/game/machinery/vendors/departmental_vendors.dm
index 01437bc26c5..2ac713c84da 100644
--- a/code/game/machinery/vendors/departmental_vendors.dm
+++ b/code/game/machinery/vendors/departmental_vendors.dm
@@ -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,
diff --git a/code/game/machinery/vendors/generic_vendors.dm b/code/game/machinery/vendors/generic_vendors.dm
index f920aca2056..9a1e411e5bd 100644
--- a/code/game/machinery/vendors/generic_vendors.dm
+++ b/code/game/machinery/vendors/generic_vendors.dm
@@ -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,
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index ab9d4d2aca0..72f7c8b6fd6 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -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))
diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm
index 03d13645aff..0a73abf89b9 100644
--- a/code/game/objects/items/RSF.dm
+++ b/code/game/objects/items/RSF.dm
@@ -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
diff --git a/code/game/objects/items/devices/radio/radio_objects.dm b/code/game/objects/items/devices/radio/radio_objects.dm
index 08b000980b6..4daf2bf4661 100644
--- a/code/game/objects/items/devices/radio/radio_objects.dm
+++ b/code/game/objects/items/devices/radio/radio_objects.dm
@@ -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 ..()
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 7beccb38d8e..4818a02f6d8 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -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))
diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm
index 6bb05201d42..d64c7b6063c 100644
--- a/code/game/objects/items/robot/ai_upgrades.dm
+++ b/code/game/objects/items/robot/ai_upgrades.dm
@@ -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)
diff --git a/code/game/objects/items/salvage.dm b/code/game/objects/items/salvage.dm
index 56b8a95dbe2..681fe1564b2 100644
--- a/code/game/objects/items/salvage.dm
+++ b/code/game/objects/items/salvage.dm
@@ -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'
diff --git a/code/game/objects/items/stacks/medical_packs.dm b/code/game/objects/items/stacks/medical_packs.dm
index fc94995a094..b449cdf81ae 100644
--- a/code/game/objects/items/stacks/medical_packs.dm
+++ b/code/game/objects/items/stacks/medical_packs.dm
@@ -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("[user] starts to apply [src] on [H]...")
- 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, "You remove the splint from [H]'s [limb].")
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("[user] starts to apply [src] to [H]'s [limb].", \
"You start to apply [src] to [H]'s [limb].", \
"You hear something being wrapped.")
- 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, "You're already applying [src].")
+ 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, "You don't have any [heal_display] damage.")
+ else
+ to_chat(user, "They don't have any [heal_display] damage.")
+ return
+
+ var/obj/item/organ/external/current_limb = target.get_organ(user.zone_selected)
+ if(!current_limb)
+ to_chat(user, "That limb is missing!")
+ return
+ if(current_limb.is_robotic())
+ to_chat(user, "This can't be used on a robotic limb.")
+ 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].", "You begin [healverb] your [current_limb.name] with [src].")
+ mend_time = self_delay
+ else
+ user.visible_message("[user] begins [healverb] [target] with [src].", "You begin [healverb] [target.p_their()] [current_limb.name] with [src].")
+
+ 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, "[target]'s [E.name] is cut open, you'll need more than some [name] to stop their bleeding.")
+ 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].", "You finish [healverb] yourself with [src].")
+ else
+ user.visible_message("[user] finishes [healverb] [target] with [src].", "You finish [healverb] [target] with [src].")
+ break
+ if(!do_after(user, delay / 2, target = target))
+ break
+ current_limb = most_damaged_limb(target)
+ to_chat(user, "You begin [healverb] [target == user ? "your" : target.p_their()] [current_limb.name] with [src].")
+ 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
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index b197c8d058c..c3b78583239 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -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)
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index 0dfb915d152..bc6ff07ad49 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -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, "You [amount_per_transfer_from_this == 5 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.")
-
//ATMOS FIRE FIGHTING BACKPACK
#define EXTINGUISHER 0
diff --git a/code/game/objects/items/weapons/alien_specific.dm b/code/game/objects/items/weapons/alien_specific.dm
index 5c20be2410b..e189c56c096 100644
--- a/code/game/objects/items/weapons/alien_specific.dm
+++ b/code/game/objects/items/weapons/alien_specific.dm
@@ -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"
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 34da3ee34ad..1edfea83fdb 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -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"
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 109ca4b2941..69534c53b60 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -50,7 +50,7 @@
/obj/item/shield/riot/roman/fake
desc = "Bears an inscription on the inside: \"Romanes venio domus\". 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
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index b503a3681f4..470907bf41b 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -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)
diff --git a/code/game/objects/structures/crates_lockers/crittercrate.dm b/code/game/objects/structures/crates_lockers/crittercrate.dm
index 8c330c5b57f..04bfe0d1a14 100644
--- a/code/game/objects/structures/crates_lockers/crittercrate.dm
+++ b/code/game/objects/structures/crates_lockers/crittercrate.dm
@@ -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"
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index 254c7d12bd4..4195f5f0031 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -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("[user] pries [src] open.", \
+ "You pry open [src].", \
+ "You hear splitting wood.")
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("[user] pries [src] open.", \
- "You pry open [src].", \
- "You hear splitting wood.")
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 ..()
diff --git a/code/game/objects/structures/holosigns.dm b/code/game/objects/structures/holosigns.dm
index 2a4797e5d73..840330adf00 100644
--- a/code/game/objects/structures/holosigns.dm
+++ b/code/game/objects/structures/holosigns.dm
@@ -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)
. = ..()
diff --git a/code/game/turfs/simulated/floor/chasm.dm b/code/game/turfs/simulated/floor/chasm.dm
index 08aa0869352..1e288e42677 100644
--- a/code/game/turfs/simulated/floor/chasm.dm
+++ b/code/game/turfs/simulated/floor/chasm.dm
@@ -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
diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm
index 889f95ae1df..1bb428f7f37 100644
--- a/code/game/turfs/simulated/floor/lava.dm
+++ b/code/game/turfs/simulated/floor/lava.dm
@@ -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
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 8d37e5ec603..03e6eec9ac1 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1746,18 +1746,29 @@
to_chat(usr, "This will only work on /mob/dead/observer")
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
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index e8de49e3c02..8a63a8e1541 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -7,8 +7,6 @@
to_chat(src, "Error: Admin-PM: You cannot send adminhelps (Muted).", 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
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 47955f68a22..650d84c57de 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -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 = "-- Click the [receive_pm_type]'s name to reply --\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) ? "(PING)" : ""
+ var/ping_link = check_rights(R_ADMIN, 0, mob) ? "(PING)" : ""
var/ticket_link
- var/alert_link = check_rights(R_ADMIN, FALSE, mob) ? "(ALERT)" : ""
+ var/alert_link = check_rights(R_ADMIN, FALSE, mob) ? "(ALERT)" : ""
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 = "(TICKET)"
var/emoji_msg = "[msg]"
- var/receive_window_link = "(WINDOW)"
+ var/receive_window_link = "(WINDOW)"
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 = "(WINDOW)"
+ var/send_window_link = "(WINDOW)"
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, "Forced open [C]'s messages window.")
return
diff --git a/code/modules/admin/verbs/deathsquad.dm b/code/modules/admin/verbs/deathsquad.dm
index e984f4b1ce0..174e17c8dd3 100644
--- a/code/modules/admin/verbs/deathsquad.dm
+++ b/code/modules/admin/verbs/deathsquad.dm
@@ -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
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 222124060cd..0d54cfb624f 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -621,12 +621,14 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].")
message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 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
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index 58ee4101a2b..47f447e3d65 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -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, "Your edit was rejected by the object.")
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, "Your edit was rejected by the object.")
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, "Your edit was rejected by the object.")
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, "Your edit was rejected by the object.")
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, "Your edit was rejected by the object.")
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, "Your edit was rejected by the object.")
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, "Your edit was rejected by the object.")
return
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_VAR_EDIT, args)
log_world("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")] (Type: [class])")
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index ca0092f88ae..89597123153 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -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
diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm
index 15fba006b05..96d57c54b42 100644
--- a/code/modules/antagonists/changeling/changeling_power.dm
+++ b/code/modules/antagonists/changeling/changeling_power.dm
@@ -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
diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm
index 2ffddd180ad..49638be9435 100644
--- a/code/modules/antagonists/changeling/powers/fakedeath.dm
+++ b/code/modules/antagonists/changeling/powers/fakedeath.dm
@@ -35,9 +35,9 @@
to_chat(user, "We are already regenerating.")
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
diff --git a/code/modules/asset_cache/transports/asset_transport.dm b/code/modules/asset_cache/transports/asset_transport.dm
index 5ad53217bed..9b9cd0b9d1b 100644
--- a/code/modules/asset_cache/transports/asset_transport.dm
+++ b/code/modules/asset_cache/transports/asset_transport.dm
@@ -119,7 +119,7 @@
if(length(unreceived))
if(length(unreceived) >= ASSET_CACHE_TELL_CLIENT_AMOUNT)
- to_chat(client, "Sending Resources...")
+ to_chat(client, "Sending Resources...")
for(var/asset_name in unreceived)
var/new_asset_name = asset_name
diff --git a/code/modules/awaymissions/mission_code/ruins/deepstorage.dm b/code/modules/awaymissions/mission_code/ruins/deepstorage.dm
index 72c2aea4f15..f4de48e241b 100644
--- a/code/modules/awaymissions/mission_code/ruins/deepstorage.dm
+++ b/code/modules/awaymissions/mission_code/ruins/deepstorage.dm
@@ -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?
diff --git a/code/modules/buildmode/submodes/advanced.dm b/code/modules/buildmode/submodes/advanced.dm
index 1ab78c250f2..b3c90460e57 100644
--- a/code/modules/buildmode/submodes/advanced.dm
+++ b/code/modules/buildmode/submodes/advanced.dm
@@ -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]")
diff --git a/code/modules/buildmode/submodes/area_edit.dm b/code/modules/buildmode/submodes/area_edit.dm
index 473d001059d..bc84c2818cf 100644
--- a/code/modules/buildmode/submodes/area_edit.dm
+++ b/code/modules/buildmode/submodes/area_edit.dm
@@ -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
diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm
index 5192f43e0ac..e8198f98233 100644
--- a/code/modules/buildmode/submodes/basic.dm
+++ b/code/modules/buildmode/submodes/basic.dm
@@ -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])")
diff --git a/code/modules/buildmode/submodes/copy.dm b/code/modules/buildmode/submodes/copy.dm
index 95d8eee8b87..05a89331ed7 100644
--- a/code/modules/buildmode/submodes/copy.dm
+++ b/code/modules/buildmode/submodes/copy.dm
@@ -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, "[object] set as template.")
diff --git a/code/modules/buildmode/submodes/fill.dm b/code/modules/buildmode/submodes/fill.dm
index 9cd802e50a8..ca087776882 100644
--- a/code/modules/buildmode/submodes/fill.dm
+++ b/code/modules/buildmode/submodes/fill.dm
@@ -56,4 +56,5 @@
T.ChangeTurf(objholder)
else
var/obj/A = new objholder(T)
+ A.admin_spawned = TRUE
A.setDir(BM.build_dir)
diff --git a/code/modules/buildmode/submodes/portal.dm b/code/modules/buildmode/submodes/portal.dm
index 09f48f3af96..f7de6a2caab 100644
--- a/code/modules/buildmode/submodes/portal.dm
+++ b/code/modules/buildmode/submodes/portal.dm
@@ -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
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 38eb3c674db..ad8d8734e02 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -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()
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index d43679372be..f5b60b6c797 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -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
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index bde456622ab..430b2b00677 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -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'
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 8fdf0be5c34..af2e33d2618 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -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'
+ )
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 0740bf45200..408f91402fa 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -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
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index cc63e73be96..5c1cd8634f1 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -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
diff --git a/code/modules/clothing/masks/misc_masks.dm b/code/modules/clothing/masks/misc_masks.dm
index 15a9b6b58a6..c07374389b5 100644
--- a/code/modules/clothing/masks/misc_masks.dm
+++ b/code/modules/clothing/masks/misc_masks.dm
@@ -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
diff --git a/code/modules/clothing/suits/misc_suits.dm b/code/modules/clothing/suits/misc_suits.dm
index c219819f00c..a56f9a4e7b4 100644
--- a/code/modules/clothing/suits/misc_suits.dm
+++ b/code/modules/clothing/suits/misc_suits.dm
@@ -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',
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index cca29baf0e7..9951f87d2f2 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -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
diff --git a/code/modules/clothing/under/jobs/medical_jumpsuits.dm b/code/modules/clothing/under/jobs/medical_jumpsuits.dm
index 9efc5f69293..da896543a62 100644
--- a/code/modules/clothing/under/jobs/medical_jumpsuits.dm
+++ b/code/modules/clothing/under/jobs/medical_jumpsuits.dm
@@ -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)
diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm
index 069078e4ea1..d54b12377bd 100644
--- a/code/modules/clothing/under/jobs/rnd.dm
+++ b/code/modules/clothing/under/jobs/rnd.dm
@@ -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"
diff --git a/code/modules/crafting/tailoring.dm b/code/modules/crafting/tailoring.dm
index d85f38065cb..b536e6efe10 100644
--- a/code/modules/crafting/tailoring.dm
+++ b/code/modules/crafting/tailoring.dm
@@ -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)
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index 89285c0bb01..0c2b072b031 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -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, "[used] isn't exactly something that you would want to eat.")
+ return ITEM_INTERACT_COMPLETE
- if(!istype(I, /obj/item/food))
- to_chat(user, "[I] isn't exactly something that you would want to eat.")
- 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
diff --git a/code/modules/food_and_drinks/food/foods/ingredients.dm b/code/modules/food_and_drinks/food/foods/ingredients.dm
index af302b5f5cc..8e4f4a053da 100644
--- a/code/modules/food_and_drinks/food/foods/ingredients.dm
+++ b/code/modules/food_and_drinks/food/foods/ingredients.dm
@@ -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, "You flatten [src].")
- qdel(src)
- else
- to_chat(user, "You need to put [src] on a surface to roll it out!")
+/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, "You flatten [src].")
+ qdel(src)
else
- ..()
+ to_chat(user, "You need to put [src] on a surface to roll it out!")
+ 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, "[src] doesn't need to be flattened any further!")
+ return ITEM_INTERACT_COMPLETE
+
if(isturf(loc))
to_chat(user, "You flatten [src].")
flat = TRUE
update_appearance(UPDATE_NAME|UPDATE_ICON_STATE)
else
- to_chat(user, "You need to put [src] on a surface to roll it out!")
- else if(istype(I, /obj/item/kitchen/cutter) && flat)
+ to_chat(user, "You need to put [src] on a surface to roll it out!")
+ return ITEM_INTERACT_COMPLETE
+
+ if(istype(used, /obj/item/kitchen/cutter))
+ if(!flat)
+ to_chat(user, "[src] needs to be flattened first!")
+ return ITEM_INTERACT_COMPLETE
+
if(isturf(loc))
new /obj/item/food/rawcookies(loc)
to_chat(user, "You cut [src] into cookies.")
qdel(src)
else
- to_chat(user, "You need to put [src] on a surface to cut it out!")
- else
- return ..()
+ to_chat(user, "You need to put [src] on a surface to cut it out!")
+ 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, "You sprinkle [I] all over the cookies.")
+ to_chat(user, "You sprinkle [used] all over the cookies.")
qdel(src)
- qdel(I)
+ qdel(used)
else
- to_chat(user, "You need to put [src] on a surface to add this")
- else
- return ..()
+ to_chat(user, "You need to put [src] on a surface to add [used]!")
+ 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, "You cut [src] into little crumbles.")
- qdel(src)
- else
- to_chat(user, "You need to put [src] on a surface to cut it out!")
+/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, "You cut [src] into little crumbles.")
+ qdel(src)
else
- return ..()
+ to_chat(user, "You need to put [src] on a surface to cut it out!")
+ return ITEM_INTERACT_COMPLETE
/// for reagent chocolate being spilled on turfs
diff --git a/code/modules/food_and_drinks/food/foods/junkfood.dm b/code/modules/food_and_drinks/food/foods/junkfood.dm
index 4a31ee24b66..5b55d6bc33c 100644
--- a/code/modules/food_and_drinks/food/foods/junkfood.dm
+++ b/code/modules/food_and_drinks/food/foods/junkfood.dm
@@ -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"
diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm
index ff88f8dc3a9..e51708c4cb3 100644
--- a/code/modules/food_and_drinks/food/foods/meat.dm
+++ b/code/modules/food_and_drinks/food/foods/meat.dm
@@ -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( \
- "[user] cuts [src] with [W]!", \
- "You cut [src] with [W]!" \
- )
- 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(
+ "[user] cuts [src] with [used]!",
+ "You cut [src] with [used]!"
+ )
+ 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( \
- "[user] cuts the raw cutlet with [W]!", \
- "You cut the raw cutlet with [W]!" \
- )
- 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(
+ "[user] cuts the raw cutlet with [used]!",
+ "You cut the raw cutlet with [used]!"
+ )
+ 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 @@
. = ..()
. += "Use it in hand to shape it into a raw meatball."
-/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(
"[user] shapes [src] into a raw meatball.",
"You shape [src] into a raw meatball."
@@ -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 @@
. += "Use it in hand to shape it into a raw meatball."
. += "Use it in hand again to flatten it into a raw patty."
-/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(
"[user] shapes [src] into a ball.",
"You shape [src] into a ball of raw ground meat."
@@ -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 @@
. = ..()
. += "Use it in hand to flatten it into a raw patty."
-/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(
"[user] flattens [src] into a patty.",
"You flatten [src] into a raw patty."
@@ -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, "The egg refuses to take on this color!")
- 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, "The egg refuses to take on this color!")
+ return ITEM_INTERACT_COMPLETE
- to_chat(usr, "You color \the [src] [clr]")
- icon_state = "egg-[clr]"
- item_color = clr
- else
- ..()
+ to_chat(usr, "You color \the [src] [clr]")
+ icon_state = "egg-[clr]"
+ item_color = clr
+ return ITEM_INTERACT_COMPLETE
/obj/item/food/egg/blue
icon_state = "egg-blue"
diff --git a/code/modules/food_and_drinks/food/foods/side_dishes.dm b/code/modules/food_and_drinks/food/foods/side_dishes.dm
index a0232062623..609c60b1185 100644
--- a/code/modules/food_and_drinks/food/foods/side_dishes.dm
+++ b/code/modules/food_and_drinks/food/foods/side_dishes.dm
@@ -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"
diff --git a/code/modules/food_and_drinks/food_base.dm b/code/modules/food_and_drinks/food_base.dm
index 1d087303cbc..cd8301cbf20 100644
--- a/code/modules/food_and_drinks/food_base.dm
+++ b/code/modules/food_and_drinks/food_base.dm
@@ -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, "None of [src] left, oh no!")
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, "You cannot fit anything else on your [U].")
- return
+ return ITEM_INTERACT_COMPLETE
- user.visible_message( \
- "[user] scoops up some [name] with [U]!", \
- "You scoop up some [name] with [U]!" \
+ user.visible_message(
+ "[user] scoops up some [name] with [U]!",
+ "You scoop up some [name] with [U]!"
)
-
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, "You cannot slice [src] here! You need a table or at least a tray to do it.")
- 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("[user] slices [src]!",
- "You slice [src]!")
+ user.visible_message(
+ "[user] slices [src] with [used].",
+ "You slice [src] with [used]."
+ )
else
- user.visible_message("[user] crudely slices [src] with [I]!",
- "You crudely slice [src] with your [I]!")
+ user.visible_message(
+ "[user] crudely slices [src] with [used], destroying some in the process!",
+ "You crudely slice [src] with [used], destroying some in the process!"
+ )
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"
diff --git a/code/modules/holiday/christmas.dm b/code/modules/holiday/christmas.dm
index ad1d2802331..4e4386617d5 100644
--- a/code/modules/holiday/christmas.dm
+++ b/code/modules/holiday/christmas.dm
@@ -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)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 1519b9e0a5c..ff0db90fee9 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -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, "You cannot slice [src] here! You need a table or at least a tray to do it.")
- return TRUE
+ return ITEM_INTERACT_COMPLETE
var/slices_lost = 0
if(!inaccurate)
- user.visible_message("[user] slices [src] with [O]!", "You slice [src]!")
+ user.visible_message(
+ "[user] slices [src] with [used].",
+ "You slice [src] with [used]."
+ )
else
- user.visible_message("[user] crudely slices [src] with [O]!", "You crudely slice [src] with your [O]!")
+ user.visible_message(
+ "[user] crudely slices [src] with [used], destroying some in the process!",
+ "You crudely slice [src] with [used], destroying some in the process!"
+ )
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, "You open [src]\'s shell, revealing \a [T].")
+ to_chat(user, "You deshell [src], revealing \a [T].")
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)
diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm
index 87f882bfe87..5124b2e195b 100644
--- a/code/modules/hydroponics/grown/cereals.dm
+++ b/code/modules/hydroponics/grown/cereals.dm
@@ -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("[user] crushes [src] into meat.", "You crush [src] into something that resembles meat.")
+/obj/item/food/grown/meatwheat/activate_self(mob/user)
+ if(..())
+ return ITEM_INTERACT_COMPLETE
+
+ user.visible_message(
+ "[user] crushes [src] into meat.",
+ "You crush [src] into something that resembles meat."
+ )
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
diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm
index d7a8009bf5b..6ba3c838879 100644
--- a/code/modules/hydroponics/grown/citrus.dm
+++ b/code/modules/hydroponics/grown/citrus.dm
@@ -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("[user] primes [src]!", "You prime [src]!")
+ user.visible_message(
+ "[user] primes [src]!",
+ "You prime [src]!"
+ )
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()
diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm
index b28e0555d14..922627212c5 100644
--- a/code/modules/hydroponics/grown/grass_carpet.dm
+++ b/code/modules/hydroponics/grown/grass_carpet.dm
@@ -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, "You prepare the astroturf.")
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
diff --git a/code/modules/hydroponics/grown/herbals.dm b/code/modules/hydroponics/grown/herbals.dm
index d1d0421cf8e..c8e030a6ea7 100644
--- a/code/modules/hydroponics/grown/herbals.dm
+++ b/code/modules/hydroponics/grown/herbals.dm
@@ -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, "You mash [src] into a poultice.")
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, "You mash [src] into a poultice.")
user.drop_item()
qdel(src)
+ return ITEM_INTERACT_COMPLETE
// mint
/obj/item/seeds/mint
diff --git a/code/modules/hydroponics/grown/misc_seeds.dm b/code/modules/hydroponics/grown/misc_seeds.dm
index 1ccca14a80c..0eba7eedf64 100644
--- a/code/modules/hydroponics/grown/misc_seeds.dm
+++ b/code/modules/hydroponics/grown/misc_seeds.dm
@@ -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("[user] plucks the stem from [src]!", "You pluck the stem from [src], which begins to hiss loudly!")
+ user.visible_message(
+ "[user] plucks the stem from [src]!",
+ "You pluck the stem from [src], which begins to hiss loudly!"
+ )
message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) (JMP)")
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)
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index a934d4ed217..9d3d77973d4 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -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, "You need a solid floor to plant [src] on!")
+ 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, "You need a solid floor or wall to plant [src] on!")
+ return ITEM_INTERACT_COMPLETE
+
if(!isturf(user.loc))
- to_chat(user, "You need more space to plant [src].")
- return FALSE
+ to_chat(user, "You need more space to plant [src]!")
+ 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, "There are too many shrooms here to plant [src].")
- return FALSE
+ to_chat(user, "There are too many shrooms here to plant [src]!")
+ return ITEM_INTERACT_COMPLETE
+
new effect_path(user.loc, seed)
to_chat(user, "You plant [src].")
qdel(src)
- return TRUE
-
+ return ITEM_INTERACT_COMPLETE
// Glowcap
/obj/item/seeds/glowshroom/glowcap
diff --git a/code/modules/hydroponics/grown/nymph.dm b/code/modules/hydroponics/grown/nymph.dm
index 674ac06110c..eff1b44270a 100644
--- a/code/modules/hydroponics/grown/nymph.dm
+++ b/code/modules/hydroponics/grown/nymph.dm
@@ -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, "You crack open [src] letting the nymph out.")
+ to_chat(user, "You crack open [src], letting the nymph out.")
user.drop_item()
qdel(src)
+ return ITEM_INTERACT_COMPLETE
diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm
index 9fc0c7e05d1..c830477fd79 100644
--- a/code/modules/hydroponics/grown/potato.dm
+++ b/code/modules/hydroponics/grown/potato.dm
@@ -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, "You cut the potato into wedges with [W].")
- 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, "You cut the potato into wedges with [used].")
+ 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
diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm
index 20fa91d92d3..74b175b11b9 100644
--- a/code/modules/hydroponics/grown/pumpkin.dm
+++ b/code/modules/hydroponics/grown/pumpkin.dm
@@ -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("You carve a face into [src]!", 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, "You carve a face into [src] with [used].")
+ new carved_type(user.loc)
+ qdel(src)
+ return ITEM_INTERACT_COMPLETE
// Blumpkin
/obj/item/seeds/pumpkin/blumpkin
diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm
index 660726e6895..2ff7e5f65a9 100644
--- a/code/modules/hydroponics/grown/root.dm
+++ b/code/modules/hydroponics/grown/root.dm
@@ -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, "You sharpen the carrot into a shiv with [I].")
- 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, "You sharpen [src] into a shiv with [used].")
+ 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
diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm
index b825b50cc8e..cce3edc5f9a 100644
--- a/code/modules/hydroponics/grown/tomato.dm
+++ b/code/modules/hydroponics/grown/tomato.dm
@@ -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, "The tomato is twitching and shaking, preventing you from eating it.")
- return
- ..()
+/obj/item/food/grown/tomato/killer/interact_with_atom(atom/target, mob/living/user, list/modifiers)
+ if(!awakening)
+ return ..()
+
+ to_chat(user, "The tomato is squirming and shaking too much to do anything with it!")
+ 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, "You begin to awaken the Killer Tomato...")
+ return ITEM_INTERACT_COMPLETE
+
+ to_chat(user, "You begin to awaken [src]...")
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
+
diff --git a/code/modules/mob/dead/observer/observer_base.dm b/code/modules/mob/dead/observer/observer_base.dm
index a6ec09ea865..0b747043960 100644
--- a/code/modules/mob/dead/observer/observer_base.dm
+++ b/code/modules/mob/dead/observer/observer_base.dm
@@ -803,17 +803,19 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return TRUE
-/mob/dead/observer/proc/incarnate_ghost()
+/mob/dead/observer/proc/incarnate_ghost(datum/mind/from_mind = null)
if(!client)
return
- var/mob/living/carbon/human/new_char = new(get_turf(src))
- client.prefs.active_character.copy_to(new_char)
- if(mind)
- mind.active = TRUE
- mind.transfer_to(new_char)
+ var/mob/new_char
+ if(from_mind)
+ new_char = json_to_object(from_mind.destroyed_body_json, get_turf(src))
+ from_mind.transfer_to(new_char)
else
- new_char.key = key
+ new_char = new /mob/living/carbon/human(get_turf(src))
+ client.prefs.active_character.copy_to(new_char)
+ if(!new_char.ckey)
+ new_char.ckey = ckey
return new_char
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 1df864a4e2c..3277213d205 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -470,13 +470,13 @@
key = "0"
syllables = list ("honk","squeak","bonk","toot","narf","zub","wee","wub","norf")
-/datum/language/com_zvezhan
- name = "Zvezhan"
+/datum/language/com_cygni
+ name = "Cygni Standard"
desc = "The language of revolution across the stars, initially formed as a hybrid of Russian and Mandarin Chinese by early Cygni settlers before incorporating additional influences from across Eurasia."
speech_verb = "articulates"
whisper_verb = "murmurs"
exclaim_verbs = list("proclaims", "boasts", "accentuates")
- colour = "com_zvezhan"
+ colour = "com_cygni"
key = "?"
space_chance = 50
syllables = list("ai","bai","bian","che","chuang","e","fan","gan","huo","jian","jiao","ka","man","mu","nang","nuo","o","pang","pi",
diff --git a/code/modules/mob/living/basic/basic_mob.dm b/code/modules/mob/living/basic/basic_mob.dm
index 3973cebeaf3..c9bb4c40c0d 100644
--- a/code/modules/mob/living/basic/basic_mob.dm
+++ b/code/modules/mob/living/basic/basic_mob.dm
@@ -288,6 +288,7 @@ RESTRICT_TYPE(/mob/living/basic)
. = ..()
if(!.)
return FALSE
+ REMOVE_TRAIT(src, TRAIT_FLYING, INNATE_TRAIT)
if(nest)
nest.spawned_mobs -= src
nest = null
diff --git a/code/modules/mob/living/simple_animal/friendly/nian_caterpillar.dm b/code/modules/mob/living/basic/friendly/nian_caterpillar.dm
similarity index 56%
rename from code/modules/mob/living/simple_animal/friendly/nian_caterpillar.dm
rename to code/modules/mob/living/basic/friendly/nian_caterpillar.dm
index 376ec0aabb0..b16847c5585 100644
--- a/code/modules/mob/living/simple_animal/friendly/nian_caterpillar.dm
+++ b/code/modules/mob/living/basic/friendly/nian_caterpillar.dm
@@ -1,4 +1,4 @@
-/mob/living/simple_animal/nian_caterpillar
+/mob/living/basic/nian_caterpillar
name = "nian caterpillar"
icon = 'icons/mob/monkey.dmi'
icon_state = "mothroach"
@@ -11,49 +11,65 @@
ventcrawler = VENTCRAWLER_ALWAYS
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
butcher_results = list(/obj/item/food/meat = 1)
- minbodytemp = 0
+ minimum_survivable_temperature = 0
blood_color = "#b9ae9c"
maxHealth = 50
health = 50
speed = 0.75
- turns_per_move = 4
// What they sound like
voice_name = "nian caterpillar"
speak_emote = list("flutters", "chitters", "chatters")
- emote_hear = list("flutters", "chitters", "chatters")
- emote_see = list("flutters", "chitters", "chatters")
// Special verbs for when someone interacts with a caterpillar
- response_help = "pets"
- response_disarm = "shoos"
- response_harm = "kicks"
+ response_help_continuous = "pets"
+ response_help_simple = "pet"
+ response_disarm_continuous = "shoos"
+ response_disarm_simple = "shoo"
+ response_harm_continuous = "kicks"
+ response_harm_simple = "kicks"
// Xenobiology and cargo are the only ways to get the caterpillar.
gold_core_spawnable = FRIENDLY_SPAWN
+ melee_attack_cooldown_min = 1.5 SECONDS
+ melee_attack_cooldown_max = 2.5 SECONDS
melee_damage_lower = 5
melee_damage_upper = 8
- attacktext = "bites"
+ attack_verb_continuous = "bites"
+ attack_verb_simple = "bite"
attack_sound = 'sound/weapons/bite.ogg'
holder_type = /obj/item/holder/nian_caterpillar
- /// Evolution action.
- var/datum/action/innate/nian_caterpillar_emerge/evolve_action = new()
+ ai_controller = /datum/ai_controller/basic_controller/mothroach
+
+ var/list/innate_actions = list(
+ /datum/action/innate/nian_caterpillar_emerge,
+ )
+
+ /// List of stuff that we want to eat
+ var/static/list/edibles = list(
+ /obj/item/food,
+ )
/// The amount of nutrition the nian caterpillar needs to evolve, default is 500.
var/nutrition_need = 500
-/mob/living/simple_animal/nian_caterpillar/Initialize(mapload)
+/mob/living/basic/nian_caterpillar/Initialize(mapload)
. = ..()
real_name = name
AddElement(/datum/element/wears_collar)
+ AddElement(/datum/element/ai_retaliate)
+ AddElement(/datum/element/basic_eating, heal_amt_ = 2, food_types_ = edibles)
+ ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(edibles))
add_language("Tkachi")
- evolve_action.Grant(src)
+ grant_actions_by_list(innate_actions)
+ RegisterSignal(src, COMSIG_MOB_PRE_EAT, PROC_REF(check_full))
+ RegisterSignal(src, COMSIG_MOB_ATE, PROC_REF(consume))
-/mob/living/simple_animal/nian_caterpillar/proc/evolve(obj/structure/moth_cocoon/C, datum/mind/M)
+/mob/living/basic/nian_caterpillar/proc/evolve(obj/structure/moth_cocoon/C, datum/mind/M)
if(stat != CONSCIOUS)
return FALSE
@@ -80,10 +96,11 @@
adult.name = name
adult.real_name = name
- // Mind transfer to new worme.
- M.transfer_to(adult)
- // [Caterpillar -> worme -> nian] is from xenobio (or cargo) and does not give vampires usuble blood and cannot be converted by cult.
- ADD_TRAIT(adult.mind, TRAIT_XENOBIO_SPAWNED_HUMAN, ROUNDSTART_TRAIT)
+ if(M)
+ // Mind transfer to new worme.
+ M.transfer_to(adult)
+ // [Caterpillar -> worme -> nian] is from xenobio (or cargo) and does not give vampires usuble blood and cannot be converted by cult.
+ ADD_TRAIT(adult.mind, TRAIT_XENOBIO_SPAWNED_HUMAN, ROUNDSTART_TRAIT)
// Worme is placed into cacoon.
adult.forceMove(C)
@@ -103,18 +120,21 @@
qdel(src)
return TRUE
-/mob/living/simple_animal/nian_caterpillar/proc/consume(obj/item/food/G)
+/mob/living/basic/nian_caterpillar/proc/check_full(datum/source, obj/item/potential_food)
+ SIGNAL_HANDLER // COMSIG_MOB_PRE_EAT
if(nutrition >= nutrition_need) // Prevents griefing by overeating food items without evolving.
- return to_chat(src, "You're too full to consume this! Perhaps it's time to grow bigger...")
- visible_message("[src] ravenously consumes [G].", "You ravenously devour [G].")
- playsound(loc, 'sound/items/eatfood.ogg', 30, TRUE, frequency = 1.5)
- if(G.reagents.get_reagent_amount("nutriment") + G.reagents.get_reagent_amount("plantmatter") < 1)
+ to_chat(src, "You're too full to consume this! Perhaps it's time to grow bigger...")
+ return COMSIG_MOB_TERMINATE_EAT
+
+
+/mob/living/basic/nian_caterpillar/proc/consume(datum/source, obj/item/potential_food)
+ SIGNAL_HANDLER // COMSIG_MOB_ATE
+ if(potential_food.reagents.get_reagent_amount("nutriment") + potential_food.reagents.get_reagent_amount("plantmatter") < 1)
adjust_nutrition(2)
else
- adjust_nutrition((G.reagents.get_reagent_amount("nutriment") + G.reagents.get_reagent_amount("plantmatter")) * 2)
- qdel(G)
+ adjust_nutrition((potential_food.reagents.get_reagent_amount("nutriment") + potential_food.reagents.get_reagent_amount("plantmatter")) * 2)
-/mob/living/simple_animal/nian_caterpillar/attack_hand(mob/living/carbon/human/M)
+/mob/living/basic/nian_caterpillar/attack_hand(mob/living/carbon/human/M)
// Let people pick the little buggers up.
if(M.a_intent != INTENT_HELP)
return ..()
@@ -123,12 +143,16 @@
else
get_scooped(M)
-/mob/living/simple_animal/nian_caterpillar/attacked_by(obj/item/I, mob/living/user)
+/mob/living/basic/nian_caterpillar/attacked_by(obj/item/I, mob/living/user)
if(..())
return FINISH_ATTACK
if(istype(I, /obj/item/melee/flyswatter) && I.force)
gib() // Commit die.
+/mob/living/basic/nian_caterpillar/melee_attack(atom/target, list/modifiers, ignore_cooldown)
+ . = ..()
+
+
/datum/action/innate/nian_caterpillar_emerge
name = "Evolve"
desc = "Weave a cocoon around yourself to evolve into a greater form. The worme."
@@ -143,7 +167,7 @@
qdel(C)
/datum/action/innate/nian_caterpillar_emerge/Activate()
- var/mob/living/simple_animal/nian_caterpillar/user = owner
+ var/mob/living/basic/nian_caterpillar/user = owner
user.visible_message("[user] begins to hold still and concentrate on weaving a cocoon...", "You begin to focus on weaving a cocoon... (This will take [COCOON_WEAVE_DELAY / 10] seconds, and you must hold still.)")
if(do_after(user, COCOON_WEAVE_DELAY, FALSE, user))
@@ -151,3 +175,26 @@
var/datum/mind/H = user.mind
user.evolve(C, H)
addtimer(CALLBACK(src, PROC_REF(emerge), C), COCOON_EMERGE_DELAY, TIMER_UNIQUE)
+
+/datum/ai_controller/basic_controller/mothroach
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_EAT_FOOD_COOLDOWN = 1 MINUTES, // Moth wants to eat, but not too fast.
+ BB_SEARCH_RANGE = 3,
+ )
+
+ ai_traits = AI_FLAG_STOP_MOVING_WHEN_PULLED | AI_FLAG_PAUSE_DURING_DO_AFTER
+ ai_movement = /datum/ai_movement/basic_avoidance
+ idle_behavior = /datum/idle_behavior/idle_random_walk
+ planning_subtrees = list(
+ /datum/ai_planning_subtree/random_speech/moth_caterpillar,
+ /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee,
+ /datum/ai_planning_subtree/flee_target,
+ /datum/ai_planning_subtree/find_food,
+ )
+
+/datum/ai_planning_subtree/random_speech/moth_caterpillar
+ speech_chance = 2
+ emote_hear = list("flutters.", "chitters.", "chatters.")
+ emote_see = list("flutters.", "chitters.", "chatters.")
+
diff --git a/code/modules/mob/living/basic/mining/basilisk_ai.dm b/code/modules/mob/living/basic/mining/basilisk_ai.dm
index fe2fb42e480..10316a95392 100644
--- a/code/modules/mob/living/basic/mining/basilisk_ai.dm
+++ b/code/modules/mob/living/basic/mining/basilisk_ai.dm
@@ -13,6 +13,7 @@
/datum/ai_planning_subtree/ranged_skirmish/watcher,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
+ /datum/ai_planning_subtree/find_and_hunt_target/prowl/lavaland,
)
/datum/ai_planning_subtree/ranged_skirmish/watcher
diff --git a/code/modules/mob/living/basic/mining/hivelord.dm b/code/modules/mob/living/basic/mining/hivelord.dm
index b5942c378da..834e0a564d2 100644
--- a/code/modules/mob/living/basic/mining/hivelord.dm
+++ b/code/modules/mob/living/basic/mining/hivelord.dm
@@ -54,7 +54,7 @@
mouse_opacity = MOUSE_OPACITY_OPAQUE
friendly_verb_continuous = "buzzes near"
friendly_verb_simple = "buzz near"
- speed = 2
+ speed = -1 // Faster than a person
maxHealth = 1
health = 1
harm_intent_damage = 5
diff --git a/code/modules/mob/living/basic/mining/hivelord_ai.dm b/code/modules/mob/living/basic/mining/hivelord_ai.dm
index cdeff2f408f..735442e2259 100644
--- a/code/modules/mob/living/basic/mining/hivelord_ai.dm
+++ b/code/modules/mob/living/basic/mining/hivelord_ai.dm
@@ -13,6 +13,7 @@
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/summon_brood,
/datum/ai_planning_subtree/flee_target/legion,
+ /datum/ai_planning_subtree/find_and_hunt_target/prowl/lavaland,
)
/// With evil speech
@@ -22,6 +23,7 @@
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/summon_brood,
/datum/ai_planning_subtree/flee_target/legion,
+ /datum/ai_planning_subtree/find_and_hunt_target/prowl/lavaland,
)
/datum/ai_controller/basic_controller/hivelord/legion/advanced
diff --git a/code/modules/mob/living/basic/posessed_object.dm b/code/modules/mob/living/basic/posessed_object.dm
index 75002d7383a..77a08076c23 100644
--- a/code/modules/mob/living/basic/posessed_object.dm
+++ b/code/modules/mob/living/basic/posessed_object.dm
@@ -191,8 +191,8 @@
return possessed_item.throw_impact(hit_atom, throwingdatum)
/mob/living/basic/possessed_object/revenant
- maxHealth = 100
- health = 100
+ maxHealth = 40
+ health = 40
melee_attack_cooldown_min = 4 SECONDS
melee_attack_cooldown_max = 5 SECONDS
faction = list("revenant")
@@ -200,6 +200,7 @@
a_intent = INTENT_HARM
escape_chance = 100
revenant_possessed = TRUE
+ ai_controller = /datum/ai_controller/basic_controller/revenant
/mob/living/basic/possessed_object/revenant/Initialize(mapload)
. = ..()
@@ -207,3 +208,24 @@
throwforce = min(possessed_item.throwforce + 5, 15) // Damage it should do? throwforce+5 or 15, whichever is lower
melee_damage_lower = min(possessed_item.throwforce + 5, 15)
melee_damage_upper = melee_damage_lower
+ var/outline_size = min((throwforce / 15) * 3, 3)
+ add_filter("haunt_glow", 2, list("type" = "outline", "color" = "#7A4FA9", "size" = outline_size)) // Give it spooky purple outline
+ ADD_TRAIT(src, TRAIT_DODGE_ALL_OBJECTS, "Revenant")
+ ai_controller.set_ai_status(AI_STATUS_OFF)
+ addtimer(CALLBACK(src, PROC_REF(begin_poltergheist)), 1 SECONDS, TIMER_UNIQUE) // Short warm-up for floaty ambience
+
+/mob/living/basic/possessed_object/revenant/proc/begin_poltergheist()
+ ai_controller.set_ai_status(AI_STATUS_ON)
+
+/datum/ai_controller/basic_controller/revenant
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ )
+ ai_movement = /datum/ai_movement/jps
+ 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,
+ )
diff --git a/code/modules/mob/living/basic/retaliate/clown.dm b/code/modules/mob/living/basic/retaliate/clown.dm
index 1b36f039188..949817e1003 100644
--- a/code/modules/mob/living/basic/retaliate/clown.dm
+++ b/code/modules/mob/living/basic/retaliate/clown.dm
@@ -41,7 +41,13 @@
/mob/living/basic/clown/proc/retaliate_callback(mob/living/attacker)
if(!istype(attacker))
return
+ if(attacker.ai_controller) // Don't chain retaliates.
+ var/list/shitlist = attacker.ai_controller.blackboard[BB_BASIC_MOB_RETALIATE_LIST]
+ if(src in shitlist)
+ return
for(var/mob/living/basic/clown/harbringer in oview(src, 7))
+ if(harbringer == attacker) // Do not commit suicide attacking yourself
+ continue
harbringer.ai_controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker)
/mob/living/basic/clown/goblin
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 7e4d2bd31f0..58799f9a621 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -160,9 +160,7 @@
O = new /datum/outfit/plasmaman/soo
H.equipOutfit(O, visualsOnly)
- H.internal = H.r_hand
H.update_action_buttons_icon()
- return FALSE
/datum/species/plasmaman/handle_life(mob/living/carbon/human/H)
var/atmos_sealed = !HAS_TRAIT(H, TRAIT_NOFIRE) && (isclothing(H.wear_suit) && H.wear_suit.flags & STOPSPRESSUREDMAGE) && (isclothing(H.head) && H.head.flags & STOPSPRESSUREDMAGE)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 0562bb5bed4..d13909c7e3c 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -57,7 +57,7 @@
S.be_replaced()
QDEL_NULL(middleClickOverride)
if(mind?.current == src)
- mind.current = null
+ mind.unbind()
UnregisterSignal(src, COMSIG_ATOM_PREHIT)
return ..()
diff --git a/code/modules/mob/living/living_emote.dm b/code/modules/mob/living/living_emote.dm
index 3c6f799e2fe..cc57152ac08 100644
--- a/code/modules/mob/living/living_emote.dm
+++ b/code/modules/mob/living/living_emote.dm
@@ -56,11 +56,6 @@
key_third_person = "dances"
message = "dances around happily."
-/datum/emote/living/jump
- key = "jump"
- key_third_person = "jumps"
- message = "jumps!"
-
/datum/emote/living/deathgasp
key = "deathgasp"
key_third_person = "deathgasps"
diff --git a/code/modules/mob/living/silicon/ai/ai_mob.dm b/code/modules/mob/living/silicon/ai/ai_mob.dm
index e89e588c5b1..4c617e9403c 100644
--- a/code/modules/mob/living/silicon/ai/ai_mob.dm
+++ b/code/modules/mob/living/silicon/ai/ai_mob.dm
@@ -239,7 +239,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
add_language("Galactic Common", 1)
add_language("Sol Common", 1)
add_language("Tradeband", 1)
- add_language("Zvezhan", 1)
+ add_language("Cygni Standard", 1)
add_language("Gutter", 1)
add_language("Sinta'unathi", 1)
add_language("Siik'tajr", 1)
diff --git a/code/modules/mob/living/silicon/pai/software/pai_toggles.dm b/code/modules/mob/living/silicon/pai/software/pai_toggles.dm
index b1c3ced9f78..c2ae83be434 100644
--- a/code/modules/mob/living/silicon/pai/software/pai_toggles.dm
+++ b/code/modules/mob/living/silicon/pai/software/pai_toggles.dm
@@ -76,7 +76,7 @@
user.add_language("Bubblish")
user.add_language("Orluum")
user.add_language("Clownish")
- user.add_language("Zvezhan")
+ user.add_language("Cygni Standard")
user.add_language("Tkachi")
else
user.remove_language("Sinta'unathi")
@@ -89,7 +89,7 @@
user.remove_language("Bubblish")
user.remove_language("Orluum")
user.remove_language("Clownish")
- user.remove_language("Zvezhan")
+ user.remove_language("Cygni Standard")
user.remove_language("Tkachi")
/datum/pai_software/translator/is_active(mob/living/silicon/pai/user)
diff --git a/code/modules/mob/living/silicon/robot/robot_mob.dm b/code/modules/mob/living/silicon/robot/robot_mob.dm
index ab42f7b27ce..453455ac936 100644
--- a/code/modules/mob/living/silicon/robot/robot_mob.dm
+++ b/code/modules/mob/living/silicon/robot/robot_mob.dm
@@ -678,6 +678,8 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
module.add_languages(src)
module.add_armor(src)
module.add_subsystems_and_actions(src)
+ if(emagged)
+ module.emag_act(src)
if(!static_radio_channels)
radio.config(module.channels)
rename_character(real_name, get_default_name())
@@ -1624,7 +1626,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
custom_name = borgname
real_name = name
mind = new
- mind.current = src
+ mind.bind_to(src)
mind.set_original_mob(src)
mind.assigned_role = SPECIAL_ROLE_ERT
mind.special_role = SPECIAL_ROLE_ERT
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index ed1c4eabaa1..1429acb8cc1 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -281,7 +281,7 @@
R.add_language("Sol Common", TRUE)
R.add_language("Tradeband", TRUE)
R.add_language("Gutter", FALSE)
- R.add_language("Zvezhan", TRUE)
+ R.add_language("Cygni Standard", TRUE)
R.add_language("Sinta'unathi", FALSE)
R.add_language("Siik'tajr", FALSE)
R.add_language("Canilunzt", FALSE)
@@ -435,6 +435,9 @@
// Fluorosulphuric acid spray bottle.
/obj/item/reagent_containers/spray/cyborg_facid
name = "Polyacid spray"
+ spray_maxrange = 3
+ spray_currentrange = 3
+ adjustable = FALSE
list_reagents = list("facid" = 250)
/obj/item/reagent_containers/spray/cyborg_facid/cyborg_recharge(coeff, emagged)
@@ -688,7 +691,7 @@
R.add_language("Chittin", 1)
R.add_language("Bubblish", 1)
R.add_language("Clownish",1)
- R.add_language("Zvezhan", 1)
+ R.add_language("Cygni Standard", 1)
R.add_language("Tkachi", 1)
// Mining
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index d702a68066e..d8acd942935 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -126,7 +126,7 @@
return FALSE
layer = MOB_LAYER
if(client)
- client.time_died_as_mouse = world.time
+ client.persistent.time_died_as_mouse = world.time
/*
* Mouse types
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 4cec48dda07..9c5d853ea20 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -965,9 +965,6 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
/mob/proc/is_mechanical()
return mind && (mind.assigned_role == "Cyborg" || mind.assigned_role == "AI")
-/mob/proc/is_ready()
- return client && !!mind
-
/mob/proc/is_in_brig()
if(!loc || !loc.loc)
return 0
@@ -1107,8 +1104,8 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
* Returns true if the player successfully becomes a mouse
*/
/mob/proc/become_mouse()
- var/timedifference = world.time - client.time_died_as_mouse
- if(client.time_died_as_mouse && timedifference <= GLOB.mouse_respawn_time * 600)
+ var/timedifference = world.time - client.persistent.time_died_as_mouse
+ if(client.persistent.time_died_as_mouse && timedifference <= GLOB.mouse_respawn_time * 600)
var/timedifference_text = time2text(GLOB.mouse_respawn_time * 600 - timedifference,"mm:ss")
to_chat(src, "You may only spawn again as a mouse more than [GLOB.mouse_respawn_time] minutes after your death. You have [timedifference_text] left.")
return FALSE
@@ -1519,10 +1516,10 @@ GLOBAL_LIST_INIT(holy_areas, typecacheof(list(
// Pretend we've always succeeded when we might not have.
// This should prevent people from using it to suss anything out about mobs' states
- if(!client || !target.mind)
+ if(!client || !target.client)
return
- target.mind.kudos_received_from |= ckey
+ target.client.persistent.kudos_received_from |= ckey
/mob/living/simple_animal/relaymove(mob/living/user, direction)
if(user.incapacitated())
diff --git a/code/modules/mob/mob_emote.dm b/code/modules/mob/mob_emote.dm
index 28ad98a0d3b..86bb84300dc 100644
--- a/code/modules/mob/mob_emote.dm
+++ b/code/modules/mob/mob_emote.dm
@@ -200,3 +200,47 @@
if(istype(L))
L.Dizzy(24 SECONDS)
L.Confused(24 SECONDS)
+
+/datum/emote/jump
+ key = "jump"
+ key_third_person = "jumps"
+ message = "jumps!"
+ emote_type = EMOTE_VISIBLE | EMOTE_FORCE_NO_RUNECHAT
+ mob_type_allowed_typecache = list(/mob/living, /mob/dead/observer)
+ mob_type_blacklist_typecache = list(/mob/living/brain, /mob/camera, /mob/living/silicon/ai)
+ mob_type_ignore_stat_typecache = list(/mob/dead/observer)
+ cooldown = 0.25 SECONDS // bhop until you're stamina-less if you want lmao
+ audio_cooldown = 0.25 SECONDS
+
+/datum/emote/jump/run_emote(mob/user, params, type_override, intentional)
+ . = ..()
+ if(!.)
+ return FALSE
+
+ jump_animation(user)
+ if(isliving(user))
+ var/mob/living/L = user
+ L.adjustStaminaLoss(30)
+
+/datum/emote/jump/proc/jump_animation(mob/user)
+ var/original_transform = user.transform
+ animate(user, transform = user.transform.Translate(0, 8), time = 0.15 SECONDS, flags = ANIMATION_PARALLEL, easing = QUAD_EASING|EASE_OUT)
+ animate(transform = original_transform, time = 0.15 SECONDS, easing = QUAD_EASING|EASE_IN)
+
+/datum/emote/jump/get_sound(mob/user)
+ return 'sound/weapons/thudswoosh.ogg'
+
+// Avoids playing sounds if we're a ghost
+/datum/emote/jump/should_play_sound(mob/user, intentional)
+ if(isliving(user))
+ return ..()
+ return FALSE
+
+/datum/emote/jump/can_run_emote(mob/user, status_check, intentional)
+ if(user.buckled || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !isturf(user.loc))
+ return FALSE
+ if(isliving(user))
+ var/mob/living/L = user
+ if(IS_HORIZONTAL(L))
+ return FALSE
+ return ..()
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 280a4fa145a..d344cde1ab7 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -18,8 +18,13 @@
return INITIALIZE_HINT_NORMAL
/mob/new_player/Destroy()
+ if(spawning)
+ // The mind is being reused elsewhere, so just unhook it here.
+ mind = null
if(mind)
- mind.current = null // We best null their mind as well, otherwise /every/ single new player is going to explode the server a little more going in/out of the round
+ // Minds really shouldn't bind to new players, but just in case...
+ mind.unbind()
+ qdel(mind)
return ..()
/mob/new_player/proc/new_player_panel()
@@ -62,11 +67,11 @@
var/list/antags = client.prefs.be_special
if(length(antags))
- if(!client.skip_antag)
+ if(!client.persistent.skip_antag)
output += "
You are [client.skip_antag ? "ineligible" : "eligible"] for all antag roles.
You are [client.persistent.skip_antag ? "ineligible" : "eligible"] for all antag roles.
Observe (Please wait...)
" @@ -143,7 +148,7 @@ new_player_panel_proc() if(href_list["skip_antag"]) - client.skip_antag = !client.skip_antag + client.persistent.skip_antag = !client.persistent.skip_antag new_player_panel_proc() if(href_list["refresh"]) @@ -551,21 +556,16 @@ H.flavor_text = "" stop_sound_channel(CHANNEL_LOBBYMUSIC) + mind.set_original_mob(new_character) + mind.transfer_to(new_character) - if(mind) - mind.active = FALSE //we wish to transfer the key manually - // Clowns and mimes get appropriate default names, and the chance to pick a custom one. - if(mind.assigned_role == "Clown") - new_character.rename_character(new_character.real_name, pick(GLOB.clown_names)) - new_character.rename_self("clown") - else if(mind.assigned_role == "Mime") - new_character.rename_character(new_character.real_name, pick(GLOB.mime_names)) - new_character.rename_self("mime") - mind.set_original_mob(new_character) - mind.transfer_to(new_character) //won't transfer key since the mind is not active - - - new_character.key = key //Manually transfer the key to log them in + // Clowns and mimes get appropriate default names, and the chance to pick a custom one. + if(mind.assigned_role == "Clown") + new_character.rename_character(new_character.real_name, pick(GLOB.clown_names)) + new_character.rename_self("clown") + else if(mind.assigned_role == "Mime") + new_character.rename_character(new_character.real_name, pick(GLOB.mime_names)) + new_character.rename_self("mime") return new_character @@ -613,8 +613,8 @@ if(!client || !client.prefs) ..() return client.prefs.active_character.gender -/mob/new_player/is_ready() - return ready && ..() +/mob/new_player/proc/is_ready() + return ready && client // No hearing announcements /mob/new_player/can_hear() diff --git a/code/modules/mob/new_player/new_player_login.dm b/code/modules/mob/new_player/new_player_login.dm index 95225af0d00..d6f800afd7f 100644 --- a/code/modules/mob/new_player/new_player_login.dm +++ b/code/modules/mob/new_player/new_player_login.dm @@ -6,7 +6,6 @@ if(!mind) mind = new /datum/mind(key) mind.active = TRUE - mind.current = src if(length(GLOB.newplayer_start)) loc = pick(GLOB.newplayer_start) diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index 37a2ed722a6..423a46fad86 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -6,7 +6,6 @@ base_icon_state = "helmet" item_state = 'icons/mob/clothing/modsuit/mod_clothing.dmi' icon_override = 'icons/mob/clothing/modsuit/mod_clothing.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0) heat_protection = HEAD cold_protection = HEAD permeability_coefficient = 0.01 @@ -32,7 +31,6 @@ /obj/item/flashlight, /obj/item/tank/jetpack/oxygen/captain, ) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0) body_parts_covered = UPPER_TORSO|LOWER_TORSO heat_protection = UPPER_TORSO|LOWER_TORSO cold_protection = UPPER_TORSO|LOWER_TORSO @@ -55,7 +53,6 @@ base_icon_state = "gauntlets" item_state = 'icons/mob/clothing/modsuit/mod_clothing.dmi' icon_override = 'icons/mob/clothing/modsuit/mod_clothing.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0) body_parts_covered = HANDS|ARMS heat_protection = HANDS|ARMS cold_protection = HANDS|ARMS @@ -76,7 +73,6 @@ base_icon_state = "boots" item_state = 'icons/mob/clothing/modsuit/mod_clothing.dmi' icon_override = 'icons/mob/clothing/modsuit/mod_clothing.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0) body_parts_covered = FEET|LEGS heat_protection = FEET|LEGS cold_protection = FEET|LEGS diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 6501d303b44..31c5ed258bc 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -14,7 +14,6 @@ w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK strip_delay = 10 SECONDS - 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/mod/deploy, /datum/action/item_action/mod/activate, diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 62293f6897a..bed0eff13c5 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -607,10 +607,11 @@ GLOBAL_LIST_EMPTY(detected_advanced_diseases) /obj/machinery/pandemic/attack_ghost(mob/user) ui_interact(user) +/obj/machinery/pandemic/wrench_act(mob/user, obj/item/I) + . = TRUE + default_unfasten_wrench(user, I, 4 SECONDS) + /obj/machinery/pandemic/item_interaction(mob/living/user, obj/item/used, list/modifiers) - if(default_unfasten_wrench(user, used, time = 4 SECONDS)) - power_change() - return if((istype(used, /obj/item/reagent_containers) && (used.container_type & OPENCONTAINER)) && user.a_intent != INTENT_HARM) if(stat & (NOPOWER|BROKEN)) return ITEM_INTERACT_COMPLETE diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 69fe911ee56..413cfe31555 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -10,9 +10,16 @@ slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL throw_speed = 3 - var/spray_maxrange = 3 //what the sprayer will set spray_currentrange to in the attack_self. - var/spray_currentrange = 3 //the range of tiles the sprayer will reach when in fixed mode. + // TRUE if spray amount and range can be toggled via `attack_self()`. + var/adjustable = TRUE + var/adjust_action = "turn the nozzle" + //sprayer alternates between assigning this and `spray_minrange` to `spray_currentrange` via `attack_self()`. + var/spray_maxrange = 2 + //the range of tiles the sprayer will reach when in fixed mode. + var/spray_currentrange = 2 + var/spray_minrange = 1 volume = 250 + amount_per_transfer_from_this = 10 possible_transfer_amounts = null var/delay = CLICK_CD_RANGE * 2 @@ -90,10 +97,11 @@ /obj/item/reagent_containers/spray/activate_self(mob/user) if(..()) return FINISH_ATTACK - + if(!adjustable) + return FINISH_ATTACK amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10) - spray_currentrange = (spray_currentrange == 1 ? spray_maxrange : 1) - to_chat(user, "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.") + spray_currentrange = (amount_per_transfer_from_this == 10 ? spray_maxrange : spray_minrange) + to_chat(user, "You [adjust_action]. You'll now use [amount_per_transfer_from_this] units per spray.") /obj/item/reagent_containers/spray/examine(mob/user) . = ..() @@ -114,9 +122,6 @@ /obj/item/reagent_containers/spray/empty lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' - spray_maxrange = 2 - spray_currentrange = 2 - amount_per_transfer_from_this = 10 //space cleaner /obj/item/reagent_containers/spray/cleaner @@ -124,9 +129,6 @@ desc = "Your standard spritz cleaner bottle designed to keep ALL of your workplaces spotless." lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' - spray_maxrange = 2 - spray_currentrange = 2 - amount_per_transfer_from_this = 10 list_reagents = list("cleaner" = 250) /obj/item/reagent_containers/spray/cleaner/advanced @@ -156,6 +158,7 @@ desc = "BLAM!-brand non-foaming space cleaner!" spray_maxrange = 3 spray_currentrange = 3 + adjustable = FALSE amount_per_transfer_from_this = 5 volume = 50 list_reagents = list("cleaner" = 50) @@ -165,6 +168,9 @@ /obj/item/reagent_containers/spray/cyborg_lube name = "lube spray" + spray_maxrange = 3 + spray_currentrange = 3 + adjustable = FALSE list_reagents = list("lube" = 250) /obj/item/reagent_containers/spray/cyborg_lube/cyborg_recharge(coeff, emagged) @@ -188,6 +194,8 @@ belt_icon = null volume = 40 spray_maxrange = 4 + spray_currentrange = 4 + spray_minrange = 2 list_reagents = list("condensedcapsaicin" = 40) //water flower @@ -198,15 +206,11 @@ icon_state = "sunflower" item_state = "sunflower" belt_icon = null + adjustable = FALSE amount_per_transfer_from_this = 1 volume = 10 list_reagents = list("water" = 10) -/obj/item/reagent_containers/spray/waterflower/Initialize(mapload) - . = ..() - // Don't allow changing how much the flower sprays - RegisterSignal(src, COMSIG_ACTIVATE_SELF, TYPE_PROC_REF(/datum, signal_cancel_activate_self)) - //chemsprayer /obj/item/reagent_containers/spray/chemsprayer name = "chem sprayer" @@ -217,7 +221,8 @@ w_class = WEIGHT_CLASS_NORMAL spray_maxrange = 7 spray_currentrange = 7 - amount_per_transfer_from_this = 10 + spray_minrange = 4 + adjust_action = "adjust the output switch" volume = 600 origin_tech = "combat=3;materials=3;engineering=3" @@ -258,15 +263,6 @@ qdel(D) - -/obj/item/reagent_containers/spray/chemsprayer/activate_self(mob/user) - if(..()) - return - - amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10) - to_chat(user, "You adjust the output switch. You'll now use [amount_per_transfer_from_this] units per spray.") - - /// Plant-B-Gone /// -- Skie /obj/item/reagent_containers/spray/plantbgone @@ -288,8 +284,5 @@ icon_state = "syndie_spraycan" item_state = "syndie_spraycan" container_type = AMOUNT_VISIBLE - spray_maxrange = 2 - spray_currentrange = 2 - amount_per_transfer_from_this = 10 list_reagents = list("sticky_tar" = 100) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 516b8aab2c8..12f41c3b863 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -752,14 +752,6 @@ build_path = /obj/item/reagent_containers/hypospray/safety category = list("initial", "Medical") -/datum/design/automender - name = "Auto-mender" - id = "automender" - build_type = AUTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 1000) - build_path = /obj/item/reagent_containers/applicator - category = list("initial", "Medical") - /datum/design/prox_sensor name = "Proximity Sensor" id = "prox_sensor" diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 7183d356500..a3b06c5d4df 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -980,6 +980,16 @@ construction_time = 10 SECONDS category = list("Exosuit Equipment") +/datum/design/dropwall_launcher + name = "Exosuit Module (DWDL-04 Dropwall Launcher)" + id = "dropwall_launcher" + build_type = MECHFAB + req_tech = list("engineering" = 6, "bluespace" = 6, "combat" = 6) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/cleaner + materials = list(list(MAT_METAL = 8000, MAT_GLASS = 8000, MAT_SILVER = 4000, MAT_TITANIUM = 4000, MAT_PLASMA = 4000)) + construction_time = 10 SECONDS + category = list("Exosuit Equipment") + /datum/design/mech_bola name = "Exosuit Weapon Design (PCMK-6 Bola Launcher)" desc = "Allows for the construction of PCMK-6 Bola Launcher." diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 73eabdfeead..d7652b3d0a3 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -52,6 +52,15 @@ build_path = /obj/item/healthupgrade category = list("Medical") +/datum/design/automender + name = "Auto-mender" + id = "automender" + req_tech = list("biotech" = 7, "magnets" = 3) + build_type = PROTOLATHE + materials = list(MAT_TITANIUM = 3000, MAT_GLASS = 1000) + build_path = /obj/item/reagent_containers/applicator + category = list("Medical") + /datum/design/handheld_defib name = "Handheld Defibrillator" desc = "A smaller defibrillator only capable of treating cardiac arrest." diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index 27fc90d2002..fc2e6a46f73 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -11,7 +11,7 @@ materials = list(MAT_METAL = 700, MAT_GLASS = 50) construction_time=100 build_path = /obj/item/stock_parts/cell/empty - category = list("Misc","Power","Machinery","initial") + category = list("Misc", "Power", "Stock Parts", "Machinery", "initial") /datum/design/high_cell name = "High-Capacity Power Cell" @@ -22,7 +22,7 @@ materials = list(MAT_METAL = 700, MAT_GLASS = 60) construction_time=100 build_path = /obj/item/stock_parts/cell/high/empty - category = list("Misc","Power") + category = list("Misc", "Power", "Stock Parts") /datum/design/hyper_cell name = "Hyper-Capacity Power Cell" @@ -33,7 +33,7 @@ materials = list(MAT_METAL = 700, MAT_GOLD = 150, MAT_SILVER = 150, MAT_GLASS = 70) construction_time=100 build_path = /obj/item/stock_parts/cell/hyper/empty - category = list("Misc","Power") + category = list("Misc", "Power", "Stock Parts") /datum/design/super_cell name = "Super-Capacity Power Cell" @@ -44,7 +44,7 @@ materials = list(MAT_METAL = 700, MAT_GLASS = 70) construction_time=100 build_path = /obj/item/stock_parts/cell/super/empty - category = list("Misc","Power") + category = list("Misc", "Power", "Stock Parts") /datum/design/bluespace_cell name = "Bluespace Power Cell" @@ -55,7 +55,7 @@ materials = list(MAT_METAL = 800, MAT_GOLD = 120, MAT_GLASS = 160, MAT_DIAMOND = 160, MAT_TITANIUM = 300, MAT_BLUESPACE = 100) construction_time=100 build_path = /obj/item/stock_parts/cell/bluespace/empty - category = list("Misc","Power") + category = list("Misc", "Power", "Stock Parts") /datum/design/pacman name = "Machine Board (PACMAN-type Generator)" diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm index 5dc233e42ba..f3c1a4f016f 100644 --- a/code/modules/response_team/ert.dm +++ b/code/modules/response_team/ert.dm @@ -208,7 +208,7 @@ GLOBAL_LIST_EMPTY(ert_request_messages) //Creates mind stuff. M.mind = new - M.mind.current = M + M.mind.bind_to(M) M.mind.set_original_mob(M) M.mind.assigned_role = SPECIAL_ROLE_ERT M.mind.special_role = SPECIAL_ROLE_ERT diff --git a/code/modules/ruins/ghost_bar.dm b/code/modules/ruins/ghost_bar.dm index ea464780285..28f299a117f 100644 --- a/code/modules/ruins/ghost_bar.dm +++ b/code/modules/ruins/ghost_bar.dm @@ -14,6 +14,7 @@ GLOBAL_LIST_EMPTY(occupants_by_key) restrict_antagban = FALSE restrict_respawnability = FALSE restrict_ahud = FALSE + outfit = /datum/outfit/ghost_bar /obj/effect/mob_spawn/human/alive/ghost_bar/create(ckey, flavour = TRUE, name, mob/user = usr) // So divorced from the normal proc it's just being overriden var/datum/character_save/save_to_load @@ -37,16 +38,15 @@ GLOBAL_LIST_EMPTY(occupants_by_key) return save_to_load = new save_to_load.randomise() - var/mob/living/carbon/human/H = new(get_turf(src)) + var/mob/living/carbon/human/human = new(get_turf(src)) + human.speaks_ooc = TRUE - save_to_load.copy_to(H) - if(!H.back) - equip_item(H, /obj/item/storage/backpack, ITEM_SLOT_BACK) - equip_item(H, /obj/item/radio/headset/deadsay, ITEM_SLOT_LEFT_EAR) - H.dna.species.before_equip_job(/datum/job/assistant, H) - H.dna.species.remains_type = /obj/effect/decal/cleanable/ash - var/obj/item/bio_chip/dust/I = new - I.implant(H, null) + save_to_load.copy_to(human) + human.dna.species.before_equip_job(/datum/job/assistant, human) + human.job = assignedrole + if(outfit) + human.equipOutfit(outfit) + human.dna.species.remains_type = /obj/effect/decal/cleanable/ash for(var/gear in save_to_load.loadout_gear) var/datum/gear/G = GLOB.gear_datums[text2path(gear) || gear] if(isnull(G)) @@ -54,56 +54,35 @@ GLOBAL_LIST_EMPTY(occupants_by_key) if(G.allowed_roles) // Fix due to shitty HUD code continue if(G.slot) - if(H.equip_to_slot_or_del(G.spawn_item(H, save_to_load.get_gear_metadata(G)), G.slot, TRUE)) - to_chat(H, "Equipping you with [G.display_name]!") + if(human.equip_to_slot_or_del(G.spawn_item(human, save_to_load.get_gear_metadata(G)), G.slot, TRUE)) + to_chat(human, "Equipping you with [G.display_name]!") else - H.equip_or_collect(G.spawn_item(null, save_to_load.get_gear_metadata(G))) - if(!H.w_uniform) - equip_item(H, /obj/item/clothing/under/color/random, ITEM_SLOT_JUMPSUIT) - if(!H.shoes) - equip_item(H, /obj/item/clothing/shoes/black, ITEM_SLOT_SHOES) - equip_item(H, /obj/item/stack/spacecash/c1000, ITEM_SLOT_LEFT_POCKET) + human.equip_or_collect(G.spawn_item(null, save_to_load.get_gear_metadata(G))) - var/obj/item/card/id/syndicate/our_id = equip_item(H, /obj/item/card/id/syndicate/ghost_bar, ITEM_SLOT_ID) - our_id.assignment = assignedrole - our_id.registered_name = H.real_name - our_id.sex = capitalize(H.gender) - our_id.age = H.age - our_id.name = "[our_id.registered_name]'s ID Card ([our_id.assignment])" - our_id.photo = get_id_photo(H) - our_id.owner_uid = H.UID() - our_id.owner_ckey = H.ckey - H.job = assignedrole - - H.dna.ready_dna(H) - H.mind_initialize() - H.mind.assigned_role = assignedrole - H.mind.special_role = assignedrole - H.mind.offstation_role = TRUE - ADD_TRAIT(H, TRAIT_PACIFISM, GHOST_ROLE) + human.dna.ready_dna(human) + human.mind_initialize() + human.mind.assigned_role = assignedrole + human.mind.special_role = assignedrole + human.mind.offstation_role = TRUE + ADD_TRAIT(human, TRAIT_PACIFISM, GHOST_ROLE) if(isobserver(user)) var/mob/dead/observer/ghost = user if(ghost.can_reenter_corpse) - ADD_TRAIT(H, TRAIT_RESPAWNABLE, GHOST_ROLE) + ADD_TRAIT(human, TRAIT_RESPAWNABLE, GHOST_ROLE) - H.key = ckey - H.dna.species.after_equip_job(/datum/job/assistant, H) - if(isgrey(H)) + human.key = ckey + human.dna.species.after_equip_job(/datum/job/assistant, human) + if(isgrey(human)) var/obj/item/organ/internal/cyberimp/brain/speech_translator/implant = new - implant.insert(H) + implant.insert(human) log_game("[ckey] has entered the ghost bar") playsound(src, 'sound/machines/wooden_closet_open.ogg', 50) - var/mob/old_mob = GLOB.occupants_by_key["[H.ckey]"] + var/mob/old_mob = GLOB.occupants_by_key["[human.ckey]"] if(old_mob) qdel(old_mob) - GLOB.occupants_by_key["[H.ckey]"] = H - RegisterSignal(H, COMSIG_PARENT_QDELETING, PROC_REF(clear_references_to_owner)) - -/obj/effect/mob_spawn/human/alive/ghost_bar/proc/equip_item(mob/living/carbon/human/H, path, slot) - var/obj/item/I = new path(H) - H.equip_or_collect(I, slot, TRUE) - H.speaks_ooc = TRUE - return I + GLOB.occupants_by_key["[human.ckey]"] = human + RegisterSignal(human, COMSIG_PARENT_QDELETING, PROC_REF(clear_references_to_owner)) + return human /obj/effect/mob_spawn/human/alive/ghost_bar/proc/clear_references_to_owner(mob/mob_to_obliterate) SIGNAL_HANDLER // COMSIG_PARENT_QDELETING @@ -132,3 +111,35 @@ GLOBAL_LIST_EMPTY(occupants_by_key) return if(HAS_TRAIT_FROM(M, TRAIT_RESPAWNABLE, GHOST_ROLE)) M.dust() + +// MARK: Ghost Bar outfit +/datum/outfit/ghost_bar + name = "Ghost Bar Occupant" + uniform = /obj/item/clothing/under/color/random + shoes = /obj/item/clothing/shoes/black + back = /obj/item/storage/backpack + l_ear = /obj/item/radio/headset/deadsay + l_pocket = /obj/item/stack/spacecash/c1000 + id = /obj/item/card/id/syndicate/ghost_bar + bio_chips = list(/obj/item/bio_chip/dust) + backpack_contents = list(/obj/item/storage/box/syndie_kit/chameleon/ghost_bar) + +/datum/outfit/ghost_bar/post_equip(mob/living/carbon/human/human, visualsOnly) + . = ..() + var/obj/item/card/id/card = human.wear_id + card.assignment = human.job + card.registered_name = human.real_name + card.sex = capitalize(human.gender) + card.age = human.age + card.name = "[card.registered_name]'s ID Card ([card.assignment])" + card.photo = get_id_photo(human) + card.owner_uid = human.UID() + card.owner_ckey = human.ckey + +// MARK: Ghost Bar chameleon kit +/obj/item/storage/box/syndie_kit/chameleon/ghost_bar/populate_contents() + . = ..() + for(var/obj/item/pda/pda in contents) + qdel(pda) + for(var/obj/item/radio/headset/headset in contents) + qdel(headset) diff --git a/code/modules/surgery/organs/organ_datums/lung_datum.dm b/code/modules/surgery/organs/organ_datums/lung_datum.dm index 27d3bba0198..c40f9b18597 100644 --- a/code/modules/surgery/organs/organ_datums/lung_datum.dm +++ b/code/modules/surgery/organs/organ_datums/lung_datum.dm @@ -78,8 +78,6 @@ if(H.health < HEALTH_THRESHOLD_CRIT) return FALSE - var/gas_breathed = 0 - //Partial pressures in our breath var/O2_pp = breath.get_breath_partial_pressure(breath.oxygen()) var/N2_pp = breath.get_breath_partial_pressure(breath.nitrogen()) @@ -102,17 +100,15 @@ //Too little oxygen! if(safe_oxygen_min) if(O2_pp < safe_oxygen_min) - gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath.oxygen()) + handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath.oxygen()) H.throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) else H.adjustOxyLoss(-HUMAN_MAX_OXYLOSS) - gas_breathed = breath.oxygen() H.clear_alert("not_enough_oxy") - //Exhale - breath.set_oxygen(breath.oxygen() - gas_breathed) - breath.set_carbon_dioxide(breath.carbon_dioxide() + gas_breathed) - gas_breathed = 0 + // Exhale + breath.set_carbon_dioxide(breath.carbon_dioxide() + breath.oxygen()) + breath.set_oxygen(0) //-- Nitrogen --// @@ -128,17 +124,15 @@ //Too little nitrogen! if(safe_nitro_min) if(N2_pp < safe_nitro_min) - gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath.nitrogen()) + handle_too_little_breath(H, N2_pp, safe_nitro_min, breath.nitrogen()) H.throw_alert("not_enough_nitro", /atom/movable/screen/alert/not_enough_nitro) else H.adjustOxyLoss(-HUMAN_MAX_OXYLOSS) - gas_breathed = breath.nitrogen() H.clear_alert("not_enough_nitro") - //Exhale - breath.set_nitrogen(breath.nitrogen() - gas_breathed) - breath.set_carbon_dioxide(breath.carbon_dioxide() + gas_breathed) - gas_breathed = 0 + // Exhale + breath.set_carbon_dioxide(breath.carbon_dioxide() + breath.nitrogen()) + breath.set_nitrogen(0) //-- CO2 --// @@ -163,17 +157,15 @@ //Too little CO2! if(safe_co2_min) if(CO2_pp < safe_co2_min) - gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath.carbon_dioxide()) + handle_too_little_breath(H, CO2_pp, safe_co2_min, breath.carbon_dioxide()) H.throw_alert("not_enough_co2", /atom/movable/screen/alert/not_enough_co2) else H.adjustOxyLoss(-HUMAN_MAX_OXYLOSS) - gas_breathed = breath.carbon_dioxide() H.clear_alert("not_enough_co2") - //Exhale - breath.set_carbon_dioxide(breath.carbon_dioxide() - gas_breathed) - breath.set_oxygen(breath.oxygen() + gas_breathed) - gas_breathed = 0 + // Exhale + breath.set_oxygen(breath.oxygen() + breath.carbon_dioxide()) + breath.set_carbon_dioxide(0) //-- TOX --// @@ -191,17 +183,15 @@ //Too little toxins! if(safe_toxins_min) if(Toxins_pp < safe_toxins_min) - gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath.toxins()) + handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath.toxins()) H.throw_alert("not_enough_tox", /atom/movable/screen/alert/not_enough_tox) else H.adjustOxyLoss(-HUMAN_MAX_OXYLOSS) - gas_breathed = breath.toxins() H.clear_alert("not_enough_tox") - //Exhale - breath.set_toxins(breath.toxins() - gas_breathed) - breath.set_carbon_dioxide(breath.carbon_dioxide() + gas_breathed) - gas_breathed = 0 + // Exhale + breath.set_carbon_dioxide(breath.carbon_dioxide() + breath.toxins()) + breath.set_toxins(0) //-- TRACES --// @@ -220,19 +210,16 @@ return TRUE -/datum/organ/lungs/proc/handle_too_little_breath(mob/living/carbon/human/H = null, breath_pp = 0, safe_breath_min = 0, true_pp = 0) +/datum/organ/lungs/proc/handle_too_little_breath(mob/living/carbon/human/H = null, breath_pp = 0, safe_breath_min = 0, breath_moles = 0) . = 0 if(!H || !safe_breath_min) //the other args are either: Ok being 0 or Specifically handled. return FALSE if(prob(20)) H.emote("gasp") - if(breath_pp > 0) - var/ratio = safe_breath_min/breath_pp - H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all! - . = true_pp*ratio/6 - else - H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + var/available_ratio = clamp(breath_pp / safe_breath_min, 0, 1) + // Take oxyloss damage scaled to the amount of missing air. + H.adjustOxyLoss((1 - available_ratio) * HUMAN_MAX_OXYLOSS) /datum/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 0365d47bbcc..2e020896125 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -818,8 +818,6 @@ Note that amputating the affected organ does in fact remove the infection from t ..() //robot limbs take reduced damage if(!make_tough) - brute_mod = 0.66 - burn_mod = 0.66 dismember_at_max_damage = TRUE else tough = TRUE diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index d74273d7a7d..71656876a6e 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -230,7 +230,7 @@ if(S) H.drop_item() H.put_in_active_hand(S) - S.attack__legacy__attackchain(H, H) + S.interact_with_atom(H, H) qdel(src) else ..() diff --git a/config/example/config.toml b/config/example/config.toml index cb91700c678..18e97f6dd6a 100644 --- a/config/example/config.toml +++ b/config/example/config.toml @@ -235,6 +235,8 @@ event_initial_delays = [ {severity = "moderate", lower_bound = 25, upper_bound = 40}, {severity = "major", lower_bound = 55, upper_bound = 75}, ] +# The population needed to allow blobs to split consciousness +blob_highpop_trigger = 60 ################################################################ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index 53e9ee768c4..c4142443c90 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/clothing/species/drask/head.dmi b/icons/mob/clothing/species/drask/head.dmi index 350d6e16c61..6e9f1282881 100644 Binary files a/icons/mob/clothing/species/drask/head.dmi and b/icons/mob/clothing/species/drask/head.dmi differ diff --git a/icons/mob/clothing/species/drask/helmet.dmi b/icons/mob/clothing/species/drask/helmet.dmi index 0de7eaf2ef8..8222471586b 100644 Binary files a/icons/mob/clothing/species/drask/helmet.dmi and b/icons/mob/clothing/species/drask/helmet.dmi differ diff --git a/icons/mob/clothing/species/grey/head.dmi b/icons/mob/clothing/species/grey/head.dmi index e40696a788f..929ccace905 100644 Binary files a/icons/mob/clothing/species/grey/head.dmi and b/icons/mob/clothing/species/grey/head.dmi differ diff --git a/icons/mob/clothing/species/grey/helmet.dmi b/icons/mob/clothing/species/grey/helmet.dmi index b8386b3f3f5..8aa8d1c8a48 100644 Binary files a/icons/mob/clothing/species/grey/helmet.dmi and b/icons/mob/clothing/species/grey/helmet.dmi differ diff --git a/icons/mob/clothing/species/kidan/eyes.dmi b/icons/mob/clothing/species/kidan/eyes.dmi index c1628944af7..e52efecaefb 100644 Binary files a/icons/mob/clothing/species/kidan/eyes.dmi and b/icons/mob/clothing/species/kidan/eyes.dmi differ diff --git a/icons/mob/clothing/species/kidan/head.dmi b/icons/mob/clothing/species/kidan/head.dmi index 13332556d39..b9383586f40 100644 Binary files a/icons/mob/clothing/species/kidan/head.dmi and b/icons/mob/clothing/species/kidan/head.dmi differ diff --git a/icons/mob/clothing/species/kidan/helmet.dmi b/icons/mob/clothing/species/kidan/helmet.dmi new file mode 100644 index 00000000000..275edb2a792 Binary files /dev/null and b/icons/mob/clothing/species/kidan/helmet.dmi differ diff --git a/icons/mob/clothing/species/vox/head.dmi b/icons/mob/clothing/species/vox/head.dmi index 4aa55ea7555..fe9660ef720 100644 Binary files a/icons/mob/clothing/species/vox/head.dmi and b/icons/mob/clothing/species/vox/head.dmi differ diff --git a/icons/mob/clothing/species/vox/helmet.dmi b/icons/mob/clothing/species/vox/helmet.dmi index d8ad46dee25..14a9a21e609 100644 Binary files a/icons/mob/clothing/species/vox/helmet.dmi and b/icons/mob/clothing/species/vox/helmet.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 89c2ae37810..9024214e667 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/medical.dmi b/icons/obj/medical.dmi index 98356581603..348a22f61ca 100644 Binary files a/icons/obj/medical.dmi and b/icons/obj/medical.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index e5a6501a7d0..e6b71a6cce2 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -185,7 +185,7 @@ window "paramapwindow" is-default = true saved-params = "icon-size;zoom-mode" zoom-mode = "distort" - style = ".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; } .small { font-size: 6px; } .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .clown { color: #FF69Bf;} .tajaran {color: #803B56;} .skrell {color: #00CED1;} .solcom {color: #22228B;} .com_zvezhan {color: #7c4848;} .zombie\t{color: #7c4848;} .soghun {color: #228B22;} .vox {color: #AA00AA;} .diona {color: #804000; font-weight: bold;} .trinary {color: #727272;} .kidan {color: #664205;} .slime {color: #0077AA;} .moth{color: #869b29;} .drask {color: #a3d4eb;} .vulpkanin {color: #B97A57;} .abductor {color: #800080;} .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; }" + style = ".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; } .small { font-size: 6px; } .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .clown { color: #FF69Bf;} .tajaran {color: #803B56;} .skrell {color: #00CED1;} .solcom {color: #22228B;} .com_cygni {color: #7c4848;} .zombie\t{color: #7c4848;} .soghun {color: #228B22;} .vox {color: #AA00AA;} .diona {color: #804000; font-weight: bold;} .trinary {color: #727272;} .kidan {color: #664205;} .slime {color: #0077AA;} .moth{color: #869b29;} .drask {color: #a3d4eb;} .vulpkanin {color: #B97A57;} .abductor {color: #800080;} .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; }" on-show = ".winset \"menu.statusbar.is-checked=true?paramapwindow.status_bar.is-visible=true:paramapwindow.status_bar.is-visible=false\"" elem "status_bar" type = LABEL diff --git a/paradise.dme b/paradise.dme index eb3131ed2be..161f3b03b7c 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2427,6 +2427,7 @@ #include "code\modules\mob\living\taste.dm" #include "code\modules\mob\living\basic\basic_emotes.dm" #include "code\modules\mob\living\basic\basic_mob.dm" +#include "code\modules\mob\living\basic\friendly\nian_caterpillar.dm" #include "code\modules\mob\living\basic\posessed_object.dm" #include "code\modules\mob\living\basic\farm_animals\cow.dm" #include "code\modules\mob\living\basic\farm_animals\deer.dm" @@ -2664,7 +2665,6 @@ #include "code\modules\mob\living\simple_animal\friendly\fox.dm" #include "code\modules\mob\living\simple_animal\friendly\friendly_emote.dm" #include "code\modules\mob\living\simple_animal\friendly\mouse.dm" -#include "code\modules\mob\living\simple_animal\friendly\nian_caterpillar.dm" #include "code\modules\mob\living\simple_animal\friendly\pet.dm" #include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" #include "code\modules\mob\living\simple_animal\hostile\angel_statue.dm" diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-default.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-default.scss index e2dd00dff4e..abba6c059cc 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-default.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-default.scss @@ -599,7 +599,7 @@ h2.alert { color: #8282fb; } -.com_zvezhan { +.com_cygni { color: #7c4848; } diff --git a/tgui/packages/tgui-say/helpers.ts b/tgui/packages/tgui-say/helpers.ts index 57bdfe36fe7..5d564756392 100644 --- a/tgui/packages/tgui-say/helpers.ts +++ b/tgui/packages/tgui-say/helpers.ts @@ -7,6 +7,9 @@ import { RADIO_PREFIXES, WindowSize } from './constants'; */ export function windowOpen(channel: Channel, scale: boolean): void { setWindowVisibility(true, scale); + Byond.winset('tgui_say.browser', { + focus: true, + }); Byond.sendMessage('open', { channel }); } diff --git a/tgui/public/tgui-panel.bundle.css b/tgui/public/tgui-panel.bundle.css index 50aec0ba1a6..0f6b0026f6a 100644 --- a/tgui/public/tgui-panel.bundle.css +++ b/tgui/public/tgui-panel.bundle.css @@ -1 +1 @@ -:root{--color-base:#262626;--color-section:rgba(0,0,0,.33);--color-secondary:hsl(from var(--color-base)var(--secondary-hue)var(--secondary-saturation)calc(l + var(--secondary-lightness-adjustment)));--secondary-hue:h;--secondary-saturation:s;--secondary-lightness-adjustment:7.5;--base-gradient-spread:2;--color-base-start:hsl(from var(--color-base)h s calc(l + var(--base-gradient-spread)));--color-base-end:hsl(from var(--color-base)h s calc(l - var(--base-gradient-spread)));--color-scrollbar-base:var(--color-section);--color-scrollbar-thumb:hsl(from var(--color-base)h s calc(l + 9.25));--candystripe-odd:rgba(0,0,0,.25);--candystripe-even:transparent;--color-red:#d92626;--color-orange:#f26c0d;--color-yellow:#fcd203;--color-olive:#acc91d;--color-green:#1fad4e;--color-teal:#00b3b3;--color-blue:#2a79c8;--color-violet:#63c;--color-purple:#b333cc;--color-pink:#d9268e;--color-brown:#a96a3c;--color-gold:#f2a60d;--color-black:#000;--color-white:#fff;--color-grey:gray;--color-light-grey:#aaa;--color-gray:var(--color-grey);--color-light-gray:var(--color-light-grey);--color-action:gray;--color-hover:hsl(from var(--color-action)h s l/.25);--color-active:hsl(from var(--color-action)h s l/.3);--color-selected:hsl(from var(--color-action)h s l/.4);--primary-hue:210;--primary-saturation:37.5%;--primary-lightness:45%;--color-primary:hsl(var(--primary-hue),var(--primary-saturation),var(--primary-lightness));--color-good:#5ba626;--color-average:#f2890d;--color-bad:#dc2323;--color-label:hsl(from var(--color-primary)h 17.5 57.5);--color-text:var(--color-white);--color-text-translucent:hsl(from var(--color-text)h s l/.5);--color-text-translucent-light:hsl(from var(--color-text)h s l/.75);--color-text-fixed-white:var(--color-white);--color-text-fixed-black:var(--color-black);--color-hyperlink:#69f;--color-hyperlink-visited:#96f;--color-hyperlink-new:#f66;--color-hyperlink-new-visited:#ff8c66;--color-border:rgba(255,255,255,.1);--color-border-dark:rgba(0,0,0,.33);--border-primary-saturation:100;--border-primary-lightness:75;--border-primary-alpha:.75;--color-border-primary:hsl(from var(--color-primary)h var(--border-primary-saturation)var(--border-primary-lightness)/var(--border-primary-alpha));--color-border-secondary:hsl(from var(--color-border-primary)h s l/1);--font-size:12px;--font-family:Verdana,Geneva,sans-serif;--font-family-mono:Consolas,monospace;--border-thickness-unit:.5em;--border-thickness-tiny:calc(var(--border-thickness-unit)*.5*.34);--border-thickness-small:calc(var(--border-thickness-unit)*.34);--border-thickness-medium:calc(var(--border-thickness-unit)*.5);--border-thickness-large:calc(var(--border-thickness-unit)*.66);--border-thickness-larger:var(--border-thickness-unit);--border-radius-unit:1rem;--border-radius-tiny:calc(var(--border-radius-unit)*.25*.68);--border-radius-small:calc(var(--border-radius-unit)*.25);--border-radius-medium:calc(var(--border-radius-unit)*.33);--border-radius-large:calc(var(--border-radius-unit)*.5);--border-radius-larger:calc(var(--border-radius-unit)*.75);--border-radius-huge:var(--border-radius-unit);--border-radius-giant:calc(var(--border-radius-unit)*2);--border-radius-circular:99999px;--space-unit:1em;--space-xxs:calc(var(--space-unit)*.25*.34);--space-xs:calc(var(--space-unit)*.25*.68);--space-s:calc(var(--space-unit)*.25);--space-sm:calc(var(--space-unit)*.33);--space-m:calc(var(--space-unit)*.5);--space-ml:calc(var(--space-unit)*.66);--space-l:calc(var(--space-unit)*.75);--space-xl:var(--space-unit);--space-xxl:calc(var(--space-unit)*2);--transition-time-unit:1s;--transition-time-fast:calc(var(--transition-time-unit)*.1);--transition-time-medium:calc(var(--transition-time-unit)*.2);--transition-time-slow:calc(var(--transition-time-unit)*.5);--transition-time-slowest:var(--transition-time-unit);--shadow-unit:1rem;--shadow-glow-small:0 0 calc(var(--shadow-unit)*.5);--shadow-glow-medium:0 0 var(--shadow-unit);--shadow-glow-large:0 0 calc(var(--shadow-unit)*2);--blur-small:blur(6px);--blur-medium:blur(12px);--blur-large:blur(24px);--adjust-color:5;--adjust-hover:10;--adjust-active:7.5;--cursor-default:default;--cursor-pointer:pointer;--cursor-disabled:var(--cursor-default);--cursor-n-resize:n-resize;--cursor-s-resize:s-resize;--cursor-se-resize:se-resize;--cursor-e-resize:e-resize;--blockquote-color:hsl(from var(--color-label)h s calc(l + var(--adjust-color)));--blockquote-border:var(--border-thickness-small)solid;--button-height:1.667em;--button-color:var(--color-white);--button-color-transparent:var(--color-text-translucent);--button-background-default:var(--color-primary);--button-background-selected:var(--color-green);--button-background-caution:var(--color-yellow);--button-background-danger:var(--color-red);--button-background-disabled:var(--undefined);--button-disabled-opacity:.5;--button-border-radius:var(--border-radius-tiny);--button-transition:var(--transition-time-medium);--button-transition-timing:ease;--dialog-background:hsl(from var(--color-section)h s l/.5);--dimmer-background-opacity:.75;--dimmer-background:hsl(from var(--color-base)h s 5/var(--dimmer-background-opacity));--divider-color:var(--color-border);--divider-border:var(--border-thickness-small)solid var(--divider-color);--dropdown-transition:var(--transition-time-medium);--dropdown-menu-color:var(--color-text);--dropdown-menu-background:hsl(from var(--color-base)h s calc(l - 5.5)/.85);--dropdown-menu-border:var(--border-thickness-tiny)solid var(--color-border);--dropdown-menu-border-radius:var(--border-radius-large);--dropdown-menu-blur:var(--blur-medium);--dropdown-entry-background-hover:var(--color-hover);--dropdown-entry-background-active:var(--color-active);--dropdown-entry-background-selected:var(--color-selected);--dropdown-entry-border-radius:var(--border-radius-small);--dropdown-entry-transition:var(--transition-time-fast);--floating-transition-time:var(--transition-time-medium);--floating-transition-timing:ease;--tab-background:transparent;--tab-background-hover:hsl(from var(--color-hover)h s calc(l*.75));--tab-background-selected:hsl(from var(--color-selected)h s calc(l*.75));--tab-color:var(--color-text-translucent);--tab-color-selected:hsl(from var(--color-primary)h s 90);--tab-border-radius:var(--border-radius-small);--tab-indicator-size:var(--border-thickness-small);--tab-transition:var(--transition-time-medium);--tabs-container-background:var(--color-section);--imagebutton-transparecy:.25;--input-background-lightness:5;--input-background:hsl(from var(--color-base)h s var(--input-background-lightness));--input-color:var(--color-text);--input-color-placeholder:var(--color-text-translucent);--input-border-color:var(--color-border-primary);--input-border-color-focus:var(--color-border-secondary);--input-border-radius:var(--border-radius-tiny);--input-border-disabled:var(--color-gray);--input-transition:var(--transition-time-medium);--input-font-family:var(--font-family);--input-font-family-mono:var(--font-family-mono);--input-width:9em;--knob-color:hsl(from var(--color-base)h 5 20);--knob-ring-color:var(--input-border-color);--knob-popup-background:var(--tooltip-background);--knob-popup-color:var(--tooltip-color);--knob-popup-border-radius:var(--tooltip-border-radius);--knob-popup-blur:var(--tooltip-blur);--knob-inner-padding:var(--space-xs);--menu-bar-background:var(--color-base);--menu-bar-font-family:var(--font-family);--menu-bar-transition:var(--transition-time-medium);--modal-background:var(--color-base);--modal-padding:var(--space-xl);--notice-box-stripes:rgba(0,0,0,.1);--notice-box-background:#cea257;--notice-box-color:var(--color-text-fixed-white);--number-input-background:var(--input-background);--number-input-color:var(--input-color);--number-input-border-color:var(--input-border-color);--number-input-border-color-active:var(--input-border-color-focus);--number-input-border-radius:var(--input-border-radius);--number-input-transition:var(--input-transition);--progress-bar-fill:var(--color-primary);--progress-bar-background:transparent;--progress-bar-border-radius:var(--border-radius-tiny);--progress-bar-transition:var(--transition-time-slowest);--restricted-input-border-color:var(--color-good);--restricted-input-border-color-focus:hsl(from var(--color-good)h s calc(l + 10));--restricted-input-border-color-invalid:var(--color-bad);--round-gauge-ring-color:var(--input-border-color);--round-gauge-transition:var(--transition-time-medium);--round-gauge-alert-animation:var(--transition-time-slowest);--round-gauge-needle-alert-animation:var(--transition-time-fast);--round-gauge-needle-alert-rotation:2.5deg;--section-title-color:var(--color-text);--section-background:var(--color-section);--section-separator-color:var(--color-primary);--section-separator-thickness:var(--border-thickness-small);--slider-cursor-color:var(--color-text);--slider-popup-background:var(--tooltip-background);--slider-popup-color:var(--tooltip-color);--slider-popup-border-radius:var(--tooltip-border-radius);--slider-popup-blur:var(--tooltip-blur);--tooltip-color:var(--color-text);--tooltip-background-lightness:5;--tooltip-background:hsl(from var(--color-base)h s var(--tooltip-background-lightness)/.85);--tooltip-border-radius:var(--border-radius-medium);--tooltip-blur:var(--blur-medium)}body{font-family:var(--font-family,Verdana,Geneva,sans-serif);position:relative;overflow:auto}.BlockQuote{color:var(--blockquote-color);border-left:var(--blockquote-border);padding-left:var(--space-m);margin-bottom:var(--space-m)}.BlockQuote:last-child{margin-bottom:0}.Button--color--grey,.Button--color--gray{--color:var(--color-grey);--button-color:var(--color-white)}.Button--color--light-grey,.Button--color--light-gray{--color:var(--color-light-grey);--button-color:var(--color-white)}.ColorBox{text-align:center;width:1em;height:1em;line-height:1em;display:inline-block}.Dialog{background-color:var(--dialog-background);justify-content:center;align-items:center;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.Dialog__content{font-family:var(--font-family-mono);background-color:var(--color-base);flex-direction:column;font-size:1.16667em;display:flex}.Dialog__header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:var(--dialog-background);height:2em;line-height:1.928em;display:flex}.Dialog__title{margin-left:var(--space-xl);margin-right:var(--space-xxl);opacity:.33;flex-grow:1;font-style:italic;display:inline}.Dialog__body{margin:var(--space-xxl)var(--space-xl);flex-grow:1}.Dialog__footer{padding:var(--space-xl);background-color:hsl(from var(--dialog-background)h s l/.25);flex-direction:row;justify-content:flex-end;display:flex}.Dialog__button{margin:0 var(--space-xl);text-align:center;min-width:6rem;height:2rem}.SaveAsDialog__inputs{padding-left:var(--space-xxl);margin-right:var(--space-xl);flex-direction:row;justify-content:flex-end;align-items:center;display:flex}.SaveAsDialog__input{margin-left:var(--space-xl);width:80%}.SaveAsDialog__label{vertical-align:center}.Dialog__FileList{flex-wrap:wrap;flex-grow:1;align-content:flex-start;max-height:20rem;display:flex;position:relative;overflow-x:auto;overflow-y:scroll}.Dialog__FileEntry{text-align:center;margin:var(--space-xl)}.Dialog__FileIcon{cursor:default;text-align:center;width:6vh;height:auto;margin:0 0 var(--space-xl)0;display:inline-block;position:relative}.Dimmer{background-color:var(--dimmer-background);z-index:100;justify-content:center;align-items:center;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}.Divider--horizontal{margin:var(--space-m)0}.Divider--horizontal:not(.Divider--hidden){border-top:var(--divider-border)}.Divider--vertical{height:100%;margin:0 var(--space-m)}.Divider--vertical:not(.Divider--hidden){border-left:var(--divider-border)}.Button{white-space:nowrap;line-height:var(--button-height);padding:0 var(--space-m);margin-right:var(--space-xs);margin-bottom:var(--space-xs);border-radius:var(--button-border-radius);--button-background:hsl(from var(--color)h s calc(l - var(--adjust-color)));cursor:var(--cursor-pointer);background-color:var(--button-background);color:var(--button-color);transition-property:background-color,color,opacity;transition-duration:var(--button-transition);transition-timing-function:var(--button-transition-timing);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:none;display:inline-block;position:relative}.Button:hover{background-color:hsl(from var(--button-background)h s calc(l + var(--adjust-hover)));color:var(--button-color)}.Button:active{background-color:hsl(from var(--button-background)h s calc(l - var(--adjust-active)));color:var(--button-color);transition:none}.Button:last-child{margin-bottom:0;margin-right:0}.Button__content{align-self:stretch;display:block}.Button__content--ellipsis{align-items:center;display:flex}.Button .Button--icon{text-align:center;min-width:1.333em}.Button.Button--hasIcon{padding-left:0}.Button.Button--hasIcon .Button--icon{margin:0 var(--space-s)}.Button--icon-right.Button--hasIcon{padding-left:var(--space-m);padding-right:var(--space-s)}.Button--icon-right.Button--hasIcon .Button--icon{margin:0 0 0 var(--space-s)}.Button--empty.Button--hasIcon{padding:0}.Button--compact{padding:0 var(--space-s);line-height:1.333em}.Button--compact.Button--hasIcon .Button--icon{margin:0 var(--space-xxs)}.Button--circular{border-radius:var(--border-radius-circular)}.Button--fluid{margin-left:0;margin-right:0;display:block}.Button--ellipsis{text-overflow:ellipsis;margin-right:calc(-1*var(--space-s));display:block;overflow:hidden}.Stack>.Button,.Stack__item>.Button{margin:0}.Button--color--red{--color:var(--color-red);--button-color:var(--color-white)}.Button--color--orange{--color:var(--color-orange);--button-color:var(--color-white)}.Button--color--yellow{--color:var(--color-yellow);--button-color:var(--color-black)}.Button--color--olive{--color:var(--color-olive);--button-color:var(--color-white)}.Button--color--green{--color:var(--color-green);--button-color:var(--color-white)}.Button--color--teal{--color:var(--color-teal);--button-color:var(--color-white)}.Button--color--blue{--color:var(--color-blue);--button-color:var(--color-white)}.Button--color--violet{--color:var(--color-violet);--button-color:var(--color-white)}.Button--color--purple{--color:var(--color-purple);--button-color:var(--color-white)}.Button--color--pink{--color:var(--color-pink);--button-color:var(--color-white)}.Button--color--brown{--color:var(--color-brown);--button-color:var(--color-white)}.Button--color--gold{--color:var(--color-gold);--button-color:var(--color-white)}.Button--color--black{--color:var(--color-black);--button-color:var(--color-white)}.Button--color--white{--color:var(--color-white);--button-color:var(--color-black)}.Button--color--grey,.Button--color--gray{--color:var(--color-grey);--button-color:var(--color-white)}.Button--color--light-grey,.Button--color--light-gray{--color:var(--color-light-grey);--button-color:var(--color-white)}.Button--color--primary{--color:var(--color-primary);--button-color:var(--color-white)}.Button--color--good{--color:var(--color-good);--button-color:var(--color-white)}.Button--color--average{--color:var(--color-average);--button-color:var(--color-white)}.Button--color--bad{--color:var(--color-bad);--button-color:var(--color-white)}.Button--color--label{--color:var(--color-label);--button-color:var(--color-white)}.Button--color--default{--color:var(--button-background-default)}.Button--color--caution{--color:var(--button-background-caution)}.Button--color--danger{--color:var(--button-background-danger)}.Button--color--transparent{--button-background:hsl(from var(--button-color)h s l/.1);--button-color:var(--button-color-transparent);background-color:transparent}.Button--color--transparent:hover{--button-color:hsl(from var(--button-color-transparent)h s l/1)}.Button--color--transparent:active{opacity:.75}.Button--color--transparent.Button--selected{--button-color:hsl(from var(--color)h s calc(l + var(--adjust-color)))}.Button--color--transparent.Button--disabled{--button-background:hsl(from var(--button-color)h s l/.2);--button-color:var(--color-bad);opacity:1;color:var(--button-color)!important}.Button--disabled{opacity:var(--button-disabled-opacity);cursor:var(--cursor-disabled)!important;background-color:var(--button-background-disabled,var(--button-background))!important}.Button--selected{--color:var(--button-background-selected)!important}.Button--flex{flex-direction:column;display:inline-flex}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Dropdown{align-items:stretch;gap:var(--space-s);margin-right:var(--space-xs);margin-bottom:var(--space-xs);display:flex}.Dropdown:last-child{margin-bottom:0;margin-right:0}.Dropdown .Button{align-content:center;margin:0}.Dropdown--fluid{flex:1;width:100%}.Dropdown__control{font-family:var(--font-family);border-radius:var(--button-border-radius);--button-background:hsl(from var(--color)h s calc(l - var(--adjust-color)));height:1.83333em;cursor:var(--cursor-pointer);background-color:var(--button-background);color:var(--button-color);transition-property:background-color,color,opacity;transition-duration:var(--button-transition);transition-timing-function:var(--button-transition-timing);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:1;font-size:1em;line-height:1.33333em;display:flex;overflow:hidden}.Dropdown__control:hover{background-color:hsl(from var(--button-background)h s calc(l + var(--adjust-hover)));color:var(--button-color)}.Dropdown__control:active{background-color:hsl(from var(--button-background)h s calc(l - var(--adjust-active)));color:var(--button-color);transition:none}.Dropdown__selected-text{text-overflow:ellipsis;white-space:nowrap;height:100%;padding:var(--space-s)var(--space-m);border-right:var(--border-thickness-tiny)solid var(--color-border-dark);flex:1;align-content:center;display:inline-block;overflow:hidden}.Dropdown__icon{text-align:center;width:1.83333em;height:100%;transition:transform var(--dropdown-transition);align-content:center;display:inline-block}.Dropdown__icon--arrow.open:not(.over),.Dropdown__icon--arrow.over:not(.open){transform:rotate(180deg)}.Dropdown__icon~.Dropdown__selected-text{padding-left:0}.Dropdown__menu{scrollbar-width:thin;scrollbar-color:var(--color-scrollbar-thumb)transparent;max-height:16.6667em;padding:var(--space-sm);overflow-y:auto}.Dropdown__menu--wrapper{background-color:var(--dropdown-menu-background);color:var(--dropdown-menu-color);border:var(--dropdown-menu-border);border-radius:var(--dropdown-menu-border-radius);-webkit-backdrop-filter:var(--dropdown-menu-blur);backdrop-filter:var(--dropdown-menu-blur);overflow:hidden}.Dropdown__menu--entry{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;font-family:var(--font-family);padding:var(--space-xs)var(--space-m);border-radius:var(--dropdown-entry-border-radius);transition:background-color var(--dropdown-entry-transition);font-size:1em;line-height:1.33333em;overflow:hidden}.Dropdown__menu--entry.selected{transition-duration:0s;background-color:var(--dropdown-entry-background-selected)!important}.Dropdown__menu--entry:not(.selected){cursor:var(--cursor-pointer)}.Dropdown__menu--entry:not(.selected):hover{background-color:var(--dropdown-entry-background-hover);transition-duration:0s}.Dropdown__menu--entry:not(.selected):active{background-color:var(--dropdown-entry-background-active);transition-duration:0s}.Dropdown__control--icon-only{justify-content:center;align-items:center;max-width:2rem;display:flex}.Flex{display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline,.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Floating{z-index:5}.Floating--animated[data-transition=open]{opacity:1;transform:scale(1)}.Floating--animated[data-transition=close],.Floating--animated[data-transition=initial]{opacity:0;transform:scale(.9)}.Floating--animated[data-transition=open],.Floating--animated[data-transition=close]{transition-duration:var(--floating-transition-time);transition-timing-function:var(--floating-transition-timing);transition-property:opacity,transform}.Floating[data-position=top]{transform-origin:bottom}.Floating[data-position=top-start],.Floating[data-position=right-end]{transform-origin:0 100%}.Floating[data-position=top-end],.Floating[data-position=left-end]{transform-origin:100% 100%}.Floating[data-position=bottom]{transform-origin:top}.Floating[data-position=bottom-start],.Floating[data-position=right-start]{transform-origin:0 0}.Floating[data-position=bottom-end],.Floating[data-position=left-start]{transform-origin:100% 0}.Floating[data-position=right]{transform-origin:0}.Floating[data-position=left]{transform-origin:100%}.IconStack{justify-content:center;align-items:center;display:inline-flex;position:relative}.IconStack .Icon:before{vertical-align:middle}.IconStack .Icon:not(:first-child){position:absolute}.ImageButton{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;background-color:hsl(from var(--imagebutton-color)h s calc(l - var(--adjust-color)*2)/var(--imagebutton-transparecy));border:var(--border-thickness-tiny)solid hsl(from var(--imagebutton-color)h s calc(l + var(--adjust-color))/var(--imagebutton-transparecy));border-radius:var(--border-radius-medium);transition-property:background-color,border-color,box-shadow;transition-duration:var(--transition-time-medium);border-width:0;margin:.25em;display:inline-flex;position:relative;overflow:hidden}.ImageButton:not(:-webkit-any(.ImageButton--disabled,.ImageButton--noAction)) .ImageButton__container{cursor:var(--cursor-pointer)}.ImageButton:not(:-moz-any(.ImageButton--disabled,.ImageButton--noAction)) .ImageButton__container{cursor:var(--cursor-pointer)}.ImageButton:not(:is(.ImageButton--disabled,.ImageButton--noAction)) .ImageButton__container{cursor:var(--cursor-pointer)}.ImageButton:not(:-webkit-any(.ImageButton--disabled,.ImageButton--noAction)):not(:-webkit-any(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):hover{background-color:hsl(from var(--imagebutton-color)h s calc(l - var(--adjust-color) + var(--adjust-hover))/var(--imagebutton-transparecy))}.ImageButton:not(:-moz-any(.ImageButton--disabled,.ImageButton--noAction)):not(:-moz-any(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):hover{background-color:hsl(from var(--imagebutton-color)h s calc(l - var(--adjust-color) + var(--adjust-hover))/var(--imagebutton-transparecy))}.ImageButton:not(:is(.ImageButton--disabled,.ImageButton--noAction)):not(:is(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):hover{background-color:hsl(from var(--imagebutton-color)h s calc(l - var(--adjust-color) + var(--adjust-hover))/var(--imagebutton-transparecy))}.ImageButton:not(:-webkit-any(.ImageButton--disabled,.ImageButton--noAction)):not(:-webkit-any(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):active .ImageButton__image{-webkit-filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));transition-duration:0s}.ImageButton:not(:-moz-any(.ImageButton--disabled,.ImageButton--noAction)):not(:-moz-any(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):active .ImageButton__image{-webkit-filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));transition-duration:0s}.ImageButton:not(:is(.ImageButton--disabled,.ImageButton--noAction)):not(:is(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):active .ImageButton__image{-webkit-filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));transition-duration:0s}.ImageButton:not(.ImageButton--fluid) .ImageButton__content{background-color:hsl(from var(--imagebutton-color)h s calc(l - var(--adjust-hover)));border-top:var(--border-thickness-tiny)solid var(--imagebutton-color)}.ImageButton__container{border-color:inherit;transition:opacity var(--transition-time-medium);flex-direction:column;display:flex}.ImageButton__image{pointer-events:none;padding:var(--space-s);border:var(--border-thickness-tiny)solid;border-bottom:none;border-color:inherit;border-radius:var(--border-radius-medium)var(--border-radius-medium)0 0;transition:filter var(--transition-time-slow);align-self:center;line-height:0;position:relative;overflow:hidden}.ImageButton__image--fallback{text-align:center;color:var(--color-text-translucent);align-content:center}.ImageButton__image--fallback:before{zoom:.75;width:100%;display:table}.ImageButton__content{white-space:nowrap;text-overflow:ellipsis;color:var(--color-text-fixed-white);z-index:2;padding:.25em .33em;overflow:hidden}.ImageButton__buttons{left:var(--border-thickness-tiny);z-index:1;max-width:100%;display:flex;position:absolute;bottom:1.8em;overflow:hidden}.ImageButton__buttons--alt{pointer-events:none;top:var(--border-thickness-tiny);text-shadow:0px 1px 2px var(--color-base),-1px 0px 2px var(--color-base),1px 0px 2px var(--color-base),0px -1px 2px var(--color-base);flex-direction:column;overflow:visible;bottom:unset!important}.ImageButton__buttons--empty{bottom:0;left:0}.ImageButton__buttons>*{border-radius:0!important;margin:0!important;padding:0!important}.ImageButton--empty{border-width:var(--border-thickness-tiny)}.ImageButton--empty .ImageButton__image{border-radius:var(--border-radius-medium);border:none}.Stack>.ImageButton,.Stack__item>.ImageButton{margin:0}.ImageButton--fluid{border-width:var(--border-thickness-tiny);flex-direction:row;margin:0 0 .33em;display:flex}.ImageButton--fluid:last-child{margin-bottom:0}.ImageButton--fluid .ImageButton__container{flex-direction:row;flex:1}.ImageButton--fluid .ImageButton__image{border:0;margin:0 auto;padding:0}.ImageButton--fluid .ImageButton__content{white-space:normal;color:var(--color-text);flex-direction:column;flex:1;justify-content:center;margin:0 .5em;padding:0;display:flex}.ImageButton--fluid .ImageButton__content--title{padding:.5em;font-weight:700}.ImageButton--fluid .ImageButton__content--divider{border-bottom:var(--border-thickness-small)solid var(--color-border)}.ImageButton--fluid .ImageButton__content--text{padding:.5em}.ImageButton--fluid .ImageButton__buttons{left:inherit;bottom:inherit;background-color:inherit;position:relative}.ImageButton--fluid .ImageButton__buttons--alt{pointer-events:all;top:inherit;text-shadow:none}.ImageButton--fluid .ImageButton__buttons--alt>*{border-top:1px solid rgba(255,255,255,.075)}.ImageButton--fluid .ImageButton__buttons--alt>:first-child{border-top:0}.ImageButton--fluid .ImageButton__buttons>*{text-align:center;white-space:pre-wrap;border-left:var(--border-thickness-tiny)solid var(--color-border);flex-direction:column;justify-content:center;height:100%;line-height:1.15em;display:inline-flex}.ImageButton__color--red{--imagebutton-color:var(--color-red)}.ImageButton__color--orange{--imagebutton-color:var(--color-orange)}.ImageButton__color--yellow{--imagebutton-color:var(--color-yellow);--color-text-fixed-white:var(--color-black)}.ImageButton__color--olive{--imagebutton-color:var(--color-olive)}.ImageButton__color--green{--imagebutton-color:var(--color-green)}.ImageButton__color--teal{--imagebutton-color:var(--color-teal)}.ImageButton__color--blue{--imagebutton-color:var(--color-blue)}.ImageButton__color--violet{--imagebutton-color:var(--color-violet)}.ImageButton__color--purple{--imagebutton-color:var(--color-purple)}.ImageButton__color--pink{--imagebutton-color:var(--color-pink)}.ImageButton__color--brown{--imagebutton-color:var(--color-brown)}.ImageButton__color--gold{--imagebutton-color:var(--color-gold)}.ImageButton__color--black{--imagebutton-color:var(--color-black)}.ImageButton__color--white{--imagebutton-color:var(--color-white);--color-text-fixed-white:var(--color-black)}.ImageButton__color--grey,.ImageButton__color--gray{--imagebutton-color:var(--color-grey)}.ImageButton__color--light-grey,.ImageButton__color--light-gray{--imagebutton-color:var(--color-light-grey)}.ImageButton__color--good{--imagebutton-color:var(--color-good)}.ImageButton__color--average{--imagebutton-color:var(--color-average)}.ImageButton__color--bad{--imagebutton-color:var(--color-bad)}.ImageButton__color--label{--imagebutton-color:var(--color-label)}.ImageButton__color--transparent{--imagebutton-color:var(--color-text-translucent-light);--imagebutton-transparecy:.1;background-color:transparent;border-color:transparent!important}.ImageButton__color--transparent .ImageButton__content{color:var(--color-text-translucent-light);background-color:transparent!important;border-color:transparent!important}.ImageButton__color--transparent.ImageButton--disabled{background-color:hsL(from var(--color-red)h s l/.15)!important}.ImageButton__color--transparent.ImageButton--selected{background-color:hsL(from var(--color-good)h s l/.15)}.ImageButton__color--default{--imagebutton-color:hsl(from var(--color-base)h s 30)}.ImageButton__color--primary{--imagebutton-color:hsl(from var(--color-primary)h s l)}.ImageButton--selected{--imagebutton-color:hsl(from var(--button-background-selected)h s calc(l*1.15));--color-text-fixed-white:var(--color-white)}.ImageButton--disabled .ImageButton__container{cursor:var(--cursor-disabled);opacity:.5}.ImageButton--disabled.ImageButton--fluid{-webkit-filter:contrast(75%);filter:contrast(75%)}.ImageButton--disabled.ImageButton--fluid .ImageButton__buttons{-webkit-filter:contrast(125%);filter:contrast(125%)}.Input{background-color:var(--input-background);border-radius:var(--input-border-radius);border:var(--border-thickness-tiny)solid var(--input-border-color);color:var(--input-color);font-size:1em;font-family:var(--input-font-family);padding:var(--space-xxs)var(--space-sm);width:var(--input-width)}.Input:focus{outline:none}.Input:focus-within{border-color:var(--input-border-color-focus)}.Input::-webkit-input-placeholder{color:var(--input-color-placeholder);font-style:italic}.Input::-ms-input-placeholder{color:var(--input-color-placeholder);font-style:italic}.Input::placeholder{color:var(--input-color-placeholder);font-style:italic}.Input--disabled{border-color:var(--input-border-disabled);color:var(--input-color-placeholder)}.Input--fluid{width:100%}.Input--monospace{font-family:var(--input-font-family-mono)}.Knob{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:var(--cursor-n-resize);width:2.6em;height:2.6em;margin:0 auto -.2em;font-size:1rem;position:relative}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{inset:var(--knob-inner-padding);background-color:var(--knob-color);background-image:linear-gradient(to bottom,hsl(from var(--knob-color)h s calc(l + 15))0%,var(--knob-color)100%);border-radius:var(--border-radius-circular);box-shadow:var(--shadow-glow-medium)hsl(from var(--knob-color)h s l/.25);margin:.3em;position:absolute}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{background-color:hsl(from var(--knob-color)h s 85);width:.2em;height:.8em;margin:0 auto;position:relative;top:.05em}.Knob__popupValue{white-space:nowrap;text-align:center;padding:var(--space-s)var(--space-m);background-color:var(--knob-popup-background);color:var(--knob-popup-color);border-radius:var(--knob-popup-border-radius);-webkit-backdrop-filter:var(--knob-popup-blur);backdrop-filter:var(--knob-popup-blur);font-size:1rem;position:absolute;top:0;left:50%;transform:translateY(-100%)translate(-50%)}.Knob__ring{padding:var(--knob-inner-padding);position:absolute;top:0;bottom:0;left:0;right:0;overflow:visible}.Knob__ringTrackPivot{transform:rotate(135deg)}.Knob__ringTrack{fill:transparent;stroke:hsl(from var(--ring-color,var(--knob-ring-color))h s l/.15);stroke-width:8px;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotate(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.Knob__ringFill{fill:transparent;stroke:var(--ring-color,var(--knob-ring-color));stroke-width:8px;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke var(--transition-time-medium)ease-out}.Knob--color--red{--ring-color:var(--color-red)}.Knob--color--orange{--ring-color:var(--color-orange)}.Knob--color--yellow{--ring-color:var(--color-yellow)}.Knob--color--olive{--ring-color:var(--color-olive)}.Knob--color--green{--ring-color:var(--color-green)}.Knob--color--teal{--ring-color:var(--color-teal)}.Knob--color--blue{--ring-color:var(--color-blue)}.Knob--color--violet{--ring-color:var(--color-violet)}.Knob--color--purple{--ring-color:var(--color-purple)}.Knob--color--pink{--ring-color:var(--color-pink)}.Knob--color--brown{--ring-color:var(--color-brown)}.Knob--color--gold{--ring-color:var(--color-gold)}.Knob--color--black{--ring-color:var(--color-black)}.Knob--color--white{--ring-color:var(--color-white)}.Knob--color--grey,.Knob--color--gray{--ring-color:var(--color-grey)}.Knob--color--light-grey,.Knob--color--light-gray{--ring-color:var(--color-light-grey)}.Knob--color--primary{--ring-color:var(--color-primary)}.Knob--color--good{--ring-color:var(--color-good)}.Knob--color--average{--ring-color:var(--color-average)}.Knob--color--bad{--ring-color:var(--color-bad)}.Knob--color--label{--ring-color:var(--color-label)}.LabeledList{border-collapse:collapse;border-spacing:0;width:calc(100% + 1em);margin:calc(-1*var(--space-s))calc(-1*var(--space-m))0;padding:0;display:table}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{padding:var(--space-s)var(--space-m);text-align:left;border:0;margin:0;display:table-cell}.LabeledList__label--nowrap{white-space:nowrap;width:1%;min-width:5em}.LabeledList__buttons{white-space:nowrap;text-align:right;width:.1%;padding-top:var(--space-xxs);padding-bottom:0}.LabeledList__breakContents{word-break:break-all;word-wrap:break-word}.MenuBar{display:flex}.MenuBar__font{font-family:var(--menu-bar-font-family);font-size:1em;line-height:1.41667em}.MenuBar__hover:hover{background-color:hsl(from var(--menu-bar-background)h s calc(l + 20));transition:background-color}.MenuBar__MenuBarButton{padding:var(--space-s)var(--space-m)}.MenuBar__menu{background-color:var(--menu-bar-background);padding:var(--space-sm);z-index:5;position:absolute;box-shadow:4px 6px 5px -2px rgba(0,0,0,.5)}.MenuBar__MenuItem{transition:background-color var(--menu-bar-transition)ease-out;background-color:var(--menu-bar-background);white-space:nowrap;padding:var(--space-sm)var(--space-xl)var(--space-sm)calc(var(--space-xxl) + 1rem)}.MenuBar__MenuItemToggle{padding:var(--space-sm)var(--space-xl)var(--space-sm)0}.MenuBar__MenuItemToggle__check{vertical-align:middle;text-align:center;min-width:2.5rem;padding-left:var(--space-sm);display:inline-block}.MenuBar__over{top:auto;bottom:100%}.MenuBar__MenuBarButton-text{text-overflow:clip;white-space:nowrap;height:1.41667em}.MenuBar__Separator{margin:var(--space-sm);border-top:var(--border-thickness-tiny)solid var(--color-border);display:block}.Modal{background-color:var(--modal-background);padding:var(--modal-padding)}.Modal__dimmer .Dimmer__inner{max-width:calc(100vw - var(--space-xxl));max-height:calc(100vh - var(--space-xxl))}.NoticeBox{--noticebox-background:var(--notice-box-background);padding:var(--space-sm)var(--space-m);margin-bottom:var(--space-m);background-color:oklch(from var(--noticebox-background)calc(l*.825)calc(c*.75)h);background-image:repeating-linear-gradient(-45deg,transparent 0 .833333em,var(--notice-box-stripes).833333em 1.66667em);color:var(--notice-box-color);font-style:italic;font-weight:700}.NoticeBox--color--red{--noticebox-background:var(--color-red)}.NoticeBox--color--orange{--noticebox-background:var(--color-orange)}.NoticeBox--color--yellow{--noticebox-background:var(--color-yellow);--notice-box-color:var(--color-black)}.NoticeBox--color--olive{--noticebox-background:var(--color-olive)}.NoticeBox--color--green{--noticebox-background:var(--color-green)}.NoticeBox--color--teal{--noticebox-background:var(--color-teal)}.NoticeBox--color--blue{--noticebox-background:var(--color-blue)}.NoticeBox--color--violet{--noticebox-background:var(--color-violet)}.NoticeBox--color--purple{--noticebox-background:var(--color-purple)}.NoticeBox--color--pink{--noticebox-background:var(--color-pink)}.NoticeBox--color--brown{--noticebox-background:var(--color-brown)}.NoticeBox--color--gold{--noticebox-background:var(--color-gold)}.NoticeBox--color--black{--noticebox-background:var(--color-black);--notice-box-stripes:rgba(255,255,255,.1)}.NoticeBox--color--white{--noticebox-background:var(--color-white);--notice-box-color:var(--color-black)}.NoticeBox--color--grey,.NoticeBox--color--gray{--noticebox-background:var(--color-grey)}.NoticeBox--color--light-grey,.NoticeBox--color--light-gray{--noticebox-background:var(--color-light-grey)}.NoticeBox--color--primary{--noticebox-background:var(--color-primary)}.NoticeBox--color--good{--noticebox-background:var(--color-good)}.NoticeBox--color--average{--noticebox-background:var(--color-average)}.NoticeBox--color--bad{--noticebox-background:var(--color-bad)}.NoticeBox--color--label{--noticebox-background:var(--color-label)}.NoticeBox--type--info{--noticebox-background:var(--color-blue)}.NoticeBox--type--success{--noticebox-background:var(--color-green)}.NoticeBox--type--warning{--noticebox-background:var(--color-orange)}.NoticeBox--type--danger{--noticebox-background:var(--color-red)}.NumberInput{cursor:var(--cursor-n-resize);text-align:right;padding:0 var(--space-sm);margin-right:var(--space-xs);background-color:var(--number-input-background);color:var(--number-input-border-color-active);border:var(--border-thickness-tiny)solid var(--number-input-border-color);border-radius:var(--number-input-border-radius);transition:border-color var(--number-input-transition);line-height:1.41667em;display:inline-block;position:relative;overflow:visible}.NumberInput:active{border-color:var(--number-input-border-color-active)}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:var(--space-m)}.NumberInput__barContainer{top:var(--space-xs);bottom:var(--space-xs);left:var(--space-xs);position:absolute}.NumberInput__bar{box-sizing:border-box;border-bottom:var(--border-thickness-tiny)solid var(--number-input-border-color-active);background-color:var(--number-input-border-color-active);width:.25em;position:absolute;bottom:0;left:0}.NumberInput__input{text-align:right;width:100%;height:1.41667em;padding:0 var(--space-m);font-size:1em;line-height:1.41667em;font-family:var(--font-family);background-color:var(--number-input-background);color:var(--number-input-color);border:0;outline:0;margin:0;display:block;position:absolute;top:0;bottom:0;left:0;right:0}.ProgressBar{width:100%;min-height:var(--button-height);padding:0 var(--space-m);background-color:var(--progress-bar-background);border:var(--border-thickness-tiny)solid var(--progress-bar-color);border-radius:var(--progress-bar-border-radius);transition:border-color var(--progress-bar-transition)ease-out;align-content:center;display:inline-block;position:relative}.ProgressBar__fill{background-color:var(--progress-bar-color);position:absolute;top:0;bottom:0;left:0;right:0}.ProgressBar__fill--animated{transition-property:background-color,width;transition-duration:var(--progress-bar-transition)}.ProgressBar__content{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:right;width:100%;position:relative}.ProgressBar--color--default{--progress-bar-color:hsl(from var(--progress-bar-fill)h s calc(l - var(--adjust-color)))}.ProgressBar--color--red{--progress-bar-color:hsl(from var(--color-red)h s calc(l - var(--adjust-color)))}.ProgressBar--color--orange{--progress-bar-color:hsl(from var(--color-orange)h s calc(l - var(--adjust-color)))}.ProgressBar--color--yellow{--progress-bar-color:hsl(from var(--color-yellow)h s calc(l - var(--adjust-color)))}.ProgressBar--color--olive{--progress-bar-color:hsl(from var(--color-olive)h s calc(l - var(--adjust-color)))}.ProgressBar--color--green{--progress-bar-color:hsl(from var(--color-green)h s calc(l - var(--adjust-color)))}.ProgressBar--color--teal{--progress-bar-color:hsl(from var(--color-teal)h s calc(l - var(--adjust-color)))}.ProgressBar--color--blue{--progress-bar-color:hsl(from var(--color-blue)h s calc(l - var(--adjust-color)))}.ProgressBar--color--violet{--progress-bar-color:hsl(from var(--color-violet)h s calc(l - var(--adjust-color)))}.ProgressBar--color--purple{--progress-bar-color:hsl(from var(--color-purple)h s calc(l - var(--adjust-color)))}.ProgressBar--color--pink{--progress-bar-color:hsl(from var(--color-pink)h s calc(l - var(--adjust-color)))}.ProgressBar--color--brown{--progress-bar-color:hsl(from var(--color-brown)h s calc(l - var(--adjust-color)))}.ProgressBar--color--gold{--progress-bar-color:hsl(from var(--color-gold)h s calc(l - var(--adjust-color)))}.ProgressBar--color--black{--progress-bar-color:hsl(from var(--color-black)h s calc(l - var(--adjust-color)))}.ProgressBar--color--white{--progress-bar-color:hsl(from var(--color-white)h s calc(l - var(--adjust-color)))}.ProgressBar--color--grey,.ProgressBar--color--gray{--progress-bar-color:hsl(from var(--color-grey)h s calc(l - var(--adjust-color)))}.ProgressBar--color--light-grey,.ProgressBar--color--light-gray{--progress-bar-color:hsl(from var(--color-light-grey)h s calc(l - var(--adjust-color)))}.ProgressBar--color--primary{--progress-bar-color:hsl(from var(--color-primary)h s calc(l - var(--adjust-color)))}.ProgressBar--color--good{--progress-bar-color:hsl(from var(--color-good)h s calc(l - var(--adjust-color)))}.ProgressBar--color--average{--progress-bar-color:hsl(from var(--color-average)h s calc(l - var(--adjust-color)))}.ProgressBar--color--bad{--progress-bar-color:hsl(from var(--color-bad)h s calc(l - var(--adjust-color)))}.ProgressBar--color--label{--progress-bar-color:hsl(from var(--color-label)h s calc(l - var(--adjust-color)))}.RestrictedInput{border-color:var(--restricted-input-border-color);text-align:right}.RestrictedInput:focus-within{border-color:var(--restricted-input-border-color-focus)}.RestrictedInput::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.RestrictedInput::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.RestrictedInput--invalid{border-color:var(--restricted-input-border-color-invalid)}.RestrictedInput--invalid:focus-within{border-color:var(--restricted-input-border-color-invalid)}@keyframes RoundGauge__alertAnim{0%,to{opacity:.1}50%{opacity:1}}@keyframes RoundGauge__needleAlertAnim{0%{transform:rotate(var(--round-gauge-needle-alert-rotation))}50%{transform:rotate(calc(-1*var(--round-gauge-needle-alert-rotation)))}}.RoundGauge{width:2.6em;height:1.3em;margin:0 auto .2em;font-size:1rem}.RoundGauge__wrapper{text-align:center;display:inline-block}.RoundGauge__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:10px;stroke-dasharray:157.08;stroke-dashoffset:157.08px}.RoundGauge__ringFill{fill:transparent;stroke:var(--round-gauge-ring-color);stroke-width:10px;stroke-dasharray:314.16;transition:stroke var(--round-gauge-transition)ease-out}.RoundGauge__needle,.RoundGauge__ringFill{transition:transform var(--round-gauge-transition)ease-in-out}.RoundGauge__needleLine,.RoundGauge__needleMiddle{fill:var(--color-red)}.RoundGauge__alert{fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;fill:rgba(255,255,255,.1);transform-origin:top;transform:scale(.9)}.RoundGauge__alert.active{animation:RoundGauge__alertAnim var(--round-gauge-alert-animation)cubic-bezier(.34,1.56,.64,1)infinite}.RoundGauge__alert.active~.RoundGauge__needle .RoundGauge__needleLine{transform-origin:bottom;animation:RoundGauge__needleAlertAnim var(--round-gauge-needle-alert-animation)infinite}.RoundGauge__alert.max{fill:var(--color-bad)}.RoundGauge--color--red.RoundGauge__ringFill{stroke:var(--color-red)}.RoundGauge--color--orange.RoundGauge__ringFill{stroke:var(--color-orange)}.RoundGauge--color--yellow.RoundGauge__ringFill{stroke:var(--color-yellow)}.RoundGauge--color--olive.RoundGauge__ringFill{stroke:var(--color-olive)}.RoundGauge--color--green.RoundGauge__ringFill{stroke:var(--color-green)}.RoundGauge--color--teal.RoundGauge__ringFill{stroke:var(--color-teal)}.RoundGauge--color--blue.RoundGauge__ringFill{stroke:var(--color-blue)}.RoundGauge--color--violet.RoundGauge__ringFill{stroke:var(--color-violet)}.RoundGauge--color--purple.RoundGauge__ringFill{stroke:var(--color-purple)}.RoundGauge--color--pink.RoundGauge__ringFill{stroke:var(--color-pink)}.RoundGauge--color--brown.RoundGauge__ringFill{stroke:var(--color-brown)}.RoundGauge--color--gold.RoundGauge__ringFill{stroke:var(--color-gold)}.RoundGauge--color--black.RoundGauge__ringFill{stroke:var(--color-black)}.RoundGauge--color--white.RoundGauge__ringFill{stroke:var(--color-white)}.RoundGauge--color--grey.RoundGauge__ringFill,.RoundGauge--color--gray.RoundGauge__ringFill{stroke:var(--color-grey)}.RoundGauge--color--light-grey.RoundGauge__ringFill,.RoundGauge--color--light-gray.RoundGauge__ringFill{stroke:var(--color-light-grey)}.RoundGauge--color--primary.RoundGauge__ringFill{stroke:var(--color-primary)}.RoundGauge--color--good.RoundGauge__ringFill{stroke:var(--color-good)}.RoundGauge--color--average.RoundGauge__ringFill{stroke:var(--color-average)}.RoundGauge--color--bad.RoundGauge__ringFill{stroke:var(--color-bad)}.RoundGauge--color--label.RoundGauge__ringFill{stroke:var(--color-label)}.RoundGauge__alert--red{fill:var(--color-red)}.RoundGauge__alert--orange{fill:var(--color-orange)}.RoundGauge__alert--yellow{fill:var(--color-yellow)}.RoundGauge__alert--olive{fill:var(--color-olive)}.RoundGauge__alert--green{fill:var(--color-green)}.RoundGauge__alert--teal{fill:var(--color-teal)}.RoundGauge__alert--blue{fill:var(--color-blue)}.RoundGauge__alert--violet{fill:var(--color-violet)}.RoundGauge__alert--purple{fill:var(--color-purple)}.RoundGauge__alert--pink{fill:var(--color-pink)}.RoundGauge__alert--brown{fill:var(--color-brown)}.RoundGauge__alert--gold{fill:var(--color-gold)}.RoundGauge__alert--black{fill:var(--color-black)}.RoundGauge__alert--white{fill:var(--color-white)}.RoundGauge__alert--grey,.RoundGauge__alert--gray{fill:var(--color-grey)}.RoundGauge__alert--light-grey,.RoundGauge__alert--light-gray{fill:var(--color-light-grey)}.RoundGauge__alert--primary{fill:var(--color-primary)}.RoundGauge__alert--good{fill:var(--color-good)}.RoundGauge__alert--average{fill:var(--color-average)}.RoundGauge__alert--bad{fill:var(--color-bad)}.RoundGauge__alert--label{fill:var(--color-label)}.Section{margin-bottom:var(--space-m);background-color:var(--section-background);box-sizing:border-box;scrollbar-color:var(--color-scrollbar-thumb)transparent;position:relative}.Section:last-child{margin-bottom:0}.Section__title{padding:var(--space-m);border-bottom:var(--section-separator-thickness)solid var(--section-separator-color);position:relative}.Section__titleText{color:var(--section-title-color);font-size:1.16667em;font-weight:700}.Section__buttons{right:var(--space-m);margin-top:calc(-1*var(--space-xxs));display:inline-block;position:absolute}.Section__rest{position:relative}.Section__content{padding:var(--space-ml)var(--space-m)}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{flex-direction:column;height:100%;display:flex}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;bottom:0;left:0;right:0}.Section--scrollable{overflow:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-x:hidden;overflow-y:scroll}.Section--scrollableHorizontal{overflow:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-x:scroll;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal{overflow:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow:scroll}.Section .Section{margin:0 calc(-1*var(--space-m));background-color:transparent}.Section .Section:first-child{margin-top:calc(-1*var(--space-m))}.Section .Section .Section__titleText{font-size:1.08333em}.Section .Section .Section .Section__titleText{font-size:1em}.Section--flex{flex-flow:column;display:flex}.Section--flex .Section__content{flex-grow:1;overflow:auto}.Section__content--noTopPadding{padding-top:0}.Section__content--stretchContents{height:calc(100% - 3rem)}.Slider{cursor:e-resize;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.Slider--editing .Slider__cursor:before{display:none}.Slider__cursor{inset:0 calc(-1*var(--space-xxs));left:unset;border-left:var(--border-thickness-small)solid var(--slider-cursor-color);border-radius:var(--border-radius-circular);position:absolute}.Slider__cursorOffset{position:absolute;top:0;bottom:0;left:0;right:0;transition:none!important}.Slider__cursor:before{content:"";aspect-ratio:1;border-left:inherit;transform-origin:50%;position:absolute;bottom:0;right:0;transform:scale(4)translateY(50%)rotate(45deg);-webkit-mask-image:linear-gradient(135deg,#000 50%,transparent 50%);mask-image:linear-gradient(135deg,#000 50%,transparent 50%)}.Slider__popupValue{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;padding:var(--space-s)var(--space-m);background-color:var(--slider-popup-background);color:var(--slider-popup-color);border-radius:var(--slider-popup-border-radius);-webkit-backdrop-filter:var(--slider-popup-blur);backdrop-filter:var(--slider-popup-blur);font-size:1em;position:absolute;top:-2em;right:0;transform:translate(50%)}.Slider .NumberInput__input{width:auto;height:auto;top:2px;bottom:2px;left:2px;right:2px}.Stack{gap:.5em}.Stack--fill{height:100%}.Stack--zebra>.Stack__item:nth-child(odd){background-color:var(--candystripe-odd)}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:var(--divider-border)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:var(--divider-border)}.Table{border-collapse:collapse;border-spacing:0;width:100%;margin:0;display:table}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{padding:0 var(--space-s);display:table-cell}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{padding-bottom:var(--space-m);font-weight:700}.Table__cell--collapsing{white-space:nowrap;width:1%}.Tabs{background-color:var(--tabs-container-background);align-items:stretch;display:flex;overflow:hidden}.Tabs--fill{height:100%}.Tabs--vertical{padding:var(--space-s)0 var(--space-s)var(--space-s);flex-direction:column}.Tabs--horizontal{margin-bottom:var(--space-m);padding:var(--space-s)var(--space-s)0}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:var(--cursor-pointer);background-color:var(--tab-background);color:var(--tab-color);min-width:4em;min-height:2.25em;transition-property:background-color,color;transition-duration:var(--tab-transition);justify-content:space-between;align-items:center;display:flex}.Tab:not(.Tab--selected):hover{background-color:var(--tab-background-hover)}.Tab:not(.Tab--selected):active{color:var(--tab-color-selected)}.Tab--selected{cursor:var(--cursor-default);background-color:var(--tab-background-selected);color:var(--tab-color-selected)}.Tab .Tab__text{margin:0 var(--space-m);flex-grow:1}.Tab__left{text-align:center;min-width:1.5em;margin-left:var(--space-s)}.Tab__right{text-align:center;min-width:1.5em;margin-right:var(--space-s)}.Tabs--horizontal .Tab{border-top-left-radius:var(--tab-border-radius);border-top-right-radius:var(--tab-border-radius);padding-bottom:var(--tab-indicator-size);position:relative}.Tabs--horizontal .Tab:before{content:"";transition:transform var(--tab-transition);width:100%;height:var(--tab-indicator-size);background-color:currentColor;position:absolute;bottom:0;transform:scaleX(0)}.Tabs--horizontal .Tab--selected:before{transform:scaleX(.99999)!important}.Tabs--vertical .Tab{border-top-left-radius:var(--tab-border-radius);border-bottom-left-radius:var(--tab-border-radius);min-height:2em;padding-right:var(--tab-indicator-size);position:relative}.Tabs--vertical .Tab:before{content:"";transition:transform var(--tab-transition);width:var(--tab-indicator-size);background-color:currentColor;height:100%;position:absolute;right:0;transform:scaleY(0)}.Tabs--vertical .Tab--selected:before{transform:scaleY(.99999)!important}.Tab--selected.Tab--color--red{color:hsl(from var(--color-red)h s calc(l + 17.5))}.Tab--selected.Tab--color--orange{color:hsl(from var(--color-orange)h s calc(l + 17.5))}.Tab--selected.Tab--color--yellow{color:hsl(from var(--color-yellow)h s calc(l + 17.5))}.Tab--selected.Tab--color--olive{color:hsl(from var(--color-olive)h s calc(l + 17.5))}.Tab--selected.Tab--color--green{color:hsl(from var(--color-green)h s calc(l + 17.5))}.Tab--selected.Tab--color--teal{color:hsl(from var(--color-teal)h s calc(l + 17.5))}.Tab--selected.Tab--color--blue{color:hsl(from var(--color-blue)h s calc(l + 17.5))}.Tab--selected.Tab--color--violet{color:hsl(from var(--color-violet)h s calc(l + 17.5))}.Tab--selected.Tab--color--purple{color:hsl(from var(--color-purple)h s calc(l + 17.5))}.Tab--selected.Tab--color--pink{color:hsl(from var(--color-pink)h s calc(l + 17.5))}.Tab--selected.Tab--color--brown{color:hsl(from var(--color-brown)h s calc(l + 17.5))}.Tab--selected.Tab--color--gold{color:hsl(from var(--color-gold)h s calc(l + 17.5))}.Tab--selected.Tab--color--black{color:hsl(from var(--color-black)h s calc(l + 17.5))}.Tab--selected.Tab--color--white{color:hsl(from var(--color-white)h s calc(l + 17.5))}.Tab--selected.Tab--color--grey,.Tab--selected.Tab--color--gray{color:hsl(from var(--color-grey)h s calc(l + 17.5))}.Tab--selected.Tab--color--light-grey,.Tab--selected.Tab--color--light-gray{color:hsl(from var(--color-light-grey)h s calc(l + 17.5))}.Tab--selected.Tab--color--primary{color:hsl(from var(--color-primary)h s calc(l + 17.5))}.Tab--selected.Tab--color--good{color:hsl(from var(--color-good)h s calc(l + 17.5))}.Tab--selected.Tab--color--average{color:hsl(from var(--color-average)h s calc(l + 17.5))}.Tab--selected.Tab--color--bad{color:hsl(from var(--color-bad)h s calc(l + 17.5))}.Tab--selected.Tab--color--label{color:hsl(from var(--color-label)h s calc(l + 17.5))}.Section .Tabs{background-color:transparent}.Section:not(.Section--fitted) .Tabs{margin:0 calc(-1*var(--space-m))var(--space-m)}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:calc(-1*var(--space-m))}.TextArea{resize:none;scrollbar-width:thin;scrollbar-gutter:stable;scrollbar-color:var(--color-scrollbar-thumb)transparent}.Tooltip{-webkit-backdrop-filter:var(--tooltip-blur);backdrop-filter:var(--tooltip-blur);background-color:var(--tooltip-background);border-radius:var(--tooltip-border-radius);color:var(--tooltip-color);max-width:20.8333em;padding:var(--space-m)var(--space-l);pointer-events:none;text-align:left;box-shadow:.1em .1em 1.25em -.1em rgba(0,0,0,.5)}html,body{box-sizing:border-box;height:100%;font-size:var(--font-size,12px);color:var(--color-text,#fff);scrollbar-color:var(--color-scrollbar-thumb)var(--color-scrollbar-base);margin:0}html{cursor:var(--cursor-default,default);overflow:hidden}body{font-family:var(--font-family,Verdana,Geneva,sans-serif);overflow:auto}img{image-rendering:pixelated}*,:before,:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{padding:var(--space-m,6px)0;padding:var(--space-m,.5rem)0;margin:0;display:block}h1{font-size:1.5rem}h2{font-size:1.333rem}h3{font-size:1.167rem}h4{font-size:1rem}td,th{vertical-align:baseline;text-align:left}:where(.candystripe:nth-child(odd)){background-color:var(--candystripe-odd)}:where(.candystripe:nth-child(2n)){background-color:var(--candystripe-even)}.color-black{color:hsl(from var(--color-black)h s calc(l + var(--adjust-color)))!important}.color-white{color:hsl(from var(--color-white)h s calc(l + var(--adjust-color)))!important}.color-red{color:hsl(from var(--color-red)h s calc(l + var(--adjust-color)))!important}.color-orange{color:hsl(from var(--color-orange)h s calc(l + var(--adjust-color)))!important}.color-yellow{color:hsl(from var(--color-yellow)h s calc(l + var(--adjust-color)))!important}.color-olive{color:hsl(from var(--color-olive)h s calc(l + var(--adjust-color)))!important}.color-green{color:hsl(from var(--color-green)h s calc(l + var(--adjust-color)))!important}.color-teal{color:hsl(from var(--color-teal)h s calc(l + var(--adjust-color)))!important}.color-blue{color:hsl(from var(--color-blue)h s calc(l + var(--adjust-color)))!important}.color-violet{color:hsl(from var(--color-violet)h s calc(l + var(--adjust-color)))!important}.color-purple{color:hsl(from var(--color-purple)h s calc(l + var(--adjust-color)))!important}.color-pink{color:hsl(from var(--color-pink)h s calc(l + var(--adjust-color)))!important}.color-brown{color:hsl(from var(--color-brown)h s calc(l + var(--adjust-color)))!important}.color-grey,.color-gray{color:hsl(from var(--color-grey)h s calc(l + var(--adjust-color)))!important}.color-light-grey,.color-light-gray{color:hsl(from var(--color-light-grey)h s calc(l + var(--adjust-color)))!important}.color-good{color:hsl(from var(--color-good)h s calc(l + var(--adjust-color)))!important}.color-average{color:hsl(from var(--color-average)h s calc(l + var(--adjust-color)))!important}.color-bad{color:hsl(from var(--color-bad)h s calc(l + var(--adjust-color)))!important}.color-label{color:hsl(from var(--color-label)h s calc(l + var(--adjust-color)))!important}.color-bg-black{background-color:hsl(from var(--color-black)h s calc(l - var(--adjust-color)))!important}.color-bg-white{background-color:hsl(from var(--color-white)h s calc(l - var(--adjust-color)))!important}.color-bg-red{background-color:hsl(from var(--color-red)h s calc(l - var(--adjust-color)))!important}.color-bg-orange{background-color:hsl(from var(--color-orange)h s calc(l - var(--adjust-color)))!important}.color-bg-yellow{background-color:hsl(from var(--color-yellow)h s calc(l - var(--adjust-color)))!important}.color-bg-olive{background-color:hsl(from var(--color-olive)h s calc(l - var(--adjust-color)))!important}.color-bg-green{background-color:hsl(from var(--color-green)h s calc(l - var(--adjust-color)))!important}.color-bg-teal{background-color:hsl(from var(--color-teal)h s calc(l - var(--adjust-color)))!important}.color-bg-blue{background-color:hsl(from var(--color-blue)h s calc(l - var(--adjust-color)))!important}.color-bg-violet{background-color:hsl(from var(--color-violet)h s calc(l - var(--adjust-color)))!important}.color-bg-purple{background-color:hsl(from var(--color-purple)h s calc(l - var(--adjust-color)))!important}.color-bg-pink{background-color:hsl(from var(--color-pink)h s calc(l - var(--adjust-color)))!important}.color-bg-brown{background-color:hsl(from var(--color-brown)h s calc(l - var(--adjust-color)))!important}.color-bg-grey,.color-bg-gray{background-color:hsl(from var(--color-grey)h s calc(l - var(--adjust-color)))!important}.color-bg-light-grey,.color-bg-light-gray{background-color:hsl(from var(--color-light-grey)h s calc(l - var(--adjust-color)))!important}.color-bg-good{background-color:hsl(from var(--color-good)h s calc(l - var(--adjust-color)))!important}.color-bg-average{background-color:hsl(from var(--color-average)h s calc(l - var(--adjust-color)))!important}.color-bg-bad{background-color:hsl(from var(--color-bad)h s calc(l - var(--adjust-color)))!important}.color-bg-label{background-color:hsl(from var(--color-label)h s calc(l - var(--adjust-color)))!important}.debug-layout,.debug-layout :not(g):not(path){color:rgba(255,255,255,.9)!important;box-shadow:none!important;-webkit-filter:none!important;filter:none!important;background:0 0!important;outline:1px solid rgba(255,255,255,.5)!important}.debug-layout:hover,.debug-layout :not(g):not(path):hover{outline-color:rgba(255,255,255,.8)!important}.outline-dotted{outline-style:dotted!important}.outline-dashed{outline-style:dashed!important}.outline-solid{outline-style:solid!important}.outline-double{outline-style:double!important}.outline-groove{outline-style:groove!important}.outline-ridge{outline-style:ridge!important}.outline-inset{outline-style:inset!important}.outline-outset{outline-style:outset!important}.outline-color-black{outline:var(--border-thickness-small)solid hsl(from var(--color-black)h s calc(l + var(--adjust-color)))!important}.outline-color-white{outline:var(--border-thickness-small)solid hsl(from var(--color-white)h s calc(l + var(--adjust-color)))!important}.outline-color-red{outline:var(--border-thickness-small)solid hsl(from var(--color-red)h s calc(l + var(--adjust-color)))!important}.outline-color-orange{outline:var(--border-thickness-small)solid hsl(from var(--color-orange)h s calc(l + var(--adjust-color)))!important}.outline-color-yellow{outline:var(--border-thickness-small)solid hsl(from var(--color-yellow)h s calc(l + var(--adjust-color)))!important}.outline-color-olive{outline:var(--border-thickness-small)solid hsl(from var(--color-olive)h s calc(l + var(--adjust-color)))!important}.outline-color-green{outline:var(--border-thickness-small)solid hsl(from var(--color-green)h s calc(l + var(--adjust-color)))!important}.outline-color-teal{outline:var(--border-thickness-small)solid hsl(from var(--color-teal)h s calc(l + var(--adjust-color)))!important}.outline-color-blue{outline:var(--border-thickness-small)solid hsl(from var(--color-blue)h s calc(l + var(--adjust-color)))!important}.outline-color-violet{outline:var(--border-thickness-small)solid hsl(from var(--color-violet)h s calc(l + var(--adjust-color)))!important}.outline-color-purple{outline:var(--border-thickness-small)solid hsl(from var(--color-purple)h s calc(l + var(--adjust-color)))!important}.outline-color-pink{outline:var(--border-thickness-small)solid hsl(from var(--color-pink)h s calc(l + var(--adjust-color)))!important}.outline-color-brown{outline:var(--border-thickness-small)solid hsl(from var(--color-brown)h s calc(l + var(--adjust-color)))!important}.outline-color-grey,.outline-color-gray{outline:var(--border-thickness-small)solid hsl(from var(--color-grey)h s calc(l + var(--adjust-color)))!important}.outline-color-light-grey,.outline-color-light-gray{outline:var(--border-thickness-small)solid hsl(from var(--color-light-grey)h s calc(l + var(--adjust-color)))!important}.outline-color-good{outline:var(--border-thickness-small)solid hsl(from var(--color-good)h s calc(l + var(--adjust-color)))!important}.outline-color-average{outline:var(--border-thickness-small)solid hsl(from var(--color-average)h s calc(l + var(--adjust-color)))!important}.outline-color-bad{outline:var(--border-thickness-small)solid hsl(from var(--color-bad)h s calc(l + var(--adjust-color)))!important}.outline-color-label{outline:var(--border-thickness-small)solid hsl(from var(--color-label)h s calc(l + var(--adjust-color)))!important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:700}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.Chat{color:var(--chat-text-color)}.Chat__badge{color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#db143c;border-radius:10px;min-width:.5em;padding:.2em .3em;font-size:.7em;line-height:1;transition:font-size .2s ease-out;display:inline-block}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size}.Chat__scrollButton{position:fixed;bottom:1em;right:2em}.Chat__reconnected{text-align:center;margin:1em 0 2em;font-size:.85em}.Chat__reconnected:before{content:"Reconnected";color:var(--reconnect-text,var(--color-red));background-color:var(--reconnect-background,var(--color-section));border-radius:1em;padding:0 .7em;display:inline-block}.Chat__reconnected:after{content:"";border-bottom:.166667em solid var(--color-red);margin-top:-.75em;display:block}.Chat__highlight{color:var(--color-black)}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{border-left:.166667em solid #ffe045;padding-left:.5em;position:relative}.ChatMessage--highlighted:after{content:"";pointer-events:none;background-color:rgba(255,224,69,.1);position:absolute;top:0;bottom:0;left:0;right:0}.Ping{padding:var(--space-xs)var(--space-sm);border:var(--border-thickness-tiny)solid hsl(from var(--color-border-primary)h 10 50/.33);border-radius:var(--border-radius-medium);text-align:right;min-width:4em;max-width:5em;position:relative}.Ping__indicator{content:"";top:var(--space-m);left:var(--space-m);border-radius:var(--border-radius-medium);background-color:#888;width:.5em;height:.5em;position:absolute}.Notifications{position:absolute;top:1em;left:1em;right:2em}.Notification{color:#fff;background-color:#db143c;margin:1em 0;padding:.5em}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.UnreadCount{pointer-events:none;top:calc(-1*var(--space-s));right:calc(-1*var(--space-s));padding:0 var(--space-s);border-radius:var(--border-radius-small);background-color:var(--color-red);color:var(--color-white);font-size:.65em;line-height:1.25em;position:absolute}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.Layout__content--scrollable{margin-bottom:0;overflow-y:auto}.Window{color:var(--color-text);background-color:var(--color-base);background-image:linear-gradient(to bottom,var(--color-base-start)0%,var(--color-base-end)100%);position:fixed;top:0;bottom:0;left:0;right:0}.Window__rest{position:fixed;top:2.66667rem;bottom:0;left:0;right:0}.Window__contentPadding{height:calc(100% - 1rem);margin:.5rem}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{content:"";height:.5rem;display:block}.Window__dimmer{pointer-events:none;background-color:hsl(from var(--color-base)h s calc(l + 15)/.25);position:fixed;top:0;bottom:0;left:0;right:0}.Window__resizeHandle__se{cursor:var(--cursor-se-resize);width:1.66667rem;height:1.66667rem;position:fixed;bottom:0;right:0}.Window__resizeHandle__s{cursor:var(--cursor-s-resize);height:.5rem;position:fixed;bottom:0;left:0;right:0}.Window__resizeHandle__e{cursor:var(--cursor-e-resize);width:.25rem;position:fixed;top:0;bottom:0;right:0}img{margin:0;padding:0;line-height:1}img.icon{vertical-align:bottom;width:auto;min-width:16px;height:1em;min-height:16px}a{color:#397ea5}em{font-style:normal;font-weight:700}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}.emoji{max-width:16px;max-height:16px}.emoji16x16{vertical-align:middle}.italic,.italics,.emote{font-style:italic}.bold{font-weight:700}.bolditalics{font-style:italic;font-weight:700}.center{text-align:center}.big{font-size:150%}.reallybig{font-size:175%}.sans{font-family:Comic Sans MS,cursive,sans-serif}.wingdings{font-family:Wingdings,Webdings}.robot{font-family:OCR-A,monospace;font-size:1.15em;font-weight:700}.hidden{visibility:hidden;display:none}.motd{color:#a4bad6;white-space:normal;font-family:Verdana,sans-serif}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:active,.motd a:hover{color:#a4bad6}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:75%}.ooc{font-weight:700}.looc{color:#69c;font-weight:700}.discordpm{color:#6685f5}.debug{color:#6d2f83}.deadsay{color:#e2c1ff}.darkmblue{color:#6685f5}.prefix,.name,.yell{font-weight:700}.mentorhelp{color:#07b;font-weight:700}.mentor_channel{color:#b4af13;font-weight:700}.mentor_channel_admin{color:#f1ec50;font-weight:700}.admin{color:#386aff;font-weight:700}.adminhelp{color:#a00;font-weight:700}.adminticket{color:#3daf21;font-weight:700}.adminticketalt{color:#ccb847;font-weight:700}.admin_channel{color:#03fc9d;font-weight:700}.all_admin_ping{color:#12a5f4;text-align:center;font-size:120%;font-weight:700}.dev_channel{color:#61b413;font-weight:700}.dev_channel_admin{color:#9ef14f;font-weight:700}.staff_channel{color:#775bff;font-weight:700}.staff_channel_admin{color:#a35cff;font-weight:700}.radio{color:#20b142}.deptradio{color:#939}.comradio{color:#5f5cff}.syndradio{color:#8f4a4b}.dsquadradio{color:#998599}.airadio{color:#ff5ed7}.centradio{color:#2681a5}.secradio{color:#dd3535}.engradio{color:#feac20}.medradio{color:#00b5ad}.sciradio{color:#c68cfa}.supradio{color:#b88646}.srvradio{color:#bbd164}.proradio{color:#b84f92}.alert{color:#d82020}h1.alert,h2.alert{color:#a4bad6}.ghostalert{color:#cc00c6;font-style:italic;font-weight:700}.warning{color:#c51e1e;font-style:italic}.boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.danger{color:#c51e1e;font-weight:700}.biggerdanger{color:red;font-size:150%;font-weight:700}.userdanger{color:#c51e1e;font-size:120%;font-weight:700}.attack{color:red}.disarm{color:#900}.moderate{color:#c00}.notice{color:#6685f5}.boldnotice{color:#6685f5;font-weight:700}.subtle{color:#8a72c5;font-size:85%;font-style:italic}.suicide{color:#ff5050;font-style:italic}.announcement h1,.announcement h2{color:#a4bad6;margin:8pt 0;line-height:1.2}.announcement p{color:#d82020;line-height:1.3}.announcement.minor h1{font-size:180%}.announcement.minor h2{font-size:170%}.announcement.sec h1{color:red;font-family:Verdana,sans-serif;font-size:180%}.boldannounceic,.boldannounceooc,.pr_announce{color:#c51e1e;font-weight:700}.greenannounce{color:#059223;font-weight:700}.alien{color:#c433c4}.noticealien{color:#00c000}.alertalien{color:#00c000;font-weight:700}.terrorspider{color:#cf52fa}.dantalion{color:#8b2c5e}.chaosverygood{color:#19e0c0;font-size:120%;font-weight:700}.chaosgood{color:#19e0c0;font-weight:700}.chaosneutral{color:#479ac0;font-weight:700}.chaosbad{color:#9047c0;font-weight:700}.chaosverybad{color:#9047c0;font-size:120%;font-weight:700}.sinister{color:purple;font-style:italic;font-weight:700}.blob{color:#ee4000;font-style:italic}.revennotice{color:#6685f5}.revenbignotice{color:#6685f5;font-size:120%;font-weight:700}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-size:120%;font-weight:700}.changeling{color:#00b4de}.abductor{color:purple;font-style:italic}.mind_control{color:#a00d6f;font-size:3px;font-style:italic;font-weight:700}.cult{color:purple;font-style:italic;font-weight:700}.cultspeech{color:#af0000;font-style:italic}.cultitalic{color:#a60000;font-style:italic}.cultlarge{color:#a60000;font-size:120%;font-weight:700}.narsie{color:#a60000;font-size:300%;font-weight:700}.narsiesmall{color:#a60000;font-size:200%;font-weight:700}.his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.zombielarge{color:#7c4848;font-size:120%;font-weight:700}.colossus{color:#7f282a;font-size:175%}.hierophant{color:#609;font-style:italic;font-weight:700}.hierophant_warning{color:#609;font-style:italic}.tajaran{color:#803b56}.skrell{color:#00ced1}.solcom{color:#8282fb}.com_zvezhan{color:#7c4848}.zombie{color:red}.soghun{color:#228b22}.vox{color:#a0a}.diona{color:#804000;font-weight:700}.trinary{color:#727272}.kidan{color:#c64c05}.slime{color:#07a}.drask{color:#a3d4eb;font-family:Arial Black}.moth{color:#869b29;font-family:Copperplate}.clown{color:red}.vulpkanin{color:#b97a57}.gutter{color:#7092be;font-family:Trebuchet MS,cursive,sans-serif}.tradeband{font-family:Georgia,Verdana,sans-serif}.rose{color:#ff5050}.interface{color:#9031c4}.greentext{color:#0f0;font-size:150%}.redtext{color:red;font-size:150%}.red{color:red}.green{color:#03bb39}.purple{color:#9031c4}.orange{color:orange}.resonate{color:#298f85}.healthscan_oxy{color:#5cc9ff}.specialnotice{color:#4a6f82;font-size:120%;font-weight:700}.whisper{color:#ccc;font-style:italic}span.body .codephrases{color:#55f}span.body .coderesponses{color:#f33}.oxygen{color:#449dff}.nitrogen{color:#f94541}.carbon_dioxide{color:#ccc}.plasma{color:#eb6b00}.sleeping_agent{color:#f28b89}.agent_b{color:teal}.boxed_message{text-align:center;background:#17191c;border:.0833333em solid rgba(166,183,217,.25);border-width:.0833333em .416667em;border-radius:.5em;margin:.5em .25em;padding:.5em .75em}.boxed_message.red_border{background:#1f1414;border-color:rgba(255,0,0,.5)}.boxed_message.green_border{background:#141f18;border-color:rgba(0,255,0,.5)}.boxed_message.purple_border{background:#1d1828;border-color:rgba(170,128,255,.5)}.boxed_message.notice_border{background:#14181f;border-color:rgba(85,126,246,.5)}.boxed_message.thick_border{border-width:.5em}.boxed_message.left_align_text{text-align:left}:root{--chat-text-color:#b3cce6;--color-base:#202020;--color-section:hsl(from var(--color-base)h s calc(l - 4.2));--base-gradient-spread:0}.theme-light:root{--chat-text-color:var(--color-black);--color-base:#ededed;--color-section:var(--color-white);--color-text:var(--color-black);--color-label:#545454;--color-action:#e6e6e6;--color-scrollbar-thumb:var(--color-light-gray);--primary-lightness:60%;--primary-saturation:60%;--border-primary-alpha:.66;--button-background-selected:hsl(from var(--color-primary)h 100 l);--button-background-caution:#b85a0a;--button-background-danger:#990;--tab-color-selected:var(--color-black);--input-background:var(--color-base);--tooltip-background-lightness:90}.theme-light:root a,.theme-light:root h1,.theme-light:root h2,.theme-light:root h3,.theme-light:root h4,.theme-light:root h5,.theme-light:root h6{color:#00f}.theme-light:root .motd,.theme-light:root .motd h1,.theme-light:root .motd h2,.theme-light:root .motd h3,.theme-light:root .motd h4,.theme-light:root .motd h5,.theme-light:root .motd h6,.theme-light:root .motd a,.theme-light:root .motd a:link,.theme-light:root .motd a:active,.theme-light:root .motd a:hover{color:#638500}.theme-light:root .looc{color:#69c}.theme-light:root .discordpm{color:#00f}.theme-light:root .debug{color:#6d2f83}.theme-light:root .deadsay{color:#5c00e6}.theme-light:root .darkmblue{color:#00f}.theme-light:root .mentorhelp{color:#07b}.theme-light:root .mentor_channel{color:#5e6812}.theme-light:root .mentor_channel_admin{color:#94a419}.theme-light:root .adminhelp{color:#a00}.theme-light:root .adminticket{color:#3e7336}.theme-light:root .adminticketalt{color:#014c8a}.theme-light:root .admin_channel{color:#9a04d1}.theme-light:root .all_admin_ping{color:#12a5f4}.theme-light:root .dev_channel{color:#126719}.theme-light:root .dev_channel_admin{color:#26a419}.theme-light:root .staff_channel{color:#775bff}.theme-light:root .staff_channel_admin{color:#a35cff}.theme-light:root .radio{color:#408010}.theme-light:root .deptradio{color:#939}.theme-light:root .comradio{color:#204090}.theme-light:root .syndradio{color:#6d3f40}.theme-light:root .dsquadradio{color:#686868}.theme-light:root .airadio{color:#f0f}.theme-light:root .centradio{color:#5c5c7c}.theme-light:root .secradio{color:#a30000}.theme-light:root .engradio{color:#a66300}.theme-light:root .medradio{color:#009190}.theme-light:root .sciradio{color:#939}.theme-light:root .supradio{color:#7f6539}.theme-light:root .srvradio{color:#80a000}.theme-light:root .proradio{color:#e3027a}.theme-light:root .alert{color:red}.theme-light:root h1.alert,.theme-light:root h2.alert{color:#000}.theme-light:root .ghostalert{color:#5c00e6}.theme-light:root .warning,.theme-light:root .boldwarning,.theme-light:root .danger,.theme-light:root .userdanger{color:red}.theme-light:root .notice,.theme-light:root .boldnotice{color:#009}.theme-light:root .subtle{color:#009;font-size:85%;font-style:italic}.theme-light:root .announcement h1,.theme-light:root .announcement h2{color:#000}.theme-light:root .announcement.sec h1,.theme-light:root .boldannounceic,.theme-light:root .boldannounceooc{color:red}.theme-light:root .pr_announce{color:#228b22}.theme-light:root .greenannounce{color:#0f0}.theme-light:root .alien{color:#543354}.theme-light:root .terrorspider{color:#320e32}.theme-light:root .dantalion{color:#6a2148}.theme-light:root .revennotice,.theme-light:root .revenbignotice{color:#1d2953}.theme-light:root .changeling{color:purple}.theme-light:root .cultspeech{color:#7f0000}.theme-light:root .cultitalic,.theme-light:root .cultlarge,.theme-light:root .narsie,.theme-light:root .narsiesmall{color:#960000}.theme-light:root .rose{color:#ff5050}.theme-light:root .interface{color:#303}.theme-light:root .purple{color:#5e2d79}.theme-light:root .orange{color:orange}.theme-light:root .healthscan_oxy{color:#0074bd}.theme-light:root .specialnotice{color:#36525e}.theme-light:root .whisper{color:#333}.theme-light:root span.body .codephrases{color:#00f}.theme-light:root span.body .coderesponses{color:red}.theme-light:root .oxygen{color:#006adb}.theme-light:root .nitrogen{color:#d00a06}.theme-light:root .carbon_dioxide{color:#1f1f1f}.theme-light:root .plasma{color:#853c00}.theme-light:root .sleeping_agent{color:#e82f2c}.theme-light:root .agent_b{color:#004d4d}.theme-light:root .boxed_message{background:#f2f7ff;border-color:rgba(16,48,112,.5)}.theme-light:root .boxed_message.red_border{background:#fff2f2;border-color:rgba(255,0,0,.5)}.theme-light:root .boxed_message.green_border{background:#f2fff7;border-color:rgba(0,168,0,.5)}.theme-light:root .boxed_message.purple_border{background:#f7f2ff;border-color:rgba(85,0,255,.5)}.theme-light:root .boxed_message.notice_border{background:#f2f7ff;border-color:rgba(0,64,255,.5)}.theme-ntos:root{--color-base:#1b2532;--color-section:#121821;--color-primary:#476385}.theme-ntos:root .boxed_message{background:#1d2330}.theme-ntos:root .boxed_message.red_border{background:#301d1d}.theme-ntos:root .boxed_message.green_border{background:#1d3023}.theme-ntos:root .boxed_message.purple_border{background:#231d30}.theme-ntos:root .boxed_message.notice_border{background:#192234}.theme-syndicate:root{--color-base:#4d0202;--color-section:#2b0101;--color-primary:#3b783b;--color-label:#ad8585;--button-background-selected:#b60a0a;--button-background-caution:#ba5e0d;--button-background-danger:#969900;--notice-box-background:#8d0101;--notice-box-color:var(--color-text-fixed-white);--progress-bar-background:rgba(0,0,0,.5);--tooltip-background-lightness:25}.theme-syndicate:root .adminooc{color:#29ccbe}.theme-syndicate:root .debug{color:#8f39e6}.theme-syndicate:root .boxed_message{background:#360a0a}.theme-syndicate:root .boxed_message.red_border{background:#400000}.theme-syndicate:root .boxed_message.green_border{background:#261a00}.theme-syndicate:root .boxed_message.purple_border{background:#260026}.theme-syndicate:root .boxed_message.notice_border{background:#260016}.theme-paradise:root{--color-base:#8a0f38;--color-section:rgba(0,0,0,.5);--color-base-start:#7e014a;--color-base-end:#8a4d0f;--color-primary:#1f7a7a;--color-label:#ad9685;--reconnect-background:#d92626;--reconnect-text:var(--color-text);--input-border-color:#e85e30;--button-background-selected:#cf6e3d;--button-background-danger:#93f}.theme-paradise:root .adminooc{color:#29ccbe}.theme-paradise:root .debug{color:#8f39e6}.theme-paradise:root .boxed_message{background:rgba(0,0,0,.25);border-color:rgba(223,181,159,.25)}.theme-paradise:root .boxed_message.red_border{background:rgba(22,3,3,.25);border-color:rgba(255,0,0,.5)}.theme-paradise:root .boxed_message.green_border{background:rgba(3,22,10,.25);border-color:rgba(0,255,0,.5)}.theme-paradise:root .boxed_message.purple_border{background:rgba(10,3,22,.25);border-color:rgba(136,77,255,.5)}.theme-paradise:root .boxed_message.notice_border{background:rgba(3,10,22,.25);border-color:rgba(85,126,246,.5)} \ No newline at end of file +:root{--color-base:#262626;--color-section:rgba(0,0,0,.33);--color-secondary:hsl(from var(--color-base)var(--secondary-hue)var(--secondary-saturation)calc(l + var(--secondary-lightness-adjustment)));--secondary-hue:h;--secondary-saturation:s;--secondary-lightness-adjustment:7.5;--base-gradient-spread:2;--color-base-start:hsl(from var(--color-base)h s calc(l + var(--base-gradient-spread)));--color-base-end:hsl(from var(--color-base)h s calc(l - var(--base-gradient-spread)));--color-scrollbar-base:var(--color-section);--color-scrollbar-thumb:hsl(from var(--color-base)h s calc(l + 9.25));--candystripe-odd:rgba(0,0,0,.25);--candystripe-even:transparent;--color-red:#d92626;--color-orange:#f26c0d;--color-yellow:#fcd203;--color-olive:#acc91d;--color-green:#1fad4e;--color-teal:#00b3b3;--color-blue:#2a79c8;--color-violet:#63c;--color-purple:#b333cc;--color-pink:#d9268e;--color-brown:#a96a3c;--color-gold:#f2a60d;--color-black:#000;--color-white:#fff;--color-grey:gray;--color-light-grey:#aaa;--color-gray:var(--color-grey);--color-light-gray:var(--color-light-grey);--color-action:gray;--color-hover:hsl(from var(--color-action)h s l/.25);--color-active:hsl(from var(--color-action)h s l/.3);--color-selected:hsl(from var(--color-action)h s l/.4);--primary-hue:210;--primary-saturation:37.5%;--primary-lightness:45%;--color-primary:hsl(var(--primary-hue),var(--primary-saturation),var(--primary-lightness));--color-good:#5ba626;--color-average:#f2890d;--color-bad:#dc2323;--color-label:hsl(from var(--color-primary)h 17.5 57.5);--color-text:var(--color-white);--color-text-translucent:hsl(from var(--color-text)h s l/.5);--color-text-translucent-light:hsl(from var(--color-text)h s l/.75);--color-text-fixed-white:var(--color-white);--color-text-fixed-black:var(--color-black);--color-hyperlink:#69f;--color-hyperlink-visited:#96f;--color-hyperlink-new:#f66;--color-hyperlink-new-visited:#ff8c66;--color-border:rgba(255,255,255,.1);--color-border-dark:rgba(0,0,0,.33);--border-primary-saturation:100;--border-primary-lightness:75;--border-primary-alpha:.75;--color-border-primary:hsl(from var(--color-primary)h var(--border-primary-saturation)var(--border-primary-lightness)/var(--border-primary-alpha));--color-border-secondary:hsl(from var(--color-border-primary)h s l/1);--font-size:12px;--font-family:Verdana,Geneva,sans-serif;--font-family-mono:Consolas,monospace;--border-thickness-unit:.5em;--border-thickness-tiny:calc(var(--border-thickness-unit)*.5*.34);--border-thickness-small:calc(var(--border-thickness-unit)*.34);--border-thickness-medium:calc(var(--border-thickness-unit)*.5);--border-thickness-large:calc(var(--border-thickness-unit)*.66);--border-thickness-larger:var(--border-thickness-unit);--border-radius-unit:1rem;--border-radius-tiny:calc(var(--border-radius-unit)*.25*.68);--border-radius-small:calc(var(--border-radius-unit)*.25);--border-radius-medium:calc(var(--border-radius-unit)*.33);--border-radius-large:calc(var(--border-radius-unit)*.5);--border-radius-larger:calc(var(--border-radius-unit)*.75);--border-radius-huge:var(--border-radius-unit);--border-radius-giant:calc(var(--border-radius-unit)*2);--border-radius-circular:99999px;--space-unit:1em;--space-xxs:calc(var(--space-unit)*.25*.34);--space-xs:calc(var(--space-unit)*.25*.68);--space-s:calc(var(--space-unit)*.25);--space-sm:calc(var(--space-unit)*.33);--space-m:calc(var(--space-unit)*.5);--space-ml:calc(var(--space-unit)*.66);--space-l:calc(var(--space-unit)*.75);--space-xl:var(--space-unit);--space-xxl:calc(var(--space-unit)*2);--transition-time-unit:1s;--transition-time-fast:calc(var(--transition-time-unit)*.1);--transition-time-medium:calc(var(--transition-time-unit)*.2);--transition-time-slow:calc(var(--transition-time-unit)*.5);--transition-time-slowest:var(--transition-time-unit);--shadow-unit:1rem;--shadow-glow-small:0 0 calc(var(--shadow-unit)*.5);--shadow-glow-medium:0 0 var(--shadow-unit);--shadow-glow-large:0 0 calc(var(--shadow-unit)*2);--blur-small:blur(6px);--blur-medium:blur(12px);--blur-large:blur(24px);--adjust-color:5;--adjust-hover:10;--adjust-active:7.5;--cursor-default:default;--cursor-pointer:pointer;--cursor-disabled:var(--cursor-default);--cursor-n-resize:n-resize;--cursor-s-resize:s-resize;--cursor-se-resize:se-resize;--cursor-e-resize:e-resize;--blockquote-color:hsl(from var(--color-label)h s calc(l + var(--adjust-color)));--blockquote-border:var(--border-thickness-small)solid;--button-height:1.667em;--button-color:var(--color-white);--button-color-transparent:var(--color-text-translucent);--button-background-default:var(--color-primary);--button-background-selected:var(--color-green);--button-background-caution:var(--color-yellow);--button-background-danger:var(--color-red);--button-background-disabled:var(--undefined);--button-disabled-opacity:.5;--button-border-radius:var(--border-radius-tiny);--button-transition:var(--transition-time-medium);--button-transition-timing:ease;--dialog-background:hsl(from var(--color-section)h s l/.5);--dimmer-background-opacity:.75;--dimmer-background:hsl(from var(--color-base)h s 5/var(--dimmer-background-opacity));--divider-color:var(--color-border);--divider-border:var(--border-thickness-small)solid var(--divider-color);--dropdown-transition:var(--transition-time-medium);--dropdown-menu-color:var(--color-text);--dropdown-menu-background:hsl(from var(--color-base)h s calc(l - 5.5)/.85);--dropdown-menu-border:var(--border-thickness-tiny)solid var(--color-border);--dropdown-menu-border-radius:var(--border-radius-large);--dropdown-menu-blur:var(--blur-medium);--dropdown-entry-background-hover:var(--color-hover);--dropdown-entry-background-active:var(--color-active);--dropdown-entry-background-selected:var(--color-selected);--dropdown-entry-border-radius:var(--border-radius-small);--dropdown-entry-transition:var(--transition-time-fast);--floating-transition-time:var(--transition-time-medium);--floating-transition-timing:ease;--tab-background:transparent;--tab-background-hover:hsl(from var(--color-hover)h s calc(l*.75));--tab-background-selected:hsl(from var(--color-selected)h s calc(l*.75));--tab-color:var(--color-text-translucent);--tab-color-selected:hsl(from var(--color-primary)h s 90);--tab-border-radius:var(--border-radius-small);--tab-indicator-size:var(--border-thickness-small);--tab-transition:var(--transition-time-medium);--tabs-container-background:var(--color-section);--imagebutton-transparecy:.25;--input-background-lightness:5;--input-background:hsl(from var(--color-base)h s var(--input-background-lightness));--input-color:var(--color-text);--input-color-placeholder:var(--color-text-translucent);--input-border-color:var(--color-border-primary);--input-border-color-focus:var(--color-border-secondary);--input-border-radius:var(--border-radius-tiny);--input-border-disabled:var(--color-gray);--input-transition:var(--transition-time-medium);--input-font-family:var(--font-family);--input-font-family-mono:var(--font-family-mono);--input-width:9em;--knob-color:hsl(from var(--color-base)h 5 20);--knob-ring-color:var(--input-border-color);--knob-popup-background:var(--tooltip-background);--knob-popup-color:var(--tooltip-color);--knob-popup-border-radius:var(--tooltip-border-radius);--knob-popup-blur:var(--tooltip-blur);--knob-inner-padding:var(--space-xs);--menu-bar-background:var(--color-base);--menu-bar-font-family:var(--font-family);--menu-bar-transition:var(--transition-time-medium);--modal-background:var(--color-base);--modal-padding:var(--space-xl);--notice-box-stripes:rgba(0,0,0,.1);--notice-box-background:#cea257;--notice-box-color:var(--color-text-fixed-white);--number-input-background:var(--input-background);--number-input-color:var(--input-color);--number-input-border-color:var(--input-border-color);--number-input-border-color-active:var(--input-border-color-focus);--number-input-border-radius:var(--input-border-radius);--number-input-transition:var(--input-transition);--progress-bar-fill:var(--color-primary);--progress-bar-background:transparent;--progress-bar-border-radius:var(--border-radius-tiny);--progress-bar-transition:var(--transition-time-slowest);--restricted-input-border-color:var(--color-good);--restricted-input-border-color-focus:hsl(from var(--color-good)h s calc(l + 10));--restricted-input-border-color-invalid:var(--color-bad);--round-gauge-ring-color:var(--input-border-color);--round-gauge-transition:var(--transition-time-medium);--round-gauge-alert-animation:var(--transition-time-slowest);--round-gauge-needle-alert-animation:var(--transition-time-fast);--round-gauge-needle-alert-rotation:2.5deg;--section-title-color:var(--color-text);--section-background:var(--color-section);--section-separator-color:var(--color-primary);--section-separator-thickness:var(--border-thickness-small);--slider-cursor-color:var(--color-text);--slider-popup-background:var(--tooltip-background);--slider-popup-color:var(--tooltip-color);--slider-popup-border-radius:var(--tooltip-border-radius);--slider-popup-blur:var(--tooltip-blur);--tooltip-color:var(--color-text);--tooltip-background-lightness:5;--tooltip-background:hsl(from var(--color-base)h s var(--tooltip-background-lightness)/.85);--tooltip-border-radius:var(--border-radius-medium);--tooltip-blur:var(--blur-medium)}body{font-family:var(--font-family,Verdana,Geneva,sans-serif);position:relative;overflow:auto}.BlockQuote{color:var(--blockquote-color);border-left:var(--blockquote-border);padding-left:var(--space-m);margin-bottom:var(--space-m)}.BlockQuote:last-child{margin-bottom:0}.Button--color--grey,.Button--color--gray{--color:var(--color-grey);--button-color:var(--color-white)}.Button--color--light-grey,.Button--color--light-gray{--color:var(--color-light-grey);--button-color:var(--color-white)}.ColorBox{text-align:center;width:1em;height:1em;line-height:1em;display:inline-block}.Dialog{background-color:var(--dialog-background);justify-content:center;align-items:center;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.Dialog__content{font-family:var(--font-family-mono);background-color:var(--color-base);flex-direction:column;font-size:1.16667em;display:flex}.Dialog__header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:var(--dialog-background);height:2em;line-height:1.928em;display:flex}.Dialog__title{margin-left:var(--space-xl);margin-right:var(--space-xxl);opacity:.33;flex-grow:1;font-style:italic;display:inline}.Dialog__body{margin:var(--space-xxl)var(--space-xl);flex-grow:1}.Dialog__footer{padding:var(--space-xl);background-color:hsl(from var(--dialog-background)h s l/.25);flex-direction:row;justify-content:flex-end;display:flex}.Dialog__button{margin:0 var(--space-xl);text-align:center;min-width:6rem;height:2rem}.SaveAsDialog__inputs{padding-left:var(--space-xxl);margin-right:var(--space-xl);flex-direction:row;justify-content:flex-end;align-items:center;display:flex}.SaveAsDialog__input{margin-left:var(--space-xl);width:80%}.SaveAsDialog__label{vertical-align:center}.Dialog__FileList{flex-wrap:wrap;flex-grow:1;align-content:flex-start;max-height:20rem;display:flex;position:relative;overflow-x:auto;overflow-y:scroll}.Dialog__FileEntry{text-align:center;margin:var(--space-xl)}.Dialog__FileIcon{cursor:default;text-align:center;width:6vh;height:auto;margin:0 0 var(--space-xl)0;display:inline-block;position:relative}.Dimmer{background-color:var(--dimmer-background);z-index:100;justify-content:center;align-items:center;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}.Divider--horizontal{margin:var(--space-m)0}.Divider--horizontal:not(.Divider--hidden){border-top:var(--divider-border)}.Divider--vertical{height:100%;margin:0 var(--space-m)}.Divider--vertical:not(.Divider--hidden){border-left:var(--divider-border)}.Button{white-space:nowrap;line-height:var(--button-height);padding:0 var(--space-m);margin-right:var(--space-xs);margin-bottom:var(--space-xs);border-radius:var(--button-border-radius);--button-background:hsl(from var(--color)h s calc(l - var(--adjust-color)));cursor:var(--cursor-pointer);background-color:var(--button-background);color:var(--button-color);transition-property:background-color,color,opacity;transition-duration:var(--button-transition);transition-timing-function:var(--button-transition-timing);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:none;display:inline-block;position:relative}.Button:hover{background-color:hsl(from var(--button-background)h s calc(l + var(--adjust-hover)));color:var(--button-color)}.Button:active{background-color:hsl(from var(--button-background)h s calc(l - var(--adjust-active)));color:var(--button-color);transition:none}.Button:last-child{margin-bottom:0;margin-right:0}.Button__content{align-self:stretch;display:block}.Button__content--ellipsis{align-items:center;display:flex}.Button .Button--icon{text-align:center;min-width:1.333em}.Button.Button--hasIcon{padding-left:0}.Button.Button--hasIcon .Button--icon{margin:0 var(--space-s)}.Button--icon-right.Button--hasIcon{padding-left:var(--space-m);padding-right:var(--space-s)}.Button--icon-right.Button--hasIcon .Button--icon{margin:0 0 0 var(--space-s)}.Button--empty.Button--hasIcon{padding:0}.Button--compact{padding:0 var(--space-s);line-height:1.333em}.Button--compact.Button--hasIcon .Button--icon{margin:0 var(--space-xxs)}.Button--circular{border-radius:var(--border-radius-circular)}.Button--fluid{margin-left:0;margin-right:0;display:block}.Button--ellipsis{text-overflow:ellipsis;margin-right:calc(-1*var(--space-s));display:block;overflow:hidden}.Stack>.Button,.Stack__item>.Button{margin:0}.Button--color--red{--color:var(--color-red);--button-color:var(--color-white)}.Button--color--orange{--color:var(--color-orange);--button-color:var(--color-white)}.Button--color--yellow{--color:var(--color-yellow);--button-color:var(--color-black)}.Button--color--olive{--color:var(--color-olive);--button-color:var(--color-white)}.Button--color--green{--color:var(--color-green);--button-color:var(--color-white)}.Button--color--teal{--color:var(--color-teal);--button-color:var(--color-white)}.Button--color--blue{--color:var(--color-blue);--button-color:var(--color-white)}.Button--color--violet{--color:var(--color-violet);--button-color:var(--color-white)}.Button--color--purple{--color:var(--color-purple);--button-color:var(--color-white)}.Button--color--pink{--color:var(--color-pink);--button-color:var(--color-white)}.Button--color--brown{--color:var(--color-brown);--button-color:var(--color-white)}.Button--color--gold{--color:var(--color-gold);--button-color:var(--color-white)}.Button--color--black{--color:var(--color-black);--button-color:var(--color-white)}.Button--color--white{--color:var(--color-white);--button-color:var(--color-black)}.Button--color--grey,.Button--color--gray{--color:var(--color-grey);--button-color:var(--color-white)}.Button--color--light-grey,.Button--color--light-gray{--color:var(--color-light-grey);--button-color:var(--color-white)}.Button--color--primary{--color:var(--color-primary);--button-color:var(--color-white)}.Button--color--good{--color:var(--color-good);--button-color:var(--color-white)}.Button--color--average{--color:var(--color-average);--button-color:var(--color-white)}.Button--color--bad{--color:var(--color-bad);--button-color:var(--color-white)}.Button--color--label{--color:var(--color-label);--button-color:var(--color-white)}.Button--color--default{--color:var(--button-background-default)}.Button--color--caution{--color:var(--button-background-caution)}.Button--color--danger{--color:var(--button-background-danger)}.Button--color--transparent{--button-background:hsl(from var(--button-color)h s l/.1);--button-color:var(--button-color-transparent);background-color:transparent}.Button--color--transparent:hover{--button-color:hsl(from var(--button-color-transparent)h s l/1)}.Button--color--transparent:active{opacity:.75}.Button--color--transparent.Button--selected{--button-color:hsl(from var(--color)h s calc(l + var(--adjust-color)))}.Button--color--transparent.Button--disabled{--button-background:hsl(from var(--button-color)h s l/.2);--button-color:var(--color-bad);opacity:1;color:var(--button-color)!important}.Button--disabled{opacity:var(--button-disabled-opacity);cursor:var(--cursor-disabled)!important;background-color:var(--button-background-disabled,var(--button-background))!important}.Button--selected{--color:var(--button-background-selected)!important}.Button--flex{flex-direction:column;display:inline-flex}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Dropdown{align-items:stretch;gap:var(--space-s);margin-right:var(--space-xs);margin-bottom:var(--space-xs);display:flex}.Dropdown:last-child{margin-bottom:0;margin-right:0}.Dropdown .Button{align-content:center;margin:0}.Dropdown--fluid{flex:1;width:100%}.Dropdown__control{font-family:var(--font-family);border-radius:var(--button-border-radius);--button-background:hsl(from var(--color)h s calc(l - var(--adjust-color)));height:1.83333em;cursor:var(--cursor-pointer);background-color:var(--button-background);color:var(--button-color);transition-property:background-color,color,opacity;transition-duration:var(--button-transition);transition-timing-function:var(--button-transition-timing);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:1;font-size:1em;line-height:1.33333em;display:flex;overflow:hidden}.Dropdown__control:hover{background-color:hsl(from var(--button-background)h s calc(l + var(--adjust-hover)));color:var(--button-color)}.Dropdown__control:active{background-color:hsl(from var(--button-background)h s calc(l - var(--adjust-active)));color:var(--button-color);transition:none}.Dropdown__selected-text{text-overflow:ellipsis;white-space:nowrap;height:100%;padding:var(--space-s)var(--space-m);border-right:var(--border-thickness-tiny)solid var(--color-border-dark);flex:1;align-content:center;display:inline-block;overflow:hidden}.Dropdown__icon{text-align:center;width:1.83333em;height:100%;transition:transform var(--dropdown-transition);align-content:center;display:inline-block}.Dropdown__icon--arrow.open:not(.over),.Dropdown__icon--arrow.over:not(.open){transform:rotate(180deg)}.Dropdown__icon~.Dropdown__selected-text{padding-left:0}.Dropdown__menu{scrollbar-width:thin;scrollbar-color:var(--color-scrollbar-thumb)transparent;max-height:16.6667em;padding:var(--space-sm);overflow-y:auto}.Dropdown__menu--wrapper{background-color:var(--dropdown-menu-background);color:var(--dropdown-menu-color);border:var(--dropdown-menu-border);border-radius:var(--dropdown-menu-border-radius);-webkit-backdrop-filter:var(--dropdown-menu-blur);backdrop-filter:var(--dropdown-menu-blur);overflow:hidden}.Dropdown__menu--entry{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;font-family:var(--font-family);padding:var(--space-xs)var(--space-m);border-radius:var(--dropdown-entry-border-radius);transition:background-color var(--dropdown-entry-transition);font-size:1em;line-height:1.33333em;overflow:hidden}.Dropdown__menu--entry.selected{transition-duration:0s;background-color:var(--dropdown-entry-background-selected)!important}.Dropdown__menu--entry:not(.selected){cursor:var(--cursor-pointer)}.Dropdown__menu--entry:not(.selected):hover{background-color:var(--dropdown-entry-background-hover);transition-duration:0s}.Dropdown__menu--entry:not(.selected):active{background-color:var(--dropdown-entry-background-active);transition-duration:0s}.Dropdown__control--icon-only{justify-content:center;align-items:center;max-width:2rem;display:flex}.Flex{display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline,.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Floating{z-index:5}.Floating--animated[data-transition=open]{opacity:1;transform:scale(1)}.Floating--animated[data-transition=close],.Floating--animated[data-transition=initial]{opacity:0;transform:scale(.9)}.Floating--animated[data-transition=open],.Floating--animated[data-transition=close]{transition-duration:var(--floating-transition-time);transition-timing-function:var(--floating-transition-timing);transition-property:opacity,transform}.Floating[data-position=top]{transform-origin:bottom}.Floating[data-position=top-start],.Floating[data-position=right-end]{transform-origin:0 100%}.Floating[data-position=top-end],.Floating[data-position=left-end]{transform-origin:100% 100%}.Floating[data-position=bottom]{transform-origin:top}.Floating[data-position=bottom-start],.Floating[data-position=right-start]{transform-origin:0 0}.Floating[data-position=bottom-end],.Floating[data-position=left-start]{transform-origin:100% 0}.Floating[data-position=right]{transform-origin:0}.Floating[data-position=left]{transform-origin:100%}.IconStack{justify-content:center;align-items:center;display:inline-flex;position:relative}.IconStack .Icon:before{vertical-align:middle}.IconStack .Icon:not(:first-child){position:absolute}.ImageButton{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;background-color:hsl(from var(--imagebutton-color)h s calc(l - var(--adjust-color)*2)/var(--imagebutton-transparecy));border:var(--border-thickness-tiny)solid hsl(from var(--imagebutton-color)h s calc(l + var(--adjust-color))/var(--imagebutton-transparecy));border-radius:var(--border-radius-medium);transition-property:background-color,border-color,box-shadow;transition-duration:var(--transition-time-medium);border-width:0;margin:.25em;display:inline-flex;position:relative;overflow:hidden}.ImageButton:not(:-webkit-any(.ImageButton--disabled,.ImageButton--noAction)) .ImageButton__container{cursor:var(--cursor-pointer)}.ImageButton:not(:-moz-any(.ImageButton--disabled,.ImageButton--noAction)) .ImageButton__container{cursor:var(--cursor-pointer)}.ImageButton:not(:is(.ImageButton--disabled,.ImageButton--noAction)) .ImageButton__container{cursor:var(--cursor-pointer)}.ImageButton:not(:-webkit-any(.ImageButton--disabled,.ImageButton--noAction)):not(:-webkit-any(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):hover{background-color:hsl(from var(--imagebutton-color)h s calc(l - var(--adjust-color) + var(--adjust-hover))/var(--imagebutton-transparecy))}.ImageButton:not(:-moz-any(.ImageButton--disabled,.ImageButton--noAction)):not(:-moz-any(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):hover{background-color:hsl(from var(--imagebutton-color)h s calc(l - var(--adjust-color) + var(--adjust-hover))/var(--imagebutton-transparecy))}.ImageButton:not(:is(.ImageButton--disabled,.ImageButton--noAction)):not(:is(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):hover{background-color:hsl(from var(--imagebutton-color)h s calc(l - var(--adjust-color) + var(--adjust-hover))/var(--imagebutton-transparecy))}.ImageButton:not(:-webkit-any(.ImageButton--disabled,.ImageButton--noAction)):not(:-webkit-any(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):active .ImageButton__image{-webkit-filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));transition-duration:0s}.ImageButton:not(:-moz-any(.ImageButton--disabled,.ImageButton--noAction)):not(:-moz-any(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):active .ImageButton__image{-webkit-filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));transition-duration:0s}.ImageButton:not(:is(.ImageButton--disabled,.ImageButton--noAction)):not(:is(:has(.ImageButton__buttons:hover),:has(.ImageButton__buttons:active))):active .ImageButton__image{-webkit-filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));filter:drop-shadow(var(--shadow-glow-small)var(--imagebutton-color));transition-duration:0s}.ImageButton:not(.ImageButton--fluid) .ImageButton__content{background-color:hsl(from var(--imagebutton-color)h s calc(l - var(--adjust-hover)));border-top:var(--border-thickness-tiny)solid var(--imagebutton-color)}.ImageButton__container{border-color:inherit;transition:opacity var(--transition-time-medium);flex-direction:column;display:flex}.ImageButton__image{pointer-events:none;padding:var(--space-s);border:var(--border-thickness-tiny)solid;border-bottom:none;border-color:inherit;border-radius:var(--border-radius-medium)var(--border-radius-medium)0 0;transition:filter var(--transition-time-slow);align-self:center;line-height:0;position:relative;overflow:hidden}.ImageButton__image--fallback{text-align:center;color:var(--color-text-translucent);align-content:center}.ImageButton__image--fallback:before{zoom:.75;width:100%;display:table}.ImageButton__content{white-space:nowrap;text-overflow:ellipsis;color:var(--color-text-fixed-white);z-index:2;padding:.25em .33em;overflow:hidden}.ImageButton__buttons{left:var(--border-thickness-tiny);z-index:1;max-width:100%;display:flex;position:absolute;bottom:1.8em;overflow:hidden}.ImageButton__buttons--alt{pointer-events:none;top:var(--border-thickness-tiny);text-shadow:0px 1px 2px var(--color-base),-1px 0px 2px var(--color-base),1px 0px 2px var(--color-base),0px -1px 2px var(--color-base);flex-direction:column;overflow:visible;bottom:unset!important}.ImageButton__buttons--empty{bottom:0;left:0}.ImageButton__buttons>*{border-radius:0!important;margin:0!important;padding:0!important}.ImageButton--empty{border-width:var(--border-thickness-tiny)}.ImageButton--empty .ImageButton__image{border-radius:var(--border-radius-medium);border:none}.Stack>.ImageButton,.Stack__item>.ImageButton{margin:0}.ImageButton--fluid{border-width:var(--border-thickness-tiny);flex-direction:row;margin:0 0 .33em;display:flex}.ImageButton--fluid:last-child{margin-bottom:0}.ImageButton--fluid .ImageButton__container{flex-direction:row;flex:1}.ImageButton--fluid .ImageButton__image{border:0;margin:0 auto;padding:0}.ImageButton--fluid .ImageButton__content{white-space:normal;color:var(--color-text);flex-direction:column;flex:1;justify-content:center;margin:0 .5em;padding:0;display:flex}.ImageButton--fluid .ImageButton__content--title{padding:.5em;font-weight:700}.ImageButton--fluid .ImageButton__content--divider{border-bottom:var(--border-thickness-small)solid var(--color-border)}.ImageButton--fluid .ImageButton__content--text{padding:.5em}.ImageButton--fluid .ImageButton__buttons{left:inherit;bottom:inherit;background-color:inherit;position:relative}.ImageButton--fluid .ImageButton__buttons--alt{pointer-events:all;top:inherit;text-shadow:none}.ImageButton--fluid .ImageButton__buttons--alt>*{border-top:1px solid rgba(255,255,255,.075)}.ImageButton--fluid .ImageButton__buttons--alt>:first-child{border-top:0}.ImageButton--fluid .ImageButton__buttons>*{text-align:center;white-space:pre-wrap;border-left:var(--border-thickness-tiny)solid var(--color-border);flex-direction:column;justify-content:center;height:100%;line-height:1.15em;display:inline-flex}.ImageButton__color--red{--imagebutton-color:var(--color-red)}.ImageButton__color--orange{--imagebutton-color:var(--color-orange)}.ImageButton__color--yellow{--imagebutton-color:var(--color-yellow);--color-text-fixed-white:var(--color-black)}.ImageButton__color--olive{--imagebutton-color:var(--color-olive)}.ImageButton__color--green{--imagebutton-color:var(--color-green)}.ImageButton__color--teal{--imagebutton-color:var(--color-teal)}.ImageButton__color--blue{--imagebutton-color:var(--color-blue)}.ImageButton__color--violet{--imagebutton-color:var(--color-violet)}.ImageButton__color--purple{--imagebutton-color:var(--color-purple)}.ImageButton__color--pink{--imagebutton-color:var(--color-pink)}.ImageButton__color--brown{--imagebutton-color:var(--color-brown)}.ImageButton__color--gold{--imagebutton-color:var(--color-gold)}.ImageButton__color--black{--imagebutton-color:var(--color-black)}.ImageButton__color--white{--imagebutton-color:var(--color-white);--color-text-fixed-white:var(--color-black)}.ImageButton__color--grey,.ImageButton__color--gray{--imagebutton-color:var(--color-grey)}.ImageButton__color--light-grey,.ImageButton__color--light-gray{--imagebutton-color:var(--color-light-grey)}.ImageButton__color--good{--imagebutton-color:var(--color-good)}.ImageButton__color--average{--imagebutton-color:var(--color-average)}.ImageButton__color--bad{--imagebutton-color:var(--color-bad)}.ImageButton__color--label{--imagebutton-color:var(--color-label)}.ImageButton__color--transparent{--imagebutton-color:var(--color-text-translucent-light);--imagebutton-transparecy:.1;background-color:transparent;border-color:transparent!important}.ImageButton__color--transparent .ImageButton__content{color:var(--color-text-translucent-light);background-color:transparent!important;border-color:transparent!important}.ImageButton__color--transparent.ImageButton--disabled{background-color:hsL(from var(--color-red)h s l/.15)!important}.ImageButton__color--transparent.ImageButton--selected{background-color:hsL(from var(--color-good)h s l/.15)}.ImageButton__color--default{--imagebutton-color:hsl(from var(--color-base)h s 30)}.ImageButton__color--primary{--imagebutton-color:hsl(from var(--color-primary)h s l)}.ImageButton--selected{--imagebutton-color:hsl(from var(--button-background-selected)h s calc(l*1.15));--color-text-fixed-white:var(--color-white)}.ImageButton--disabled .ImageButton__container{cursor:var(--cursor-disabled);opacity:.5}.ImageButton--disabled.ImageButton--fluid{-webkit-filter:contrast(75%);filter:contrast(75%)}.ImageButton--disabled.ImageButton--fluid .ImageButton__buttons{-webkit-filter:contrast(125%);filter:contrast(125%)}.Input{background-color:var(--input-background);border-radius:var(--input-border-radius);border:var(--border-thickness-tiny)solid var(--input-border-color);color:var(--input-color);font-size:1em;font-family:var(--input-font-family);padding:var(--space-xxs)var(--space-sm);width:var(--input-width)}.Input:focus{outline:none}.Input:focus-within{border-color:var(--input-border-color-focus)}.Input::-webkit-input-placeholder{color:var(--input-color-placeholder);font-style:italic}.Input::-ms-input-placeholder{color:var(--input-color-placeholder);font-style:italic}.Input::placeholder{color:var(--input-color-placeholder);font-style:italic}.Input--disabled{border-color:var(--input-border-disabled);color:var(--input-color-placeholder)}.Input--fluid{width:100%}.Input--monospace{font-family:var(--input-font-family-mono)}.Knob{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:var(--cursor-n-resize);width:2.6em;height:2.6em;margin:0 auto -.2em;font-size:1rem;position:relative}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{inset:var(--knob-inner-padding);background-color:var(--knob-color);background-image:linear-gradient(to bottom,hsl(from var(--knob-color)h s calc(l + 15))0%,var(--knob-color)100%);border-radius:var(--border-radius-circular);box-shadow:var(--shadow-glow-medium)hsl(from var(--knob-color)h s l/.25);margin:.3em;position:absolute}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{background-color:hsl(from var(--knob-color)h s 85);width:.2em;height:.8em;margin:0 auto;position:relative;top:.05em}.Knob__popupValue{white-space:nowrap;text-align:center;padding:var(--space-s)var(--space-m);background-color:var(--knob-popup-background);color:var(--knob-popup-color);border-radius:var(--knob-popup-border-radius);-webkit-backdrop-filter:var(--knob-popup-blur);backdrop-filter:var(--knob-popup-blur);font-size:1rem;position:absolute;top:0;left:50%;transform:translateY(-100%)translate(-50%)}.Knob__ring{padding:var(--knob-inner-padding);position:absolute;top:0;bottom:0;left:0;right:0;overflow:visible}.Knob__ringTrackPivot{transform:rotate(135deg)}.Knob__ringTrack{fill:transparent;stroke:hsl(from var(--ring-color,var(--knob-ring-color))h s l/.15);stroke-width:8px;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotate(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.Knob__ringFill{fill:transparent;stroke:var(--ring-color,var(--knob-ring-color));stroke-width:8px;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke var(--transition-time-medium)ease-out}.Knob--color--red{--ring-color:var(--color-red)}.Knob--color--orange{--ring-color:var(--color-orange)}.Knob--color--yellow{--ring-color:var(--color-yellow)}.Knob--color--olive{--ring-color:var(--color-olive)}.Knob--color--green{--ring-color:var(--color-green)}.Knob--color--teal{--ring-color:var(--color-teal)}.Knob--color--blue{--ring-color:var(--color-blue)}.Knob--color--violet{--ring-color:var(--color-violet)}.Knob--color--purple{--ring-color:var(--color-purple)}.Knob--color--pink{--ring-color:var(--color-pink)}.Knob--color--brown{--ring-color:var(--color-brown)}.Knob--color--gold{--ring-color:var(--color-gold)}.Knob--color--black{--ring-color:var(--color-black)}.Knob--color--white{--ring-color:var(--color-white)}.Knob--color--grey,.Knob--color--gray{--ring-color:var(--color-grey)}.Knob--color--light-grey,.Knob--color--light-gray{--ring-color:var(--color-light-grey)}.Knob--color--primary{--ring-color:var(--color-primary)}.Knob--color--good{--ring-color:var(--color-good)}.Knob--color--average{--ring-color:var(--color-average)}.Knob--color--bad{--ring-color:var(--color-bad)}.Knob--color--label{--ring-color:var(--color-label)}.LabeledList{border-collapse:collapse;border-spacing:0;width:calc(100% + 1em);margin:calc(-1*var(--space-s))calc(-1*var(--space-m))0;padding:0;display:table}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{padding:var(--space-s)var(--space-m);text-align:left;border:0;margin:0;display:table-cell}.LabeledList__label--nowrap{white-space:nowrap;width:1%;min-width:5em}.LabeledList__buttons{white-space:nowrap;text-align:right;width:.1%;padding-top:var(--space-xxs);padding-bottom:0}.LabeledList__breakContents{word-break:break-all;word-wrap:break-word}.MenuBar{display:flex}.MenuBar__font{font-family:var(--menu-bar-font-family);font-size:1em;line-height:1.41667em}.MenuBar__hover:hover{background-color:hsl(from var(--menu-bar-background)h s calc(l + 20));transition:background-color}.MenuBar__MenuBarButton{padding:var(--space-s)var(--space-m)}.MenuBar__menu{background-color:var(--menu-bar-background);padding:var(--space-sm);z-index:5;position:absolute;box-shadow:4px 6px 5px -2px rgba(0,0,0,.5)}.MenuBar__MenuItem{transition:background-color var(--menu-bar-transition)ease-out;background-color:var(--menu-bar-background);white-space:nowrap;padding:var(--space-sm)var(--space-xl)var(--space-sm)calc(var(--space-xxl) + 1rem)}.MenuBar__MenuItemToggle{padding:var(--space-sm)var(--space-xl)var(--space-sm)0}.MenuBar__MenuItemToggle__check{vertical-align:middle;text-align:center;min-width:2.5rem;padding-left:var(--space-sm);display:inline-block}.MenuBar__over{top:auto;bottom:100%}.MenuBar__MenuBarButton-text{text-overflow:clip;white-space:nowrap;height:1.41667em}.MenuBar__Separator{margin:var(--space-sm);border-top:var(--border-thickness-tiny)solid var(--color-border);display:block}.Modal{background-color:var(--modal-background);padding:var(--modal-padding)}.Modal__dimmer .Dimmer__inner{max-width:calc(100vw - var(--space-xxl));max-height:calc(100vh - var(--space-xxl))}.NoticeBox{--noticebox-background:var(--notice-box-background);padding:var(--space-sm)var(--space-m);margin-bottom:var(--space-m);background-color:oklch(from var(--noticebox-background)calc(l*.825)calc(c*.75)h);background-image:repeating-linear-gradient(-45deg,transparent 0 .833333em,var(--notice-box-stripes).833333em 1.66667em);color:var(--notice-box-color);font-style:italic;font-weight:700}.NoticeBox--color--red{--noticebox-background:var(--color-red)}.NoticeBox--color--orange{--noticebox-background:var(--color-orange)}.NoticeBox--color--yellow{--noticebox-background:var(--color-yellow);--notice-box-color:var(--color-black)}.NoticeBox--color--olive{--noticebox-background:var(--color-olive)}.NoticeBox--color--green{--noticebox-background:var(--color-green)}.NoticeBox--color--teal{--noticebox-background:var(--color-teal)}.NoticeBox--color--blue{--noticebox-background:var(--color-blue)}.NoticeBox--color--violet{--noticebox-background:var(--color-violet)}.NoticeBox--color--purple{--noticebox-background:var(--color-purple)}.NoticeBox--color--pink{--noticebox-background:var(--color-pink)}.NoticeBox--color--brown{--noticebox-background:var(--color-brown)}.NoticeBox--color--gold{--noticebox-background:var(--color-gold)}.NoticeBox--color--black{--noticebox-background:var(--color-black);--notice-box-stripes:rgba(255,255,255,.1)}.NoticeBox--color--white{--noticebox-background:var(--color-white);--notice-box-color:var(--color-black)}.NoticeBox--color--grey,.NoticeBox--color--gray{--noticebox-background:var(--color-grey)}.NoticeBox--color--light-grey,.NoticeBox--color--light-gray{--noticebox-background:var(--color-light-grey)}.NoticeBox--color--primary{--noticebox-background:var(--color-primary)}.NoticeBox--color--good{--noticebox-background:var(--color-good)}.NoticeBox--color--average{--noticebox-background:var(--color-average)}.NoticeBox--color--bad{--noticebox-background:var(--color-bad)}.NoticeBox--color--label{--noticebox-background:var(--color-label)}.NoticeBox--type--info{--noticebox-background:var(--color-blue)}.NoticeBox--type--success{--noticebox-background:var(--color-green)}.NoticeBox--type--warning{--noticebox-background:var(--color-orange)}.NoticeBox--type--danger{--noticebox-background:var(--color-red)}.NumberInput{cursor:var(--cursor-n-resize);text-align:right;padding:0 var(--space-sm);margin-right:var(--space-xs);background-color:var(--number-input-background);color:var(--number-input-border-color-active);border:var(--border-thickness-tiny)solid var(--number-input-border-color);border-radius:var(--number-input-border-radius);transition:border-color var(--number-input-transition);line-height:1.41667em;display:inline-block;position:relative;overflow:visible}.NumberInput:active{border-color:var(--number-input-border-color-active)}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:var(--space-m)}.NumberInput__barContainer{top:var(--space-xs);bottom:var(--space-xs);left:var(--space-xs);position:absolute}.NumberInput__bar{box-sizing:border-box;border-bottom:var(--border-thickness-tiny)solid var(--number-input-border-color-active);background-color:var(--number-input-border-color-active);width:.25em;position:absolute;bottom:0;left:0}.NumberInput__input{text-align:right;width:100%;height:1.41667em;padding:0 var(--space-m);font-size:1em;line-height:1.41667em;font-family:var(--font-family);background-color:var(--number-input-background);color:var(--number-input-color);border:0;outline:0;margin:0;display:block;position:absolute;top:0;bottom:0;left:0;right:0}.ProgressBar{width:100%;min-height:var(--button-height);padding:0 var(--space-m);background-color:var(--progress-bar-background);border:var(--border-thickness-tiny)solid var(--progress-bar-color);border-radius:var(--progress-bar-border-radius);transition:border-color var(--progress-bar-transition)ease-out;align-content:center;display:inline-block;position:relative}.ProgressBar__fill{background-color:var(--progress-bar-color);position:absolute;top:0;bottom:0;left:0;right:0}.ProgressBar__fill--animated{transition-property:background-color,width;transition-duration:var(--progress-bar-transition)}.ProgressBar__content{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:right;width:100%;position:relative}.ProgressBar--color--default{--progress-bar-color:hsl(from var(--progress-bar-fill)h s calc(l - var(--adjust-color)))}.ProgressBar--color--red{--progress-bar-color:hsl(from var(--color-red)h s calc(l - var(--adjust-color)))}.ProgressBar--color--orange{--progress-bar-color:hsl(from var(--color-orange)h s calc(l - var(--adjust-color)))}.ProgressBar--color--yellow{--progress-bar-color:hsl(from var(--color-yellow)h s calc(l - var(--adjust-color)))}.ProgressBar--color--olive{--progress-bar-color:hsl(from var(--color-olive)h s calc(l - var(--adjust-color)))}.ProgressBar--color--green{--progress-bar-color:hsl(from var(--color-green)h s calc(l - var(--adjust-color)))}.ProgressBar--color--teal{--progress-bar-color:hsl(from var(--color-teal)h s calc(l - var(--adjust-color)))}.ProgressBar--color--blue{--progress-bar-color:hsl(from var(--color-blue)h s calc(l - var(--adjust-color)))}.ProgressBar--color--violet{--progress-bar-color:hsl(from var(--color-violet)h s calc(l - var(--adjust-color)))}.ProgressBar--color--purple{--progress-bar-color:hsl(from var(--color-purple)h s calc(l - var(--adjust-color)))}.ProgressBar--color--pink{--progress-bar-color:hsl(from var(--color-pink)h s calc(l - var(--adjust-color)))}.ProgressBar--color--brown{--progress-bar-color:hsl(from var(--color-brown)h s calc(l - var(--adjust-color)))}.ProgressBar--color--gold{--progress-bar-color:hsl(from var(--color-gold)h s calc(l - var(--adjust-color)))}.ProgressBar--color--black{--progress-bar-color:hsl(from var(--color-black)h s calc(l - var(--adjust-color)))}.ProgressBar--color--white{--progress-bar-color:hsl(from var(--color-white)h s calc(l - var(--adjust-color)))}.ProgressBar--color--grey,.ProgressBar--color--gray{--progress-bar-color:hsl(from var(--color-grey)h s calc(l - var(--adjust-color)))}.ProgressBar--color--light-grey,.ProgressBar--color--light-gray{--progress-bar-color:hsl(from var(--color-light-grey)h s calc(l - var(--adjust-color)))}.ProgressBar--color--primary{--progress-bar-color:hsl(from var(--color-primary)h s calc(l - var(--adjust-color)))}.ProgressBar--color--good{--progress-bar-color:hsl(from var(--color-good)h s calc(l - var(--adjust-color)))}.ProgressBar--color--average{--progress-bar-color:hsl(from var(--color-average)h s calc(l - var(--adjust-color)))}.ProgressBar--color--bad{--progress-bar-color:hsl(from var(--color-bad)h s calc(l - var(--adjust-color)))}.ProgressBar--color--label{--progress-bar-color:hsl(from var(--color-label)h s calc(l - var(--adjust-color)))}.RestrictedInput{border-color:var(--restricted-input-border-color);text-align:right}.RestrictedInput:focus-within{border-color:var(--restricted-input-border-color-focus)}.RestrictedInput::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.RestrictedInput::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.RestrictedInput--invalid{border-color:var(--restricted-input-border-color-invalid)}.RestrictedInput--invalid:focus-within{border-color:var(--restricted-input-border-color-invalid)}@keyframes RoundGauge__alertAnim{0%,to{opacity:.1}50%{opacity:1}}@keyframes RoundGauge__needleAlertAnim{0%{transform:rotate(var(--round-gauge-needle-alert-rotation))}50%{transform:rotate(calc(-1*var(--round-gauge-needle-alert-rotation)))}}.RoundGauge{width:2.6em;height:1.3em;margin:0 auto .2em;font-size:1rem}.RoundGauge__wrapper{text-align:center;display:inline-block}.RoundGauge__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:10px;stroke-dasharray:157.08;stroke-dashoffset:157.08px}.RoundGauge__ringFill{fill:transparent;stroke:var(--round-gauge-ring-color);stroke-width:10px;stroke-dasharray:314.16;transition:stroke var(--round-gauge-transition)ease-out}.RoundGauge__needle,.RoundGauge__ringFill{transition:transform var(--round-gauge-transition)ease-in-out}.RoundGauge__needleLine,.RoundGauge__needleMiddle{fill:var(--color-red)}.RoundGauge__alert{fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;fill:rgba(255,255,255,.1);transform-origin:top;transform:scale(.9)}.RoundGauge__alert.active{animation:RoundGauge__alertAnim var(--round-gauge-alert-animation)cubic-bezier(.34,1.56,.64,1)infinite}.RoundGauge__alert.active~.RoundGauge__needle .RoundGauge__needleLine{transform-origin:bottom;animation:RoundGauge__needleAlertAnim var(--round-gauge-needle-alert-animation)infinite}.RoundGauge__alert.max{fill:var(--color-bad)}.RoundGauge--color--red.RoundGauge__ringFill{stroke:var(--color-red)}.RoundGauge--color--orange.RoundGauge__ringFill{stroke:var(--color-orange)}.RoundGauge--color--yellow.RoundGauge__ringFill{stroke:var(--color-yellow)}.RoundGauge--color--olive.RoundGauge__ringFill{stroke:var(--color-olive)}.RoundGauge--color--green.RoundGauge__ringFill{stroke:var(--color-green)}.RoundGauge--color--teal.RoundGauge__ringFill{stroke:var(--color-teal)}.RoundGauge--color--blue.RoundGauge__ringFill{stroke:var(--color-blue)}.RoundGauge--color--violet.RoundGauge__ringFill{stroke:var(--color-violet)}.RoundGauge--color--purple.RoundGauge__ringFill{stroke:var(--color-purple)}.RoundGauge--color--pink.RoundGauge__ringFill{stroke:var(--color-pink)}.RoundGauge--color--brown.RoundGauge__ringFill{stroke:var(--color-brown)}.RoundGauge--color--gold.RoundGauge__ringFill{stroke:var(--color-gold)}.RoundGauge--color--black.RoundGauge__ringFill{stroke:var(--color-black)}.RoundGauge--color--white.RoundGauge__ringFill{stroke:var(--color-white)}.RoundGauge--color--grey.RoundGauge__ringFill,.RoundGauge--color--gray.RoundGauge__ringFill{stroke:var(--color-grey)}.RoundGauge--color--light-grey.RoundGauge__ringFill,.RoundGauge--color--light-gray.RoundGauge__ringFill{stroke:var(--color-light-grey)}.RoundGauge--color--primary.RoundGauge__ringFill{stroke:var(--color-primary)}.RoundGauge--color--good.RoundGauge__ringFill{stroke:var(--color-good)}.RoundGauge--color--average.RoundGauge__ringFill{stroke:var(--color-average)}.RoundGauge--color--bad.RoundGauge__ringFill{stroke:var(--color-bad)}.RoundGauge--color--label.RoundGauge__ringFill{stroke:var(--color-label)}.RoundGauge__alert--red{fill:var(--color-red)}.RoundGauge__alert--orange{fill:var(--color-orange)}.RoundGauge__alert--yellow{fill:var(--color-yellow)}.RoundGauge__alert--olive{fill:var(--color-olive)}.RoundGauge__alert--green{fill:var(--color-green)}.RoundGauge__alert--teal{fill:var(--color-teal)}.RoundGauge__alert--blue{fill:var(--color-blue)}.RoundGauge__alert--violet{fill:var(--color-violet)}.RoundGauge__alert--purple{fill:var(--color-purple)}.RoundGauge__alert--pink{fill:var(--color-pink)}.RoundGauge__alert--brown{fill:var(--color-brown)}.RoundGauge__alert--gold{fill:var(--color-gold)}.RoundGauge__alert--black{fill:var(--color-black)}.RoundGauge__alert--white{fill:var(--color-white)}.RoundGauge__alert--grey,.RoundGauge__alert--gray{fill:var(--color-grey)}.RoundGauge__alert--light-grey,.RoundGauge__alert--light-gray{fill:var(--color-light-grey)}.RoundGauge__alert--primary{fill:var(--color-primary)}.RoundGauge__alert--good{fill:var(--color-good)}.RoundGauge__alert--average{fill:var(--color-average)}.RoundGauge__alert--bad{fill:var(--color-bad)}.RoundGauge__alert--label{fill:var(--color-label)}.Section{margin-bottom:var(--space-m);background-color:var(--section-background);box-sizing:border-box;scrollbar-color:var(--color-scrollbar-thumb)transparent;position:relative}.Section:last-child{margin-bottom:0}.Section__title{padding:var(--space-m);border-bottom:var(--section-separator-thickness)solid var(--section-separator-color);position:relative}.Section__titleText{color:var(--section-title-color);font-size:1.16667em;font-weight:700}.Section__buttons{right:var(--space-m);margin-top:calc(-1*var(--space-xxs));display:inline-block;position:absolute}.Section__rest{position:relative}.Section__content{padding:var(--space-ml)var(--space-m)}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{flex-direction:column;height:100%;display:flex}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;bottom:0;left:0;right:0}.Section--scrollable{overflow:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-x:hidden;overflow-y:scroll}.Section--scrollableHorizontal{overflow:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-x:scroll;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal{overflow:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow:scroll}.Section .Section{margin:0 calc(-1*var(--space-m));background-color:transparent}.Section .Section:first-child{margin-top:calc(-1*var(--space-m))}.Section .Section .Section__titleText{font-size:1.08333em}.Section .Section .Section .Section__titleText{font-size:1em}.Section--flex{flex-flow:column;display:flex}.Section--flex .Section__content{flex-grow:1;overflow:auto}.Section__content--noTopPadding{padding-top:0}.Section__content--stretchContents{height:calc(100% - 3rem)}.Slider{cursor:e-resize;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.Slider--editing .Slider__cursor:before{display:none}.Slider__cursor{inset:0 calc(-1*var(--space-xxs));left:unset;border-left:var(--border-thickness-small)solid var(--slider-cursor-color);border-radius:var(--border-radius-circular);position:absolute}.Slider__cursorOffset{position:absolute;top:0;bottom:0;left:0;right:0;transition:none!important}.Slider__cursor:before{content:"";aspect-ratio:1;border-left:inherit;transform-origin:50%;position:absolute;bottom:0;right:0;transform:scale(4)translateY(50%)rotate(45deg);-webkit-mask-image:linear-gradient(135deg,#000 50%,transparent 50%);mask-image:linear-gradient(135deg,#000 50%,transparent 50%)}.Slider__popupValue{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;padding:var(--space-s)var(--space-m);background-color:var(--slider-popup-background);color:var(--slider-popup-color);border-radius:var(--slider-popup-border-radius);-webkit-backdrop-filter:var(--slider-popup-blur);backdrop-filter:var(--slider-popup-blur);font-size:1em;position:absolute;top:-2em;right:0;transform:translate(50%)}.Slider .NumberInput__input{width:auto;height:auto;top:2px;bottom:2px;left:2px;right:2px}.Stack{gap:.5em}.Stack--fill{height:100%}.Stack--zebra>.Stack__item:nth-child(odd){background-color:var(--candystripe-odd)}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:var(--divider-border)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:var(--divider-border)}.Table{border-collapse:collapse;border-spacing:0;width:100%;margin:0;display:table}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{padding:0 var(--space-s);display:table-cell}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{padding-bottom:var(--space-m);font-weight:700}.Table__cell--collapsing{white-space:nowrap;width:1%}.Tabs{background-color:var(--tabs-container-background);align-items:stretch;display:flex;overflow:hidden}.Tabs--fill{height:100%}.Tabs--vertical{padding:var(--space-s)0 var(--space-s)var(--space-s);flex-direction:column}.Tabs--horizontal{margin-bottom:var(--space-m);padding:var(--space-s)var(--space-s)0}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:var(--cursor-pointer);background-color:var(--tab-background);color:var(--tab-color);min-width:4em;min-height:2.25em;transition-property:background-color,color;transition-duration:var(--tab-transition);justify-content:space-between;align-items:center;display:flex}.Tab:not(.Tab--selected):hover{background-color:var(--tab-background-hover)}.Tab:not(.Tab--selected):active{color:var(--tab-color-selected)}.Tab--selected{cursor:var(--cursor-default);background-color:var(--tab-background-selected);color:var(--tab-color-selected)}.Tab .Tab__text{margin:0 var(--space-m);flex-grow:1}.Tab__left{text-align:center;min-width:1.5em;margin-left:var(--space-s)}.Tab__right{text-align:center;min-width:1.5em;margin-right:var(--space-s)}.Tabs--horizontal .Tab{border-top-left-radius:var(--tab-border-radius);border-top-right-radius:var(--tab-border-radius);padding-bottom:var(--tab-indicator-size);position:relative}.Tabs--horizontal .Tab:before{content:"";transition:transform var(--tab-transition);width:100%;height:var(--tab-indicator-size);background-color:currentColor;position:absolute;bottom:0;transform:scaleX(0)}.Tabs--horizontal .Tab--selected:before{transform:scaleX(.99999)!important}.Tabs--vertical .Tab{border-top-left-radius:var(--tab-border-radius);border-bottom-left-radius:var(--tab-border-radius);min-height:2em;padding-right:var(--tab-indicator-size);position:relative}.Tabs--vertical .Tab:before{content:"";transition:transform var(--tab-transition);width:var(--tab-indicator-size);background-color:currentColor;height:100%;position:absolute;right:0;transform:scaleY(0)}.Tabs--vertical .Tab--selected:before{transform:scaleY(.99999)!important}.Tab--selected.Tab--color--red{color:hsl(from var(--color-red)h s calc(l + 17.5))}.Tab--selected.Tab--color--orange{color:hsl(from var(--color-orange)h s calc(l + 17.5))}.Tab--selected.Tab--color--yellow{color:hsl(from var(--color-yellow)h s calc(l + 17.5))}.Tab--selected.Tab--color--olive{color:hsl(from var(--color-olive)h s calc(l + 17.5))}.Tab--selected.Tab--color--green{color:hsl(from var(--color-green)h s calc(l + 17.5))}.Tab--selected.Tab--color--teal{color:hsl(from var(--color-teal)h s calc(l + 17.5))}.Tab--selected.Tab--color--blue{color:hsl(from var(--color-blue)h s calc(l + 17.5))}.Tab--selected.Tab--color--violet{color:hsl(from var(--color-violet)h s calc(l + 17.5))}.Tab--selected.Tab--color--purple{color:hsl(from var(--color-purple)h s calc(l + 17.5))}.Tab--selected.Tab--color--pink{color:hsl(from var(--color-pink)h s calc(l + 17.5))}.Tab--selected.Tab--color--brown{color:hsl(from var(--color-brown)h s calc(l + 17.5))}.Tab--selected.Tab--color--gold{color:hsl(from var(--color-gold)h s calc(l + 17.5))}.Tab--selected.Tab--color--black{color:hsl(from var(--color-black)h s calc(l + 17.5))}.Tab--selected.Tab--color--white{color:hsl(from var(--color-white)h s calc(l + 17.5))}.Tab--selected.Tab--color--grey,.Tab--selected.Tab--color--gray{color:hsl(from var(--color-grey)h s calc(l + 17.5))}.Tab--selected.Tab--color--light-grey,.Tab--selected.Tab--color--light-gray{color:hsl(from var(--color-light-grey)h s calc(l + 17.5))}.Tab--selected.Tab--color--primary{color:hsl(from var(--color-primary)h s calc(l + 17.5))}.Tab--selected.Tab--color--good{color:hsl(from var(--color-good)h s calc(l + 17.5))}.Tab--selected.Tab--color--average{color:hsl(from var(--color-average)h s calc(l + 17.5))}.Tab--selected.Tab--color--bad{color:hsl(from var(--color-bad)h s calc(l + 17.5))}.Tab--selected.Tab--color--label{color:hsl(from var(--color-label)h s calc(l + 17.5))}.Section .Tabs{background-color:transparent}.Section:not(.Section--fitted) .Tabs{margin:0 calc(-1*var(--space-m))var(--space-m)}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:calc(-1*var(--space-m))}.TextArea{resize:none;scrollbar-width:thin;scrollbar-gutter:stable;scrollbar-color:var(--color-scrollbar-thumb)transparent}.Tooltip{-webkit-backdrop-filter:var(--tooltip-blur);backdrop-filter:var(--tooltip-blur);background-color:var(--tooltip-background);border-radius:var(--tooltip-border-radius);color:var(--tooltip-color);max-width:20.8333em;padding:var(--space-m)var(--space-l);pointer-events:none;text-align:left;box-shadow:.1em .1em 1.25em -.1em rgba(0,0,0,.5)}html,body{box-sizing:border-box;height:100%;font-size:var(--font-size,12px);color:var(--color-text,#fff);scrollbar-color:var(--color-scrollbar-thumb)var(--color-scrollbar-base);margin:0}html{cursor:var(--cursor-default,default);overflow:hidden}body{font-family:var(--font-family,Verdana,Geneva,sans-serif);overflow:auto}img{image-rendering:pixelated}*,:before,:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{padding:var(--space-m,6px)0;padding:var(--space-m,.5rem)0;margin:0;display:block}h1{font-size:1.5rem}h2{font-size:1.333rem}h3{font-size:1.167rem}h4{font-size:1rem}td,th{vertical-align:baseline;text-align:left}:where(.candystripe:nth-child(odd)){background-color:var(--candystripe-odd)}:where(.candystripe:nth-child(2n)){background-color:var(--candystripe-even)}.color-black{color:hsl(from var(--color-black)h s calc(l + var(--adjust-color)))!important}.color-white{color:hsl(from var(--color-white)h s calc(l + var(--adjust-color)))!important}.color-red{color:hsl(from var(--color-red)h s calc(l + var(--adjust-color)))!important}.color-orange{color:hsl(from var(--color-orange)h s calc(l + var(--adjust-color)))!important}.color-yellow{color:hsl(from var(--color-yellow)h s calc(l + var(--adjust-color)))!important}.color-olive{color:hsl(from var(--color-olive)h s calc(l + var(--adjust-color)))!important}.color-green{color:hsl(from var(--color-green)h s calc(l + var(--adjust-color)))!important}.color-teal{color:hsl(from var(--color-teal)h s calc(l + var(--adjust-color)))!important}.color-blue{color:hsl(from var(--color-blue)h s calc(l + var(--adjust-color)))!important}.color-violet{color:hsl(from var(--color-violet)h s calc(l + var(--adjust-color)))!important}.color-purple{color:hsl(from var(--color-purple)h s calc(l + var(--adjust-color)))!important}.color-pink{color:hsl(from var(--color-pink)h s calc(l + var(--adjust-color)))!important}.color-brown{color:hsl(from var(--color-brown)h s calc(l + var(--adjust-color)))!important}.color-grey,.color-gray{color:hsl(from var(--color-grey)h s calc(l + var(--adjust-color)))!important}.color-light-grey,.color-light-gray{color:hsl(from var(--color-light-grey)h s calc(l + var(--adjust-color)))!important}.color-good{color:hsl(from var(--color-good)h s calc(l + var(--adjust-color)))!important}.color-average{color:hsl(from var(--color-average)h s calc(l + var(--adjust-color)))!important}.color-bad{color:hsl(from var(--color-bad)h s calc(l + var(--adjust-color)))!important}.color-label{color:hsl(from var(--color-label)h s calc(l + var(--adjust-color)))!important}.color-bg-black{background-color:hsl(from var(--color-black)h s calc(l - var(--adjust-color)))!important}.color-bg-white{background-color:hsl(from var(--color-white)h s calc(l - var(--adjust-color)))!important}.color-bg-red{background-color:hsl(from var(--color-red)h s calc(l - var(--adjust-color)))!important}.color-bg-orange{background-color:hsl(from var(--color-orange)h s calc(l - var(--adjust-color)))!important}.color-bg-yellow{background-color:hsl(from var(--color-yellow)h s calc(l - var(--adjust-color)))!important}.color-bg-olive{background-color:hsl(from var(--color-olive)h s calc(l - var(--adjust-color)))!important}.color-bg-green{background-color:hsl(from var(--color-green)h s calc(l - var(--adjust-color)))!important}.color-bg-teal{background-color:hsl(from var(--color-teal)h s calc(l - var(--adjust-color)))!important}.color-bg-blue{background-color:hsl(from var(--color-blue)h s calc(l - var(--adjust-color)))!important}.color-bg-violet{background-color:hsl(from var(--color-violet)h s calc(l - var(--adjust-color)))!important}.color-bg-purple{background-color:hsl(from var(--color-purple)h s calc(l - var(--adjust-color)))!important}.color-bg-pink{background-color:hsl(from var(--color-pink)h s calc(l - var(--adjust-color)))!important}.color-bg-brown{background-color:hsl(from var(--color-brown)h s calc(l - var(--adjust-color)))!important}.color-bg-grey,.color-bg-gray{background-color:hsl(from var(--color-grey)h s calc(l - var(--adjust-color)))!important}.color-bg-light-grey,.color-bg-light-gray{background-color:hsl(from var(--color-light-grey)h s calc(l - var(--adjust-color)))!important}.color-bg-good{background-color:hsl(from var(--color-good)h s calc(l - var(--adjust-color)))!important}.color-bg-average{background-color:hsl(from var(--color-average)h s calc(l - var(--adjust-color)))!important}.color-bg-bad{background-color:hsl(from var(--color-bad)h s calc(l - var(--adjust-color)))!important}.color-bg-label{background-color:hsl(from var(--color-label)h s calc(l - var(--adjust-color)))!important}.debug-layout,.debug-layout :not(g):not(path){color:rgba(255,255,255,.9)!important;box-shadow:none!important;-webkit-filter:none!important;filter:none!important;background:0 0!important;outline:1px solid rgba(255,255,255,.5)!important}.debug-layout:hover,.debug-layout :not(g):not(path):hover{outline-color:rgba(255,255,255,.8)!important}.outline-dotted{outline-style:dotted!important}.outline-dashed{outline-style:dashed!important}.outline-solid{outline-style:solid!important}.outline-double{outline-style:double!important}.outline-groove{outline-style:groove!important}.outline-ridge{outline-style:ridge!important}.outline-inset{outline-style:inset!important}.outline-outset{outline-style:outset!important}.outline-color-black{outline:var(--border-thickness-small)solid hsl(from var(--color-black)h s calc(l + var(--adjust-color)))!important}.outline-color-white{outline:var(--border-thickness-small)solid hsl(from var(--color-white)h s calc(l + var(--adjust-color)))!important}.outline-color-red{outline:var(--border-thickness-small)solid hsl(from var(--color-red)h s calc(l + var(--adjust-color)))!important}.outline-color-orange{outline:var(--border-thickness-small)solid hsl(from var(--color-orange)h s calc(l + var(--adjust-color)))!important}.outline-color-yellow{outline:var(--border-thickness-small)solid hsl(from var(--color-yellow)h s calc(l + var(--adjust-color)))!important}.outline-color-olive{outline:var(--border-thickness-small)solid hsl(from var(--color-olive)h s calc(l + var(--adjust-color)))!important}.outline-color-green{outline:var(--border-thickness-small)solid hsl(from var(--color-green)h s calc(l + var(--adjust-color)))!important}.outline-color-teal{outline:var(--border-thickness-small)solid hsl(from var(--color-teal)h s calc(l + var(--adjust-color)))!important}.outline-color-blue{outline:var(--border-thickness-small)solid hsl(from var(--color-blue)h s calc(l + var(--adjust-color)))!important}.outline-color-violet{outline:var(--border-thickness-small)solid hsl(from var(--color-violet)h s calc(l + var(--adjust-color)))!important}.outline-color-purple{outline:var(--border-thickness-small)solid hsl(from var(--color-purple)h s calc(l + var(--adjust-color)))!important}.outline-color-pink{outline:var(--border-thickness-small)solid hsl(from var(--color-pink)h s calc(l + var(--adjust-color)))!important}.outline-color-brown{outline:var(--border-thickness-small)solid hsl(from var(--color-brown)h s calc(l + var(--adjust-color)))!important}.outline-color-grey,.outline-color-gray{outline:var(--border-thickness-small)solid hsl(from var(--color-grey)h s calc(l + var(--adjust-color)))!important}.outline-color-light-grey,.outline-color-light-gray{outline:var(--border-thickness-small)solid hsl(from var(--color-light-grey)h s calc(l + var(--adjust-color)))!important}.outline-color-good{outline:var(--border-thickness-small)solid hsl(from var(--color-good)h s calc(l + var(--adjust-color)))!important}.outline-color-average{outline:var(--border-thickness-small)solid hsl(from var(--color-average)h s calc(l + var(--adjust-color)))!important}.outline-color-bad{outline:var(--border-thickness-small)solid hsl(from var(--color-bad)h s calc(l + var(--adjust-color)))!important}.outline-color-label{outline:var(--border-thickness-small)solid hsl(from var(--color-label)h s calc(l + var(--adjust-color)))!important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:700}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.Chat{color:var(--chat-text-color)}.Chat__badge{color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#db143c;border-radius:10px;min-width:.5em;padding:.2em .3em;font-size:.7em;line-height:1;transition:font-size .2s ease-out;display:inline-block}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size}.Chat__scrollButton{position:fixed;bottom:1em;right:2em}.Chat__reconnected{text-align:center;margin:1em 0 2em;font-size:.85em}.Chat__reconnected:before{content:"Reconnected";color:var(--reconnect-text,var(--color-red));background-color:var(--reconnect-background,var(--color-section));border-radius:1em;padding:0 .7em;display:inline-block}.Chat__reconnected:after{content:"";border-bottom:.166667em solid var(--color-red);margin-top:-.75em;display:block}.Chat__highlight{color:var(--color-black)}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{border-left:.166667em solid #ffe045;padding-left:.5em;position:relative}.ChatMessage--highlighted:after{content:"";pointer-events:none;background-color:rgba(255,224,69,.1);position:absolute;top:0;bottom:0;left:0;right:0}.Ping{padding:var(--space-xs)var(--space-sm);border:var(--border-thickness-tiny)solid hsl(from var(--color-border-primary)h 10 50/.33);border-radius:var(--border-radius-medium);text-align:right;min-width:4em;max-width:5em;position:relative}.Ping__indicator{content:"";top:var(--space-m);left:var(--space-m);border-radius:var(--border-radius-medium);background-color:#888;width:.5em;height:.5em;position:absolute}.Notifications{position:absolute;top:1em;left:1em;right:2em}.Notification{color:#fff;background-color:#db143c;margin:1em 0;padding:.5em}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.UnreadCount{pointer-events:none;top:calc(-1*var(--space-s));right:calc(-1*var(--space-s));padding:0 var(--space-s);border-radius:var(--border-radius-small);background-color:var(--color-red);color:var(--color-white);font-size:.65em;line-height:1.25em;position:absolute}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.Layout__content--scrollable{margin-bottom:0;overflow-y:auto}.Window{color:var(--color-text);background-color:var(--color-base);background-image:linear-gradient(to bottom,var(--color-base-start)0%,var(--color-base-end)100%);position:fixed;top:0;bottom:0;left:0;right:0}.Window__rest{position:fixed;top:2.66667rem;bottom:0;left:0;right:0}.Window__contentPadding{height:calc(100% - 1rem);margin:.5rem}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{content:"";height:.5rem;display:block}.Window__dimmer{pointer-events:none;background-color:hsl(from var(--color-base)h s calc(l + 15)/.25);position:fixed;top:0;bottom:0;left:0;right:0}.Window__resizeHandle__se{cursor:var(--cursor-se-resize);width:1.66667rem;height:1.66667rem;position:fixed;bottom:0;right:0}.Window__resizeHandle__s{cursor:var(--cursor-s-resize);height:.5rem;position:fixed;bottom:0;left:0;right:0}.Window__resizeHandle__e{cursor:var(--cursor-e-resize);width:.25rem;position:fixed;top:0;bottom:0;right:0}img{margin:0;padding:0;line-height:1}img.icon{vertical-align:bottom;width:auto;min-width:16px;height:1em;min-height:16px}a{color:#397ea5}em{font-style:normal;font-weight:700}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}.emoji{max-width:16px;max-height:16px}.emoji16x16{vertical-align:middle}.italic,.italics,.emote{font-style:italic}.bold{font-weight:700}.bolditalics{font-style:italic;font-weight:700}.center{text-align:center}.big{font-size:150%}.reallybig{font-size:175%}.sans{font-family:Comic Sans MS,cursive,sans-serif}.wingdings{font-family:Wingdings,Webdings}.robot{font-family:OCR-A,monospace;font-size:1.15em;font-weight:700}.hidden{visibility:hidden;display:none}.motd{color:#a4bad6;white-space:normal;font-family:Verdana,sans-serif}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:active,.motd a:hover{color:#a4bad6}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:75%}.ooc{font-weight:700}.looc{color:#69c;font-weight:700}.discordpm{color:#6685f5}.debug{color:#6d2f83}.deadsay{color:#e2c1ff}.darkmblue{color:#6685f5}.prefix,.name,.yell{font-weight:700}.mentorhelp{color:#07b;font-weight:700}.mentor_channel{color:#b4af13;font-weight:700}.mentor_channel_admin{color:#f1ec50;font-weight:700}.admin{color:#386aff;font-weight:700}.adminhelp{color:#a00;font-weight:700}.adminticket{color:#3daf21;font-weight:700}.adminticketalt{color:#ccb847;font-weight:700}.admin_channel{color:#03fc9d;font-weight:700}.all_admin_ping{color:#12a5f4;text-align:center;font-size:120%;font-weight:700}.dev_channel{color:#61b413;font-weight:700}.dev_channel_admin{color:#9ef14f;font-weight:700}.staff_channel{color:#775bff;font-weight:700}.staff_channel_admin{color:#a35cff;font-weight:700}.radio{color:#20b142}.deptradio{color:#939}.comradio{color:#5f5cff}.syndradio{color:#8f4a4b}.dsquadradio{color:#998599}.airadio{color:#ff5ed7}.centradio{color:#2681a5}.secradio{color:#dd3535}.engradio{color:#feac20}.medradio{color:#00b5ad}.sciradio{color:#c68cfa}.supradio{color:#b88646}.srvradio{color:#bbd164}.proradio{color:#b84f92}.alert{color:#d82020}h1.alert,h2.alert{color:#a4bad6}.ghostalert{color:#cc00c6;font-style:italic;font-weight:700}.warning{color:#c51e1e;font-style:italic}.boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.danger{color:#c51e1e;font-weight:700}.biggerdanger{color:red;font-size:150%;font-weight:700}.userdanger{color:#c51e1e;font-size:120%;font-weight:700}.attack{color:red}.disarm{color:#900}.moderate{color:#c00}.notice{color:#6685f5}.boldnotice{color:#6685f5;font-weight:700}.subtle{color:#8a72c5;font-size:85%;font-style:italic}.suicide{color:#ff5050;font-style:italic}.announcement h1,.announcement h2{color:#a4bad6;margin:8pt 0;line-height:1.2}.announcement p{color:#d82020;line-height:1.3}.announcement.minor h1{font-size:180%}.announcement.minor h2{font-size:170%}.announcement.sec h1{color:red;font-family:Verdana,sans-serif;font-size:180%}.boldannounceic,.boldannounceooc,.pr_announce{color:#c51e1e;font-weight:700}.greenannounce{color:#059223;font-weight:700}.alien{color:#c433c4}.noticealien{color:#00c000}.alertalien{color:#00c000;font-weight:700}.terrorspider{color:#cf52fa}.dantalion{color:#8b2c5e}.chaosverygood{color:#19e0c0;font-size:120%;font-weight:700}.chaosgood{color:#19e0c0;font-weight:700}.chaosneutral{color:#479ac0;font-weight:700}.chaosbad{color:#9047c0;font-weight:700}.chaosverybad{color:#9047c0;font-size:120%;font-weight:700}.sinister{color:purple;font-style:italic;font-weight:700}.blob{color:#ee4000;font-style:italic}.revennotice{color:#6685f5}.revenbignotice{color:#6685f5;font-size:120%;font-weight:700}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-size:120%;font-weight:700}.changeling{color:#00b4de}.abductor{color:purple;font-style:italic}.mind_control{color:#a00d6f;font-size:3px;font-style:italic;font-weight:700}.cult{color:purple;font-style:italic;font-weight:700}.cultspeech{color:#af0000;font-style:italic}.cultitalic{color:#a60000;font-style:italic}.cultlarge{color:#a60000;font-size:120%;font-weight:700}.narsie{color:#a60000;font-size:300%;font-weight:700}.narsiesmall{color:#a60000;font-size:200%;font-weight:700}.his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.zombielarge{color:#7c4848;font-size:120%;font-weight:700}.colossus{color:#7f282a;font-size:175%}.hierophant{color:#609;font-style:italic;font-weight:700}.hierophant_warning{color:#609;font-style:italic}.tajaran{color:#803b56}.skrell{color:#00ced1}.solcom{color:#8282fb}.com_cygni{color:#7c4848}.zombie{color:red}.soghun{color:#228b22}.vox{color:#a0a}.diona{color:#804000;font-weight:700}.trinary{color:#727272}.kidan{color:#c64c05}.slime{color:#07a}.drask{color:#a3d4eb;font-family:Arial Black}.moth{color:#869b29;font-family:Copperplate}.clown{color:red}.vulpkanin{color:#b97a57}.gutter{color:#7092be;font-family:Trebuchet MS,cursive,sans-serif}.tradeband{font-family:Georgia,Verdana,sans-serif}.rose{color:#ff5050}.interface{color:#9031c4}.greentext{color:#0f0;font-size:150%}.redtext{color:red;font-size:150%}.red{color:red}.green{color:#03bb39}.purple{color:#9031c4}.orange{color:orange}.resonate{color:#298f85}.healthscan_oxy{color:#5cc9ff}.specialnotice{color:#4a6f82;font-size:120%;font-weight:700}.whisper{color:#ccc;font-style:italic}span.body .codephrases{color:#55f}span.body .coderesponses{color:#f33}.oxygen{color:#449dff}.nitrogen{color:#f94541}.carbon_dioxide{color:#ccc}.plasma{color:#eb6b00}.sleeping_agent{color:#f28b89}.agent_b{color:teal}.boxed_message{text-align:center;background:#17191c;border:.0833333em solid rgba(166,183,217,.25);border-width:.0833333em .416667em;border-radius:.5em;margin:.5em .25em;padding:.5em .75em}.boxed_message.red_border{background:#1f1414;border-color:rgba(255,0,0,.5)}.boxed_message.green_border{background:#141f18;border-color:rgba(0,255,0,.5)}.boxed_message.purple_border{background:#1d1828;border-color:rgba(170,128,255,.5)}.boxed_message.notice_border{background:#14181f;border-color:rgba(85,126,246,.5)}.boxed_message.thick_border{border-width:.5em}.boxed_message.left_align_text{text-align:left}:root{--chat-text-color:#b3cce6;--color-base:#202020;--color-section:hsl(from var(--color-base)h s calc(l - 4.2));--base-gradient-spread:0}.theme-light:root{--chat-text-color:var(--color-black);--color-base:#ededed;--color-section:var(--color-white);--color-text:var(--color-black);--color-label:#545454;--color-action:#e6e6e6;--color-scrollbar-thumb:var(--color-light-gray);--primary-lightness:60%;--primary-saturation:60%;--border-primary-alpha:.66;--button-background-selected:hsl(from var(--color-primary)h 100 l);--button-background-caution:#b85a0a;--button-background-danger:#990;--tab-color-selected:var(--color-black);--input-background:var(--color-base);--tooltip-background-lightness:90}.theme-light:root a,.theme-light:root h1,.theme-light:root h2,.theme-light:root h3,.theme-light:root h4,.theme-light:root h5,.theme-light:root h6{color:#00f}.theme-light:root .motd,.theme-light:root .motd h1,.theme-light:root .motd h2,.theme-light:root .motd h3,.theme-light:root .motd h4,.theme-light:root .motd h5,.theme-light:root .motd h6,.theme-light:root .motd a,.theme-light:root .motd a:link,.theme-light:root .motd a:active,.theme-light:root .motd a:hover{color:#638500}.theme-light:root .looc{color:#69c}.theme-light:root .discordpm{color:#00f}.theme-light:root .debug{color:#6d2f83}.theme-light:root .deadsay{color:#5c00e6}.theme-light:root .darkmblue{color:#00f}.theme-light:root .mentorhelp{color:#07b}.theme-light:root .mentor_channel{color:#5e6812}.theme-light:root .mentor_channel_admin{color:#94a419}.theme-light:root .adminhelp{color:#a00}.theme-light:root .adminticket{color:#3e7336}.theme-light:root .adminticketalt{color:#014c8a}.theme-light:root .admin_channel{color:#9a04d1}.theme-light:root .all_admin_ping{color:#12a5f4}.theme-light:root .dev_channel{color:#126719}.theme-light:root .dev_channel_admin{color:#26a419}.theme-light:root .staff_channel{color:#775bff}.theme-light:root .staff_channel_admin{color:#a35cff}.theme-light:root .radio{color:#408010}.theme-light:root .deptradio{color:#939}.theme-light:root .comradio{color:#204090}.theme-light:root .syndradio{color:#6d3f40}.theme-light:root .dsquadradio{color:#686868}.theme-light:root .airadio{color:#f0f}.theme-light:root .centradio{color:#5c5c7c}.theme-light:root .secradio{color:#a30000}.theme-light:root .engradio{color:#a66300}.theme-light:root .medradio{color:#009190}.theme-light:root .sciradio{color:#939}.theme-light:root .supradio{color:#7f6539}.theme-light:root .srvradio{color:#80a000}.theme-light:root .proradio{color:#e3027a}.theme-light:root .alert{color:red}.theme-light:root h1.alert,.theme-light:root h2.alert{color:#000}.theme-light:root .ghostalert{color:#5c00e6}.theme-light:root .warning,.theme-light:root .boldwarning,.theme-light:root .danger,.theme-light:root .userdanger{color:red}.theme-light:root .notice,.theme-light:root .boldnotice{color:#009}.theme-light:root .subtle{color:#009;font-size:85%;font-style:italic}.theme-light:root .announcement h1,.theme-light:root .announcement h2{color:#000}.theme-light:root .announcement.sec h1,.theme-light:root .boldannounceic,.theme-light:root .boldannounceooc{color:red}.theme-light:root .pr_announce{color:#228b22}.theme-light:root .greenannounce{color:#0f0}.theme-light:root .alien{color:#543354}.theme-light:root .terrorspider{color:#320e32}.theme-light:root .dantalion{color:#6a2148}.theme-light:root .revennotice,.theme-light:root .revenbignotice{color:#1d2953}.theme-light:root .changeling{color:purple}.theme-light:root .cultspeech{color:#7f0000}.theme-light:root .cultitalic,.theme-light:root .cultlarge,.theme-light:root .narsie,.theme-light:root .narsiesmall{color:#960000}.theme-light:root .rose{color:#ff5050}.theme-light:root .interface{color:#303}.theme-light:root .purple{color:#5e2d79}.theme-light:root .orange{color:orange}.theme-light:root .healthscan_oxy{color:#0074bd}.theme-light:root .specialnotice{color:#36525e}.theme-light:root .whisper{color:#333}.theme-light:root span.body .codephrases{color:#00f}.theme-light:root span.body .coderesponses{color:red}.theme-light:root .oxygen{color:#006adb}.theme-light:root .nitrogen{color:#d00a06}.theme-light:root .carbon_dioxide{color:#1f1f1f}.theme-light:root .plasma{color:#853c00}.theme-light:root .sleeping_agent{color:#e82f2c}.theme-light:root .agent_b{color:#004d4d}.theme-light:root .boxed_message{background:#f2f7ff;border-color:rgba(16,48,112,.5)}.theme-light:root .boxed_message.red_border{background:#fff2f2;border-color:rgba(255,0,0,.5)}.theme-light:root .boxed_message.green_border{background:#f2fff7;border-color:rgba(0,168,0,.5)}.theme-light:root .boxed_message.purple_border{background:#f7f2ff;border-color:rgba(85,0,255,.5)}.theme-light:root .boxed_message.notice_border{background:#f2f7ff;border-color:rgba(0,64,255,.5)}.theme-ntos:root{--color-base:#1b2532;--color-section:#121821;--color-primary:#476385}.theme-ntos:root .boxed_message{background:#1d2330}.theme-ntos:root .boxed_message.red_border{background:#301d1d}.theme-ntos:root .boxed_message.green_border{background:#1d3023}.theme-ntos:root .boxed_message.purple_border{background:#231d30}.theme-ntos:root .boxed_message.notice_border{background:#192234}.theme-syndicate:root{--color-base:#4d0202;--color-section:#2b0101;--color-primary:#3b783b;--color-label:#ad8585;--button-background-selected:#b60a0a;--button-background-caution:#ba5e0d;--button-background-danger:#969900;--notice-box-background:#8d0101;--notice-box-color:var(--color-text-fixed-white);--progress-bar-background:rgba(0,0,0,.5);--tooltip-background-lightness:25}.theme-syndicate:root .adminooc{color:#29ccbe}.theme-syndicate:root .debug{color:#8f39e6}.theme-syndicate:root .boxed_message{background:#360a0a}.theme-syndicate:root .boxed_message.red_border{background:#400000}.theme-syndicate:root .boxed_message.green_border{background:#261a00}.theme-syndicate:root .boxed_message.purple_border{background:#260026}.theme-syndicate:root .boxed_message.notice_border{background:#260016}.theme-paradise:root{--color-base:#8a0f38;--color-section:rgba(0,0,0,.5);--color-base-start:#7e014a;--color-base-end:#8a4d0f;--color-primary:#1f7a7a;--color-label:#ad9685;--reconnect-background:#d92626;--reconnect-text:var(--color-text);--input-border-color:#e85e30;--button-background-selected:#cf6e3d;--button-background-danger:#93f}.theme-paradise:root .adminooc{color:#29ccbe}.theme-paradise:root .debug{color:#8f39e6}.theme-paradise:root .boxed_message{background:rgba(0,0,0,.25);border-color:rgba(223,181,159,.25)}.theme-paradise:root .boxed_message.red_border{background:rgba(22,3,3,.25);border-color:rgba(255,0,0,.5)}.theme-paradise:root .boxed_message.green_border{background:rgba(3,22,10,.25);border-color:rgba(0,255,0,.5)}.theme-paradise:root .boxed_message.purple_border{background:rgba(10,3,22,.25);border-color:rgba(136,77,255,.5)}.theme-paradise:root .boxed_message.notice_border{background:rgba(3,10,22,.25);border-color:rgba(85,126,246,.5)} \ No newline at end of file diff --git a/tgui/public/tgui-say.bundle.js b/tgui/public/tgui-say.bundle.js index 66433bdcca2..eac783c84ae 100644 --- a/tgui/public/tgui-say.bundle.js +++ b/tgui/public/tgui-say.bundle.js @@ -1 +1 @@ -(()=>{"use strict";var e={3579:function(e,n,t){function r(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}var l,a=t(1171),i=t(2778),o=t(9807);function u(e){var n="https://react.dev/errors/"+e;if(1