diff --git a/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm b/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm
index 4ff1b225364c1..49da2fefd64b6 100644
--- a/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm
+++ b/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm
@@ -519,7 +519,7 @@
/turf/open/floor/carpet,
/area/ruin/space/has_grav/powered/macspace)
"cd" = (
-/obj/item/food/toastedsandwich,
+/obj/item/food/grilled_cheese_sandwich,
/obj/structure/table/wood/fancy/blue,
/turf/open/floor/iron/cafeteria,
/area/ruin/space/has_grav/powered/macspace)
diff --git a/_maps/boxstation.json b/_maps/boxstation.json
index b1279ac62327e..e2bba152ea251 100644
--- a/_maps/boxstation.json
+++ b/_maps/boxstation.json
@@ -1,6 +1,6 @@
{
"map_name": "Box Station",
- "map_link": "BoxStation",
+ "map_link": "boxstation",
"map_path": "map_files/BoxStation",
"map_file": "BoxStation.dmm",
"shuttles": {
diff --git a/_maps/corgstation.json b/_maps/corgstation.json
index e29bbe0de2f33..405fe87a355e0 100644
--- a/_maps/corgstation.json
+++ b/_maps/corgstation.json
@@ -1,6 +1,6 @@
{
"map_name": "Corg Station",
- "map_link": "CorgStation",
+ "map_link": "corgstation",
"map_path": "map_files/CorgStation",
"map_file": "CorgStation.dmm",
"shuttles": {
diff --git a/_maps/deltastation.json b/_maps/deltastation.json
index 242904a1c3185..a1e6fc2fd08a3 100644
--- a/_maps/deltastation.json
+++ b/_maps/deltastation.json
@@ -1,6 +1,6 @@
{
"map_name": "Delta Station",
- "map_link": "DeltaStation",
+ "map_link": "deltsatation",
"map_path": "map_files/Deltastation",
"map_file": "DeltaStation2.dmm",
"shuttles": {
diff --git a/_maps/echostation.json b/_maps/echostation.json
index 3cdf003eb821f..11d427772d898 100644
--- a/_maps/echostation.json
+++ b/_maps/echostation.json
@@ -1,6 +1,6 @@
{
"map_name": "Echo Station",
- "map_link": "EchoStation",
+ "map_link": "echostation",
"map_path": "map_files/EchoStation",
"map_file": "EchoStation.dmm",
"shuttles": {
diff --git a/_maps/flandstation.json b/_maps/flandstation.json
index ac4190a9e38e5..357b524e7ab2d 100644
--- a/_maps/flandstation.json
+++ b/_maps/flandstation.json
@@ -1,6 +1,6 @@
{
"map_name": "Fland Station",
- "map_link": "FlandStation",
+ "map_link": "flandstation",
"map_path": "map_files/FlandStation",
"map_file": "FlandStation.dmm",
"shuttles": {
diff --git a/_maps/kilostation.json b/_maps/kilostation.json
index 961c50a3dba9e..476acd646c18f 100644
--- a/_maps/kilostation.json
+++ b/_maps/kilostation.json
@@ -1,6 +1,6 @@
{
"map_name": "Kilo Station",
- "map_link": "KiloStation",
+ "map_link": "kilostation",
"map_path": "map_files/KiloStation",
"map_file": "KiloStation.dmm",
"shuttles": {
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index f3ed424e9463f..61e05c1584277 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -4259,6 +4259,12 @@
"aTN" = (
/obj/structure/table,
/obj/item/kitchen/rollingpin,
+/obj/item/reagent_containers/food/condiment/peppermill{
+ pixel_x = 3
+ },
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -3
+ },
/turf/open/floor/iron/cafeteria,
/area/crew_quarters/kitchen)
"aTO" = (
@@ -4515,13 +4521,7 @@
/turf/open/floor/iron/cafeteria,
/area/crew_quarters/kitchen)
"aVD" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/condiment/saltshaker{
- pixel_x = -3
- },
-/obj/item/reagent_containers/food/condiment/peppermill{
- pixel_x = 3
- },
+/obj/machinery/griddle,
/turf/open/floor/iron/cafeteria,
/area/crew_quarters/kitchen)
"aVE" = (
@@ -44208,9 +44208,7 @@
/area/security/courtroom)
"ooe" = (
/obj/structure/closet/secure_closet/freezer/kitchen,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-2"
},
@@ -58441,7 +58439,7 @@
/turf/open/floor/iron,
/area/security/checkpoint/supply)
"uBy" = (
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 8
},
/obj/effect/turf_decal/tile/red/anticorner/contrasted,
@@ -62554,6 +62552,13 @@
/obj/structure/cable/yellow,
/turf/open/floor/plating,
/area/crew_quarters/heads/cmo)
+"wCj" = (
+/obj/structure/table,
+/obj/machinery/dish_drive{
+ pixel_y = 5
+ },
+/turf/open/floor/iron/cafeteria,
+/area/crew_quarters/kitchen)
"wCo" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable/yellow{
@@ -104700,8 +104705,8 @@ uve
lCW
hcL
bEr
-aVD
aVE
+aVD
aXm
aVz
kVI
@@ -104958,7 +104963,7 @@ aJI
aRB
thS
aTN
-cCq
+wCj
aVz
cAg
kVI
diff --git a/_maps/map_files/CorgStation/CorgStation.dmm b/_maps/map_files/CorgStation/CorgStation.dmm
index 054ebcd8a0716..ea6161c73c61c 100644
--- a/_maps/map_files/CorgStation/CorgStation.dmm
+++ b/_maps/map_files/CorgStation/CorgStation.dmm
@@ -691,16 +691,6 @@
},
/turf/open/floor/iron/dark,
/area/security/nuke_storage)
-"afY" = (
-/obj/effect/turf_decal/tile/brown/half/contrasted{
- dir = 1
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/airalarm/directional/west,
-/turf/open/floor/iron,
-/area/quartermaster/storage)
"agb" = (
/obj/machinery/atmospherics/components/binary/volume_pump/on{
dir = 1;
@@ -1545,6 +1535,19 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/starboard/central)
+"apN" = (
+/obj/effect/turf_decal/tile/brown/half/contrasted{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/apc/auto_name/north,
+/turf/open/floor/iron/dark,
+/area/quartermaster/storage)
"apW" = (
/obj/structure/chair{
dir = 1
@@ -3776,18 +3779,6 @@
},
/turf/open/space/basic,
/area/solar/port/fore)
-"aTC" = (
-/obj/effect/turf_decal/tile/brown/opposingcorners{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "2-4"
- },
-/turf/open/floor/iron,
-/area/quartermaster/storage)
"aTD" = (
/obj/machinery/door/airlock/maintenance_hatch{
name = "Maintenance Hatch";
@@ -5744,6 +5735,30 @@
/obj/effect/turf_decal/tile/yellow/half/contrasted,
/turf/open/floor/iron/dark,
/area/engine/engine_room)
+"bCq" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/mining{
+ name = "Quartermaster's Office";
+ req_access_txt = "41"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/turf/open/floor/iron,
+/area/quartermaster/qm)
"bCP" = (
/obj/structure/cable/yellow{
icon_state = "2-4"
@@ -6301,14 +6316,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plating,
/area/medical/cryo)
-"bKR" = (
-/obj/machinery/deepfryer,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red/fourcorners/contrasted,
-/turf/open/floor/iron/white,
-/area/crew_quarters/kitchen)
"bKV" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 5
@@ -7214,14 +7221,6 @@
},
/turf/open/floor/iron/dark,
/area/security/main)
-"bZk" = (
-/obj/effect/turf_decal/tile/brown/fourcorners/contrasted,
-/obj/effect/turf_decal/bot,
-/obj/structure/extinguisher_cabinet{
- pixel_x = -25
- },
-/turf/open/floor/iron,
-/area/quartermaster/storage)
"bZp" = (
/obj/structure/rack,
/obj/item/stock_parts/cell/high/plus,
@@ -8394,6 +8393,14 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/AIsatextAP)
+"cvn" = (
+/obj/effect/turf_decal/tile/brown/fourcorners/contrasted,
+/obj/effect/turf_decal/bot,
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -25
+ },
+/turf/open/floor/iron,
+/area/quartermaster/storage)
"cvq" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 1
@@ -8991,15 +8998,6 @@
},
/turf/open/floor/iron/white,
/area/crew_quarters/heads/cmo)
-"cHq" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/bag/tray,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red/fourcorners/contrasted,
-/turf/open/floor/iron/white,
-/area/crew_quarters/kitchen)
"cHt" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/turf/open/floor/iron,
@@ -12840,6 +12838,18 @@
dir = 5
},
/area/science/breakroom)
+"dUC" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/turf/open/floor/iron,
+/area/quartermaster/storage)
"dUK" = (
/obj/structure/reagent_dispensers/watertank/high,
/obj/machinery/light/small{
@@ -13377,30 +13387,6 @@
},
/turf/open/floor/carpet/purple,
/area/crew_quarters/heads/hor)
-"ecV" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/mining{
- name = "Quartermaster's Office";
- req_access_txt = "41"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable/yellow{
- icon_state = "2-4"
- },
-/turf/open/floor/iron,
-/area/quartermaster/qm)
"edi" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating/asteroid,
@@ -22283,6 +22269,20 @@
"hdz" = (
/turf/closed/wall,
/area/science/mixing)
+"hdA" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "qmoffice";
+ name = "Quartermaster's Office Shutters"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/quartermaster/qm)
"hdC" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -26891,24 +26891,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/turf/open/floor/wood,
/area/crew_quarters/bar)
-"izh" = (
-/obj/effect/turf_decal/tile/red/fourcorners/contrasted,
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 8
- },
-/obj/structure/chair/fancy/comfy{
- color = "#666666";
- dir = 1
- },
-/obj/effect/landmark/start/security_officer,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/security/main)
"izP" = (
/obj/effect/turf_decal/stripes/corner{
dir = 8
@@ -31405,20 +31387,6 @@
/obj/effect/turf_decal/tile/red,
/turf/open/floor/iron/white,
/area/crew_quarters/kitchen)
-"kaB" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "qmoffice";
- name = "Quartermaster's Office Shutters"
- },
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/quartermaster/qm)
"kaW" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -31994,6 +31962,24 @@
},
/turf/open/floor/iron/dark,
/area/ai_monitored/turret_protected/aisat/foyer)
+"kkG" = (
+/obj/effect/turf_decal/tile/red/fourcorners/contrasted,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/obj/structure/chair/fancy/comfy{
+ color = "#666666";
+ dir = 1
+ },
+/obj/effect/landmark/start/security_officer,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/security/main)
"kkP" = (
/obj/structure/chair/office{
dir = 1
@@ -32481,6 +32467,36 @@
},
/turf/open/floor/plating,
/area/security/prison)
+"kqV" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/door/airlock/command/glass{
+ name = "Head of Security";
+ req_access_txt = "58"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 8
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "hosoffice";
+ name = "Head Of Security Blast door"
+ },
+/turf/open/floor/iron/dark,
+/area/security/brig)
"krj" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -34005,17 +34021,6 @@
},
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/AIsatextAP)
-"kUb" = (
-/obj/structure/cable/yellow{
- icon_state = "0-2"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "hosoffice";
- name = "Head Of Security Blast door"
- },
-/turf/open/floor/plating,
-/area/security/brig)
"kUj" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
@@ -34052,6 +34057,15 @@
/obj/machinery/washing_machine,
/turf/open/floor/iron/freezer,
/area/security/prison)
+"kUI" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/bag/tray,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red/fourcorners/contrasted,
+/turf/open/floor/iron/white,
+/area/crew_quarters/kitchen)
"kUJ" = (
/obj/structure/chair/office/light{
dir = 4
@@ -34125,7 +34139,7 @@
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
"kVR" = (
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 4
},
/obj/machinery/power/apc/auto_name/west{
@@ -37501,26 +37515,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/iron,
/area/ai_monitored/storage/eva)
-"lZt" = (
-/obj/effect/turf_decal/tile/brown/fourcorners/contrasted,
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 8
- },
-/obj/effect/turf_decal/tile/brown/fourcorners/contrasted,
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/dark,
-/area/quartermaster/qm)
"lZv" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -39346,6 +39340,17 @@
},
/turf/open/floor/iron/dark,
/area/crew_quarters/heads/hos)
+"mAc" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "hosoffice";
+ name = "Head Of Security Blast door"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/heads/hos)
"mAf" = (
/obj/machinery/atmospherics/pipe/simple/dark{
dir = 9
@@ -40323,25 +40328,6 @@
},
/turf/open/floor/iron/white,
/area/medical/genetics/cloning)
-"mOu" = (
-/obj/structure/table,
-/obj/item/clothing/under/rank/cargo/tech{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/gloves/fingerless{
- pixel_x = 1
- },
-/obj/structure/cable/yellow,
-/obj/effect/turf_decal/tile/brown/half/contrasted{
- dir = 1
- },
-/obj/item/radio/intercom{
- pixel_x = -29;
- pixel_y = -2
- },
-/turf/open/floor/iron,
-/area/quartermaster/storage)
"mOF" = (
/obj/structure/cable/yellow{
icon_state = "1-4"
@@ -41718,16 +41704,6 @@
},
/turf/open/floor/iron/dark,
/area/maintenance/department/chapel/monastery)
-"nok" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron,
-/area/security/brig)
"noq" = (
/obj/item/storage/toolbox/electrical,
/obj/machinery/airalarm/directional/west,
@@ -43937,24 +43913,6 @@
},
/turf/open/floor/wood,
/area/library)
-"nXN" = (
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 8
- },
-/obj/effect/turf_decal/tile/brown/fourcorners/contrasted,
-/obj/structure/table/reinforced,
-/obj/item/computer_hardware/hard_drive/role/quartermaster{
- pixel_x = -6
- },
-/obj/item/computer_hardware/hard_drive/role/quartermaster{
- pixel_x = 6
- },
-/obj/item/computer_hardware/hard_drive/role/quartermaster{
- pixel_y = 6
- },
-/obj/item/gps/mining,
-/turf/open/floor/iron/dark,
-/area/quartermaster/qm)
"nXW" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -45229,6 +45187,23 @@
},
/turf/open/floor/iron/white,
/area/medical/medbay/lobby)
+"oud" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "hosoffice";
+ name = "Head Of Security Blast door"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/heads/hos)
"oui" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
@@ -45716,6 +45691,26 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"oCA" = (
+/obj/effect/turf_decal/tile/brown/fourcorners/contrasted,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/brown/fourcorners/contrasted,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron/dark,
+/area/quartermaster/qm)
"oCK" = (
/obj/effect/turf_decal/tile/red/opposingcorners,
/obj/item/radio/intercom{
@@ -46837,6 +46832,14 @@
},
/turf/closed/wall,
/area/engine/atmospherics_engine)
+"oYs" = (
+/obj/machinery/deepfryer,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red/fourcorners/contrasted,
+/turf/open/floor/iron/white,
+/area/crew_quarters/kitchen)
"oYA" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -49011,15 +49014,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted,
/turf/open/floor/iron,
/area/hallway/primary/fore)
-"pLo" = (
-/obj/structure/cable/yellow,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "hosoffice";
- name = "Head Of Security Blast door"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/heads/hos)
"pLz" = (
/obj/machinery/power/apc/auto_name/south{
pixel_y = -24
@@ -49484,17 +49478,6 @@
/obj/structure/closet/firecloset/full,
/turf/open/floor/iron,
/area/hallway/primary/starboard)
-"pSX" = (
-/obj/structure/cable/yellow{
- icon_state = "0-2"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "hosoffice";
- name = "Head Of Security Blast door"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/heads/hos)
"pTe" = (
/turf/open/floor/plating,
/area/crew_quarters/fitness/recreation)
@@ -53422,36 +53405,6 @@
/obj/structure/disposalpipe/junction,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
-"riQ" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/door/airlock/command/glass{
- name = "Head of Security";
- req_access_txt = "58"
- },
-/obj/structure/disposalpipe/segment{
- dir = 8
- },
-/obj/machinery/door/poddoor/preopen{
- id = "hosoffice";
- name = "Head Of Security Blast door"
- },
-/turf/open/floor/iron/dark,
-/area/security/brig)
"rjb" = (
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
@@ -53553,6 +53506,17 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/crew_quarters/toilet)
+"rkB" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "hosoffice";
+ name = "Head Of Security Blast door"
+ },
+/turf/open/floor/plating,
+/area/security/brig)
"rkK" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable/white{
@@ -53723,23 +53687,6 @@
},
/turf/open/floor/wood,
/area/crew_quarters/fitness/recreation)
-"rnk" = (
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "hosoffice";
- name = "Head Of Security Blast door"
- },
-/turf/open/floor/plating,
-/area/crew_quarters/heads/hos)
"rnn" = (
/obj/machinery/light_switch{
pixel_x = 1;
@@ -56568,6 +56515,15 @@
/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron/dark,
/area/security/warden)
+"siu" = (
+/obj/structure/cable/yellow,
+/obj/machinery/door/poddoor/preopen{
+ id = "hosoffice";
+ name = "Head Of Security Blast door"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/security/brig)
"siV" = (
/obj/item/kirbyplants/random,
/obj/machinery/light,
@@ -58310,6 +58266,15 @@
},
/turf/closed/wall,
/area/engine/atmospherics_engine)
+"sLg" = (
+/obj/structure/cable/yellow,
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "hosoffice";
+ name = "Head Of Security Blast door"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/heads/hos)
"sLm" = (
/turf/closed/wall,
/area/science/storage)
@@ -58665,6 +58630,14 @@
},
/turf/open/floor/engine,
/area/engine/atmospherics_engine)
+"sRL" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Cargo Maintenance";
+ req_access_txt = "31"
+ },
+/turf/open/floor/plating,
+/area/quartermaster/storage)
"sSj" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
@@ -58692,6 +58665,16 @@
/obj/effect/turf_decal/tile/yellow/fourcorners/contrasted,
/turf/open/floor/iron,
/area/engine/atmos)
+"sSB" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron,
+/area/security/brig)
"sSL" = (
/obj/structure/window/reinforced/spawner,
/obj/structure/window/reinforced/spawner{
@@ -61419,6 +61402,25 @@
},
/turf/open/floor/iron/dark,
/area/hallway/primary/central)
+"tOn" = (
+/obj/structure/table,
+/obj/item/clothing/under/rank/cargo/tech{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/clothing/gloves/fingerless{
+ pixel_x = 1
+ },
+/obj/structure/cable/yellow,
+/obj/effect/turf_decal/tile/brown/half/contrasted{
+ dir = 1
+ },
+/obj/item/radio/intercom{
+ pixel_x = -29;
+ pixel_y = -2
+ },
+/turf/open/floor/iron,
+/area/quartermaster/storage)
"tOF" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -64407,14 +64409,6 @@
},
/turf/open/floor/iron/dark,
/area/maintenance/department/chapel/monastery)
-"uLB" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Cargo Maintenance";
- req_access_txt = "31"
- },
-/turf/open/floor/plating,
-/area/quartermaster/storage)
"uMg" = (
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/neutral{
@@ -65458,19 +65452,6 @@
},
/turf/open/floor/iron,
/area/engine/engine_room)
-"veL" = (
-/obj/effect/turf_decal/tile/brown/half/contrasted{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/obj/machinery/power/apc/auto_name/north,
-/turf/open/floor/iron/dark,
-/area/quartermaster/storage)
"veT" = (
/obj/structure/table/wood,
/obj/item/storage/fancy/candle_box,
@@ -65629,6 +65610,16 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"vhD" = (
+/obj/effect/turf_decal/tile/brown/half/contrasted{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/airalarm/directional/west,
+/turf/open/floor/iron,
+/area/quartermaster/storage)
"vhE" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -67165,6 +67156,24 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/dark,
/area/security/brig)
+"vEj" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/brown/fourcorners/contrasted,
+/obj/structure/table/reinforced,
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
+ pixel_x = -6
+ },
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
+ pixel_x = 6
+ },
+/obj/item/computer_hardware/hard_drive/role/quartermaster{
+ pixel_y = 6
+ },
+/obj/item/gps/mining,
+/turf/open/floor/iron/dark,
+/area/quartermaster/qm)
"vEs" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -68311,7 +68320,7 @@
/turf/open/floor/plating,
/area/crew_quarters/heads/cmo)
"vXY" = (
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 4
},
/turf/open/floor/carpet/royalblue,
@@ -68769,15 +68778,6 @@
},
/turf/open/floor/iron/dark,
/area/quartermaster/miningdock)
-"wgP" = (
-/obj/machinery/button/door{
- id = "detectivewindows";
- name = "Detective Private Shutters";
- pixel_y = -8;
- req_access_txt = "4"
- },
-/turf/closed/wall,
-/area/security/detectives_office)
"wgR" = (
/obj/effect/turf_decal/tile/blue/anticorner/contrasted,
/turf/open/floor/iron/white,
@@ -71481,6 +71481,15 @@
},
/turf/open/floor/iron/dark,
/area/engine/atmospherics_engine)
+"wZF" = (
+/obj/machinery/button/door{
+ id = "detectivewindows";
+ name = "Detective Private Shutters";
+ pixel_y = -8;
+ req_access_txt = "4"
+ },
+/turf/closed/wall,
+/area/security/detectives_office)
"wZS" = (
/obj/structure/table/glass,
/obj/machinery/requests_console{
@@ -74278,15 +74287,6 @@
},
/turf/open/floor/iron/dark,
/area/bridge)
-"xUc" = (
-/obj/structure/cable/yellow,
-/obj/machinery/door/poddoor/preopen{
- id = "hosoffice";
- name = "Head Of Security Blast door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/brig)
"xUf" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -110841,7 +110841,7 @@ sIf
cyL
uYN
qsX
-bKR
+oYs
wWq
jOn
jNy
@@ -111355,7 +111355,7 @@ aYT
tnJ
hZf
aPw
-cHq
+kUI
wWq
gEw
aYT
@@ -113084,7 +113084,7 @@ ykq
wkk
tmQ
kQW
-izh
+kkG
qRL
nXe
hhE
@@ -113857,7 +113857,7 @@ uQV
kkf
vwV
wKV
-wgP
+wZF
dqa
lev
ijS
@@ -115142,7 +115142,7 @@ wBm
fEX
tXi
rfO
-nok
+sSB
mLz
bkx
nPz
@@ -115647,9 +115647,9 @@ sEA
ezb
eZq
eZq
-kUb
-riQ
-xUc
+rkB
+kqV
+siu
duF
duF
cik
@@ -118217,9 +118217,9 @@ fpM
ajU
naL
iRh
-pSX
-rnk
-pLo
+mAc
+oud
+sLg
iRh
iRh
anT
@@ -118762,8 +118762,8 @@ hcZ
oeF
ivK
ecG
-uLB
-aTC
+sRL
+dUC
enS
qUi
kuy
@@ -119020,7 +119020,7 @@ oeF
ivK
sKt
aWM
-veL
+apN
aiQ
cNs
uiA
@@ -119519,11 +119519,11 @@ ivK
sEx
lJc
hgC
-lZt
-ecV
+oCA
+bCq
fcU
-afY
-bZk
+vhD
+cvn
mqk
azU
mqk
@@ -119533,7 +119533,7 @@ lDt
rDh
gMD
kvM
-mOu
+tOn
gdv
gdv
wpa
@@ -119777,7 +119777,7 @@ sEx
kYZ
mKw
pZL
-kaB
+hdA
qZv
nxL
nxL
@@ -120033,8 +120033,8 @@ ivK
sEx
vjM
vqO
-nXN
-kaB
+vEj
+hdA
aFR
vQo
enI
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index ce04c26e93f98..7de1e97e0fac8 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -10012,9 +10012,7 @@
/turf/open/floor/iron,
/area/crew_quarters/kitchen)
"bhR" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/bot,
-/obj/item/book/manual/wiki/cooking_to_serve_man,
+/obj/machinery/griddle,
/turf/open/floor/iron,
/area/crew_quarters/kitchen)
"bhS" = (
@@ -10563,6 +10561,7 @@
pixel_y = 5
},
/obj/effect/turf_decal/bot,
+/obj/item/book/manual/wiki/cooking_to_serve_man,
/turf/open/floor/iron,
/area/crew_quarters/kitchen)
"blw" = (
@@ -36560,7 +36559,7 @@
/turf/open/floor/iron,
/area/engine/storage_shared)
"eNB" = (
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 4
},
/turf/open/floor/prison,
diff --git a/_maps/map_files/EchoStation/EchoStation.dmm b/_maps/map_files/EchoStation/EchoStation.dmm
index e0ea43e0b62de..de3787324a6c0 100644
--- a/_maps/map_files/EchoStation/EchoStation.dmm
+++ b/_maps/map_files/EchoStation/EchoStation.dmm
@@ -5972,7 +5972,7 @@
/obj/effect/turf_decal/siding/wood{
dir = 5
},
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 1
},
/obj/structure/railing,
@@ -9023,6 +9023,18 @@
req_access = null;
req_one_access_txt = "28;25;35"
},
+/obj/item/storage/box/ingredients/fruity{
+ pixel_x = 4;
+ pixel_y = 6
+ },
+/obj/item/storage/box/ingredients/vegetarian{
+ pixel_x = -1;
+ pixel_y = 4
+ },
+/obj/item/storage/box/ingredients/wildcard{
+ pixel_x = -5;
+ pixel_y = 8
+ },
/turf/open/floor/iron/freezer,
/area/crew_quarters/kitchen/coldroom)
"eoQ" = (
@@ -28962,15 +28974,7 @@
/obj/effect/turf_decal/tile/dark_green/fourcorners/contrasted,
/mob/living/simple_animal/hostile/retaliate/frog{
attacked_sound = 'sound/effects/huuu.ogg';
- density = 0;
- desc = "It seems a little sad.";
dir = 8;
- head_icon = 'icons/mob/pets_held.dmi';
- held_state = "";
- icon = 'icons/mob/animal.dmi';
- icon_dead = "frog_dead";
- icon_living = "frog";
- icon_state = "frog";
name = "Larry";
pixel_y = 12;
stepped_sound = null
@@ -35130,19 +35134,7 @@
/turf/open/floor/iron,
/area/engine/engineering)
"rZh" = (
-/obj/structure/table,
-/obj/item/storage/box/ingredients/wildcard{
- pixel_x = -5;
- pixel_y = 8
- },
-/obj/item/storage/box/ingredients/fruity{
- pixel_x = 4;
- pixel_y = 6
- },
-/obj/item/storage/box/ingredients/vegetarian{
- pixel_x = -1;
- pixel_y = 4
- },
+/obj/machinery/griddle,
/turf/open/floor/iron/cafeteria,
/area/crew_quarters/kitchen)
"rZv" = (
@@ -36559,7 +36551,6 @@
/area/crew_quarters/cafeteria)
"sMM" = (
/obj/machinery/airalarm{
- dir = 2;
pixel_y = 28
},
/turf/open/openspace,
diff --git a/_maps/map_files/FlandStation/FlandStation.dmm b/_maps/map_files/FlandStation/FlandStation.dmm
index 00421407d23e9..8dbf4af27ce4d 100644
--- a/_maps/map_files/FlandStation/FlandStation.dmm
+++ b/_maps/map_files/FlandStation/FlandStation.dmm
@@ -4474,9 +4474,7 @@
/turf/open/floor/iron/dark,
/area/hallway/secondary/entry)
"aYi" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/effect/turf_decal/tile/blue/fourcorners/contrasted,
/obj/machinery/camera{
c_tag = "Medbay - Chief Medical Officer's Office";
@@ -6052,9 +6050,7 @@
/obj/structure/cable/yellow{
icon_state = "0-8"
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/dark,
/area/chapel/office)
@@ -9911,12 +9907,9 @@
},
/area/hallway/primary/port)
"czD" = (
-/obj/structure/table,
/obj/effect/turf_decal/bot,
-/obj/item/reagent_containers/glass/bowl,
-/obj/item/food/grown/tomato,
-/obj/item/food/dough,
/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/machinery/griddle,
/turf/open/floor/iron/cafeteria,
/area/crew_quarters/kitchen)
"czF" = (
@@ -10225,9 +10218,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 8
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -11785,9 +11776,7 @@
/obj/machinery/light{
dir = 4
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -11915,6 +11904,10 @@
/obj/effect/turf_decal/bot,
/obj/structure/table,
/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/item/reagent_containers/food/condiment/sugar,
+/obj/item/reagent_containers/food/condiment/flour{
+ pixel_x = 4
+ },
/turf/open/floor/iron/cafeteria,
/area/crew_quarters/kitchen)
"dap" = (
@@ -14949,6 +14942,10 @@
/obj/structure/disposalpipe/trunk{
dir = 4
},
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
/turf/open/floor/iron/dark,
/area/hydroponics)
"dPC" = (
@@ -16114,6 +16111,10 @@
},
/turf/open/floor/prison,
/area/security/prison)
+"ehF" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/hydroponics)
"ehG" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/stripes/closeup{
@@ -19089,9 +19090,7 @@
/turf/open/floor/plating,
/area/maintenance/port/central)
"eSB" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow,
/obj/effect/turf_decal/siding/wood{
dir = 8
@@ -19213,9 +19212,7 @@
/turf/open/floor/iron/grid/steel,
/area/bridge)
"eTQ" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow,
/turf/open/floor/iron/dark,
/area/engine/storage)
@@ -19702,6 +19699,10 @@
},
/turf/open/floor/iron,
/area/quartermaster/office)
+"eYj" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/crew_quarters/kitchen)
"eYk" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/turf/open/floor/circuit,
@@ -20411,6 +20412,14 @@
},
/turf/open/floor/iron,
/area/hallway/primary/port)
+"fiV" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/structure/table,
+/obj/item/food/dough,
+/obj/item/reagent_containers/glass/bowl,
+/obj/item/food/grown/tomato,
+/turf/open/floor/iron/cafeteria,
+/area/crew_quarters/kitchen)
"fiW" = (
/obj/effect/turf_decal/stripes/end,
/obj/effect/turf_decal/stripes/red/end,
@@ -20843,13 +20852,13 @@
/turf/open/floor/engine/air/light,
/area/engine/atmos)
"foJ" = (
-/obj/machinery/deepfryer,
/obj/item/radio/intercom{
pixel_x = 28
},
/obj/effect/turf_decal/tile/bar/opposingcorners{
dir = 1
},
+/obj/machinery/griddle,
/turf/open/floor/iron/cafeteria,
/area/vacant_room/commissary/commissaryFood)
"foO" = (
@@ -23237,9 +23246,7 @@
/turf/open/floor/iron,
/area/hallway/primary/central)
"fSI" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow,
/obj/structure/cable/yellow{
icon_state = "0-8"
@@ -23929,9 +23936,7 @@
/turf/open/floor/iron/dark,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"gbx" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -24435,10 +24440,6 @@
/turf/open/floor/plating,
/area/maintenance/port/central)
"ghK" = (
-/obj/structure/noticeboard{
- dir = 8;
- pixel_x = 32
- },
/obj/machinery/light/small{
dir = 4
},
@@ -26111,6 +26112,9 @@
/obj/item/storage/bag/plants/portaseeder,
/obj/item/plant_analyzer,
/obj/item/reagent_containers/glass/bucket,
+/obj/item/seeds/wheat,
+/obj/item/seeds/wheat,
+/obj/item/seeds/wheat,
/turf/open/floor/grass,
/area/hydroponics/garden)
"gCA" = (
@@ -26258,9 +26262,7 @@
dir = 9;
network = list("vault")
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -30283,9 +30285,7 @@
/turf/open/floor/iron,
/area/hallway/primary/central)
"hJw" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -37168,9 +37168,7 @@
/obj/structure/cable/yellow{
icon_state = "0-8"
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/chair/foldable{
dir = 8
},
@@ -39582,9 +39580,7 @@
/obj/machinery/airalarm{
pixel_y = 22
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-2"
},
@@ -41952,10 +41948,6 @@
/obj/item/hand_labeler,
/obj/effect/turf_decal/bot,
/obj/structure/table,
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
/turf/open/floor/iron/grid/steel,
/area/hydroponics)
"kFJ" = (
@@ -42458,16 +42450,9 @@
/turf/closed/wall/r_wall,
/area/engine/supermatter)
"kMK" = (
-/obj/structure/table,
-/obj/effect/turf_decal/bot,
-/obj/item/reagent_containers/food/condiment/sugar,
-/obj/item/reagent_containers/food/condiment/flour{
- pixel_x = 4
- },
-/obj/item/food/chocolatebar,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron/cafeteria,
-/area/crew_quarters/kitchen)
+/mob/living/simple_animal/chicken,
+/turf/open/floor/grass,
+/area/hydroponics/garden)
"kMO" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -42933,9 +42918,7 @@
name = "medbay camera";
network = list("ss13","medbay")
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -43951,9 +43934,7 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -47803,9 +47784,7 @@
/obj/item/stock_parts/cell/hyper,
/obj/item/stack/cable_coil,
/obj/effect/turf_decal/bot,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -48968,9 +48947,7 @@
/turf/open/floor/carpet/orange,
/area/quartermaster/qm)
"muu" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow,
/turf/open/floor/carpet,
/area/hallway/primary/starboard)
@@ -50334,6 +50311,7 @@
/obj/item/storage/box/ingredients/wildcard,
/obj/item/food/mint,
/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/item/food/chocolatebar,
/turf/open/floor/iron/cafeteria,
/area/crew_quarters/kitchen)
"mLS" = (
@@ -53079,6 +53057,10 @@
pixel_x = 4;
pixel_y = -4
},
+/obj/structure/noticeboard{
+ dir = 4;
+ pixel_x = -27
+ },
/turf/open/floor/iron/dark,
/area/crew_quarters/bar)
"nwT" = (
@@ -55690,7 +55672,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 4
},
/turf/open/floor/iron,
@@ -59259,9 +59241,7 @@
/turf/open/floor/iron/dark,
/area/bridge)
"pgZ" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-2"
},
@@ -63031,9 +63011,7 @@
/area/maintenance/central)
"qfK" = (
/obj/item/kirbyplants/random,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -65806,9 +65784,7 @@
/turf/open/floor/iron/freezer,
/area/crew_quarters/kitchen/coldroom)
"qPX" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -66573,7 +66549,7 @@
/obj/structure/railing{
dir = 1
},
-/obj/machinery/computer/arcade,
+/obj/effect/spawner/randomarcade,
/obj/effect/turf_decal{
dir = 1
},
@@ -66714,9 +66690,7 @@
/obj/structure/cable/yellow{
icon_state = "0-8"
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/machinery/light_switch{
pixel_x = 24;
pixel_y = 24
@@ -68753,9 +68727,7 @@
/turf/open/floor/iron/dark,
/area/quartermaster/miningdock)
"rCW" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -70048,9 +70020,7 @@
/area/hydroponics)
"rQK" = (
/obj/item/kirbyplants/random,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -71329,6 +71299,11 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/security/execution/transfer)
+"sis" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/structure/table,
+/turf/open/floor/iron/cafeteria,
+/area/crew_quarters/kitchen)
"siB" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/stripes/closeup,
@@ -72236,7 +72211,7 @@
/turf/closed/wall/r_wall,
/area/crew_quarters/heads/cmo)
"suV" = (
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 4
},
/obj/machinery/status_display/ai{
@@ -72786,9 +72761,7 @@
/turf/open/floor/iron/ridged/steel,
/area/science/xenobiology)
"sBB" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -73098,9 +73071,7 @@
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 4
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-2"
},
@@ -75200,7 +75171,7 @@
/turf/open/floor/iron/sepia,
/area/engine/engineering)
"thX" = (
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 4
},
/obj/machinery/light/small{
@@ -77012,9 +76983,7 @@
/obj/structure/cable/yellow{
icon_state = "0-8"
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/effect/turf_decal/tile/yellow/fourcorners/contrasted,
/turf/open/floor/iron,
/area/storage/tools)
@@ -77677,7 +77646,7 @@
/turf/open/floor/iron/dark,
/area/security/brig)
"tPH" = (
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 4
},
/obj/effect/turf_decal/bot,
@@ -79728,9 +79697,7 @@
dir = 5
},
/obj/item/kirbyplants/random,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -80675,9 +80642,7 @@
/area/engine/engine_room)
"uBs" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-2"
},
@@ -81655,9 +81620,7 @@
/turf/open/floor/iron/dark,
/area/engine/gravity_generator)
"uOg" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -83805,9 +83768,7 @@
/turf/open/floor/wood,
/area/security/detectives_office)
"vmR" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow,
/turf/open/floor/iron/dark,
/area/science/robotics/mechbay)
@@ -89063,9 +89024,7 @@
/turf/open/floor/iron/dark,
/area/science/lobby)
"wvS" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/blood/old,
/obj/structure/closet/secure_closet/injection,
@@ -116658,7 +116617,7 @@ tqu
fUf
fUf
fUf
-fUf
+kMK
fUf
veT
gVE
@@ -119242,7 +119201,7 @@ ajI
vqH
vqH
vpW
-vqH
+eYj
lHN
sxF
mRd
@@ -120518,7 +120477,7 @@ arZ
mEH
ptN
kFI
-arZ
+ehF
kZd
jAa
xNi
@@ -120788,8 +120747,8 @@ cRo
mib
mib
rfs
-mib
-mib
+sis
+fiV
mib
njG
jOJ
@@ -121046,7 +121005,7 @@ pYP
qxm
mib
mLj
-kMK
+czD
mib
qrj
jOJ
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 41232f42c62e2..6d9777691fd90 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -33331,9 +33331,7 @@
"ewl" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/dark/opposingcorners,
-/obj/machinery/atmospherics/components/unary/cryo_cell{
- dir = 4
- },
+/obj/machinery/atmospherics/components/unary/cryo_cell,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
/area/medical/cryo)
@@ -51709,7 +51707,7 @@
/turf/open/floor/iron/dark,
/area/security/main)
"kAD" = (
-/obj/machinery/computer/arcade,
+/obj/effect/spawner/randomarcade,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/siding/wood{
dir = 1;
@@ -53329,9 +53327,7 @@
"lgL" = (
/obj/effect/turf_decal/tile/dark/opposingcorners,
/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/components/unary/cryo_cell{
- dir = 4
- },
+/obj/machinery/atmospherics/components/unary/cryo_cell,
/turf/open/floor/iron/dark,
/area/medical/cryo)
"lgN" = (
@@ -55048,14 +55044,12 @@
/area/medical/medbay/central)
"lHW" = (
/obj/structure/table,
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted,
+/obj/item/storage/bag/tray,
/obj/item/book/manual/chef_recipes{
pixel_x = -4;
pixel_y = 6
},
-/obj/item/book/manual/chef_recipes{
- pixel_y = 2
- },
-/obj/effect/turf_decal/tile/neutral/anticorner/contrasted,
/turf/open/floor/iron/dark,
/area/crew_quarters/kitchen)
"lIC" = (
@@ -61752,7 +61746,6 @@
/turf/open/floor/iron/showroomfloor,
/area/medical/surgery)
"nZX" = (
-/obj/machinery/deepfryer,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/stripes/corner,
/obj/effect/turf_decal/stripes/line{
@@ -61761,6 +61754,7 @@
/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
dir = 4
},
+/obj/machinery/food_cart,
/turf/open/floor/iron/dark,
/area/crew_quarters/kitchen)
"oaf" = (
@@ -61845,10 +61839,12 @@
/area/maintenance/starboard)
"ocf" = (
/obj/structure/table,
-/obj/item/storage/bag/tray,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 4
},
+/obj/machinery/reagentgrinder{
+ pixel_y = 5
+ },
/turf/open/floor/iron/dark,
/area/crew_quarters/kitchen)
"ocg" = (
@@ -65601,9 +65597,7 @@
/turf/open/floor/plating,
/area/quartermaster/warehouse)
"plP" = (
-/obj/effect/turf_decal/tile/dark_green/half/contrasted{
- color = "#439C1E"
- },
+/obj/effect/turf_decal/tile/dark_green/half/contrasted,
/obj/effect/turf_decal/stripes/corner,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
@@ -74739,7 +74733,7 @@
/turf/open/floor/iron/dark,
/area/crew_quarters/heads/hor)
"stT" = (
-/obj/machinery/computer/arcade,
+/obj/effect/spawner/randomarcade,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/siding/wood{
dir = 1
@@ -85868,13 +85862,13 @@
/turf/open/floor/iron/showroomfloor,
/area/medical/medbay/central)
"wgS" = (
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
+ dir = 8
+ },
/obj/structure/table,
/obj/machinery/microwave{
pixel_y = 5
},
-/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
- dir = 8
- },
/turf/open/floor/iron/dark,
/area/crew_quarters/kitchen)
"wgX" = (
@@ -90967,13 +90961,10 @@
},
/area/maintenance/starboard/aft)
"xQc" = (
-/obj/structure/table,
-/obj/machinery/reagentgrinder{
- pixel_y = 5
- },
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 8
},
+/obj/machinery/griddle,
/turf/open/floor/iron/dark,
/area/crew_quarters/kitchen)
"xQl" = (
@@ -92397,9 +92388,7 @@
/area/crew_quarters/cryopods)
"ylk" = (
/obj/effect/decal/cleanable/blood/old,
-/obj/effect/turf_decal/tile/dark_green/half/contrasted{
- color = "#439C1E"
- },
+/obj/effect/turf_decal/tile/dark_green/half/contrasted,
/obj/effect/turf_decal/stripes/line{
dir = 4
},
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 7b6dd78d5e312..d1017c4555e51 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -29469,8 +29469,6 @@
/turf/open/floor/iron/dark,
/area/aisat)
"fpB" = (
-/obj/structure/table,
-/obj/item/food/mint,
/obj/machinery/airalarm{
dir = 4;
pixel_x = -23
@@ -29481,6 +29479,13 @@
pixel_y = -24
},
/obj/structure/cable/yellow,
+/obj/structure/rack,
+/obj/item/storage/box/donkpockets,
+/obj/item/stack/package_wrap,
+/obj/item/book/manual/chef_recipes{
+ pixel_x = 2;
+ pixel_y = 6
+ },
/turf/open/floor/iron/checker,
/area/crew_quarters/kitchen)
"fpC" = (
@@ -35284,10 +35289,12 @@
/turf/open/floor/plating,
/area/maintenance/aft/secondary)
"hEt" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/door/poddoor/preopen{
+ id = "kitchenwindow";
+ name = "kitchen shutters"
},
-/turf/open/floor/iron/checker,
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
/area/crew_quarters/kitchen)
"hEL" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
@@ -43273,6 +43280,7 @@
"kId" = (
/obj/structure/table,
/obj/item/book/manual/wiki/cooking_to_serve_man,
+/obj/item/storage/box/donkpockets,
/turf/open/floor/iron/checker,
/area/crew_quarters/kitchen)
"kIn" = (
@@ -43473,6 +43481,7 @@
/obj/item/reagent_containers/food/condiment/enzyme{
layer = 5
},
+/obj/item/food/mint,
/turf/open/floor/iron/checker,
/area/crew_quarters/kitchen)
"kKl" = (
@@ -44187,7 +44196,7 @@
/turf/open/floor/iron/white,
/area/science/research)
"kZa" = (
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 4
},
/turf/open/floor/prison,
@@ -44469,7 +44478,7 @@
/turf/open/floor/iron,
/area/storage/tools)
"lge" = (
-/obj/machinery/computer/arcade,
+/obj/effect/spawner/randomarcade,
/obj/machinery/airalarm{
dir = 8;
pixel_x = 24
@@ -45876,9 +45885,6 @@
/obj/structure/cable/yellow{
icon_state = "1-4"
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 5
},
@@ -53120,10 +53126,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/white,
/area/medical/medbay/aft)
-"oub" = (
-/obj/structure/sign/poster/official/random,
-/turf/closed/wall,
-/area/hydroponics)
"oue" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 5
@@ -59033,9 +59035,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -60310,9 +60310,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 4
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -62521,13 +62519,7 @@
/obj/structure/extinguisher_cabinet{
pixel_y = -30
},
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/bot{
- dir = 1
- },
+/obj/machinery/processor,
/turf/open/floor/iron/checker,
/area/crew_quarters/kitchen)
"sdw" = (
@@ -64629,11 +64621,6 @@
/turf/open/floor/engine,
/area/science/xenobiology)
"sVr" = (
-/obj/structure/table,
-/obj/machinery/microwave{
- pixel_x = -3;
- pixel_y = 4
- },
/obj/machinery/button/door{
id = "kitchen";
name = "Kitchen Shutters Control";
@@ -64648,6 +64635,10 @@
/obj/machinery/light{
dir = 1
},
+/obj/structure/table,
+/obj/machinery/dish_drive{
+ pixel_y = 5
+ },
/turf/open/floor/iron/checker,
/area/crew_quarters/kitchen)
"sVA" = (
@@ -66326,13 +66317,11 @@
/turf/open/floor/iron/grid/steel,
/area/medical/virology)
"tDj" = (
-/obj/structure/rack,
-/obj/item/book/manual/chef_recipes{
- pixel_x = 2;
- pixel_y = 6
+/obj/structure/table,
+/obj/machinery/microwave{
+ pixel_x = -3;
+ pixel_y = 4
},
-/obj/item/stack/package_wrap,
-/obj/item/storage/box/donkpockets,
/turf/open/floor/iron/checker,
/area/crew_quarters/kitchen)
"tDC" = (
@@ -66353,8 +66342,7 @@
/turf/open/floor/iron/white,
/area/medical/medbay/aft)
"tDH" = (
-/obj/structure/table,
-/obj/item/storage/box/donkpockets,
+/obj/machinery/griddle,
/turf/open/floor/iron/checker,
/area/crew_quarters/kitchen)
"tDM" = (
@@ -66627,9 +66615,6 @@
/turf/open/floor/iron,
/area/hallway/primary/fore)
"tIN" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -66639,6 +66624,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
+/obj/structure/disposalpipe/trunk/multiz/down{
+ dir = 1
+ },
/turf/open/floor/iron/checker,
/area/crew_quarters/kitchen)
"tIU" = (
@@ -68041,7 +68029,6 @@
/obj/structure/cable/yellow{
icon_state = "2-4"
},
-/obj/machinery/deepfryer,
/turf/open/floor/iron/checker,
/area/crew_quarters/kitchen)
"ukx" = (
@@ -71280,9 +71267,7 @@
/obj/machinery/light{
dir = 4
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -75165,7 +75150,11 @@
departmentType = 2;
pixel_x = 30
},
-/obj/machinery/processor,
+/obj/machinery/disposal/bin,
+/obj/effect/turf_decal/bot{
+ dir = 1
+ },
+/obj/structure/disposalpipe/trunk,
/turf/open/floor/iron/checker,
/area/crew_quarters/kitchen)
"wVV" = (
@@ -75924,9 +75913,7 @@
name = "medbay camera";
network = list("ss13","medbay")
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow,
/turf/open/floor/iron/dark,
/area/medical/surgery)
@@ -77493,7 +77480,6 @@
/obj/effect/turf_decal/tile/red/fourcorners/contrasted,
/mob/living/simple_animal/kalo{
desc = "The Perma brig's cute grass snake.";
- icon = 'icons/mob/animal.dmi';
icon_dead = "snake_dead";
icon_living = "snake";
icon_state = "snake";
@@ -111795,7 +111781,7 @@ dik
bKe
bOP
bOP
-bOP
+hEt
bKe
bSS
soe
@@ -113082,7 +113068,7 @@ leM
kId
qqj
djR
-oub
+bUe
bUi
hzl
bWT
@@ -113595,7 +113581,7 @@ ujJ
duS
owC
qqj
-hEt
+ujJ
bSV
bUh
mPh
@@ -114110,7 +114096,7 @@ dLU
agH
wVR
tIN
-bST
+bUe
kwI
hzl
bWT
diff --git a/_maps/map_files/RadStation/RadStation.dmm b/_maps/map_files/RadStation/RadStation.dmm
index 3edc695f1ca9b..2c6cbec8a9542 100644
--- a/_maps/map_files/RadStation/RadStation.dmm
+++ b/_maps/map_files/RadStation/RadStation.dmm
@@ -453,9 +453,7 @@
/turf/open/floor/iron,
/area/hallway/primary/fore)
"agS" = (
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -494,9 +492,7 @@
/area/ai_monitored/turret_protected/ai)
"aic" = (
/obj/structure/table/reinforced,
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/item/clothing/glasses/welding,
/turf/open/floor/plating,
/area/ai_monitored/storage/satellite)
@@ -1159,9 +1155,7 @@
/obj/item/radio/intercom{
pixel_y = -35
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/machinery/recharge_station{
name = "EPS recharging station"
},
@@ -1831,8 +1825,7 @@
dir = 2
},
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/effect/turf_decal/guideline/guideline_in/darkblue{
dir = 4
@@ -2141,7 +2134,6 @@
dir = 1
},
/obj/machinery/camera/autoname{
- dir = 2;
view_range = 12
},
/obj/machinery/status_display/evac{
@@ -2747,7 +2739,6 @@
broadcasting = 1;
canhear_range = 6;
dir = 8;
- listening = 1;
name = "Station Intercom (Court)"
},
/obj/item/gavelhammer{
@@ -3060,9 +3051,7 @@
/turf/open/floor/iron,
/area/science/xenobiology)
"aXX" = (
-/obj/structure/chair/wood/normal{
- dir = 2
- },
+/obj/structure/chair/wood/normal,
/turf/open/floor/wood,
/area/crew_quarters/theatre)
"aYr" = (
@@ -3381,8 +3370,7 @@
/obj/item/toy/figure/captain{
icon_state = "nuketoy";
name = "Toy Nuke";
- toysay = "What the fuck did you do?";
- toysound = 'sound/machines/click.ogg'
+ toysay = "What the fuck did you do?"
},
/turf/open/floor/plating/airless,
/area/science/test_area)
@@ -3683,7 +3671,6 @@
dir = 1
},
/obj/machinery/camera/autoname{
- dir = 2;
network = list("ss13","engine")
},
/turf/open/floor/iron/tech,
@@ -3855,7 +3842,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -4298,8 +4284,7 @@
dir = 5
},
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/sorting/mail{
name = "Security"
@@ -4667,9 +4652,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/structure/cable{
icon_state = "4-8"
},
@@ -4701,7 +4684,6 @@
/obj/structure/closet/secure_closet/freezer/meat,
/obj/effect/turf_decal/bot,
/obj/machinery/airalarm{
- dir = 2;
pixel_y = 28
},
/turf/open/floor/iron/freezer,
@@ -4752,8 +4734,7 @@
/area/medical/sleeper)
"bCx" = (
/obj/effect/turf_decal/tile/yellow/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/effect/turf_decal/bot,
/obj/machinery/light{
@@ -5481,7 +5462,6 @@
dir = 8
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -5740,7 +5720,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -6087,7 +6066,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -6228,7 +6206,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -6259,7 +6236,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -6271,8 +6247,7 @@
/area/crew_quarters/heads/hos)
"ccv" = (
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/effect/turf_decal/guideline/guideline_in/darkblue{
dir = 4
@@ -7135,7 +7110,6 @@
"coY" = (
/obj/structure/table,
/obj/machinery/door/window/eastright{
- dir = 4;
icon_state = "left";
name = "Research and Development Desk";
req_one_access_txt = "7;29"
@@ -7541,8 +7515,7 @@
/area/engine/atmos)
"cvf" = (
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 2
@@ -7904,7 +7877,6 @@
dir = 1
},
/obj/machinery/camera/autoname{
- dir = 2;
network = list("ss13","medbay");
view_range = 10
},
@@ -8041,9 +8013,7 @@
/obj/structure/cable/yellow{
icon_state = "2-8"
},
-/obj/machinery/nuclearbomb/selfdestruct{
- base_icon_state = null
- },
+/obj/machinery/nuclearbomb/selfdestruct,
/turf/open/floor/circuit/green{
luminosity = 2
},
@@ -8615,7 +8585,6 @@
},
/obj/effect/turf_decal/guideline/guideline_edge_alt/blue,
/obj/effect/turf_decal/guideline/guideline_tri/blue{
- color = "#52B4E9";
dir = 4
},
/turf/open/floor/iron/white/side{
@@ -9202,15 +9171,11 @@
/turf/open/floor/iron/dark,
/area/hallway/primary/central)
"cWP" = (
-/obj/structure/chair/wood/normal{
- dir = 2
- },
+/obj/structure/chair/wood/normal,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/effect/turf_decal/siding/wood/corner{
dir = 1
},
@@ -9569,9 +9534,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 6
},
-/turf/open/floor/iron/dark/side{
- dir = 2
- },
+/turf/open/floor/iron/dark/side,
/area/hallway/primary/central)
"dcB" = (
/obj/machinery/ai_slipper{
@@ -10256,8 +10219,7 @@
/area/quartermaster/storage)
"dmU" = (
/obj/effect/turf_decal/tile/yellow/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/closet/secure_closet/engineering_personal,
/obj/effect/turf_decal/bot,
@@ -10560,9 +10522,7 @@
pixel_x = -1;
pixel_y = 5
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/machinery/camera/autoname{
c_tag = "Starbird Security Checkpoint";
dir = 1
@@ -10981,7 +10941,6 @@
pixel_y = -32
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E";
dir = 1
},
@@ -11084,9 +11043,7 @@
dir = 8
},
/obj/effect/turf_decal/guideline/guideline_edge/red,
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 1
},
@@ -11201,8 +11158,7 @@
/area/engine/atmos)
"dBX" = (
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 2
@@ -11581,7 +11537,6 @@
dir = 6
},
/obj/machinery/airalarm{
- dir = 2;
pixel_y = 28
},
/obj/machinery/chem_dispenser/mutagensaltpetersmall,
@@ -11804,7 +11759,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -12110,9 +12064,7 @@
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/open/floor/iron/dark/side{
- dir = 2
- },
+/turf/open/floor/iron/dark/side,
/area/science/mixing/chamber)
"dNE" = (
/obj/effect/landmark/start/janitor,
@@ -12278,9 +12230,7 @@
/turf/open/floor/engine,
/area/science/xenobiology)
"dQf" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -12521,7 +12471,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -12586,7 +12535,6 @@
icon_state = "4-8"
},
/obj/machinery/atmospherics/components/binary/pump{
- dir = 2;
name = "Atmos to Loop"
},
/obj/effect/turf_decal/delivery,
@@ -13468,7 +13416,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -13534,8 +13481,7 @@
"elG" = (
/obj/effect/turf_decal/tile/dark_red/half/contrasted{
alpha = 180;
- color = "#DE3A3A";
- dir = 2
+ color = "#DE3A3A"
},
/obj/structure/cable/yellow{
icon_state = "1-8"
@@ -13887,9 +13833,7 @@
/turf/open/floor/iron,
/area/maintenance/starboard/aft)
"ert" = (
-/obj/machinery/power/emitter/welded{
- dir = 2
- },
+/obj/machinery/power/emitter/welded,
/obj/structure/cable/yellow{
icon_state = "0-4"
},
@@ -14411,7 +14355,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_tri/blue{
- color = "#52B4E9";
dir = 1
},
/obj/structure/disposalpipe/segment{
@@ -15270,8 +15213,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 1
@@ -15307,9 +15249,7 @@
dir = 1;
network = list("ss13","security")
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/item/radio/intercom{
frequency = 1423;
name = "Interrogation Intercom";
@@ -15667,7 +15607,6 @@
},
/obj/effect/turf_decal/guideline/guideline_edge_alt/blue,
/obj/effect/turf_decal/guideline/guideline_tri/blue{
- color = "#52B4E9";
dir = 4
},
/turf/open/floor/iron/white/side{
@@ -15697,9 +15636,7 @@
"eTm" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/effect/turf_decal/bot,
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/turf/open/floor/iron,
/area/engine/atmos)
"eTn" = (
@@ -15986,7 +15923,6 @@
},
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/obj/machinery/camera/autoname{
- c_tag = null;
dir = 8;
network = list("ss13","medbay");
view_range = 8
@@ -16705,9 +16641,7 @@
/area/maintenance/port/aft)
"fid" = (
/obj/effect/turf_decal/siding/wideplating/dark,
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 9
},
@@ -17391,7 +17325,6 @@
dir = 8
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -17414,7 +17347,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -17767,9 +17699,7 @@
pixel_x = 1;
pixel_y = -36
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/structure/chair/fancy/sofa/old/right{
dir = 1
},
@@ -17896,9 +17826,7 @@
/turf/open/floor/wood,
/area/security/courtroom)
"fzv" = (
-/obj/machinery/computer/cloning{
- dir = 2
- },
+/obj/machinery/computer/cloning,
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
/area/medical/genetics/cloning)
@@ -18074,9 +18002,7 @@
dir = 1
},
/obj/effect/turf_decal/siding/wideplating/dark,
-/turf/open/floor/iron/dark/side{
- dir = 2
- },
+/turf/open/floor/iron/dark/side,
/area/hallway/primary/central)
"fCz" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
@@ -18594,7 +18520,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -18613,15 +18538,11 @@
/obj/structure/cable/yellow{
icon_state = "0-8"
},
-/obj/structure/curtain/directional{
- dir = 2
- },
+/obj/structure/curtain/directional,
/turf/open/floor/plating,
/area/security/courtroom)
"fLQ" = (
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/item/kirbyplants/random,
/turf/open/floor/iron,
/area/science/lobby)
@@ -19590,9 +19511,7 @@
layer = 3.00001;
pixel_y = 1
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/structure/extinguisher_cabinet{
pixel_y = -33
},
@@ -19888,9 +19807,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = -27
},
-/turf/open/floor/iron/dark/side{
- dir = 2
- },
+/turf/open/floor/iron/dark/side,
/area/hallway/primary/central)
"geq" = (
/obj/machinery/meter,
@@ -20179,9 +20096,7 @@
/obj/structure/extinguisher_cabinet{
pixel_y = -33
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/turf/open/floor/iron/white/side{
dir = 1
},
@@ -20421,8 +20336,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 1
@@ -21147,8 +21061,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/effect/turf_decal/guideline/guideline_in/darkblue{
dir = 4
@@ -21553,8 +21466,7 @@
location = "2-Sec"
},
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
@@ -21814,7 +21726,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -21992,7 +21903,6 @@
pixel_y = 1
},
/obj/machinery/airalarm{
- dir = 2;
pixel_y = 28
},
/turf/open/floor/iron/white,
@@ -22139,8 +22049,7 @@
icon_state = "4-8"
},
/obj/effect/turf_decal/guideline/guideline_in/neutral{
- alpha = 255;
- dir = 2
+ alpha = 255
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
@@ -22288,7 +22197,6 @@
pixel_y = 29
},
/obj/machinery/camera/autoname{
- dir = 2;
network = list("ss13","rd")
},
/turf/open/floor/iron/dark,
@@ -22526,9 +22434,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/turf/open/floor/engine,
/area/science/explab)
"gRN" = (
@@ -22943,7 +22849,6 @@
dir = 1
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -23021,9 +22926,7 @@
/turf/open/floor/iron/white,
/area/science/research)
"gYh" = (
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -23745,11 +23648,8 @@
/obj/effect/turf_decal/guideline/guideline_edge_alt/blue{
dir = 8
},
-/obj/effect/turf_decal/guideline/guideline_tri/blue{
- color = "#52B4E9"
- },
+/obj/effect/turf_decal/guideline/guideline_tri/blue,
/obj/machinery/camera/autoname{
- dir = 2;
network = list("ss13","medbay");
view_range = 10
},
@@ -23946,7 +23846,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -24180,9 +24079,7 @@
/turf/open/floor/iron/stairs/right,
/area/hallway/primary/central)
"hsL" = (
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/turf/open/floor/iron,
/area/hallway/primary/central)
"hsU" = (
@@ -25383,9 +25280,7 @@
/obj/structure/cable/yellow{
icon_state = "0-8"
},
-/obj/structure/curtain/directional{
- dir = 2
- },
+/obj/structure/curtain/directional,
/turf/open/floor/plating,
/area/crew_quarters/heads/chief)
"hNf" = (
@@ -25711,7 +25606,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -25813,9 +25707,7 @@
/obj/machinery/light{
dir = 1
},
-/obj/machinery/camera/autoname{
- dir = 2
- },
+/obj/machinery/camera/autoname,
/turf/open/floor/iron/dark,
/area/storage/primary)
"hTN" = (
@@ -27875,8 +27767,7 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 1
@@ -28047,9 +27938,7 @@
"iJN" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/machinery/atmospherics/components/trinary/filter{
- flipped = 0
- },
+/obj/machinery/atmospherics/components/trinary/filter,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
/area/engine/atmospherics_engine)
@@ -28237,9 +28126,7 @@
/turf/open/floor/iron/dark,
/area/security/courtroom)
"iNu" = (
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 9
},
@@ -28757,9 +28644,7 @@
alpha = 180;
dir = 4
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-2"
},
@@ -29471,8 +29356,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 1
@@ -30333,8 +30217,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 1
@@ -30408,9 +30291,7 @@
/obj/structure/disposalpipe/segment{
dir = 5
},
-/turf/open/floor/iron/dark/side{
- dir = 2
- },
+/turf/open/floor/iron/dark/side,
/area/hallway/primary/central)
"jwG" = (
/obj/effect/turf_decal/guideline/guideline_in/neutral{
@@ -30510,8 +30391,6 @@
pixel_y = -2
},
/obj/machinery/door/window/northright{
- dir = 1;
- icon_state = "right";
layer = 3.1;
name = "Jetpack Storage";
req_access_txt = "19"
@@ -30735,9 +30614,7 @@
/obj/structure/reagent_dispensers/peppertank{
pixel_y = -30
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/machinery/button/door/incinerator_vent_toxmix{
id = "tox_ESD";
name = "Emergency space door";
@@ -31004,7 +30881,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -31176,9 +31052,7 @@
pixel_y = 5
},
/obj/structure/table/wood,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-2"
},
@@ -32083,7 +31957,6 @@
"jXw" = (
/obj/structure/bed/roller,
/obj/effect/turf_decal/guideline/guideline_tri/blue{
- color = "#52B4E9";
dir = 8
},
/turf/open/floor/iron/white/side{
@@ -32331,8 +32204,7 @@
/area/science/robotics/mechbay)
"kaQ" = (
/obj/effect/turf_decal/tile/yellow/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/turf/open/floor/iron,
/area/engine/storage)
@@ -32416,7 +32288,6 @@
},
/obj/machinery/firealarm/directional/north,
/obj/machinery/camera/autoname{
- dir = 2;
network = list("ss13","engine")
},
/obj/effect/turf_decal/tile/neutral/half/contrasted{
@@ -32636,7 +32507,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -32834,9 +32704,7 @@
/turf/open/floor/iron/dark,
/area/engine/atmos)
"kjs" = (
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/hydroponics/constructable,
/obj/effect/turf_decal/stripes/line{
@@ -33083,7 +32951,6 @@
"kmq" = (
/obj/effect/turf_decal/box/white,
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
- dir = 2;
external_pressure_bound = 120;
name = "server vent"
},
@@ -33411,7 +33278,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -34093,9 +33959,7 @@
/area/ai_monitored/turret_protected/ai_upload)
"kDX" = (
/obj/effect/landmark/start/randommaint/magician,
-/obj/structure/chair/wood/normal{
- dir = 2
- },
+/obj/structure/chair/wood/normal,
/turf/open/floor/wood,
/area/crew_quarters/theatre)
"kEh" = (
@@ -34140,9 +34004,7 @@
/obj/structure/cable{
icon_state = "0-8"
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/turf/open/floor/engine{
initial_gas_mix = "n2=100;TEMP=80";
name = "mainframe floor"
@@ -34261,9 +34123,7 @@
dir = 1
},
/obj/effect/turf_decal/siding/wideplating/dark,
-/turf/open/floor/iron/dark/side{
- dir = 2
- },
+/turf/open/floor/iron/dark/side,
/area/hallway/primary/central)
"kIg" = (
/obj/item/soap/nanotrasen,
@@ -34627,7 +34487,6 @@
/area/space)
"kOt" = (
/obj/docking_port/stationary{
- dir = 1;
dwidth = 12;
height = 69;
id = "whiteship_home";
@@ -34807,8 +34666,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 1
@@ -35501,9 +35359,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -35584,8 +35440,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/effect/turf_decal/guideline/guideline_in/darkblue{
dir = 4
@@ -35696,9 +35551,7 @@
/obj/machinery/light{
dir = 4
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -36439,9 +36292,7 @@
/obj/machinery/light{
dir = 4
},
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow,
/turf/open/floor/wood,
/area/security/courtroom)
@@ -36791,10 +36642,6 @@
/turf/open/floor/iron,
/area/medical/apothecary)
"lxd" = (
-/obj/machinery/camera/autoname{
- dir = 2;
- network = list("ss13","rd")
- },
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
@@ -36802,6 +36649,10 @@
pixel_y = 30;
receive_ore_updates = 1
},
+/obj/machinery/camera/autoname{
+ dir = 2;
+ network = list("ss13","rd")
+ },
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -37099,9 +36950,7 @@
/turf/open/floor/iron/dark,
/area/engine/atmos)
"lBL" = (
-/obj/effect/turf_decal/tile/dark_green{
- dir = 2
- },
+/obj/effect/turf_decal/tile/dark_green,
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/reagent_dispensers/cooking_oil,
/turf/open/floor/iron,
@@ -37198,9 +37047,7 @@
/obj/structure/table/reinforced,
/obj/machinery/cell_charger,
/obj/item/stock_parts/cell/high/plus,
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/machinery/camera/autoname{
dir = 1;
network = list("ss13","engine")
@@ -37263,7 +37110,6 @@
id = "chapelgun"
},
/obj/machinery/door/window{
- dir = 2;
name = "Mass Driver";
req_access_txt = "22"
},
@@ -37865,7 +37711,6 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/landmark/start/assistant,
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E";
dir = 1
},
@@ -38583,12 +38428,10 @@
"mbI" = (
/obj/structure/table/wood,
/obj/item/flashlight/lamp/green{
- layer = 3;
pixel_x = -8;
pixel_y = 15
},
/obj/item/storage/secure/briefcase{
- layer = 3;
pixel_x = 2;
pixel_y = 8
},
@@ -38631,7 +38474,6 @@
dir = 4
},
/obj/machinery/door/airlock/virology/glass{
- id_tag = null;
name = "Virology Ward";
req_access_txt = "39"
},
@@ -39900,6 +39742,9 @@
pixel_x = 26;
pixel_y = -1
},
+/obj/machinery/chem_master/condimaster{
+ name = "CondiMaster Neo"
+ },
/turf/open/floor/iron/freezer,
/area/crew_quarters/kitchen/coldroom)
"mwM" = (
@@ -41193,7 +41038,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -41291,19 +41135,6 @@
"mRV" = (
/turf/closed/wall/mineral/plastitanium,
/area/security/brig/medbay)
-"mSi" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/sign/warning/securearea{
- pixel_y = 30
- },
-/obj/machinery/camera/autoname{
- dir = 2;
- network = list("ss13","engine")
- },
-/turf/open/floor/iron/dark,
-/area/engine/engine_room)
"mSo" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -41449,7 +41280,6 @@
icon_state = "2-4"
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
@@ -41493,6 +41323,16 @@
/obj/machinery/light_switch{
pixel_x = 21
},
+/obj/item/food/dough{
+ pixel_y = 1
+ },
+/obj/item/food/dough{
+ pixel_x = -4
+ },
+/obj/item/kitchen/rollingpin{
+ pixel_x = 3;
+ pixel_y = 5
+ },
/turf/open/floor/iron/white,
/area/crew_quarters/kitchen)
"mVA" = (
@@ -41573,7 +41413,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E";
dir = 1
},
@@ -41763,7 +41602,6 @@
dir = 1
},
/obj/effect/turf_decal/guideline/guideline_tri/blue{
- color = "#52B4E9";
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_edge_alt/blue,
@@ -42101,9 +41939,7 @@
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 8
},
-/obj/effect/turf_decal/guideline/guideline_in/blue{
- dir = 2
- },
+/obj/effect/turf_decal/guideline/guideline_in/blue,
/obj/machinery/light_switch{
pixel_x = 21;
pixel_y = -21
@@ -43183,8 +43019,7 @@
"nss" = (
/obj/effect/turf_decal/tile/dark_red/half/contrasted{
alpha = 180;
- color = "#DE3A3A";
- dir = 2
+ color = "#DE3A3A"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
@@ -43978,7 +43813,6 @@
/area/hallway/primary/fore)
"nDB" = (
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/obj/effect/turf_decal/tile/dark_green/half/contrasted{
@@ -44735,7 +44569,7 @@
/turf/closed/wall/r_wall,
/area/engine/atmos)
"nQr" = (
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 8
},
/obj/effect/turf_decal/siding/wood{
@@ -45324,8 +45158,7 @@
dir = 2
},
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/effect/turf_decal/guideline/guideline_in/darkblue{
dir = 4
@@ -46487,9 +46320,6 @@
name = "Security Viewing Hall"
})
"ovc" = (
-/obj/machinery/chem_master/condimaster{
- name = "CondiMaster Neo"
- },
/obj/machinery/light{
dir = 8
},
@@ -46497,6 +46327,7 @@
dir = 4
},
/obj/effect/turf_decal/bot,
+/obj/machinery/deepfryer,
/turf/open/floor/iron/white,
/area/crew_quarters/kitchen)
"ovj" = (
@@ -46679,9 +46510,7 @@
/area/medical/surgery)
"ozf" = (
/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted,
-/obj/effect/turf_decal/numbers/two_nine{
- dir = 2
- },
+/obj/effect/turf_decal/numbers/two_nine,
/obj/effect/turf_decal/box,
/turf/open/floor/iron,
/area/maintenance/port/aft)
@@ -47584,9 +47413,7 @@
/obj/effect/turf_decal/guideline/guideline_half_edge/blue{
dir = 10
},
-/obj/effect/turf_decal/guideline/guideline_tri/blue{
- color = "#52B4E9"
- },
+/obj/effect/turf_decal/guideline/guideline_tri/blue,
/obj/effect/turf_decal/guideline/guideline_edge_alt/blue{
dir = 8
},
@@ -47651,9 +47478,7 @@
},
/area/quartermaster/exploration_prep)
"oOw" = (
-/obj/machinery/power/emitter/welded{
- dir = 2
- },
+/obj/machinery/power/emitter/welded,
/obj/structure/cable/yellow,
/obj/structure/cable/yellow{
icon_state = "1-4"
@@ -48102,23 +47927,25 @@
/turf/open/floor/plating,
/area/engine/break_room)
"oVm" = (
-/obj/structure/table,
-/obj/item/food/dough{
- pixel_x = -4
- },
-/obj/item/food/dough{
- pixel_y = 1
- },
-/obj/item/kitchen/rollingpin{
- pixel_x = 3;
- pixel_y = 5
- },
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/obj/machinery/light{
dir = 4
},
+/obj/structure/table,
+/obj/item/storage/box/ingredients/wildcard{
+ pixel_x = -5;
+ pixel_y = 8
+ },
+/obj/item/storage/box/ingredients/fruity{
+ pixel_x = 4;
+ pixel_y = 6
+ },
+/obj/item/storage/box/ingredients/vegetarian{
+ pixel_x = -1;
+ pixel_y = 4
+ },
/turf/open/floor/iron/white,
/area/crew_quarters/kitchen)
"oVx" = (
@@ -48954,8 +48781,7 @@
dir = 4
},
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/turf/open/floor/iron/dark/corner{
dir = 1
@@ -48997,8 +48823,7 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 1
@@ -49146,9 +48971,7 @@
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 8
},
-/obj/effect/turf_decal/guideline/guideline_in/blue{
- dir = 2
- },
+/obj/effect/turf_decal/guideline/guideline_in/blue,
/obj/machinery/light{
dir = 8
},
@@ -49469,9 +49292,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/structure/extinguisher_cabinet{
pixel_x = -8;
pixel_y = -30
@@ -49851,7 +49672,6 @@
/area/engine/atmos)
"pxJ" = (
/obj/machinery/door/window/brigdoor/northleft{
- dir = 1;
name = "Telecommunications";
req_access_txt = "49"
},
@@ -49864,7 +49684,6 @@
/obj/effect/turf_decal/tile/red/fourcorners/contrasted,
/mob/living/simple_animal/kalo{
desc = "The Perma brig's cute grass snake.";
- icon = 'icons/mob/animal.dmi';
icon_dead = "snake_dead";
icon_living = "snake";
icon_state = "snake";
@@ -49911,9 +49730,7 @@
"pzk" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable/yellow,
-/obj/structure/curtain/directional{
- dir = 2
- },
+/obj/structure/curtain/directional,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -50008,9 +49825,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/machinery/camera/autoname{
dir = 1;
pixel_x = 2
@@ -50107,9 +49922,7 @@
/turf/open/floor/iron/tech,
/area/engine/engine_room)
"pCi" = (
-/obj/effect/turf_decal/tile/dark_green{
- dir = 2
- },
+/obj/effect/turf_decal/tile/dark_green,
/turf/open/floor/iron,
/area/maintenance/central)
"pCu" = (
@@ -50284,9 +50097,7 @@
/obj/structure/cable/yellow{
icon_state = "0-4"
},
-/obj/structure/curtain/directional{
- dir = 2
- },
+/obj/structure/curtain/directional,
/turf/open/floor/plating,
/area/crew_quarters/heads/chief)
"pEZ" = (
@@ -50473,7 +50284,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/door/window/southleft{
- dir = 2;
name = "Engineering Delivery";
req_access_txt = "24"
},
@@ -50618,7 +50428,6 @@
/area/maintenance/department/medical)
"pJP" = (
/obj/effect/turf_decal/guideline/guideline_tri/blue{
- color = "#52B4E9";
dir = 8
},
/obj/structure/cable/yellow{
@@ -50777,7 +50586,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -51482,7 +51290,6 @@
},
/obj/machinery/recharge_station,
/obj/machinery/camera/autoname{
- dir = 2;
network = list("ss13","rd")
},
/obj/effect/landmark/start/cyborg,
@@ -51608,8 +51415,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/effect/turf_decal/guideline/guideline_in/darkblue{
dir = 4
@@ -51652,7 +51458,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/obj/machinery/navbeacon{
@@ -51912,9 +51717,7 @@
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 8
},
-/obj/effect/turf_decal/guideline/guideline_in/blue{
- dir = 2
- },
+/obj/effect/turf_decal/guideline/guideline_in/blue,
/turf/open/floor/iron/white,
/area/medical/medbay/lobby)
"qcz" = (
@@ -51926,8 +51729,7 @@
icon_state = "4-8"
},
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 1
@@ -51951,8 +51753,7 @@
/area/hallway/secondary/exit/departure_lounge)
"qcH" = (
/obj/effect/turf_decal/tile/yellow/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/closet/secure_closet/engineering_personal,
/obj/effect/turf_decal/bot,
@@ -52021,7 +51822,6 @@
dir = 1
},
/obj/effect/turf_decal/guideline/guideline_tri/blue{
- color = "#52B4E9";
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_edge_alt/blue,
@@ -52796,8 +52596,7 @@
dir = 2
},
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/effect/turf_decal/guideline/guideline_half_in/darkblue{
@@ -52933,9 +52732,7 @@
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 8
},
-/obj/effect/turf_decal/guideline/guideline_in/blue{
- dir = 2
- },
+/obj/effect/turf_decal/guideline/guideline_in/blue,
/turf/open/floor/iron/white,
/area/medical/medbay/lobby)
"quK" = (
@@ -53040,7 +52837,6 @@
dir = 10
},
/obj/machinery/camera/autoname{
- dir = 2;
view_range = 12
},
/obj/effect/turf_decal/siding/wideplating/dark/corner{
@@ -53376,7 +53172,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -53418,8 +53213,7 @@
/area/science/mixing)
"qCQ" = (
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/effect/landmark/start/cyborg,
/turf/open/floor/iron,
@@ -53519,7 +53313,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -53621,7 +53414,6 @@
"qGM" = (
/obj/effect/turf_decal/tile/green/fourcorners/contrasted,
/obj/machinery/door/airlock/virology/glass{
- id_tag = null;
name = "Virology Ward";
req_access_txt = "39"
},
@@ -54172,8 +53964,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/yellow/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/iron,
@@ -54366,7 +54157,6 @@
dir = 5
},
/obj/effect/turf_decal/guideline/guideline_tri/_corner/blue{
- color = "#52B4E9";
dir = 1
},
/turf/open/floor/iron/white,
@@ -54657,7 +54447,6 @@
icon_state = "4-8"
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -54706,7 +54495,6 @@
/area/engine/engine_room)
"qYz" = (
/obj/machinery/camera/autoname{
- dir = 2;
network = list("ss13","rd")
},
/obj/structure/disposalpipe/segment{
@@ -54796,7 +54584,6 @@
},
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/medical{
- id_tag = null;
name = "Medbay";
req_one_access_txt = "5"
},
@@ -54912,7 +54699,6 @@
dir = 8
},
/obj/effect/turf_decal/guideline/guideline_tri/_corner/blue{
- color = "#52B4E9";
dir = 8
},
/turf/open/floor/iron/white,
@@ -55068,9 +54854,7 @@
/turf/open/floor/iron/white,
/area/medical/sleeper)
"res" = (
-/obj/machinery/computer/operating{
- dir = 2
- },
+/obj/machinery/computer/operating,
/turf/open/floor/iron/white,
/area/science/robotics)
"rev" = (
@@ -55798,9 +55582,7 @@
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
-/obj/effect/turf_decal/tile/dark_green{
- dir = 2
- },
+/obj/effect/turf_decal/tile/dark_green,
/turf/open/floor/iron,
/area/hallway/secondary/service)
"rqR" = (
@@ -56467,17 +56249,6 @@
/obj/structure/table/wood/fancy,
/turf/open/floor/carpet/grimy,
/area/chapel/office)
-"rCc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/turf/open/floor/iron/dark/side{
- dir = 2
- },
-/area/hallway/primary/central)
"rCn" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -56523,7 +56294,6 @@
dir = 4
},
/obj/machinery/camera/autoname{
- dir = 2;
network = list("ss13","security")
},
/obj/machinery/power/apc/auto_name/east,
@@ -56817,9 +56587,7 @@
/obj/effect/turf_decal/tile/dark_blue/fourcorners/contrasted{
alpha = 180
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/structure/extinguisher_cabinet{
pixel_x = 27;
pixel_y = -1
@@ -56828,8 +56596,7 @@
/area/ai_monitored/turret_protected/aisat/foyer)
"rHP" = (
/obj/effect/turf_decal/tile/yellow/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 10
@@ -56986,9 +56753,7 @@
/turf/open/floor/carpet/blue,
/area/medical/exam_room)
"rKH" = (
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/machinery/computer/med_data{
dir = 1
},
@@ -57139,8 +56904,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 1
@@ -57814,7 +57578,6 @@
/area/maintenance/port/aft)
"rZQ" = (
/obj/machinery/camera/autoname{
- c_tag = null;
dir = 4;
network = list("ss13","medbay");
view_range = 8
@@ -59557,8 +59320,7 @@
dir = 8
},
/obj/machinery/camera/preset/toxins{
- dir = 4;
- network = list("rd","toxins")
+ dir = 4
},
/turf/open/floor/plating/airless,
/area/science/test_area)
@@ -59793,8 +59555,7 @@
"sIW" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 1
@@ -60379,8 +60140,7 @@
/obj/structure/chair/office,
/obj/effect/turf_decal/tile/dark_red/half/contrasted{
alpha = 180;
- color = "#DE3A3A";
- dir = 2
+ color = "#DE3A3A"
},
/obj/machinery/newscaster{
pixel_x = 32;
@@ -60945,9 +60705,7 @@
/turf/closed/wall/r_wall,
/area/security/warden)
"taL" = (
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/structure/table/reinforced,
/obj/item/stack/sheet/iron/fifty{
pixel_x = -2;
@@ -61118,7 +60876,6 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -61234,9 +60991,7 @@
pixel_y = -33
},
/obj/machinery/disposal/bin,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/effect/turf_decal/tile/purple/anticorner/contrasted,
/obj/effect/turf_decal/bot,
/obj/structure/disposalpipe/trunk{
@@ -61822,7 +61577,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -62043,9 +61797,7 @@
},
/area/hallway/secondary/exit/departure_lounge)
"tpM" = (
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 8
},
@@ -62670,9 +62422,7 @@
/area/medical/medbay/lobby)
"tyE" = (
/obj/effect/turf_decal/tile/neutral/half/contrasted,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -63298,7 +63048,6 @@
"tIJ" = (
/obj/structure/table/wood,
/obj/item/toy/plush/moth/luna{
- layer = 3;
pixel_x = -18;
pixel_y = 16
},
@@ -63330,8 +63079,7 @@
"tIT" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 1
@@ -63958,9 +63706,7 @@
/area/engine/atmos)
"tTZ" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/curtain/directional{
- dir = 2
- },
+/obj/structure/curtain/directional,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -64283,9 +64029,7 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/guideline/guideline_edge/purple,
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/turf/open/floor/iron/white/side{
dir = 1
},
@@ -65179,9 +64923,7 @@
/area/hallway/primary/port)
"umA" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/curtain/directional{
- dir = 2
- },
+/obj/structure/curtain/directional,
/turf/open/floor/plating,
/area/crew_quarters/dorms)
"umL" = (
@@ -65253,9 +64995,7 @@
/obj/structure/cable/yellow{
icon_state = "0-4"
},
-/obj/structure/curtain/directional{
- dir = 2
- },
+/obj/structure/curtain/directional,
/turf/open/floor/plating,
/area/security/courtroom)
"uog" = (
@@ -65379,9 +65119,7 @@
/area/crew_quarters/dorms)
"upL" = (
/obj/structure/table/reinforced,
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/item/aicard,
/turf/open/floor/iron/dark,
/area/ai_monitored/turret_protected/aisat_interior)
@@ -65704,7 +65442,6 @@
"uvp" = (
/obj/effect/turf_decal/tile/bar/opposingcorners,
/obj/machinery/camera/autoname{
- c_tag = null;
dir = 8;
network = list("ss13","medbay");
view_range = 8
@@ -65826,7 +65563,6 @@
/area/maintenance/department/medical/morgue)
"uxt" = (
/obj/machinery/camera/autoname{
- c_tag = null;
dir = 8;
network = list("ss13","medbay")
},
@@ -66162,9 +65898,7 @@
/obj/effect/turf_decal/tile/purple/anticorner/contrasted{
dir = 4
},
-/obj/machinery/camera/autoname{
- dir = 2
- },
+/obj/machinery/camera/autoname,
/obj/vehicle/ridden/janicart,
/obj/item/key/janitor,
/turf/open/floor/iron,
@@ -66306,7 +66040,6 @@
dir = 8
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/turf/open/floor/iron,
@@ -67307,9 +67040,7 @@
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
-/obj/effect/turf_decal/tile/dark_green{
- dir = 2
- },
+/obj/effect/turf_decal/tile/dark_green,
/turf/open/floor/iron,
/area/maintenance/central)
"uWe" = (
@@ -67414,8 +67145,7 @@
icon_state = "4-8"
},
/obj/effect/turf_decal/guideline/guideline_in/neutral{
- alpha = 255;
- dir = 2
+ alpha = 255
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
@@ -67475,15 +67205,12 @@
/turf/open/floor/plating/rust,
/area/maintenance/starboard/aft)
"uXH" = (
-/obj/machinery/computer/operating{
- dir = 2
- },
+/obj/machinery/computer/operating,
/obj/effect/turf_decal/bot,
/obj/machinery/newscaster{
pixel_y = 34
},
/obj/machinery/camera/autoname{
- dir = 2;
network = list("ss13","medbay")
},
/turf/open/floor/iron,
@@ -67674,7 +67401,6 @@
"vat" = (
/obj/structure/bookcase/random/fiction,
/obj/machinery/airalarm{
- dir = 2;
pixel_y = 28
},
/turf/open/floor/wood,
@@ -67860,9 +67586,7 @@
/turf/open/floor/carpet/purple,
/area/chapel/main)
"vdz" = (
-/obj/effect/turf_decal/numbers/two_nine{
- dir = 2
- },
+/obj/effect/turf_decal/numbers/two_nine,
/turf/open/floor/iron/grid/steel,
/area/medical/virology)
"vdH" = (
@@ -68188,22 +67912,10 @@
/turf/open/floor/iron/white,
/area/medical/medbay/central)
"vjD" = (
-/obj/structure/table,
-/obj/item/storage/box/ingredients/wildcard{
- pixel_x = -5;
- pixel_y = 8
- },
-/obj/item/storage/box/ingredients/fruity{
- pixel_x = 4;
- pixel_y = 6
- },
-/obj/item/storage/box/ingredients/vegetarian{
- pixel_x = -1;
- pixel_y = 4
- },
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/machinery/griddle,
/turf/open/floor/iron/white,
/area/crew_quarters/kitchen)
"vjG" = (
@@ -68299,7 +68011,7 @@
/obj/machinery/camera/autoname{
dir = 4
},
-/obj/machinery/computer/arcade{
+/obj/effect/spawner/randomarcade{
dir = 4
},
/turf/open/floor/carpet,
@@ -68409,7 +68121,6 @@
/area/engine/atmospherics_engine)
"vma" = (
/obj/machinery/camera/autoname{
- c_tag = null;
dir = 4;
network = list("ss13","medbay")
},
@@ -68486,9 +68197,7 @@
/area/maintenance/department/medical)
"vnI" = (
/obj/effect/turf_decal/bot,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/effect/turf_decal/tile/blue/fourcorners/contrasted,
/obj/structure/cable/yellow,
/obj/item/kirbyplants/random,
@@ -68547,8 +68256,7 @@
icon_state = "4-8"
},
/obj/effect/turf_decal/guideline/guideline_in/neutral{
- alpha = 255;
- dir = 2
+ alpha = 255
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
@@ -68631,9 +68339,7 @@
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 8
},
-/obj/effect/turf_decal/guideline/guideline_in/blue{
- dir = 2
- },
+/obj/effect/turf_decal/guideline/guideline_in/blue,
/turf/open/floor/iron/white,
/area/medical/medbay/lobby)
"vqq" = (
@@ -68651,9 +68357,7 @@
/obj/effect/turf_decal/tile/dark_blue/fourcorners/contrasted{
alpha = 180
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/structure/extinguisher_cabinet{
pixel_x = -26;
pixel_y = -1
@@ -68860,7 +68564,6 @@
},
/obj/machinery/door/window/northright{
dir = 2;
- icon_state = "right";
name = "Engi Desk";
req_one_access_txt = "32;19"
},
@@ -68912,11 +68615,9 @@
dir = 1
},
/obj/machinery/camera/autoname{
- dir = 2;
network = list("ss13","medbay")
},
/obj/machinery/airalarm{
- dir = 2;
pixel_y = 28
},
/obj/structure/cable/yellow{
@@ -69111,8 +68812,8 @@
/turf/open/floor/iron/dark,
/area/science/misc_lab/range)
"vzi" = (
-/obj/machinery/deepfryer,
-/obj/effect/turf_decal/bot,
+/obj/structure/table,
+/obj/item/knife/kitchen,
/turf/open/floor/iron/white,
/area/crew_quarters/kitchen)
"vzm" = (
@@ -69168,7 +68869,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -69295,7 +68995,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/effect/turf_decal/guideline/guideline_tri/blue{
- color = "#52B4E9";
dir = 1
},
/obj/structure/cable/yellow{
@@ -69797,9 +69496,7 @@
/area/construction/mining/aux_base)
"vJG" = (
/obj/structure/lattice/catwalk,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/machinery/porta_turret/ai{
dir = 4
},
@@ -69857,8 +69554,7 @@
dir = 4
},
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
dir = 8
@@ -70631,14 +70327,6 @@
/obj/effect/turf_decal/tile/dark_green/fourcorners/contrasted,
/mob/living/simple_animal/hostile/retaliate/frog{
attacked_sound = 'sound/effects/huuu.ogg';
- density = 0;
- desc = "It seems a little sad.";
- head_icon = 'icons/mob/pets_held.dmi';
- held_state = "";
- icon = 'icons/mob/animal.dmi';
- icon_dead = "frog_dead";
- icon_living = "frog";
- icon_state = "frog";
name = "Larry";
pixel_y = 12;
stepped_sound = null
@@ -70932,9 +70620,7 @@
/turf/open/floor/iron,
/area/maintenance/department/medical)
"wcw" = (
-/obj/machinery/power/emitter/welded{
- dir = 2
- },
+/obj/machinery/power/emitter/welded,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -71205,9 +70891,7 @@
/turf/open/floor/plating,
/area/maintenance/port/central)
"wgp" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/machinery/light{
dir = 4
},
@@ -71432,7 +71116,6 @@
},
/obj/machinery/firealarm/directional/west,
/obj/machinery/camera/autoname{
- c_tag = null;
dir = 4;
network = list("ss13","medbay");
view_range = 8
@@ -71936,7 +71619,6 @@
name = "Toxins Storage";
pixel_x = -1;
pixel_y = -29;
- req_access = null;
req_access_txt = "49"
},
/obj/structure/cable/yellow{
@@ -72049,9 +71731,7 @@
/obj/structure/chair/fancy/bench/pew/right{
dir = 8
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/turf/open/floor/iron/dark,
/area/chapel/main)
"wyu" = (
@@ -72099,9 +71779,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/iron/dark/side{
- dir = 2
- },
+/turf/open/floor/iron/dark/side,
/area/hallway/primary/central)
"wzs" = (
/obj/machinery/door/firedoor,
@@ -73151,7 +72829,6 @@
dir = 4
},
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E"
},
/obj/structure/cable/yellow{
@@ -73261,9 +72938,7 @@
/obj/effect/turf_decal/siding/wood{
dir = 1
},
-/obj/structure/chair/wood/normal{
- dir = 2
- },
+/obj/structure/chair/wood/normal,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -73861,9 +73536,7 @@
/turf/open/floor/iron,
/area/hallway/primary/starboard)
"xcR" = (
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 9
},
@@ -74000,7 +73673,6 @@
broadcasting = 1;
canhear_range = 6;
dir = 8;
- listening = 1;
name = "Station Intercom (Court)"
},
/turf/open/floor/wood,
@@ -74286,7 +73958,6 @@
broadcasting = 1;
canhear_range = 6;
dir = 8;
- listening = 1;
name = "Station Intercom (Court)"
},
/obj/machinery/firealarm/directional/west,
@@ -74502,8 +74173,7 @@
icon_state = "4-8"
},
/obj/effect/turf_decal/guideline/guideline_in/neutral{
- alpha = 255;
- dir = 2
+ alpha = 255
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
@@ -75043,7 +74713,6 @@
/obj/machinery/light/floor{
brightness = 15;
bulb_colour = "#FFE4CE";
- bulb_emergency_brightness_mul = 0.25;
bulb_vacuum_brightness = 15;
nightshift_brightness = 10;
nightshift_light_color = "#E6EBFF"
@@ -75249,15 +74918,12 @@
/area/maintenance/port/aft)
"xwZ" = (
/obj/effect/turf_decal/tile/yellow/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/closet/secure_closet/engineering_electrical,
/obj/effect/turf_decal/bot,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/structure/cable/yellow,
/turf/open/floor/iron,
/area/engine/storage)
@@ -75412,9 +75078,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 6
},
-/obj/machinery/light{
- dir = 2
- },
+/obj/machinery/light,
/obj/effect/decal/cleanable/shreds,
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/dark,
@@ -76053,8 +75717,7 @@
/area/medical/chemistry)
"xII" = (
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
- alpha = 180;
- dir = 2
+ alpha = 180
},
/obj/structure/disposalpipe/segment{
dir = 2
@@ -76783,9 +76446,7 @@
/turf/open/floor/iron,
/area/science/lobby)
"xXE" = (
-/obj/machinery/power/apc/auto_name/east{
- pixel_x = 24
- },
+/obj/machinery/power/apc/auto_name/east,
/obj/machinery/camera/autoname{
dir = 1
},
@@ -77586,7 +77247,6 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/guideline/guideline_in/green{
- alpha = 180;
color = "#439C1E";
dir = 1
},
@@ -108641,7 +108301,7 @@ seT
seT
hdp
hdp
-rCc
+xgv
fWh
vAx
hVF
@@ -109237,7 +108897,7 @@ oOn
lbK
poW
mKJ
-mSi
+lnr
rVX
hvL
pBG
diff --git a/_maps/metastation.json b/_maps/metastation.json
index c1be1376ca429..14ebf764f95f7 100644
--- a/_maps/metastation.json
+++ b/_maps/metastation.json
@@ -1,6 +1,6 @@
{
"map_name": "MetaStation",
- "map_link": "MetaStation",
+ "map_link": "metastation",
"map_path": "map_files/MetaStation",
"map_file": "MetaStation.dmm",
"shuttles": {
diff --git a/_maps/radstation.json b/_maps/radstation.json
index 4f9737f7aa7f8..4ac2e8435d78b 100644
--- a/_maps/radstation.json
+++ b/_maps/radstation.json
@@ -1,6 +1,6 @@
{
"map_name": "Rad Station",
- "map_link": "RadStation",
+ "map_link": "radstation",
"map_path": "map_files/RadStation",
"map_file": "RadStation.dmm",
"shuttles": {
diff --git a/_maps/shuttles/emergency/emergency_funnypod.dmm b/_maps/shuttles/emergency/emergency_funnypod.dmm
new file mode 100644
index 0000000000000..84e5505309e15
--- /dev/null
+++ b/_maps/shuttles/emergency/emergency_funnypod.dmm
@@ -0,0 +1,181 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"i" = (
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"v" = (
+/obj/machinery/computer/emergency_shuttle{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"x" = (
+/obj/structure/shuttle/engine/propulsion/burst{
+ dir = 8
+ },
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"L" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Escape Pod Airlock"
+ },
+/obj/docking_port/mobile/emergency,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"R" = (
+/obj/structure/chair/fancy/shuttle{
+ dir = 4
+ },
+/obj/machinery/status_display/evac{
+ pixel_y = -32
+ },
+/obj/machinery/light/small,
+/obj/item/storage/pod{
+ pixel_y = 27;
+ pixel_x = 6
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"T" = (
+/obj/structure/chair/fancy/shuttle{
+ dir = 4
+ },
+/obj/item/storage/pod{
+ pixel_y = 27;
+ pixel_x = 6
+ },
+/obj/machinery/status_display/evac{
+ pixel_y = -32
+ },
+/obj/machinery/light/small,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+x
+L
+x
+"}
+(2,1,1) = {"
+a
+T
+a
+"}
+(3,1,1) = {"
+a
+T
+a
+"}
+(4,1,1) = {"
+a
+T
+a
+"}
+(5,1,1) = {"
+a
+T
+a
+"}
+(6,1,1) = {"
+a
+T
+a
+"}
+(7,1,1) = {"
+a
+T
+a
+"}
+(8,1,1) = {"
+a
+T
+a
+"}
+(9,1,1) = {"
+a
+T
+a
+"}
+(10,1,1) = {"
+a
+T
+a
+"}
+(11,1,1) = {"
+a
+T
+a
+"}
+(12,1,1) = {"
+a
+R
+a
+"}
+(13,1,1) = {"
+a
+T
+a
+"}
+(14,1,1) = {"
+a
+R
+a
+"}
+(15,1,1) = {"
+a
+T
+a
+"}
+(16,1,1) = {"
+a
+T
+a
+"}
+(17,1,1) = {"
+a
+T
+a
+"}
+(18,1,1) = {"
+a
+T
+a
+"}
+(19,1,1) = {"
+a
+T
+a
+"}
+(20,1,1) = {"
+a
+R
+a
+"}
+(21,1,1) = {"
+a
+T
+a
+"}
+(22,1,1) = {"
+a
+T
+a
+"}
+(23,1,1) = {"
+a
+T
+a
+"}
+(24,1,1) = {"
+a
+v
+a
+"}
+(25,1,1) = {"
+a
+i
+a
+"}
diff --git a/_maps/shuttles/emergency/emergency_honkco.dmm b/_maps/shuttles/emergency/emergency_honkco.dmm
new file mode 100644
index 0000000000000..ec44991eeb001
--- /dev/null
+++ b/_maps/shuttles/emergency/emergency_honkco.dmm
@@ -0,0 +1,737 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"am" = (
+/obj/structure/chair/stool/bar{
+ dir = 1
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"aq" = (
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "line";
+ color = "#0d2dff"
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"aD" = (
+/obj/structure/chair/stool/bar,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/structure/sign/poster/contraband/clown{
+ pixel_y = 32
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"aL" = (
+/obj/item/grown/bananapeel,
+/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"bB" = (
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "line";
+ color = "#ff0000"
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "i";
+ color = "#ff0000";
+ pixel_x = 17;
+ pixel_y = 10
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "t";
+ color = "#ff0000";
+ pixel_x = 17;
+ pixel_y = -8
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"bQ" = (
+/obj/structure/chair/stool/bar{
+ dir = 1
+ },
+/obj/machinery/light/small,
+/obj/structure/sign/poster/contraband/clown{
+ pixel_y = -32
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"cH" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"dS" = (
+/obj/item/grown/bananapeel,
+/obj/structure/chair/stool/bar,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"ep" = (
+/obj/machinery/computer/emergency_shuttle{
+ dir = 8
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"gF" = (
+/mob/living/simple_animal/hostile/retaliate/clown,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"hz" = (
+/mob/living/simple_animal/hostile/retaliate/clown,
+/obj/structure/chair/stool/bar{
+ dir = 4
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"hZ" = (
+/mob/living/simple_animal/hostile/retaliate/clown/mutant,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"ik" = (
+/obj/structure/sign/poster/contraband/clown{
+ pixel_y = 32
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"iN" = (
+/obj/structure/chair/stool/bar,
+/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"jb" = (
+/obj/item/grown/bananapeel,
+/obj/structure/chair/stool/bar,
+/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"kc" = (
+/obj/structure/chair/stool/bar,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"me" = (
+/obj/machinery/nuclearbomb/syndicate/bananium,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"nc" = (
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "line";
+ color = "#ff0000"
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"nv" = (
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "line";
+ color = "#ff0000"
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "s";
+ color = "#ff0000";
+ pixel_x = 17;
+ pixel_y = 11
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"pH" = (
+/obj/machinery/door/airlock/bananium/glass,
+/obj/docking_port/mobile/emergency{
+ dir = 2
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"qt" = (
+/mob/living/simple_animal/hostile/retaliate/clown/banana,
+/obj/structure/chair/stool/bar,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"sh" = (
+/obj/item/grown/bananapeel,
+/obj/item/grown/bananapeel,
+/mob/living/simple_animal/hostile/retaliate/clown/banana,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"tN" = (
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"uo" = (
+/obj/item/grown/bananapeel,
+/obj/machinery/light/floor{
+ brightness = 15;
+ bulb_colour = "#FFE4CE";
+ bulb_emergency_brightness_mul = 0.25;
+ bulb_vacuum_brightness = 15;
+ nightshift_brightness = 10;
+ nightshift_light_color = "#E6EBFF"
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"uI" = (
+/obj/structure/table/wood/fancy/orange,
+/obj/item/clothing/mask/gas/clown_hat,
+/obj/item/clothing/mask/gas/clown_hat,
+/obj/item/clothing/mask/gas/clown_hat,
+/obj/item/clothing/mask/gas/clown_hat,
+/obj/item/clothing/mask/gas/clown_hat,
+/obj/item/clothing/mask/gas/clown_hat,
+/obj/item/clothing/mask/gas/clown_hat,
+/obj/item/clothing/mask/gas/clown_hat,
+/obj/item/clothing/mask/gas/clown_hat,
+/obj/item/clothing/mask/gas/clown_hat,
+/obj/item/food/honkdae{
+ pixel_x = 10
+ },
+/obj/item/food/honkdae{
+ pixel_x = 10
+ },
+/obj/item/food/donkpocket/warm/honk{
+ pixel_x = -5;
+ pixel_y = 13
+ },
+/obj/item/food/donkpocket/warm/honk{
+ pixel_x = -5;
+ pixel_y = 13
+ },
+/obj/item/clothing/suit/space/hardsuit/clown{
+ pixel_x = -12
+ },
+/obj/item/clothing/mask/gas/clown_hat,
+/obj/item/gun/magic/staff/honk,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"vO" = (
+/obj/item/grown/bananapeel,
+/obj/structure/chair/stool/bar,
+/obj/item/grown/bananapeel,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"vY" = (
+/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"xf" = (
+/obj/item/grown/bananapeel,
+/obj/structure/chair/stool/bar,
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/blob,
+/obj/machinery/light/floor{
+ brightness = 15;
+ bulb_colour = "#FFE4CE";
+ bulb_emergency_brightness_mul = 0.25;
+ bulb_vacuum_brightness = 15;
+ nightshift_brightness = 10;
+ nightshift_light_color = "#E6EBFF"
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"ye" = (
+/obj/item/grown/bananapeel,
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/blob,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"yH" = (
+/mob/living/simple_animal/hostile/retaliate/clown,
+/obj/structure/chair/stool/bar{
+ dir = 1
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"zo" = (
+/obj/item/grown/bananapeel,
+/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"zv" = (
+/obj/item/grown/bananapeel,
+/mob/living/simple_animal/hostile/retaliate/clown,
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "c";
+ color = "#0d2dff";
+ pixel_x = 17;
+ pixel_y = 18
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "o";
+ color = "#0d2dff";
+ pixel_x = 17;
+ pixel_y = 6
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "m";
+ color = "#0d2dff";
+ pixel_x = 17;
+ pixel_y = -4
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "m";
+ color = "#0d2dff";
+ pixel_x = 17;
+ pixel_y = -16
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "a";
+ color = "#0d2dff";
+ pixel_x = 17;
+ pixel_y = -26
+ },
+/obj/item/grown/bananapeel,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"Am" = (
+/mob/living/simple_animal/hostile/retaliate/clown/fleshclown,
+/obj/item/grown/bananapeel,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"Ao" = (
+/mob/living/simple_animal/hostile/retaliate/clown,
+/obj/item/grown/bananapeel,
+/obj/structure/chair/stool/bar,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"AH" = (
+/mob/living/simple_animal/hostile/retaliate/clown/clownhulk,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"AP" = (
+/obj/structure/chair/stool/bar{
+ dir = 4
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"CN" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"DM" = (
+/obj/machinery/light/small,
+/obj/structure/sign/poster/contraband/clown{
+ pixel_y = -32
+ },
+/obj/structure/mecha_wreckage/honker,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"Fq" = (
+/obj/item/grown/bananapeel,
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "n";
+ color = "#0d2dff";
+ pixel_x = 17;
+ pixel_y = -4
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "d";
+ color = "#0d2dff";
+ pixel_x = 17;
+ pixel_y = -17
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"FO" = (
+/mob/living/simple_animal/hostile/retaliate/clown,
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "line";
+ color = "#ff0000"
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "y";
+ color = "#ff0000";
+ pixel_x = 17;
+ pixel_y = 8
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"FW" = (
+/obj/item/grown/bananapeel,
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "line";
+ color = "#0d2dff"
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"Gz" = (
+/obj/item/grown/bananapeel,
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "line";
+ color = "#ff0000"
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"Hj" = (
+/obj/structure/sign/poster/contraband/clown{
+ pixel_y = -32
+ },
+/obj/structure/mecha_wreckage/honker,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"HC" = (
+/obj/structure/statue/bananium/clown,
+/obj/structure/sign/poster/contraband/clown{
+ pixel_y = 32
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"IC" = (
+/mob/living/simple_animal/hostile/retaliate/clown,
+/obj/structure/chair/stool/bar,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"Jp" = (
+/obj/structure/statue/bananium/clown,
+/obj/structure/sign/poster/contraband/clown{
+ pixel_y = -32
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"KA" = (
+/obj/machinery/door/airlock/bananium/glass,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"Mk" = (
+/obj/structure/chair/stool/bar{
+ dir = 1
+ },
+/obj/machinery/light/floor{
+ brightness = 15;
+ bulb_colour = "#FFE4CE";
+ bulb_emergency_brightness_mul = 0.25;
+ bulb_vacuum_brightness = 15;
+ nightshift_brightness = 10;
+ nightshift_light_color = "#E6EBFF"
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"NJ" = (
+/obj/structure/chair/stool/bar,
+/obj/machinery/light/floor{
+ brightness = 15;
+ bulb_colour = "#FFE4CE";
+ bulb_emergency_brightness_mul = 0.25;
+ bulb_vacuum_brightness = 15;
+ nightshift_brightness = 10;
+ nightshift_light_color = "#E6EBFF"
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"Ok" = (
+/obj/structure/statue/bananium/clown,
+/obj/structure/sign/poster/contraband/clown{
+ pixel_y = 32
+ },
+/obj/item/clothing/mask/gas/clown_hat,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"OO" = (
+/mob/living/simple_animal/hostile/retaliate/clown,
+/obj/item/grown/bananapeel,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"Pl" = (
+/obj/structure/chair/stool/bar{
+ dir = 4
+ },
+/obj/item/grown/bananapeel,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"PX" = (
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "line";
+ color = "#ff0000"
+ },
+/mob/living/simple_animal/hostile/retaliate/clown,
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "e";
+ color = "#ff0000";
+ pixel_x = 17;
+ pixel_y = 29
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "c";
+ color = "#ff0000";
+ pixel_x = 17;
+ pixel_y = 16
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "u";
+ color = "#ff0000";
+ pixel_x = 17;
+ pixel_y = 4
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "r";
+ color = "#ff0000";
+ pixel_x = 17;
+ pixel_y = -8
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"Qk" = (
+/turf/closed/wall/mineral/bananium,
+/area/shuttle/escape)
+"Ri" = (
+/obj/item/grown/bananapeel,
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "line";
+ color = "#0d2dff"
+ },
+/mob/living/simple_animal/hostile/retaliate/clown/banana,
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "line";
+ color = "#0d2dff"
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"SS" = (
+/turf/template_noop,
+/area/space)
+"To" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"XB" = (
+/obj/structure/chair/stool/bar{
+ dir = 1
+ },
+/mob/living/simple_animal/hostile/retaliate/clown/longface,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"XS" = (
+/obj/machinery/light/floor{
+ brightness = 15;
+ bulb_colour = "#FFE4CE";
+ bulb_emergency_brightness_mul = 0.25;
+ bulb_vacuum_brightness = 15;
+ nightshift_brightness = 10;
+ nightshift_light_color = "#E6EBFF"
+ },
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+"Yc" = (
+/obj/item/grown/bananapeel,
+/turf/open/floor/mineral/bananium,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+SS
+SS
+To
+To
+To
+To
+To
+To
+To
+SS
+SS
+"}
+(2,1,1) = {"
+SS
+Qk
+CN
+CN
+CN
+CN
+CN
+CN
+CN
+Qk
+SS
+"}
+(3,1,1) = {"
+Qk
+Qk
+HC
+Pl
+Pl
+Pl
+Pl
+Pl
+Jp
+Qk
+Qk
+"}
+(4,1,1) = {"
+Qk
+Ok
+uI
+Yc
+tN
+AH
+tN
+Yc
+uI
+Hj
+Qk
+"}
+(5,1,1) = {"
+KA
+tN
+Gz
+Gz
+nv
+PX
+bB
+FO
+nc
+bQ
+Qk
+"}
+(6,1,1) = {"
+Qk
+aD
+tN
+xf
+Yc
+vO
+Am
+Mk
+tN
+bQ
+Qk
+"}
+(7,1,1) = {"
+KA
+tN
+hZ
+Ao
+Yc
+jb
+Yc
+am
+gF
+bQ
+Qk
+"}
+(8,1,1) = {"
+Qk
+aD
+Yc
+dS
+OO
+dS
+sh
+am
+Yc
+bQ
+Qk
+"}
+(9,1,1) = {"
+Qk
+aD
+gF
+iN
+tN
+NJ
+vY
+am
+Yc
+bQ
+Qk
+"}
+(10,1,1) = {"
+Qk
+aD
+Yc
+kc
+Yc
+qt
+tN
+XB
+ye
+bQ
+Qk
+"}
+(11,1,1) = {"
+Qk
+aD
+tN
+kc
+hZ
+kc
+gF
+am
+tN
+bQ
+Qk
+"}
+(12,1,1) = {"
+Qk
+aD
+gF
+IC
+Yc
+dS
+Yc
+yH
+tN
+bQ
+Qk
+"}
+(13,1,1) = {"
+pH
+tN
+zo
+uo
+zv
+Fq
+aL
+XS
+AH
+bQ
+Qk
+"}
+(14,1,1) = {"
+Qk
+ik
+aq
+Ri
+FW
+aq
+FW
+aq
+aq
+DM
+Qk
+"}
+(15,1,1) = {"
+Qk
+HC
+uI
+AP
+hz
+AP
+hz
+AP
+uI
+Jp
+Qk
+"}
+(16,1,1) = {"
+Qk
+Qk
+HC
+tN
+tN
+ep
+me
+tN
+Jp
+Qk
+Qk
+"}
+(17,1,1) = {"
+SS
+Qk
+cH
+cH
+cH
+cH
+cH
+cH
+cH
+Qk
+SS
+"}
diff --git a/_maps/shuttles/emergency/emergency_theatre.dmm b/_maps/shuttles/emergency/emergency_theatre.dmm
new file mode 100644
index 0000000000000..3f3755ff8d4e6
--- /dev/null
+++ b/_maps/shuttles/emergency/emergency_theatre.dmm
@@ -0,0 +1,989 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"at" = (
+/obj/machinery/door/airlock/gold,
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"bP" = (
+/obj/machinery/light/floor{
+ brightness = 15;
+ bulb_colour = "#FFE4CE";
+ bulb_emergency_brightness_mul = 0.25;
+ bulb_vacuum_brightness = 15;
+ nightshift_brightness = 10;
+ nightshift_light_color = "#E6EBFF"
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"ct" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -26
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"eX" = (
+/obj/item/reagent_containers/glass/bottle/epinephrine{
+ pixel_x = 6
+ },
+/obj/item/reagent_containers/glass/bottle/charcoal{
+ pixel_x = -3
+ },
+/obj/item/reagent_containers/glass/bottle/epinephrine{
+ pixel_x = -3;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/glass/bottle/charcoal{
+ pixel_x = 6;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = 3;
+ pixel_y = -2
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = 4;
+ pixel_y = 1
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = -2;
+ pixel_y = 5
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = 2;
+ pixel_y = 8
+ },
+/obj/structure/table/wood/fancy/cyan,
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"fI" = (
+/turf/template_noop,
+/area/shuttle/escape)
+"ga" = (
+/obj/structure/chair/fancy/corp{
+ dir = 1
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"gh" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Security";
+ req_access_txt = "2"
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"gk" = (
+/obj/structure/closet/crate/internals,
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"hG" = (
+/obj/structure/table/wood/fancy/black,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"jl" = (
+/obj/machinery/vending/autodrobe/all_access,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"kg" = (
+/obj/machinery/recharge_station,
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"kz" = (
+/obj/machinery/vending/clothing,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"lt" = (
+/obj/machinery/door/airlock/gold,
+/obj/docking_port/mobile/emergency,
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"ml" = (
+/obj/structure/table/wood/fancy/red,
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 29
+ },
+/obj/item/storage/fancy/cigarettes/cigars/havana,
+/obj/item/storage/box/matches{
+ pixel_y = 9
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"mK" = (
+/obj/structure/table/wood/fancy/black,
+/obj/item/storage/box/matches{
+ pixel_y = 7
+ },
+/obj/item/storage/box/matches{
+ pixel_y = 11
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"oH" = (
+/obj/structure/shuttle/engine/heater,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"oJ" = (
+/obj/machinery/computer/emergency_shuttle{
+ dir = 8
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"pr" = (
+/obj/structure/bed/roller,
+/obj/machinery/iv_drip,
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"qn" = (
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"rt" = (
+/obj/structure/chair/fancy/corp{
+ dir = 8
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"ru" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 26
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"sV" = (
+/obj/structure/chair/fancy/corp{
+ dir = 8
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"ux" = (
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"vI" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 26
+ },
+/obj/machinery/computer/operating{
+ dir = 8
+ },
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"wn" = (
+/obj/machinery/vending/clothing,
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"ww" = (
+/obj/machinery/stasis{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"xm" = (
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"xR" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/table/optable,
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"yx" = (
+/obj/machinery/computer/crew{
+ dir = 8
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"yE" = (
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"yG" = (
+/obj/structure/statue/sandstone/venus{
+ dir = 1
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"zb" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/escape)
+"AU" = (
+/obj/structure/table/wood/fancy/cyan,
+/obj/item/storage/firstaid/toxin,
+/obj/item/storage/firstaid/o2{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"Bb" = (
+/obj/item/storage/fancy/cigarettes/cigars/havana,
+/obj/structure/table/wood/fancy/royalblue,
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"Ce" = (
+/obj/structure/curtain/bounty,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"CG" = (
+/obj/structure/table/wood/fancy/red,
+/obj/machinery/recharger,
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"CZ" = (
+/obj/structure/table/wood/fancy/red,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/item/storage/lockbox/loyalty{
+ pixel_y = 6;
+ pixel_x = 14
+ },
+/obj/item/storage/box/zipties,
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"DN" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"Eq" = (
+/obj/machinery/computer/med_data,
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"EG" = (
+/obj/structure/table/wood/fancy/black,
+/obj/item/storage/box/matches,
+/obj/item/storage/box/matches{
+ pixel_y = 7
+ },
+/obj/item/storage/box/matches{
+ pixel_y = 11
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"Gh" = (
+/obj/structure/chair/fancy/corp{
+ dir = 1
+ },
+/obj/structure/chair/fancy/corp{
+ dir = 1
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"Hb" = (
+/obj/machinery/door/airlock/gold,
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"Hk" = (
+/obj/machinery/shieldgen,
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"HN" = (
+/obj/structure/table/wood/fancy/cyan,
+/obj/item/storage/firstaid/fire,
+/obj/item/storage/firstaid/regular{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"HP" = (
+/obj/machinery/vending/boozeomat,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"IK" = (
+/obj/item/scalpel{
+ pixel_y = 12
+ },
+/obj/item/circular_saw,
+/obj/item/retractor{
+ pixel_x = 4
+ },
+/obj/item/hemostat{
+ pixel_x = -4
+ },
+/obj/item/clothing/gloves/color/latex,
+/obj/item/clothing/mask/surgical,
+/obj/item/surgicaldrill,
+/obj/item/cautery,
+/obj/structure/table/wood/fancy/cyan,
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"Jn" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"Js" = (
+/obj/structure/table/wood/fancy/black,
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 1
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 8
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 1;
+ pixel_y = 7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 1;
+ pixel_y = 7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 1;
+ pixel_y = 7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 1;
+ pixel_y = 7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 1;
+ pixel_y = 7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 1;
+ pixel_y = 7
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 1
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 1
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 1
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 1
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 8
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 8
+ },
+/obj/item/clothing/mask/cigarette/cigar/cohiba{
+ pixel_x = 8
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"JG" = (
+/obj/machinery/light/floor{
+ brightness = 15;
+ bulb_colour = "#FFE4CE";
+ bulb_emergency_brightness_mul = 0.25;
+ bulb_vacuum_brightness = 15;
+ nightshift_brightness = 10;
+ nightshift_light_color = "#E6EBFF"
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"JO" = (
+/obj/structure/table/wood/fancy/royalblue,
+/obj/item/reagent_containers/food/drinks/drinkingglass{
+ pixel_y = 9;
+ pixel_x = -6
+ },
+/obj/item/reagent_containers/food/drinks/drinkingglass{
+ pixel_y = 9;
+ pixel_x = 6
+ },
+/obj/item/reagent_containers/food/drinks/bottle/champagne{
+ pixel_y = 11
+ },
+/obj/item/reagent_containers/food/drinks/drinkingglass{
+ pixel_y = 4;
+ pixel_x = 6
+ },
+/obj/item/reagent_containers/food/drinks/drinkingglass{
+ pixel_y = 4;
+ pixel_x = -6
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"LQ" = (
+/obj/structure/statue/sandstone/venus,
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"Nn" = (
+/obj/structure/table/wood/fancy/black,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/obj/item/clothing/glasses/monocle,
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"NH" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"OI" = (
+/obj/item/storage/fancy/cigarettes/cigars/havana,
+/obj/structure/table/wood/fancy/royalblue,
+/obj/item/storage/box/matches{
+ pixel_x = -10;
+ pixel_y = 7
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"Pk" = (
+/obj/machinery/door/airlock/medical/glass{
+ name = "Escape Shuttle Infirmary"
+ },
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"PH" = (
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"Rv" = (
+/obj/structure/shuttle/engine/propulsion,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"RK" = (
+/obj/structure/chair/fancy/corp{
+ dir = 4
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"Sk" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 29
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"SP" = (
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"Tx" = (
+/obj/structure/chair/fancy/corp{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"VZ" = (
+/obj/machinery/light/floor{
+ brightness = 15;
+ bulb_colour = "#FFE4CE";
+ bulb_emergency_brightness_mul = 0.25;
+ bulb_vacuum_brightness = 15;
+ nightshift_brightness = 10;
+ nightshift_light_color = "#E6EBFF"
+ },
+/obj/machinery/light/floor{
+ brightness = 15;
+ bulb_colour = "#FFE4CE";
+ bulb_emergency_brightness_mul = 0.25;
+ bulb_vacuum_brightness = 15;
+ nightshift_brightness = 10;
+ nightshift_light_color = "#E6EBFF"
+ },
+/turf/open/floor/carpet/black,
+/area/shuttle/escape)
+"Xc" = (
+/obj/machinery/computer/communications{
+ dir = 8
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+"XP" = (
+/obj/structure/table/wood/fancy/cyan,
+/obj/item/defibrillator/loaded,
+/turf/open/floor/carpet/cyan,
+/area/shuttle/escape)
+"Yv" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/escape)
+"ZW" = (
+/obj/machinery/door/airlock/command/glass{
+ name = "Cockpit";
+ req_access_txt = "19"
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+fI
+DN
+DN
+DN
+DN
+at
+DN
+lt
+xm
+xm
+xm
+xm
+xm
+Hb
+DN
+Hb
+DN
+fI
+fI
+"}
+(2,1,1) = {"
+DN
+DN
+Tx
+Tx
+Tx
+SP
+xm
+qn
+Js
+EG
+Nn
+mK
+Js
+qn
+Jn
+qn
+DN
+DN
+fI
+"}
+(3,1,1) = {"
+DN
+CZ
+SP
+SP
+SP
+SP
+gh
+qn
+bP
+bP
+bP
+bP
+qn
+qn
+qn
+qn
+Hk
+oH
+Rv
+"}
+(4,1,1) = {"
+DN
+ml
+SP
+SP
+SP
+SP
+xm
+qn
+RK
+RK
+RK
+bP
+qn
+qn
+qn
+qn
+gk
+oH
+Rv
+"}
+(5,1,1) = {"
+DN
+CG
+Tx
+Tx
+Tx
+Tx
+xm
+wn
+RK
+RK
+RK
+bP
+qn
+ru
+qn
+qn
+kg
+oH
+Rv
+"}
+(6,1,1) = {"
+DN
+xm
+xm
+xm
+xm
+xm
+DN
+LQ
+RK
+RK
+RK
+bP
+qn
+DN
+xm
+xm
+DN
+zb
+Yv
+"}
+(7,1,1) = {"
+DN
+Ce
+Ce
+Ce
+Ce
+Ce
+Ce
+qn
+bP
+bP
+bP
+bP
+bP
+xm
+eX
+ww
+AU
+oH
+Rv
+"}
+(8,1,1) = {"
+DN
+jl
+JG
+ux
+ux
+JG
+Ce
+bP
+ga
+Gh
+Gh
+Gh
+qn
+xm
+PH
+PH
+HN
+oH
+Rv
+"}
+(9,1,1) = {"
+DN
+kz
+ux
+ux
+ux
+ux
+Ce
+bP
+ga
+Gh
+Gh
+Gh
+qn
+Pk
+PH
+PH
+pr
+oH
+Rv
+"}
+(10,1,1) = {"
+DN
+ux
+ux
+ux
+ux
+ux
+Ce
+bP
+ga
+Gh
+Gh
+Gh
+qn
+xm
+Eq
+PH
+pr
+zb
+Yv
+"}
+(11,1,1) = {"
+DN
+kz
+ux
+ux
+ux
+ux
+Ce
+bP
+ga
+Gh
+Gh
+Gh
+qn
+Pk
+PH
+PH
+pr
+oH
+Rv
+"}
+(12,1,1) = {"
+DN
+jl
+JG
+ux
+ux
+JG
+Ce
+bP
+ga
+Gh
+Gh
+Gh
+qn
+xm
+XP
+PH
+PH
+oH
+Rv
+"}
+(13,1,1) = {"
+DN
+Ce
+Ce
+Ce
+Ce
+Ce
+Ce
+qn
+bP
+bP
+bP
+bP
+bP
+xm
+IK
+xR
+vI
+oH
+Rv
+"}
+(14,1,1) = {"
+DN
+xm
+xm
+xm
+xm
+xm
+DN
+yG
+sV
+sV
+sV
+bP
+qn
+DN
+xm
+xm
+DN
+zb
+Yv
+"}
+(15,1,1) = {"
+DN
+rt
+rt
+rt
+rt
+rt
+xm
+wn
+sV
+sV
+sV
+bP
+qn
+ct
+qn
+qn
+kg
+oH
+Rv
+"}
+(16,1,1) = {"
+DN
+OI
+rt
+rt
+rt
+Bb
+xm
+qn
+sV
+sV
+sV
+bP
+qn
+qn
+qn
+qn
+gk
+oH
+Rv
+"}
+(17,1,1) = {"
+DN
+Sk
+yE
+yE
+yE
+yE
+ZW
+qn
+bP
+bP
+bP
+VZ
+qn
+qn
+qn
+qn
+Hk
+oH
+Rv
+"}
+(18,1,1) = {"
+DN
+HP
+oJ
+Xc
+yx
+JO
+xm
+qn
+Js
+mK
+hG
+mK
+Js
+qn
+NH
+qn
+DN
+DN
+fI
+"}
+(19,1,1) = {"
+fI
+DN
+DN
+DN
+DN
+DN
+DN
+DN
+xm
+xm
+xm
+xm
+xm
+xm
+DN
+xm
+DN
+fI
+fI
+"}
diff --git a/beestation.dme b/beestation.dme
index 8948f9d982e06..7c54948f9d506 100644
--- a/beestation.dme
+++ b/beestation.dme
@@ -297,6 +297,7 @@
#include "code\__HELPERS\sorts\MergeSort.dm"
#include "code\__HELPERS\sorts\TimSort.dm"
#include "code\_globalvars\bitfields.dm"
+#include "code\_globalvars\colorvars.dm"
#include "code\_globalvars\configuration.dm"
#include "code\_globalvars\game_modes.dm"
#include "code\_globalvars\genetics.dm"
@@ -634,6 +635,7 @@
#include "code\datums\components\force_move.dm"
#include "code\datums\components\forensics.dm"
#include "code\datums\components\gps.dm"
+#include "code\datums\components\grillable.dm"
#include "code\datums\components\gravity_aura.dm"
#include "code\datums\components\haircolor_clothes.dm"
#include "code\datums\components\heirloom.dm"
@@ -880,6 +882,7 @@
#include "code\datums\martial\wrestling.dm"
#include "code\datums\materials\_material.dm"
#include "code\datums\materials\basemats.dm"
+#include "code\datums\materials\meat.dm"
#include "code\datums\mocking\client.dm"
#include "code\datums\mood_events\drink_events.dm"
#include "code\datums\mood_events\drug_events.dm"
@@ -1093,6 +1096,7 @@
#include "code\game\machinery\recycler.dm"
#include "code\game\machinery\requests_console.dm"
#include "code\game\machinery\scan_gate.dm"
+#include "code\game\machinery\sheetifier.dm"
#include "code\game\machinery\shieldgen.dm"
#include "code\game\machinery\sleeper.dm"
#include "code\game\machinery\slotmachine.dm"
@@ -1674,6 +1678,7 @@
#include "code\game\turfs\closed\_closed.dm"
#include "code\game\turfs\closed\minerals.dm"
#include "code\game\turfs\closed\walls.dm"
+#include "code\game\turfs\closed\wall\material_walls.dm"
#include "code\game\turfs\closed\wall\mineral_walls.dm"
#include "code\game\turfs\closed\wall\misc_walls.dm"
#include "code\game\turfs\closed\wall\reinf_walls.dm"
@@ -1734,6 +1739,7 @@
#include "code\modules\admin\sql_ban_system.dm"
#include "code\modules\admin\sql_message_system.dm"
#include "code\modules\admin\stickyban.dm"
+#include "code\modules\admin\tag.dm"
#include "code\modules\admin\team_panel.dm"
#include "code\modules\admin\topic.dm"
#include "code\modules\admin\whitelist.dm"
@@ -1814,6 +1820,7 @@
#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm"
#include "code\modules\admin\view_variables\admin_delete.dm"
+#include "code\modules\admin\view_variables\color_matrix_editor.dm"
#include "code\modules\admin\view_variables\debug_variables.dm"
#include "code\modules\admin\view_variables\filterrific.dm"
#include "code\modules\admin\view_variables\get_variables.dm"
@@ -1821,6 +1828,7 @@
#include "code\modules\admin\view_variables\mass_edit_variables.dm"
#include "code\modules\admin\view_variables\modify_variables.dm"
#include "code\modules\admin\view_variables\reference_tracking.dm"
+#include "code\modules\admin\view_variables\tag_datum.dm"
#include "code\modules\admin\view_variables\topic.dm"
#include "code\modules\admin\view_variables\topic_basic.dm"
#include "code\modules\admin\view_variables\topic_list.dm"
@@ -2445,6 +2453,7 @@
#include "code\modules\clothing\shoes\magboots.dm"
#include "code\modules\clothing\shoes\miscellaneous.dm"
#include "code\modules\clothing\shoes\taeclowndo.dm"
+#include "code\modules\clothing\shoes\wheelys.dm"
#include "code\modules\clothing\spacesuits\_spacesuits.dm"
#include "code\modules\clothing\spacesuits\chronosuit.dm"
#include "code\modules\clothing\spacesuits\hardsuit.dm"
@@ -2618,6 +2627,7 @@
#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\griddle.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\grill.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm"
diff --git a/code/__DEFINES/_helpers.dm b/code/__DEFINES/_helpers.dm
index 22ca001ae4e61..5fc95acb1af11 100644
--- a/code/__DEFINES/_helpers.dm
+++ b/code/__DEFINES/_helpers.dm
@@ -7,3 +7,8 @@
//Returns an integer given a hex input, supports negative values "-ff"
//skips preceding invalid characters
#define hex2num(X) text2num(X, 16)
+
+// Refs contain a type id within their string that can be used to identify byond types.
+// Custom types that we define don't get a unique id, but this is useful for identifying
+// types that don't normally have a way to run istype() on them.
+#define TYPEID(thing) copytext(REF(thing), 4, 6)
diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_food.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_food.dm
index 534f5a6629662..8e134d4828e8f 100644
--- a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_food.dm
+++ b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_food.dm
@@ -27,6 +27,20 @@
///called on item when created through microwaving (): (obj/machinery/microwave/M, cooking_efficiency)
#define COMSIG_ITEM_MICROWAVE_COOKED "microwave_cooked"
+// Grilling foods (griddle, grill, and bonfire)
+///Called when an object is placed onto a griddle
+#define COMSIG_ITEM_GRILL_PLACED "item_placed_on_griddle"
+///Called when an object is grilled ontop of a griddle
+#define COMSIG_ITEM_GRILL_PROCESS "item_griddled"
+ /// Return to not burn the item
+ #define COMPONENT_HANDLED_GRILLING (1<<0)
+///Called when an object is turned into another item through grilling ontop of a griddle
+#define COMSIG_ITEM_GRILLED "item_grill_completed"
+
+#define COMSIG_GRILL_COMPLETED "grill_completed"
+///Called when an object is meant to be grilled through a grill: (atom/fry_object, grill_time)
+#define COMSIG_GRILL_FOOD "item_grill_food"
+
///From /datum/component/edible/on_compost(source, /mob/living/user)
#define COMSIG_EDIBLE_ON_COMPOST "on_compost"
// Used to stop food from being composted.
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 11b5ae5dc21f4..20dca4ef23366 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -26,19 +26,34 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define DF_VAR_EDITED (1<<1)
#define DF_ISPROCESSING (1<<2)
-//! ## FLAGS BITMASK
-#define CONDUCT_1 (1<<5) //! conducts electricity (iron etc.)
-#define NODECONSTRUCT_1 (1<<7) //! For machines and structures that should not break into parts, eg, holodeck stuff
-#define OVERLAY_QUEUED_1 (1<<8) //! atom queued to SSoverlay
-#define ON_BORDER_1 (1<<9) //! item has priority to check when entering or leaving
-#define PREVENT_CLICK_UNDER_1 (1<<11) //! Prevent clicking things below it on the same turf eg. doors/ fulltile windows
-#define HOLOGRAM_1 (1<<12)
-#define TESLA_IGNORE_1 (1<<13) //! TESLA_IGNORE grants immunity from being targeted by tesla-style electricity
-#define INITIALIZED_1 (1<<14) //! Whether /atom/Initialize(mapload) has already run for the object
-#define ADMIN_SPAWNED_1 (1<<15) //! was this spawned by an admin? used for stat tracking stuff.
-#define PREVENT_CONTENTS_EXPLOSION_1 (1<<16)
-#define UNPAINTABLE_1 (1<<17)
-#define HTML_USE_INITAL_ICON_1 (1<<18) //! Should we use the initial icon for display? Mostly used by overlay only objects
+//FLAGS BITMASK
+
+/// conducts electricity (iron etc.)
+#define CONDUCT_1 (1<<1)
+/// For machines and structures that should not break into parts, eg, holodeck stuff
+#define NODECONSTRUCT_1 (1<<2)
+/// atom queued to SSoverlay
+#define OVERLAY_QUEUED_1 (1<<3)
+/// item has priority to check when entering or leaving
+#define ON_BORDER_1 (1<<4)
+/// Prevent clicking things below it on the same turf eg. doors/ fulltile windows
+#define PREVENT_CLICK_UNDER_1 (1<<5)
+///specifies that this atom is a hologram that isnt real
+#define HOLOGRAM_1 (1<<6)
+/// grants immunity from being targeted by tesla-style electricity
+#define TESLA_IGNORE_1 (1<<7)
+///Whether /atom/Initialize() has already run for the object
+#define INITIALIZED_1 (1<<8)
+/// was this spawned by an admin? used for stat tracking stuff.
+#define ADMIN_SPAWNED_1 (1<<9)
+/// should not get harmed if this gets caught by an explosion?
+#define PREVENT_CONTENTS_EXPLOSION_1 (1<<10)
+/// Should this object be unpaintable?
+#define UNPAINTABLE_1 (1<<11)
+/// Is this atom on top of another atom, and as such has click priority?
+#define IS_ONTOP_1 (1<<12)
+/// Should we use the initial icon for display? Mostly used by overlay only objects
+#define HTML_USE_INITAL_ICON_1 (1<<13)
// Update flags for [/atom/proc/update_appearance]
/// Update the atom's name
@@ -57,9 +72,9 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define UPDATE_ICON (UPDATE_ICON_STATE|UPDATE_OVERLAYS)
/// If the thing can reflect light (lasers/energy)
-#define RICOCHET_SHINY (1<<0)
+#define RICOCHET_SHINY (1<<0)
/// If the thing can reflect matter (bullets/bomb shrapnel)
-#define RICOCHET_HARD (1<<1)
+#define RICOCHET_HARD (1<<1)
//turf-only flags
#define NOJAUNT_1 (1<<0)
@@ -169,6 +184,21 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define AA_TARGET_SEE_APPEARANCE (1<<0)
#define AA_MATCH_TARGET_OVERLAYS (1<<1)
+#define KEEP_TOGETHER_ORIGINAL "keep_together_original"
+
+//setter for KEEP_TOGETHER to allow for multiple sources to set and unset it
+#define ADD_KEEP_TOGETHER(x, source)\
+ if ((x.appearance_flags & KEEP_TOGETHER) && !HAS_TRAIT(x, TRAIT_KEEP_TOGETHER)) ADD_TRAIT(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL); \
+ ADD_TRAIT(x, TRAIT_KEEP_TOGETHER, source);\
+ x.appearance_flags |= KEEP_TOGETHER
+
+#define REMOVE_KEEP_TOGETHER(x, source)\
+ REMOVE_TRAIT(x, TRAIT_KEEP_TOGETHER, source);\
+ if(HAS_TRAIT_FROM_ONLY(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL))\
+ REMOVE_TRAIT(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL);\
+ else if(!HAS_TRAIT(x, TRAIT_KEEP_TOGETHER))\
+ x.appearance_flags &= ~KEEP_TOGETHER
+
//dir macros
///Returns true if the dir is diagonal, false otherwise
#define ISDIAGONALDIR(d) (d&(d-1))
diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm
index b1af0b7cd6f56..fbf418ae4b46b 100644
--- a/code/__DEFINES/footsteps.dm
+++ b/code/__DEFINES/footsteps.dm
@@ -6,6 +6,7 @@
#define FOOTSTEP_GRASS "grass"
#define FOOTSTEP_WATER "water"
#define FOOTSTEP_LAVA "lava"
+#define FOOTSTEP_MEAT "meat"
//barefoot sounds
#define FOOTSTEP_WOOD_BAREFOOT "woodbarefoot"
#define FOOTSTEP_WOOD_CLAW "woodclaw"
@@ -71,6 +72,8 @@ GLOBAL_LIST_INIT(footstep, list(
'sound/effects/footstep/lava1.ogg',
'sound/effects/footstep/lava2.ogg',
'sound/effects/footstep/lava3.ogg'), 100, 0),
+ FOOTSTEP_MEAT = list(list(
+ 'sound/effects/meatslap.ogg'), 100, 0)
))
//bare footsteps lists
GLOBAL_LIST_INIT(barefootstep, list(
@@ -112,6 +115,8 @@ GLOBAL_LIST_INIT(barefootstep, list(
'sound/effects/footstep/lava1.ogg',
'sound/effects/footstep/lava2.ogg',
'sound/effects/footstep/lava3.ogg'), 100, 0),
+ FOOTSTEP_MEAT = list(list(
+ 'sound/effects/meatslap.ogg'), 100, 0),
))
//claw footsteps lists
@@ -154,6 +159,8 @@ GLOBAL_LIST_INIT(clawfootstep, list(
'sound/effects/footstep/lava1.ogg',
'sound/effects/footstep/lava2.ogg',
'sound/effects/footstep/lava3.ogg'), 100, 0),
+ FOOTSTEP_MEAT = list(list(
+ 'sound/effects/meatslap.ogg'), 100, 0),
))
//heavy footsteps list
@@ -170,5 +177,7 @@ GLOBAL_LIST_INIT(heavyfootstep, list(
'sound/effects/footstep/lava1.ogg',
'sound/effects/footstep/lava2.ogg',
'sound/effects/footstep/lava3.ogg'), 100, 0),
+ FOOTSTEP_MEAT = list(list(
+ 'sound/effects/meatslap.ogg'), 100, 0),
))
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index a5707b237f125..01593bf7699fb 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -11,6 +11,15 @@
#define isweakref(D) (istype(D, /datum/weakref))
+#define isimage(thing) (istype(thing, /image))
+
+GLOBAL_VAR_INIT(magic_appearance_detecting_image, new /image) // appearances are awful to detect safely, but this seems to be the best way ~ninjanomnom
+#define isappearance(thing) (!ispath(thing) && istype(GLOB.magic_appearance_detecting_image, thing))
+
+// The filters list has the same ref type id as a filter, but isnt one and also isnt a list, so we have to check if the thing has Cut() instead
+GLOBAL_VAR_INIT(refid_filter, TYPEID(filter(type="angular_blur")))
+#define isfilter(thing) (!hascall(thing, "Cut") && TYPEID(thing) == GLOB.refid_filter)
+
// simple check whether or not a player is a guest using their key
#define IS_GUEST_KEY(key) (findtextEx(key, "Guest-", 1, 7))
diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm
index 1d7fb760ea26c..7fad19e2aa6d3 100644
--- a/code/__DEFINES/keybinding.dm
+++ b/code/__DEFINES/keybinding.dm
@@ -11,6 +11,7 @@
#define COMSIG_KB_ADMIN_AGHOST_DOWN "keybinding_admin_aghost_down"
#define COMSIG_KB_ADMIN_PLAYERPANEL_DOWN "keybinding_admin_playerpanelnew_down"
#define COMSIG_KB_ADMIN_INVISIMINTOGGLE_DOWN "keybinding_admin_invisimintoggle_down"
+#define COMSIG_KB_ADMIN_VIEWTAGS_DOWN "keybinding_admin_viewtags_down"
//Carbon
#define COMSIG_KB_CARBON_TOGGLETHROWMODE_DOWN "keybinding_carbon_togglethrowmode_down"
diff --git a/code/__DEFINES/materials.dm b/code/__DEFINES/materials.dm
index 99d4dba01d6d0..2eac9aa92787f 100644
--- a/code/__DEFINES/materials.dm
+++ b/code/__DEFINES/materials.dm
@@ -18,6 +18,8 @@
/// Applies the material greyscale color to the atom's greyscale color.
#define MATERIAL_GREYSCALE (1<<4)
+#define MATERIAL_SOURCE(mat) "[mat.name]_material"
+
/// Create standardized stack sizes.
#define STACKSIZE_MACRO(Path)\
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 6135c11a12cd4..51d9cc95802f2 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -90,6 +90,9 @@
#define DIGITIGRADE_OPTIONAL 1
#define DIGITIGRADE_FORCED 2
+// Health/damage defines
+#define MAX_LIVING_HEALTH 100
+
//Reagent Metabolization flags, defines the type of reagents that affect this mob
#define PROCESS_ORGANIC 1 //Only processes reagents with "ORGANIC" or "ORGANIC | SYNTHETIC"
#define PROCESS_SYNTHETIC 2 //Only processes reagents with "SYNTHETIC" or "ORGANIC | SYNTHETIC"
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index d3e8ea0f2a104..b0fe2d1f7c879 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -270,6 +270,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_METALANGUAGE_KEY_ALLOWED "metalanguage_key_allowed" // you can use language key for metalanguage (,`) and but also you see lang icon
#define TRAIT_HYPERSPACED "hyperspaced" // Sanity trait to keep track of when we're in hyperspace and add the appropriate element if we werent
#define TRAIT_FREE_HYPERSPACE_MOVEMENT "free_hyperspace_movement" // Gives the movable free hyperspace movement without being pulled during shuttle transit
+#define TRAIT_FAST_CUFF_REMOVAL "fast_cuff_removal" // Faster cuff removal
// You can stare into the abyss, but it does not stare back.
// You're immune to the hallucination effect of the supermatter, either
@@ -277,7 +278,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_MADNESS_IMMUNE "supermatter_madness_immune"
//non-mob traits
-#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
+//Used for limb-based paralysis, where replacing the limb will fix it
+#define TRAIT_PARALYSIS "paralysis"
+
+///Used for managing KEEP_TOGETHER in [appearance_flags]
+#define TRAIT_KEEP_TOGETHER "keep-together"
#define TRAIT_HEARING_SENSITIVE "hearing_sensitive"
diff --git a/code/__DEFINES/typeids.dm b/code/__DEFINES/typeids.dm
index d659d564152f4..16a71266becf0 100644
--- a/code/__DEFINES/typeids.dm
+++ b/code/__DEFINES/typeids.dm
@@ -3,6 +3,6 @@
#define TYPEID_NORMAL_LIST "f"
//helper macros
#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, -7) ) )
-#define IS_NORMAL_LIST(L) (GET_TYPEID(FAST_REF(L)) == TYPEID_NORMAL_LIST)
-
-
+// Only allowed raw ref, since this is for lists explicitly and they will get no use from it
+// Also it tends to be used in a hot context so let's be nice yes?
+#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)
diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm
index 97e924dea766d..dab3fe081b034 100644
--- a/code/__DEFINES/vv.dm
+++ b/code/__DEFINES/vv.dm
@@ -2,6 +2,8 @@
#define VV_TEXT "Text"
#define VV_MESSAGE "Mutiline Text"
#define VV_ICON "Icon"
+#define VV_COLOR "Color"
+#define VV_COLOR_MATRIX "Color Matrix"
#define VV_ATOM_REFERENCE "Atom Reference"
#define VV_DATUM_REFERENCE "Datum Reference"
#define VV_MOB_REFERENCE "Mob Reference"
@@ -16,13 +18,17 @@
#define VV_NEW_TYPE "New Custom Typepath"
#define VV_NEW_LIST "New List"
#define VV_NULL "NULL"
+#define VV_INFINITY "Infinity"
#define VV_RESTORE_DEFAULT "Restore to Default"
#define VV_MARKED_DATUM "Marked Datum"
+#define VV_TAGGED_DATUM "Tagged Datum"
#define VV_BITFIELD "Bitfield"
#define VV_TEXT_LOCATE "Custom Reference Locate"
#define VV_PROCCALL_RETVAL "Return Value of Proccall"
+#define VV_WEAKREF "Weak Reference Datum"
#define VV_MSG_MARKED "Marked Object "
+#define VV_MSG_TAGGED(num) "Tagged Datum #[num] "
#define VV_MSG_EDITED "Var Edited "
#define VV_MSG_DELETED "Deleted "
@@ -73,11 +79,13 @@
#define VV_HK_EXPOSE "expose"
#define VV_HK_CALLPROC "proc_call"
#define VV_HK_MARK "mark"
+#define VV_HK_TAG "tag"
#define VV_HK_ADDCOMPONENT "addcomponent"
#define VV_HK_MODIFY_TRAITS "modtraits"
// /datum/weakref
-#define VV_HK_TRACK_REF "track_ref"
+#define VV_HK_WEAKREF_RESOLVE "weakref_resolve"
+
// /atom
#define VV_HK_MODIFY_TRANSFORM "atom_transform"
@@ -88,6 +96,7 @@
#define VV_HK_AUTO_RENAME "auto_rename"
#define VV_HK_RADIATE "radiate"
#define VV_HK_EDIT_FILTERS "edit_filters"
+#define VV_HK_EDIT_COLOR_MATRIX "edit_color_matrix"
#define VV_HK_EDIT_PARTICLES "edit_particles"
#define VV_HK_ADD_EMITTER "add_emitter"
#define VV_HK_REMOVE_EMITTER "remove_emitter"
@@ -163,3 +172,8 @@
// paintings
#define VV_HK_REMOVE_PAINTING "remove_painting"
+
+// Flags for debug_variable() that do little things to what we end up rendering
+
+/// ALWAYS render a reduced list, useful for fuckoff big datums that need to be condensed for the sake of client load
+#define VV_ALWAYS_CONTRACT_LIST (1<<0)
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index 5cc9b0bee2bd3..8118796298447 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -13,6 +13,14 @@
* Misc
*/
+// Generic listoflist safe add and removal macros:
+///If value is a list, wrap it in a list so it can be used with list add/remove operations
+#define LIST_VALUE_WRAP_LISTS(value) (islist(value) ? list(value) : value)
+///Add an untyped item to a list, taking care to handle list items by wrapping them in a list to remove the footgun
+#define UNTYPED_LIST_ADD(list, item) (list += LIST_VALUE_WRAP_LISTS(item))
+///Remove an untyped item to a list, taking care to handle list items by wrapping them in a list to remove the footgun
+#define UNTYPED_LIST_REMOVE(list, item) (list -= LIST_VALUE_WRAP_LISTS(item))
+
///Initialize the lazylist
#define LAZYINITLIST(L) if (!L) { L = list(); }
///If the provided list is empty, set it to null
@@ -282,7 +290,7 @@
if(skiprep)
for(var/e in first)
if(!(e in result) && !(e in second))
- result += e
+ UNTYPED_LIST_ADD(result, e)
else
result = first - second
return result
@@ -360,7 +368,7 @@
if(!value)
continue
for(var/i in 1 to value / gcf)
- output += item
+ UNTYPED_LIST_ADD(output, item)
return output
/// Takes a list of numbers as input, returns the highest value that is cleanly divides them all
@@ -446,7 +454,7 @@
/proc/unique_list(list/inserted_list)
. = list()
for(var/i in inserted_list)
- . |= i
+ . |= LIST_VALUE_WRAP_LISTS(i)
// Return a list with no duplicate entries inplace
/proc/unique_list_in_place(list/inserted_list)
@@ -628,12 +636,6 @@
if(checked_datum.vars[varname] == value)
return checked_datum
-/// remove all nulls from a list
-/proc/remove_nulls_from_list(list/inserted_list)
- while(inserted_list.Remove(null))
- continue
- return inserted_list
-
///Copies a list, and all lists inside it recusively
///Does not copy any other reference type
/proc/deep_copy_list(list/inserted_list)
@@ -690,7 +692,7 @@
return null
. = list()
for(var/key in key_list)
- . |= key_list[key]
+ . |= LIST_VALUE_WRAP_LISTS(key_list[key])
/proc/make_associative(list/flat_list)
. = list()
@@ -733,7 +735,7 @@
/proc/assoc_to_keys(list/input)
var/list/keys = list()
for(var/key in input)
- keys += key
+ UNTYPED_LIST_ADD(keys, key)
return keys
/// Checks if a value is contained in an associative list's values
@@ -780,7 +782,7 @@
. = list()
for(var/i in L)
if(condition.Invoke(i))
- . |= i
+ . |= LIST_VALUE_WRAP_LISTS(i)
/// Runtimes if the passed in list is not sorted
/proc/assert_sorted(list/list, name, cmp = /proc/cmp_numeric_asc)
diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm
index 2d831ea4bb956..53acf40b9a4de 100644
--- a/code/__HELPERS/sanitize_values.dm
+++ b/code/__HELPERS/sanitize_values.dm
@@ -94,3 +94,7 @@
return crunch + . + ((desired_format == 4) ? "f" : "ff")
else //not a supported hex color format.
return default ? default : crunch + repeat_string(desired_format, "0")
+
+/// Makes sure the input color is text with a # at the start followed by 6 hexadecimal characters. Examples: "#ff1234", "#A38321", COLOR_GREEN_GRAY
+/proc/sanitize_ooccolor(color)
+ return findtext(color, GLOB.is_color) ? color : GLOB.normal_ooc_colour
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index f83a5104731ac..ce2ce6a863aad 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -170,9 +170,9 @@ DEFINE_BITFIELD(resistance_flags, list(
DEFINE_BITFIELD(flags_1, list(
"NOJAUNT_1" = NOJAUNT_1,
"UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1,
+ "NO_LAVA_GEN_1" = NO_LAVA_GEN_1,
"CAN_BE_DIRTY_1" = CAN_BE_DIRTY_1,
"CONDUCT_1" = CONDUCT_1,
- "NO_LAVA_GEN_1" = NO_LAVA_GEN_1,
"NODECONSTRUCT_1" = NODECONSTRUCT_1,
"OVERLAY_QUEUED_1" = OVERLAY_QUEUED_1,
"ON_BORDER_1" = ON_BORDER_1,
diff --git a/code/_globalvars/colorvars.dm b/code/_globalvars/colorvars.dm
new file mode 100644
index 0000000000000..c49a3d90dfc0e
--- /dev/null
+++ b/code/_globalvars/colorvars.dm
@@ -0,0 +1 @@
+GLOBAL_LIST_INIT(color_vars, list("color"))
diff --git a/code/_globalvars/lists/admin.dm b/code/_globalvars/lists/admin.dm
index 4d46c5358641d..aa7075fd54dda 100644
--- a/code/_globalvars/lists/admin.dm
+++ b/code/_globalvars/lists/admin.dm
@@ -8,3 +8,19 @@
GLOBAL_LIST_INIT_TYPED(smite_list, /datum/smite, init_smites())
GLOBAL_VAR_INIT(admin_notice, "") // Admin notice that all clients see when joining the server
+
+// A list of all the special byond lists that need to be handled different by vv
+GLOBAL_LIST_INIT(vv_special_lists, init_special_list_names())
+
+/proc/init_special_list_names()
+ var/list/output = list()
+ var/obj/sacrifice = new
+ for(var/varname in sacrifice.vars)
+ var/value = sacrifice.vars[varname]
+ if(!islist(value))
+ if(!isdatum(value) && hascall(value, "Cut"))
+ output += varname
+ continue
+ if(isnull(locate(REF(value))))
+ output += varname
+ return output
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 9c1d53535056c..37ea04ee9d918 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -89,7 +89,10 @@
ShiftClickOn(A)
return
if(LAZYACCESS(modifiers, MIDDLE_CLICK))
- MiddleClickOn(A)
+ if(LAZYACCESS(modifiers, CTRL_CLICK))
+ CtrlMiddleClickOn(A)
+ return
+ MiddleClickOn(A, params)
return
if(LAZYACCESS(modifiers, ALT_CLICK)) // alt and alt-gr (rightalt)
AltClickOn(A)
@@ -192,7 +195,7 @@
for(var/atom/target in checking) // will filter out nulls
if(closed[target] || isarea(target)) // avoid infinity situations
continue
- if(isturf(target) || isturf(target.loc) || (target in direct_access)) //Directly accessible atoms
+ if(isturf(target) || isturf(target.loc) || (target in direct_access) || (isobj(target) && target.flags_1 & IS_ONTOP_1)) //Directly accessible atoms
if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks
return TRUE
@@ -331,6 +334,15 @@
H.changeNext_move(CLICK_CD_MELEE)
else
..()
+
+/mob/proc/CtrlMiddleClickOn(atom/A)
+ // specifically made for admin feature.
+ if(check_rights_for(client, R_ADMIN))
+ client.toggle_tag_datum(A)
+ return
+ A.CtrlClick(src) // this assumes you did CtrlClick instead of MiddleClick
+ return
+
/*
Alt click
Unused except for AI
diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm
index d36861f6bdcf2..aade401925f88 100644
--- a/code/controllers/globals.dm
+++ b/code/controllers/globals.dm
@@ -43,6 +43,12 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars)
return FALSE
return ..()
+/datum/controller/global_vars/vv_get_var(var_name)
+ switch(var_name)
+ if (NAMEOF(src, vars))
+ return debug_variable(var_name, list(), 0, src)
+ return debug_variable(var_name, vars[var_name], 0, src, display_flags = VV_ALWAYS_CONTRACT_LIST)
+
/datum/controller/global_vars/can_vv_get(var_name)
if(var_name == "gvars_datum_protected_varlist" || var_name == "gvars_datum_in_built_vars")
return FALSE
diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm
index 92348374d0b5b..91a160f0eb3e1 100644
--- a/code/controllers/subsystem/idlenpcpool.dm
+++ b/code/controllers/subsystem/idlenpcpool.dm
@@ -35,7 +35,7 @@ SUBSYSTEM_DEF(idlenpcpool)
if(!SA)
stack_trace("Null entry found at GLOB.simple_animals\[AI_IDLE\]. Null entries will be purged. Yell at coderbus. Subsystem will try to continue.")
- remove_nulls_from_list(GLOB.simple_animals[AI_IDLE])
+ list_clear_nulls(GLOB.simple_animals[AI_IDLE])
continue
if(!SA.ckey)
diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm
index 2f4c6488ee639..fff7000689273 100644
--- a/code/controllers/subsystem/materials.dm
+++ b/code/controllers/subsystem/materials.dm
@@ -12,23 +12,28 @@ SUBSYSTEM_DEF(materials)
var/list/materials
///Dictionary of category || list of material refs
var/list/materials_by_category
+ ///Dictionary of category || list of material types, mostly used by rnd machines like autolathes.
+ var/list/materialtypes_by_category
///A cache of all material combinations that have been used
var/list/list/material_combos
///List of stackcrafting recipes for materials using rigid materials
var/list/rigid_stack_recipes = list(
new /datum/stack_recipe("chair", /obj/structure/chair/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
+ new /datum/stack_recipe("Floor tile", /obj/item/stack/tile/material, 1, 4, 20, applies_mats = TRUE),
)
///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info)
/datum/controller/subsystem/materials/proc/InitializeMaterials()
materials = list()
materials_by_category = list()
+ materialtypes_by_category = list()
material_combos = list()
for(var/type in subtypesof(/datum/material))
var/datum/material/ref = new type
materials[type] = ref
for(var/c in ref.categories)
materials_by_category[c] += list(ref)
+ materialtypes_by_category[c] += list(type)
// Adds the dupe recipes into multiple material recipes
var/list/global_mat_recipes = ref.get_material_recipes()
diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm
index 8e9d7153b1b5f..77af2706946b9 100644
--- a/code/controllers/subsystem/npcpool.dm
+++ b/code/controllers/subsystem/npcpool.dm
@@ -25,7 +25,7 @@ SUBSYSTEM_DEF(npcpool)
if(!SA)
stack_trace("Null entry found at GLOB.simple_animals\[AI_ON\]. Null entries will be purged. Yell at coderbus. Subsystem will try to continue.")
- remove_nulls_from_list(GLOB.simple_animals[AI_ON])
+ list_clear_nulls(GLOB.simple_animals[AI_ON])
continue
if(!SA.ckey && !SA.notransform)
diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm
index 8901bfdba4343..ced03d367abaa 100644
--- a/code/datums/components/butchering.dm
+++ b/code/datums/components/butchering.dm
@@ -1,9 +1,15 @@
/datum/component/butchering
- var/speed = 80 //time in deciseconds taken to butcher something
- var/effectiveness = 100 //percentage effectiveness; numbers above 100 yield extra drops
- var/bonus_modifier = 0 //percentage increase to bonus item chance
- var/butcher_sound = 'sound/weapons/slice.ogg' //sound played when butchering
+ /// Time in deciseconds taken to butcher something
+ var/speed = 8 SECONDS
+ /// Percentage effectiveness; numbers above 100 yield extra drops
+ var/effectiveness = 100
+ /// Percentage increase to bonus item chance
+ var/bonus_modifier = 0
+ /// Sound played when butchering
+ var/butcher_sound = 'sound/weapons/slice.ogg'
+ /// Whether or not this component can be used to butcher currently. Used to temporarily disable butchering
var/butchering_enabled = TRUE
+ /// Whether or not this component is compatible with blunt tools.
var/can_be_blunt = FALSE
/datum/component/butchering/Initialize(_speed, _effectiveness, _bonus_modifier, _butcher_sound, disabled, _can_be_blunt)
diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm
index 3d9d7fed20181..c26b81bc41eb3 100644
--- a/code/datums/components/crafting/guncrafting.dm
+++ b/code/datums/components/crafting/guncrafting.dm
@@ -11,6 +11,7 @@
/obj/item/weaponcrafting/stock
name = "rifle stock"
desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood."
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 6)
icon = 'icons/obj/improvised.dmi'
icon_state = "riflestock"
diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm
index 1526db2b6e68a..1d5e69085fa81 100644
--- a/code/datums/components/explodable.dm
+++ b/code/datums/components/explodable.dm
@@ -10,8 +10,8 @@
var/delete_after
/// For items, lets us determine where things should be hit.
var/equipped_slot
- /// Whether this component is currently in the process of exploding.
- var/tmp/exploding = FALSE
+ /// it won't explode again if cooldown is on. This is necessary because explosion() proc through SSexplosion doesn't tell if it's exploded
+ COOLDOWN_DECLARE(explosion_cooling)
/datum/component/explodable/Initialize(devastation_range, heavy_impact_range, light_impact_range, flash_range, uncapped = FALSE, delete_after = EXPLODABLE_DELETE_PARENT)
if(!isatom(parent))
@@ -125,12 +125,11 @@
/// Expldoe and remove the object
/datum/component/explodable/proc/detonate()
SIGNAL_HANDLER
- if (exploding)
+ if(!COOLDOWN_FINISHED(src, explosion_cooling))
return // If we don't do this and this doesn't delete it can lock the MC into only processing Input, Timers, and Explosions.
+ COOLDOWN_START(src, explosion_cooling, 1)
var/atom/bomb = parent
-
- exploding = TRUE
explosion(bomb, devastation_range, heavy_impact_range, light_impact_range, flash_range, uncapped) //epic explosion time
switch(delete_after)
@@ -138,14 +137,3 @@
qdel(src)
if(EXPLODABLE_DELETE_PARENT)
qdel(bomb)
- else
- addtimer(CALLBACK(src, PROC_REF(reset_exploding), 0.1 SECONDS))
-
-/**
- * Resets the expoding flag
- */
-/datum/component/explodable/proc/reset_exploding()
- SIGNAL_HANDLER
- src.exploding = FALSE
-
-
diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm
index 32f03b53d12b7..89a1aa809b4b1 100644
--- a/code/datums/components/food/edible.dm
+++ b/code/datums/components/food/edible.dm
@@ -82,6 +82,7 @@ Behavior that's still missing from this component that original food items had t
if(isitem(parent))
RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(use_from_hand))
+ RegisterSignal(parent, COMSIG_GRILL_FOOD, PROC_REF(GrillFood))
RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_ACT, PROC_REF(on_microwaved))
RegisterSignal(parent, COMSIG_ITEM_USED_AS_INGREDIENT, PROC_REF(used_to_customize))
@@ -173,6 +174,28 @@ Behavior that's still missing from this component that original food items had t
return TryToEat(M, user)
+/datum/component/edible/proc/GrillFood(datum/source, atom/fry_object, grill_time)
+ SIGNAL_HANDLER
+
+ var/atom/this_food = parent
+
+ switch(grill_time) //no 0-20 to prevent spam
+ if(20 to 30)
+ this_food.name = "lightly-grilled [this_food.name]"
+ this_food.desc = "[this_food.desc] It's been lightly grilled."
+ if(30 to 80)
+ this_food.name = "grilled [this_food.name]"
+ this_food.desc = "[this_food.desc] It's been grilled."
+ foodtypes |= FRIED
+ if(80 to 100)
+ this_food.name = "heavily grilled [this_food.name]"
+ this_food.desc = "[this_food.desc] It's been heavily grilled."
+ foodtypes |= FRIED
+ if(100 to INFINITY) //grill marks reach max alpha
+ this_food.name = "Powerfully Grilled [this_food.name]"
+ this_food.desc = "A [this_food.name]. Reminds you of your wife, wait, no, it's prettier!"
+ foodtypes |= FRIED
+
///Called when food is created through processing (Usually this means it was sliced). We use this to pass the OG items reagents.
/datum/component/edible/proc/on_processed(datum/source, atom/original_atom, list/chosen_processing_option)
SIGNAL_HANDLER
@@ -261,9 +284,6 @@ Behavior that's still missing from this component that original food items had t
set waitfor = FALSE // We might end up sleeping here, so we don't want to hold up anything
- if(QDELETED(parent))
- return
-
var/atom/owner = parent
if(feeder.a_intent == INTENT_HARM)
@@ -446,6 +466,7 @@ Behavior that's still missing from this component that original food items had t
on_consume?.Invoke(eater, feeder)
+ to_chat(feeder, "There is nothing left of [parent], oh no! ")
if(isturf(parent))
var/turf/T = parent
T.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
diff --git a/code/datums/components/grillable.dm b/code/datums/components/grillable.dm
new file mode 100644
index 0000000000000..cb1f25e30c3d1
--- /dev/null
+++ b/code/datums/components/grillable.dm
@@ -0,0 +1,91 @@
+/datum/component/grillable
+ ///Result atom type of grilling this object
+ var/atom/cook_result
+ ///Amount of time required to cook the food
+ var/required_cook_time = 2 MINUTES
+ ///Is this a positive grill result?
+ var/positive_result = TRUE
+
+ ///Time spent cooking so far
+ var/current_cook_time = 0
+
+ ///Are we currently grilling?
+ var/currently_grilling = FALSE
+
+ ///Do we use the large steam sprite?
+ var/use_large_steam_sprite = FALSE
+
+/datum/component/grillable/Initialize(cook_result, required_cook_time, positive_result, use_large_steam_sprite)
+ . = ..()
+ if(!isitem(parent)) //Only items support grilling at the moment
+ return COMPONENT_INCOMPATIBLE
+
+ src.cook_result = cook_result
+ src.required_cook_time = required_cook_time
+ src.positive_result = positive_result
+ src.use_large_steam_sprite = use_large_steam_sprite
+
+ RegisterSignal(parent, COMSIG_ITEM_GRILLED, PROC_REF(OnGrill))
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(OnExamine))
+
+///Ran every time an item is grilled by something
+/datum/component/grillable/proc/OnGrill(datum/source, atom/used_grill, delta_time = 1)
+ SIGNAL_HANDLER
+
+ . = COMPONENT_HANDLED_GRILLING
+
+ current_cook_time += delta_time * 10 //turn it into ds
+ if(current_cook_time >= required_cook_time)
+ FinishGrilling(used_grill)
+ else if(!currently_grilling) //We havn't started grilling yet
+ StartGrilling(used_grill)
+
+
+///Ran when an object starts grilling on something
+/datum/component/grillable/proc/StartGrilling(atom/grill_source)
+ currently_grilling = TRUE
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(OnMoved))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(AddGrilledItemOverlay))
+
+ var/atom/A = parent
+ A.update_appearance()
+
+///Ran when an object finished grilling
+/datum/component/grillable/proc/FinishGrilling(atom/grill_source)
+ var/atom/original_object = parent
+ var/atom/grilled_result = new cook_result(original_object.loc)
+
+ grilled_result.pixel_x = original_object.pixel_x
+ grilled_result.pixel_y = original_object.pixel_y
+
+ grill_source.visible_message("[parent] turns into \a [grilled_result]! ")
+ SEND_SIGNAL(parent, COMSIG_GRILL_COMPLETED, grilled_result)
+ currently_grilling = FALSE
+ qdel(parent)
+
+///Ran when an object almost finishes grilling
+/datum/component/grillable/proc/OnExamine(atom/A, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+ if(!current_cook_time) //Not grilled yet
+ return
+
+ if(positive_result)
+ if(current_cook_time <= required_cook_time * 0.75)
+ examine_list += "[parent] probably needs to be cooked a bit longer! "
+ else if(current_cook_time <= required_cook_time)
+ examine_list += "[parent] seems to be almost finished cooking! "
+ else
+ examine_list += "[parent] should probably not be put on the grill "
+
+///Ran when an object moves from the grill
+/datum/component/grillable/proc/OnMoved(atom/A, atom/OldLoc, Dir, Forced)
+ SIGNAL_HANDLER
+ currently_grilling = FALSE
+ UnregisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS)
+ UnregisterSignal(parent, COMSIG_MOVABLE_MOVED)
+ A.update_appearance()
+
+/datum/component/grillable/proc/AddGrilledItemOverlay(datum/source, list/overlays)
+ SIGNAL_HANDLER
+
+ overlays += mutable_appearance('icons/effects/steam.dmi', "[use_large_steam_sprite ? "steam_triple" : "steam_single"]", ABOVE_OBJ_LAYER)
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index 1516d60734213..edf7cb0157990 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -230,12 +230,14 @@
sheet_amt = round(materials[M] / MINERAL_MATERIAL_AMOUNT)
var/count = 0
while(sheet_amt > MAX_STACK_SIZE)
- new M.sheet_type(target, MAX_STACK_SIZE)
+ var/obj/item/stack/sheets = new M.sheet_type(null, MAX_STACK_SIZE)
+ sheets.forceMove(target)
count += MAX_STACK_SIZE
use_amount_mat(sheet_amt * MINERAL_MATERIAL_AMOUNT, M)
sheet_amt -= MAX_STACK_SIZE
if(sheet_amt >= 1)
- new M.sheet_type(target, sheet_amt)
+ var/obj/item/stack/sheets = new M.sheet_type(null, sheet_amt)
+ sheets.forceMove(target)
count += sheet_amt
use_amount_mat(sheet_amt * MINERAL_MATERIAL_AMOUNT, M)
return count
diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm
index cc06f85e39b4b..3a2109a1643ac 100644
--- a/code/datums/components/radioactive.dm
+++ b/code/datums/components/radioactive.dm
@@ -82,9 +82,10 @@
out += "[length(out) ? " and it " : "[master] "]seems to be glowing a bit."
if(RAD_AMOUNT_HIGH to INFINITY) //At this level the object can contaminate other objects
out += "[length(out) ? " and it " : "[master] "]hurts to look at."
- else
- out += "."
- to_chat(user, out.Join())
+ if(!LAZYLEN(out))
+ return
+ out += "."
+ to_chat(user, "[out.Join()] ")
/datum/component/radioactive/proc/rad_attack(datum/source, atom/movable/target, mob/living/user)
SIGNAL_HANDLER
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index f9d39be51b928..0707320767c4a 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -20,21 +20,28 @@
/datum/proc/can_vv_mark()
return TRUE
-//please call . = ..() first and append to the result, that way parent items are always at the top and child items are further down
-//add separaters by doing . += "---"
+/**
+ * Gets all the dropdown options in the vv menu.
+ * When overriding, make sure to call . = ..() first and appent to the result, that way parent items are always at the top and child items are further down.
+ * Add seperators by doing VV_DROPDOWN_OPTION("", "---")
+ */
/datum/proc/vv_get_dropdown()
+ SHOULD_CALL_PARENT(TRUE)
. = list()
VV_DROPDOWN_OPTION("", "---")
VV_DROPDOWN_OPTION(VV_HK_CALLPROC, "Call Proc")
VV_DROPDOWN_OPTION(VV_HK_MARK, "Mark Object")
+ VV_DROPDOWN_OPTION(VV_HK_TAG, "Tag Datum")
VV_DROPDOWN_OPTION(VV_HK_DELETE, "Delete")
VV_DROPDOWN_OPTION(VV_HK_EXPOSE, "Show VV To Player")
VV_DROPDOWN_OPTION(VV_HK_ADDCOMPONENT, "Add Component/Element")
VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits")
-//This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks!
-//href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables!
-//This proc is for "high level" actions like admin heal/set species/etc/etc. The low level debugging things should go in admin/view_variables/topic_basic.dm incase this runtimes.
+/**
+ * This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks!
+ * href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables!
+ * This proc is for "high level" actions like admin heal/set species/etc/etc. The low level debugging things should go in admin/view_variables/topic_basic.dm incase this runtimes.
+ */
/datum/proc/vv_do_topic(list/href_list)
if(!usr || !usr.client || !usr.client.holder || !check_rights(NONE))
return FALSE //This is VV, not to be called by anything else.
diff --git a/code/datums/greyscale/_greyscale_config.dm b/code/datums/greyscale/_greyscale_config.dm
index b37c40a1d2f67..807187a048209 100644
--- a/code/datums/greyscale/_greyscale_config.dm
+++ b/code/datums/greyscale/_greyscale_config.dm
@@ -243,6 +243,7 @@
var/icon/icon_bundle = GenerateBundle(color_string, last_external_icon=last_external_icon)
icon_bundle = fcopy_rsc(icon_bundle)
+
icon_cache[key] = icon_bundle
var/icon/output = icon(icon_bundle)
return output
diff --git a/code/datums/keybinding/admin.dm b/code/datums/keybinding/admin.dm
index 00892af276943..a6d65ac40c52d 100644
--- a/code/datums/keybinding/admin.dm
+++ b/code/datums/keybinding/admin.dm
@@ -99,6 +99,19 @@
user.invisimin()
return TRUE
+/datum/keybinding/admin/view_tags
+ keys = list("F9")
+ name = "view_tags"
+ full_name = "View Tags"
+ description = "Open the View-Tags menu"
+ keybind_signal = COMSIG_KB_ADMIN_VIEWTAGS_DOWN
+
+/datum/keybinding/admin/view_tags/down(client/user)
+ . = ..()
+ if(.)
+ return
+ user.holder?.display_tags()
+ return TRUE
/datum/keybinding/admin/dead_say
keys = list("F10")
diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm
index be22022823965..24224a15f0ba1 100644
--- a/code/datums/looping_sounds/machinery_sounds.dm
+++ b/code/datums/looping_sounds/machinery_sounds.dm
@@ -41,6 +41,13 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/datum/looping_sound/grill
+ mid_sounds = list('sound/machines/grill/grillsizzle.ogg' = 1)
+ mid_length = 18
+ volume = 50
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/deep_fryer
mid_length = 2
mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
volume = 30
diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm
index 5a161b8d39bdd..f633e21d85043 100644
--- a/code/datums/materials/_material.dm
+++ b/code/datums/materials/_material.dm
@@ -31,6 +31,21 @@ Simple datum which is instanced once per type and is used for every object of sa
///How beautiful is this material per unit
var/beauty_modifier = 0
*/
+ ///Can be used to override the sound items make, lets add some SLOSHing.
+ var/item_sound_override
+ ///Can be used to override the stepsound a turf makes. MORE SLOOOSH
+ var/turf_sound_override
+ ///what texture icon state to overlay
+ var/texture_layer_icon_state
+ ///a cached icon for the texture filter
+ var/cached_texture_filter_icon
+
+/datum/material/New()
+ . = ..()
+ if(texture_layer_icon_state)
+ cached_texture_filter_icon = icon('icons/materials/composite.dmi', texture_layer_icon_state)
+
+
///This proc is called when the material is added to an object.
/datum/material/proc/on_applied(atom/source, amount, material_flags)
@@ -39,17 +54,31 @@ Simple datum which is instanced once per type and is used for every object of sa
source.add_atom_colour(color, FIXED_COLOUR_PRIORITY)
if(alpha)
source.alpha = alpha
+ if(texture_layer_icon_state)
+ ADD_KEEP_TOGETHER(source, MATERIAL_SOURCE(src))
+ source.add_filter("material_texture_[name]",1,layering_filter(icon=cached_texture_filter_icon,blend_mode=BLEND_INSET_OVERLAY))
if(material_flags & MATERIAL_GREYSCALE)
var/config_path = get_greyscale_config_for(source.greyscale_config)
source.set_greyscale(greyscale_colors, config_path)
+ if(alpha < 255)
+ source.opacity = FALSE
if(material_flags & MATERIAL_ADD_PREFIX)
source.name = "[name] [source.name]"
if(istype(source, /obj)) //objs
on_applied_obj(source, amount, material_flags)
+ if(istype(source, /turf)) //turfs
+ on_applied_turf(source, amount, material_flags)
+
+ source.mat_update_desc(src)
+
+///This proc is called when a material updates an object's description
+/atom/proc/mat_update_desc(/datum/material/mat)
+ return
+
///This proc is called when the material is added to an object specifically.
/datum/material/proc/on_applied_obj(obj/o, amount, material_flags)
if(material_flags & MATERIAL_AFFECT_STATISTICS)
@@ -63,13 +92,18 @@ Simple datum which is instanced once per type and is used for every object of sa
if(!istype(o.armor))
return
+
+ var/list/current_armor = o.armor?.getList()
+
+ for(var/i in current_armor)
+ temp_armor_list[i] = current_armor[i] * armor_modifiers[i]
+ o.armor = getArmor(arglist(temp_armor_list))
*/
if(!isitem(o))
return
var/obj/item/item = o
-
if(material_flags & MATERIAL_GREYSCALE)
var/worn_path = get_greyscale_config_for(item.greyscale_config_worn)
var/lefthand_path = get_greyscale_config_for(item.greyscale_config_inhand_left)
@@ -80,12 +114,42 @@ Simple datum which is instanced once per type and is used for every object of sa
new_inhand_right = righthand_path
)
+ if(!item_sound_override)
+ return
+ item.hitsound = item_sound_override
+ item.usesound = item_sound_override
+ item.mob_throw_hit_sound = item_sound_override
+ item.equip_sound = item_sound_override
+ item.pickup_sound = item_sound_override
+ item.drop_sound = item_sound_override
+
+/datum/material/proc/on_applied_turf(var/turf/T, amount, material_flags)
+ if(isopenturf(T))
+ if(!turf_sound_override)
+ return
+ var/turf/open/O = T
+ O.footstep = turf_sound_override
+ O.barefootstep = turf_sound_override
+ O.clawfootstep = turf_sound_override
+ O.heavyfootstep = turf_sound_override
+ return
+
+/datum/material/proc/get_greyscale_config_for(datum/greyscale_config/config_path)
+ if(!config_path)
+ return
+ for(var/datum/greyscale_config/path as anything in subtypesof(config_path))
+ if(type != initial(path.material_skin))
+ continue
+ return path
///This proc is called when the material is removed from an object.
/datum/material/proc/on_removed(atom/source, material_flags)
if(material_flags & MATERIAL_COLOR) //Prevent changing things with pre-set colors, to keep colored toolboxes their looks for example
if(color)
source.remove_atom_colour(FIXED_COLOUR_PRIORITY, color)
+ if(texture_layer_icon_state)
+ source.remove_filter("material_texture_[name]")
+ REMOVE_KEEP_TOGETHER(source, MATERIAL_SOURCE(src))
source.alpha = initial(source.alpha)
if(material_flags & MATERIAL_GREYSCALE)
@@ -97,8 +161,11 @@ Simple datum which is instanced once per type and is used for every object of sa
if(istype(source, /obj)) //objs
on_removed_obj(source, material_flags)
+ if(istype(source, /turf)) //turfs
+ on_removed_turf(source, material_flags)
+
///This proc is called when the material is removed from an object specifically.
-/datum/material/proc/on_removed_obj(var/obj/o, amount, material_flags)
+/datum/material/proc/on_removed_obj(obj/o, material_flags)
if(material_flags & MATERIAL_AFFECT_STATISTICS)
var/new_max_integrity = initial(o.max_integrity)
o.modify_max_integrity(new_max_integrity)
@@ -113,6 +180,9 @@ Simple datum which is instanced once per type and is used for every object of sa
new_inhand_right = initial(item.greyscale_config_inhand_right)
)
+/datum/material/proc/on_removed_turf(turf/T, material_flags)
+ return
+
/**
* This proc is called when the mat is found in an item that's consumed by accident. see /obj/item/proc/on_accidental_consumption.
* Arguments
@@ -122,14 +192,6 @@ Simple datum which is instanced once per type and is used for every object of sa
/datum/material/proc/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S)
return FALSE
-/datum/material/proc/get_greyscale_config_for(datum/greyscale_config/config_path)
- if(!config_path)
- return
- for(var/datum/greyscale_config/path as anything in subtypesof(config_path))
- if(type != initial(path.material_skin))
- continue
- return path
-
/// Returns GLOB.recipes of a material to modify the recipes.
/// This will be only called once from SSMaterials.
diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm
index a4bbb81651187..4b43e6be829fa 100644
--- a/code/datums/materials/basemats.dm
+++ b/code/datums/materials/basemats.dm
@@ -171,6 +171,31 @@ Unless you know what you're doing, only use the first three numbers. They're in
strength_modifier = 0.8
value_per_unit = 0.025
+/datum/material/wood
+ name = "wood"
+ desc = "Flexible, durable, but flamable. Hard to come across in space."
+ color = "#bb8e53"
+ greyscale_colors = "#bb8e53"
+ strength_modifier = 0.5
+ sheet_type = /obj/item/stack/sheet/wood
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ value_per_unit = 0.01
+ //beauty_modifier = 0.1
+ //armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 0.4, ENERGY = 0.4, BOMB = 1, BIO = 0.2, ACID = 0.3)
+ texture_layer_icon_state = "woodgrain"
+
+/datum/material/wood/on_applied_obj(obj/source, amount, material_flags)
+ . = ..()
+ if(material_flags & MATERIAL_AFFECT_STATISTICS)
+ var/obj/wooden = source
+ wooden.resistance_flags |= FLAMMABLE
+
+/datum/material/wood/on_removed_obj(obj/source, amount, material_flags)
+ . = ..()
+ if(material_flags & MATERIAL_AFFECT_STATISTICS)
+ var/obj/wooden = source
+ wooden.resistance_flags &= ~FLAMMABLE
+
///Stronk force increase
/datum/material/adamantine
name = "adamantine"
diff --git a/code/datums/materials/meat.dm b/code/datums/materials/meat.dm
new file mode 100644
index 0000000000000..f2a3526c368db
--- /dev/null
+++ b/code/datums/materials/meat.dm
@@ -0,0 +1,32 @@
+///It's gross, gets the name of it's owner, and is all kinds of fucked up
+/datum/material/meat
+ name = "meat"
+ desc = "Meat"
+ color = rgb(214, 67, 67)
+ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
+ sheet_type = /obj/item/stack/sheet/meat
+ value_per_unit = 0.05
+ //beauty_modifier = -0.3
+ strength_modifier = 0.7
+ //armor_modifiers = list("melee" = 0.3, "bullet" = 0.3, "laser" = 1.2, "energy" = 1.2, "bomb" = 0.3, "bio" = 0, "rad" = 0.7, "fire" = 1, "acid" = 1)
+ item_sound_override = 'sound/effects/meatslap.ogg'
+ turf_sound_override = FOOTSTEP_MEAT
+ texture_layer_icon_state = "meat"
+
+/datum/material/meat/on_removed(atom/source, material_flags)
+ . = ..()
+ qdel(source.GetComponent(/datum/component/edible))
+
+/datum/material/meat/on_applied_obj(obj/O, amount, material_flags)
+ . = ..()
+ O.obj_flags |= UNIQUE_RENAME //So you can name it after the person its made from, a depressing comprimise.
+ make_edible(O, amount, material_flags)
+
+/datum/material/meat/on_applied_turf(turf/T, amount, material_flags)
+ . = ..()
+ make_edible(T, amount, material_flags)
+
+/datum/material/meat/proc/make_edible(atom/source, amount, material_flags)
+ var/nutriment_count = 3 * (amount / MINERAL_MATERIAL_AMOUNT)
+ var/oil_count = 2 * (amount / MINERAL_MATERIAL_AMOUNT)
+ source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, RAW | MEAT | GORE, null, 30, list("Fleshy"))
diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm
index 96fe31b2ba3ad..35b65db187607 100644
--- a/code/datums/mutations/hulk.dm
+++ b/code/datums/mutations/hulk.dm
@@ -16,7 +16,8 @@
TRAIT_CONFUSEIMMUNE,
TRAIT_IGNOREDAMAGESLOWDOWN,
TRAIT_NOSTAMCRIT,
- TRAIT_NOLIMBDISABLE
+ TRAIT_NOLIMBDISABLE,
+ TRAIT_FAST_CUFF_REMOVAL
)
/datum/mutation/hulk/on_acquiring(mob/living/carbon/human/owner)
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 28adcf06f54cb..dc6202d1d3531 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -279,6 +279,13 @@
Has medical facilities."
credit_cost = 5000
+/datum/map_template/shuttle/emergency/theatre
+ suffix = "theatre"
+ name = "The Emergency Fancy Theatre"
+ description = "Put on your best show with the emergency theatre on the couple minutes it takes you to get to CentCom! Includes a medbay, cockpit, brig and tons of fancy stuff for the crew"
+ admin_notes = "Theatre with seats, brig, cockpit and medbay included, for shows or improvisation by the crewmembers"
+ credit_cost = 5000
+
/datum/map_template/shuttle/emergency/pod
suffix = "pod"
name = "Emergency Pods"
@@ -312,6 +319,22 @@
credit_cost = 10000
danger_level = SHUTTLE_DANGER_SUBPAR
+/datum/map_template/shuttle/emergency/funnypod
+ suffix = "funnypod"
+ name = "Comically Large Escape Pod"
+ description = "A bunch of scrapped escape pods glued together."
+ admin_notes = "This shuttle will 100% cause mayhem, as the space avaiable is 1x23 and anyone can open the door in the end."
+ credit_cost = 2000
+ danger_level = SHUTTLE_DANGER_SUBPAR
+
+/datum/map_template/shuttle/emergency/honkco
+ suffix = "honkco"
+ name = "Honk.Co shuttle"
+ description = "From the creators of Snappop(tm)!, the signature Honk.Co shuttle is now avaiable to purchase, with no usable chairs and filled with bananas, clown artifacts and all types of clowns."
+ admin_notes = "Bananium shuttle full of clowns and cluwnes that turn hostile if attacked, 4 staffs of the honk mother, bananas everywhere, clown food and space suits and no usable chairs."
+ credit_cost = 5000
+ danger_level = SHUTTLE_DANGER_HIGH
+
/datum/map_template/shuttle/emergency/discoinferno
suffix = "discoinferno"
name = "Disco Inferno"
diff --git a/code/datums/weakrefs.dm b/code/datums/weakrefs.dm
index f87da566c4e90..d7578e4d78961 100644
--- a/code/datums/weakrefs.dm
+++ b/code/datums/weakrefs.dm
@@ -85,19 +85,19 @@
var/datum/D = locate(reference)
return (!QDELETED(D) && D.weak_reference == src) ? D : null
-
-// QoL stuff
/datum/weakref/vv_get_dropdown()
- . = list()
- VV_DROPDOWN_OPTION(VV_HK_TRACK_REF, "View the original reference")
- . += ..()
+ . = ..()
+ VV_DROPDOWN_OPTION(VV_HK_WEAKREF_RESOLVE, "Go to reference")
/datum/weakref/vv_do_topic(list/href_list)
. = ..()
- if(href_list[VV_HK_TRACK_REF])
- var/datum/original = resolve()
- if(!original)
- to_chat(usr, "Failed to resolve. It might be qdeleted already. ")
+ if(!.)
+ return
+
+ if(href_list[VV_HK_WEAKREF_RESOLVE])
+ if(!check_rights(NONE))
return
- usr.client.debug_variables(original)
+ var/datum/R = resolve()
+ if(R)
+ usr.client.debug_variables(R)
diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm
index 929c312a64b3a..3f162914b61e5 100644
--- a/code/game/area/areas/centcom.dm
+++ b/code/game/area/areas/centcom.dm
@@ -173,6 +173,7 @@
name = "Capture the Flag"
icon_state = "yellow"
requires_power = FALSE
+ dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
has_gravity = STANDARD_GRAVITY
airlock_hack_difficulty = AIRLOCK_WIRE_SECURITY_ELITE
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 068af46ae5c65..45f1fd3caea5d 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1240,6 +1240,7 @@
VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EXPLOSION, "Explosion")
VV_DROPDOWN_OPTION(VV_HK_RADIATE, "Radiate")
VV_DROPDOWN_OPTION(VV_HK_EDIT_FILTERS, "Edit Filters")
+ VV_DROPDOWN_OPTION(VV_HK_EDIT_COLOR_MATRIX, "Edit Color as Matrix")
VV_DROPDOWN_OPTION(VV_HK_ADD_AI, "Add AI controller")
if(greyscale_colors)
VV_DROPDOWN_OPTION(VV_HK_MODIFY_GREYSCALE, "Modify greyscale colors")
@@ -1332,6 +1333,10 @@
var/client/C = usr.client
C?.open_filter_editor(src)
+ if(href_list[VV_HK_EDIT_COLOR_MATRIX] && check_rights(R_VAREDIT))
+ var/client/C = usr.client
+ C?.open_color_matrix_editor(src)
+
/atom/vv_get_header()
. = ..()
var/refid = REF(src)
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index cc30d74f7c456..17214114501de 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -354,6 +354,9 @@ GLOBAL_LIST_EMPTY(cryopod_computers)
if(!istype(target) || user.incapacitated() || !target.Adjacent(user) || !Adjacent(user) || !ismob(target) || (!ishuman(user) && !iscyborg(user)) || !istype(user.loc, /turf) || target.buckled)
return
+ if(!target.mind)
+ to_chat(user, "[target] is not a player controlled mob. ")
+ return
if(occupant)
to_chat(user, "The cryo pod is already occupied! ")
return
diff --git a/code/game/machinery/fabricators/modular_fabricator.dm b/code/game/machinery/fabricators/modular_fabricator.dm
index 2bc67d66cfe17..ef400e362273c 100644
--- a/code/game/machinery/fabricators/modular_fabricator.dm
+++ b/code/game/machinery/fabricators/modular_fabricator.dm
@@ -69,7 +69,7 @@
if(remote_materials)
AddComponent(/datum/component/remote_materials, "modfab", mapload, TRUE, auto_link)
else
- AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/copper, /datum/material/gold, /datum/material/gold, /datum/material/silver, /datum/material/diamond, /datum/material/uranium, /datum/material/plasma, /datum/material/bluespace, /datum/material/bananium, /datum/material/titanium, /datum/material/plastic, /datum/material/adamantine), 0, TRUE, null, null, CALLBACK(src, PROC_REF(AfterMaterialInsert)))
+ AddComponent(/datum/component/material_container, SSmaterials.materialtypes_by_category[MAT_CATEGORY_RIGID], 0, TRUE, null, null, CALLBACK(src, PROC_REF(AfterMaterialInsert)))
. = ..()
stored_research = new stored_research_type
@@ -493,12 +493,13 @@
use_power(power)
materials.use_materials(materials_used)
if(is_stack)
- var/obj/item/stack/N = new being_built.build_path(A, multiplier)
+ var/obj/item/stack/N = new being_built.build_path(null, multiplier)
+ N.forceMove(A)
N.update_icon()
else
for(var/i in 1 to multiplier)
- var/obj/item/new_item = new being_built.build_path(A)
-
+ var/obj/item/new_item = new being_built.build_path(null)
+ new_item.forceMove(A)
if(length(picked_materials))
new_item.set_custom_materials(picked_materials, 1 / multiplier) //Ensure we get the non multiplied amount
being_built = null
diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm
new file mode 100644
index 0000000000000..c8dfea81e4994
--- /dev/null
+++ b/code/game/machinery/sheetifier.dm
@@ -0,0 +1,58 @@
+/obj/machinery/sheetifier
+ name = "Sheet-meister 2000"
+ desc = "A very sheety machine"
+ icon = 'icons/obj/machines/sheetifier.dmi'
+ icon_state = "base_machine"
+ density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 10
+ active_power_usage = 100
+ circuit = /obj/item/circuitboard/machine/sheetifier
+ layer = BELOW_OBJ_LAYER
+ var/busy_processing = FALSE
+
+/obj/machinery/sheetifier/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/material_container, list(/datum/material/meat), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE, /obj/item/food/meat/slab, CALLBACK(src, PROC_REF(CanInsertMaterials)), CALLBACK(src, PROC_REF(AfterInsertMaterials)))
+
+/obj/machinery/sheetifier/update_overlays()
+ . = ..()
+ if(machine_stat & (BROKEN|NOPOWER))
+ return
+ var/mutable_appearance/on_overlay = mutable_appearance(icon, "buttons_on")
+ . += on_overlay
+
+/obj/machinery/sheetifier/update_icon_state()
+ icon_state = "base_machine[busy_processing ? "_processing" : ""]"
+ return ..()
+
+/obj/machinery/sheetifier/proc/CanInsertMaterials()
+ return !busy_processing
+
+/obj/machinery/sheetifier/proc/AfterInsertMaterials(item_inserted, id_inserted, amount_inserted)
+ busy_processing = TRUE
+ update_appearance()
+ var/datum/material/last_inserted_material = id_inserted
+ var/mutable_appearance/processing_overlay = mutable_appearance(icon, "processing")
+ processing_overlay.color = last_inserted_material.color
+ flick_overlay_static(processing_overlay, src, 64)
+ addtimer(CALLBACK(src, PROC_REF(finish_processing)), 64)
+
+/obj/machinery/sheetifier/proc/finish_processing()
+ busy_processing = FALSE
+ update_appearance()
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
+ materials.retrieve_all() //Returns all as sheets
+
+/obj/machinery/sheetifier/wrench_act(mob/living/user, obj/item/tool)
+ . = ..()
+ default_unfasten_wrench(user, tool)
+ return TOOL_ACT_TOOLTYPE_SUCCESS
+
+/obj/machinery/sheetifier/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), I))
+ update_appearance()
+ return
+ if(default_deconstruction_crowbar(I))
+ return
+ return ..()
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index a283f551f1eca..55f9515d880e5 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -153,15 +153,16 @@
playsound(D.loc, 'sound/items/poster_being_created.ogg', 100, 1)
if(do_after(user, PLACE_SPEED, target=src))
- if(!D || QDELETED(D))
+ if(QDELETED(D))
return
if(iswallturf(src) && user && user.loc == temp_loc) //Let's check if everything is still there
to_chat(user, "You place the poster! ")
return
- to_chat(user, "The poster falls down! ")
- D.roll_and_drop(temp_loc)
+ if(D.loc == src) //Would do QDELETED, but it's also possible the poster gets taken down by dismantling the wall
+ to_chat(user, "The poster falls down! ")
+ D.roll_and_drop(temp_loc)
// Various possible posters follow
@@ -171,6 +172,9 @@
name = "ripped poster"
desc = "You can't make out anything from the poster's original print. It's ruined."
+/obj/structure/sign/poster/ripped/roll_and_drop()
+ qdel(src) //We shouldn't be an item
+
/obj/structure/sign/poster/random
name = "random poster" // could even be ripped
icon_state = "random_anything"
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 049027e4e5852..8dd4963d9f633 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -150,6 +150,7 @@
/obj/effect/mine/proc/triggermine(mob/living/victim)
visible_message("[victim] sets off [icon2html(src, viewers(src))] [src]! ")
+ log_combat(victim, src, "triggered a", important = FALSE)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -190,6 +191,7 @@
/obj/effect/mine/explosive/mineEffect(mob/victim)
explosion(loc, range_devastation, range_heavy, range_light, range_flash)
+ log_bomber(victim, "has primed a", src, "for detonation (Range:[range_devastation]/[range_heavy]/[range_light]/[range_flash])")
/obj/effect/mine/explosive/traitor/toy
disarm_time = 2 SECONDS
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index b9cadb303aff8..5653c6e959140 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -109,6 +109,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
name = "firebrand"
desc = "An unlit firebrand. It makes you wonder why it's not just called a stick."
smoketime = 40
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT)
grind_results = list(/datum/reagent/carbon = 2)
/obj/item/match/firebrand/Initialize(mapload)
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index c976427405fe9..7e70e7d6740e3 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -1057,6 +1057,13 @@
req_components = list(/obj/item/stock_parts/micro_laser = 1)
needs_anchored = FALSE
+/obj/item/circuitboard/machine/griddle
+ name = "circuit board (Griddle)"
+ icon_state = "service"
+ build_path = /obj/machinery/griddle
+ req_components = list(/obj/item/stock_parts/micro_laser = 1)
+ needs_anchored = FALSE
+
/obj/item/circuitboard/machine/dish_drive
name = "dish drive (Machine Board)"
icon_state = "service"
@@ -1277,6 +1284,13 @@
//Misc
+/obj/item/circuitboard/machine/sheetifier
+ name = "Sheet-meister 2000 (Machine Board)"
+ icon_state = "supply"
+ build_path = /obj/machinery/sheetifier
+ req_components = list(
+ /obj/item/stock_parts/manipulator = 2,
+ /obj/item/stock_parts/matter_bin = 2)
/obj/item/circuitboard/machine/abductor
name = "alien board (Report This)"
diff --git a/code/game/objects/items/food/_food.dm b/code/game/objects/items/food/_food.dm
index 35f6278449f9c..7e12b97e6cb38 100644
--- a/code/game/objects/items/food/_food.dm
+++ b/code/game/objects/items/food/_food.dm
@@ -48,6 +48,7 @@
make_edible()
make_processable()
make_leave_trash()
+ make_grillable()
///This proc adds the edible component, overwrite this if you for some reason want to change some specific args like callbacks.
/obj/item/food/proc/make_edible()
@@ -68,6 +69,11 @@
/obj/item/food/proc/make_processable()
return
+///This proc handles grillable components, overwrite if you want different grill results etc.
+/obj/item/food/proc/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/badrecipe, rand(20 SECONDS, 30 SECONDS), FALSE)
+ return
+
///This proc handles trash components, overwrite this if you want the object to spawn trash
/obj/item/food/proc/make_leave_trash()
if(trash_type)
diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm
index 069b37e1c2f2b..88ed34df18b6b 100644
--- a/code/game/objects/items/food/meatdish.dm
+++ b/code/game/objects/items/food/meatdish.dm
@@ -130,6 +130,9 @@
foodtypes = MEAT | TOXIC
w_class = WEIGHT_CLASS_SMALL
+/obj/item/food/spiderleg/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/boiledspiderleg, rand(50 SECONDS, 60 SECONDS), TRUE, TRUE)
+
/obj/item/food/cornedbeef
name = "corned beef and cabbage"
desc = "Now you can feel like a real tourist vacationing in Ireland."
@@ -158,20 +161,168 @@
foodtypes = MEAT | ALCOHOL
w_class = WEIGHT_CLASS_SMALL
+//Raw
+
+/obj/item/food/raw_meatball
+ name = "raw meatball"
+ desc = "A great meal all round. Not a cord of wood. Kinda raw"
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "raw_meatball"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | RAW
+ w_class = WEIGHT_CLASS_SMALL
+ var/meatball_type = /obj/item/food/meatball
+ var/patty_type = /obj/item/food/raw_patty
+
+/obj/item/food/raw_meatball/make_grillable()
+ AddComponent(/datum/component/grillable, meatball_type, rand(30 SECONDS, 40 SECONDS), TRUE)
+
+/obj/item/food/raw_meatball/make_processable()
+ AddElement(/datum/element/processable, TOOL_ROLLINGPIN, patty_type, 1, 20)
+
+/obj/item/food/raw_meatball/human
+ name = "strange raw meatball"
+ meatball_type = /obj/item/food/meatball/human
+ patty_type = /obj/item/food/raw_patty/human
+
+/obj/item/food/raw_meatball/corgi
+ name = "raw corgi meatball"
+ meatball_type = /obj/item/food/meatball/corgi
+ patty_type = /obj/item/food/raw_patty/corgi
+
+/obj/item/food/raw_meatball/xeno
+ name = "raw xeno meatball"
+ meatball_type = /obj/item/food/meatball/xeno
+ patty_type = /obj/item/food/raw_patty/xeno
+
+/obj/item/food/raw_meatball/bear
+ name = "raw bear meatball"
+ meatball_type = /obj/item/food/meatball/bear
+ patty_type = /obj/item/food/raw_patty/bear
+
+/obj/item/food/raw_meatball/chicken
+ name = "raw chicken meatball"
+ meatball_type = /obj/item/food/meatball/chicken
+ patty_type = /obj/item/food/raw_patty/chicken
+
+//Cooked
+
/obj/item/food/meatball
name = "meatball"
desc = "A great meal all round. Not a cord of wood."
icon = 'icons/obj/food/meat.dmi'
icon_state = "meatball"
food_reagents = list(
- /datum/reagent/consumable/nutriment/protein = 2,
- /datum/reagent/consumable/nutriment = 3,
+ /datum/reagent/consumable/nutriment/protein = 2
)
tastes = list("meat" = 1)
foodtypes = MEAT
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
+/obj/item/food/meatball/human
+ name = "strange meatball"
+
+/obj/item/food/meatball/corgi
+ name = "corgi meatball"
+
+/obj/item/food/meatball/bear
+ name = "bear meatball"
+ tastes = list("meat" = 1, "salmon" = 1)
+
+/obj/item/food/meatball/xeno
+ name = "xenomorph meatball"
+ tastes = list("meat" = 1, "acid" = 1)
+
+/obj/item/food/meatball/chicken
+ name = "chicken meatball"
+ tastes = list("chicken" = 1)
+ icon_state = "chicken_meatball"
+
+/obj/item/food/raw_patty
+ name = "raw patty"
+ desc = "I'm.....NOT REAAADDYY."
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "raw_patty"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | RAW
+ w_class = WEIGHT_CLASS_SMALL
+ var/patty_type = /obj/item/food/patty/plain
+
+/obj/item/food/raw_patty/make_grillable()
+ AddComponent(/datum/component/grillable, patty_type, rand(30 SECONDS, 40 SECONDS), TRUE)
+
+/obj/item/food/raw_patty/human
+ name = "strange raw patty"
+ patty_type = /obj/item/food/patty/human
+
+/obj/item/food/raw_patty/corgi
+ name = "raw corgi patty"
+ patty_type = /obj/item/food/patty/corgi
+
+/obj/item/food/raw_patty/bear
+ name = "raw bear patty"
+ tastes = list("meat" = 1, "salmon" = 1)
+ patty_type = /obj/item/food/patty/bear
+
+/obj/item/food/raw_patty/xeno
+ name = "raw xenomorph patty"
+ tastes = list("meat" = 1, "acid" = 1)
+ patty_type = /obj/item/food/patty/xeno
+
+/obj/item/food/raw_patty/chicken
+ name = "raw chicken patty"
+ tastes = list("chicken" = 1)
+ patty_type = /obj/item/food/patty/chicken
+
+/obj/item/food/patty
+ name = "patty"
+ desc = "The nanotrasen patty is the patty for you and me!"
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "patty"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT
+ w_class = WEIGHT_CLASS_SMALL
+
+///Exists purely for the crafting recipe (because itll take subtypes)
+/obj/item/food/patty/plain
+
+/obj/item/food/patty/human
+ name = "strange patty"
+
+/obj/item/food/patty/corgi
+ name = "corgi patty"
+
+/obj/item/food/patty/bear
+ name = "bear patty"
+ tastes = list("meat" = 1, "salmon" = 1)
+
+/obj/item/food/patty/xeno
+ name = "xenomorph patty"
+ tastes = list("meat" = 1, "acid" = 1)
+
+/obj/item/food/patty/chicken
+ name = "chicken patty"
+ tastes = list("chicken" = 1)
+ icon_state = "chicken_patty"
+
+/obj/item/food/raw_sausage
+ name = "raw sausage"
+ desc = "A piece of mixed, long meat, but then raw"
+ icon = 'icons/obj/food/meat.dmi'
+ icon_state = "raw_sausage"
+ food_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("meat" = 1)
+ foodtypes = MEAT | RAW
+ eatverbs = list("bite","chew","nibble","deep throat","gobble","chomp")
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/raw_sausage/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/sausage, rand(60 SECONDS, 75 SECONDS), TRUE)
+
/obj/item/food/sausage
name = "sausage"
desc = "A piece of mixed, long meat."
@@ -190,6 +341,15 @@
/obj/item/food/sausage/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/salami, 6, 3 SECONDS, table_required = TRUE,/* screentip_verb = "Slice"*/)
+ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sausage/american, 1, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/sausage/american
+ name = "american sausage"
+ desc = "Snip."
+ icon_state = "american_sausage"
+
+/obj/item/food/sausage/american/make_processable() //or else it would make itself? Lmao
+ return
/obj/item/food/salami
name = "salami"
@@ -218,7 +378,10 @@
tastes = list("meat" = 1, "onions" = 1, "garlic" = 1)
foodtypes = MEAT | RAW
w_class = WEIGHT_CLASS_SMALL
- microwaved_type = /obj/item/food/khinkali
+
+/obj/item/food/rawkhinkali/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/khinkali, rand(50 SECONDS, 60 SECONDS), TRUE)
+
/obj/item/food/khinkali
name = "khinkali"
desc = "One hundred khinkalis? Do I look like a pig?"
diff --git a/code/game/objects/items/food/meatslab.dm b/code/game/objects/items/food/meatslab.dm
index 5c75dfc18830b..86c3d3c2bb629 100644
--- a/code/game/objects/items/food/meatslab.dm
+++ b/code/game/objects/items/food/meatslab.dm
@@ -1,5 +1,5 @@
/obj/item/food/meat
- //custom_materials = list(/datum/material/meat = MINERAL_MATERIAL_AMOUNT * 4)
+ custom_materials = list(/datum/material/meat = MINERAL_MATERIAL_AMOUNT * 4)
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/food/meat.dmi'
var/subjectname = ""
@@ -10,7 +10,6 @@
desc = "A slab of meat."
icon_state = "meat"
//dried_type = /obj/item/food//sosjerky/healthy
- microwaved_type = /obj/item/food/meat/steak/plain
bite_consumption = 3
food_reagents = list(
/datum/reagent/consumable/nutriment/protein = 6,
@@ -21,10 +20,8 @@
///Legacy code, handles the coloring of the overlay of the cutlets made from this.
var/slab_color = "#FF0000"
-/*
-/obj/item/food/meat/slab/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/steak/plain)
-*/
+/obj/item/food/meat/slab/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
/obj/item/food/meat/slab/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain, 3, 30)
@@ -33,14 +30,11 @@
/obj/item/food/meat/slab/human
name = "meat"
- microwaved_type = /obj/item/food/meat/steak/plain/human
tastes = list("tender meat" = 1)
foodtypes = MEAT | RAW | GORE
-/*
-/obj/item/food/meat/slab/human/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/steak/plain/human)
-*/
+/obj/item/food/meat/slab/human/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
/obj/item/food/meat/slab/human/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain/human, 3, 30)
@@ -73,14 +67,11 @@
/obj/item/food/meat/slab/human/mutant/lizard
icon_state = "lizardmeat"
desc = "Delicious dino damage."
- microwaved_type = /obj/item/food/meat/steak/plain/human/lizard
tastes = list("meat" = 4, "scales" = 1)
foodtypes = MEAT | RAW | GORE
-/*
-/obj/item/food/meat/slab/human/mutant/lizard/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/steak/plain/human/lizard)
-*/
+/obj/item/food/meat/slab/human/mutant/lizard/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human/lizard, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
/obj/item/food/meat/slab/human/mutant/plant
icon_state = "plantmeat"
@@ -156,19 +147,16 @@
desc = "A synthetic slab of... ethical* meat?"
foodtypes = RAW | MEAT // If it looks like a duck, quacks like a duck, its probably...
+/obj/item/food/meat/slab/synthmeat/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/synth, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/slab/meatproduct
name = "meat product"
//icon_state = "meatproduct"
- microwaved_type = /obj/item/food/meat/steak/meatproduct
desc = "A slab of station reclaimed and chemically processed meat product."
tastes = list("meat flavoring" = 2, "modified starches" = 2, "natural & artificial dyes" = 1, "butyric acid" = 1) // its supposed to be various processed chemicals seen in very processed food. Butyric acid is a reference to how a certain North American Candymaker puts a chemical commonly seen in vomit into chocolate
foodtypes = RAW | MEAT
-/*
-/obj/item/food/meat/slab/meatproduct/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/steak/meatproduct)
-*/
-
/obj/item/food/meat/slab/monkey
name = "monkey meat"
foodtypes = RAW | MEAT
@@ -199,15 +187,12 @@
name = "killer tomato meat"
desc = "A slice from a huge tomato."
icon_state = "tomatomeat"
- microwaved_type = /obj/item/food/meat/steak/killertomato
food_reagents = list(/datum/reagent/consumable/nutriment = 2)
tastes = list("tomato" = 1)
foodtypes = FRUIT // Yeah, tomatoes are FRUIT. Bite me.
-/*
-/obj/item/food/meat/slab/killertomato/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/steak/killertomato)
-*/
+/obj/item/food/meat/slab/killertomato/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/killertomato, rand(70 SECONDS, 85 SECONDS), TRUE, TRUE)
/obj/item/food/meat/slab/killertomato/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/killertomato, 3, 30)
@@ -216,7 +201,6 @@
name = "bear meat"
desc = "A very manly slab of meat."
icon_state = "bearmeat"
- microwaved_type = /obj/item/food/meat/steak/bear
food_reagents = list(
/datum/reagent/consumable/nutriment/protein = 16,
/datum/reagent/medicine/morphine = 5,
@@ -226,10 +210,8 @@
tastes = list("meat" = 1, "salmon" = 1)
foodtypes = RAW | MEAT
-/*
-/obj/item/food/meat/slab/bear/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/steak/bear)
-*/
+/obj/item/food/meat/slab/bear/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/bear, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
/obj/item/food/meat/slab/bear/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/bear, 3, 30)
@@ -238,7 +220,6 @@
name = "xeno meat"
desc = "A slab of meat."
icon_state = "xenomeat"
- microwaved_type = /obj/item/food/meat/steak/xeno
food_reagents = list(
/datum/reagent/consumable/nutriment/protein = 8,
/datum/reagent/consumable/nutriment/vitamin = 3
@@ -247,19 +228,16 @@
tastes = list("meat" = 1, "acid" = 1)
foodtypes = RAW | MEAT
-/*
-/obj/item/food/meat/slab/xeno/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/steak/xeno)
-*/
-
/obj/item/food/meat/slab/xeno/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/xeno, 3, 30)
+/obj/item/food/meat/slab/xeno/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/xeno, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/slab/spider
name = "spider meat"
desc = "A slab of spider meat. That is so Kafkaesque."
icon_state = "spidermeat"
- microwaved_type = /obj/item/food/meat/steak/spider
food_reagents = list(
/datum/reagent/consumable/nutriment/protein = 5,
/datum/reagent/toxin = 3,
@@ -268,14 +246,12 @@
tastes = list("cobwebs" = 1)
foodtypes = RAW | MEAT | TOXIC
-/*
-/obj/item/food/meat/slab/spider/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/steak/spider)
-*/
-
/obj/item/food/meat/slab/spider/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/spider, 3, 30)
+/obj/item/food/meat/slab/spider/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/spider, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE)
+
/obj/item/food/meat/slab/goliath
name = "goliath meat"
desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
@@ -320,7 +296,6 @@
name = "raw piece of bacon"
desc = "A raw piece of bacon."
icon_state = "bacon"
- microwaved_type = /obj/item/food/meat/bacon
bite_consumption = 2
food_reagents = list(
/datum/reagent/consumable/nutriment/protein = 2,
@@ -329,10 +304,8 @@
tastes = list("bacon" = 1)
foodtypes = RAW | MEAT | BREAKFAST
-/*
-/obj/item/food/meat/rawbacon/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/bacon)
-*/
+/obj/item/food/meat/rawbacon/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/bacon, rand(25 SECONDS, 45 SECONDS), TRUE, TRUE)
/obj/item/food/meat/bacon
name = "piece of bacon"
@@ -349,7 +322,6 @@
/obj/item/food/meat/slab/gondola
name = "gondola meat"
desc = "According to legends of old, consuming raw gondola flesh grants one inner peace."
- microwaved_type = /obj/item/food/meat/steak/gondola
food_reagents = list(
/datum/reagent/consumable/nutriment/protein = 4,
/datum/reagent/tranquility = 5,
@@ -358,18 +330,15 @@
tastes = list("meat" = 4, "tranquility" = 1)
foodtypes = RAW | MEAT
-/*
-/obj/item/food/meat/slab/gondola/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/steak/gondola)
-*/
+/obj/item/food/meat/slab/gondola/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/gondola, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
/obj/item/food/meat/slab/gondola/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/gondola, 3, 30)
/obj/item/food/meat/slab/penguin
name = "penguin meat"
- //icon_state = "birdmeat"
- microwaved_type = /obj/item/food/meat/steak/penguin
+ icon_state = "birdmeat"
desc = "A slab of penguin meat."
food_reagents = list(
/datum/reagent/consumable/nutriment/protein = 4,
@@ -377,10 +346,8 @@
)
tastes = list("beef" = 1, "cod fish" = 1)
-/*
-/obj/item/food/meat/slab/penguin/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/steak/penguin)
-*/
+/obj/item/food/meat/slab/penguin/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/penguin, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
/obj/item/food/meat/slab/penguin/make_processable()
. = ..()
@@ -399,10 +366,8 @@
tastes = list("raw crab" = 1)
foodtypes = RAW | MEAT
-/*
-/obj/item/food/meat/rawcrab/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/crab)
-*/
+/obj/item/food/meat/slab/rawcrab/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/crab, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe?
/obj/item/food/meat/crab
name = "crab meat"
@@ -418,17 +383,15 @@
/obj/item/food/meat/slab/chicken
name = "chicken meat"
- //icon_state = "birdmeat"
- microwaved_type = /obj/item/food/meat/steak/chicken
+ icon_state = "birdmeat"
desc = "A slab of raw chicken. Remember to wash your hands!"
food_reagents = list(
/datum/reagent/consumable/nutriment/protein = 6
) //low fat
tastes = list("chicken" = 1)
-/*
-/obj/item/food/meat/slab/chicken/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/steak/chicken)
-*/
+
+/obj/item/food/meat/slab/chicken/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/chicken, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? (no this is chicken)
/obj/item/food/meat/slab/chicken/make_processable()
. = ..()
@@ -529,17 +492,17 @@
/obj/item/food/meat/steak/penguin
name = "penguin steak"
- //icon_state = "birdsteak"
+ icon_state = "birdsteak"
tastes = list("beef" = 1, "cod fish" = 1)
/obj/item/food/meat/steak/chicken
name = "chicken steak" //Can you have chicken steaks? Maybe this should be renamed once it gets new sprites. //I concur
- //icon_state = "birdsteak"
+ icon_state = "birdsteak"
tastes = list("chicken" = 1)
/obj/item/food/meat/steak/plain/human/lizard
name = "lizard steak"
- //icon_state = "birdsteak"
+ icon_state = "birdsteak" //cause they're birds. Get it?
tastes = list("juicy chicken" = 3, "scales" = 1)
foodtypes = MEAT
@@ -554,7 +517,7 @@
//icon_state = "meatproductsteak"
tastes = list("enhanced char" = 2, "suspicious tenderness" = 2, "natural & artificial dyes" = 2, "emulsifying agents" = 1)
-/obj/item/food/meat/steak/synth
+/obj/item/food/meat/steak/plain/synth
name = "synthsteak"
desc = "A synthetic meat steak. It doesn't look quite right, now does it?"
icon_state = "meatsteak"
@@ -592,19 +555,16 @@
name = "raw cutlet"
desc = "A raw meat cutlet."
icon_state = "rawcutlet"
- microwaved_type = /obj/item/food/meat/cutlet/plain
bite_consumption = 2
food_reagents = list(
- /datum/reagent/consumable/nutriment/protein = 1
+ /datum/reagent/consumable/nutriment/protein = 2
)
tastes = list("meat" = 1)
foodtypes = MEAT | RAW
var/meat_type = "meat"
-/*
-/obj/item/food/meat/rawcutlet/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/cutlet/plain)
-*/
+/obj/item/food/meat/rawcutlet/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/plain, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/OnCreatedFromProcessing(mob/living/user, obj/item/work_tool, list/chosen_option, atom/original_atom)
. = ..()
@@ -620,14 +580,11 @@
foodtypes = MEAT
/obj/item/food/meat/rawcutlet/plain/human
- microwaved_type = /obj/item/food/meat/cutlet/plain/human
tastes = list("tender meat" = 1)
foodtypes = MEAT | RAW | GORE
-/*
-/obj/item/food/meat/rawcutlet/plain/human/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/cutlet/plain/human)
-*/
+/obj/item/food/meat/rawcutlet/plain/human/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/plain/human, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/plain/human/OnCreatedFromProcessing(mob/living/user, obj/item/I, list/chosen_option, atom/original_atom)
. = ..()
@@ -644,72 +601,51 @@
name = "raw killer tomato cutlet"
tastes = list("tomato" = 1)
foodtypes = FRUIT
- microwaved_type = /obj/item/food/meat/cutlet/killertomato
-/*
-/obj/item/food/meat/rawcutlet/killertomato/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/cutlet/killertomato)
-*/
+/obj/item/food/meat/rawcutlet/killertomato/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/killertomato, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/bear
name = "raw bear cutlet"
tastes = list("meat" = 1, "salmon" = 1)
- microwaved_type = /obj/item/food/meat/cutlet/bear
-/*
-/obj/item/food/meat/rawcutlet/bear/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/cutlet/bear)
-*/
+/obj/item/food/meat/rawcutlet/bear/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/bear, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/xeno
name = "raw xeno cutlet"
tastes = list("meat" = 1, "acid" = 1)
- microwaved_type = /obj/item/food/meat/cutlet/xeno
-/*
-/obj/item/food/meat/rawcutlet/xeno/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/cutlet/xeno)
-*/
+/obj/item/food/meat/rawcutlet/xeno/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/xeno, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/spider
name = "raw spider cutlet"
tastes = list("cobwebs" = 1)
- microwaved_type = /obj/item/food/meat/cutlet/spider
-/*
-/obj/item/food/meat/rawcutlet/spider/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/cutlet/spider)
-*/
+/obj/item/food/meat/rawcutlet/spider/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/spider, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/gondola
name = "raw gondola cutlet"
tastes = list("meat" = 1, "tranquility" = 1)
- microwaved_type = /obj/item/food/meat/cutlet/gondola
-/*
-/obj/item/food/meat/rawcutlet/gondola/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/cutlet/gondola)
-*/
+/obj/item/food/meat/rawcutlet/gondola/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/gondola, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/penguin
name = "raw penguin cutlet"
tastes = list("beef" = 1, "cod fish" = 1)
- microwaved_type = /obj/item/food/meat/cutlet/penguin
-/*
-/obj/item/food/meat/rawcutlet/penguin/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/cutlet/penguin)
-*/
+/obj/item/food/meat/rawcutlet/penguin/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/penguin, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/chicken
name = "raw chicken cutlet"
tastes = list("chicken" = 1)
- microwaved_type = /obj/item/food/meat/cutlet/chicken
-/*
-/obj/item/food/meat/rawcutlet/chicken/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/cutlet/chicken)
-*/
+/obj/item/food/meat/rawcutlet/chicken/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/chicken, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/grub //grub meat is small, so its in cutlets
name = "redgrub cutlet"
@@ -725,10 +661,8 @@
foodtypes = RAW | MEAT | TOXIC
microwaved_type = /obj/item/food/meat/cutlet/grub
-/*
-/obj/item/food/meat/rawcutlet/grub/make_microwaveable()
- AddElement(/datum/element/microwavable, /obj/item/food/meat/cutlet/grub)
-*/
+/obj/item/food/meat/rawcutlet/grub/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/grub, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
//Cooked cutlets
diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm
index 57300f36796e4..b6b5df75ec0c1 100644
--- a/code/game/objects/items/food/misc.dm
+++ b/code/game/objects/items/food/misc.dm
@@ -59,6 +59,14 @@
foodtypes = GROSS
w_class = WEIGHT_CLASS_SMALL
+/obj/item/food/badrecipe/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_ITEM_GRILLED, PROC_REF(OnGrill))
+
+///Prevents grilling burnt shit from well, burning.
+/obj/item/food/badrecipe/proc/OnGrill()
+ return COMPONENT_HANDLED_GRILLING
+
/obj/item/food/badrecipe/burn()
if(QDELETED(src))
return
@@ -69,6 +77,9 @@
SSfire_burning.processing -= src
qdel(src)
+// We override the parent procs here to prevent burned messes from cooking into burned messes.
+/obj/item/food/badrecipe/make_grillable()
+ return
/obj/item/food/spidereggs
name = "spider eggs"
diff --git a/code/game/objects/items/food/sandwichtoast.dm b/code/game/objects/items/food/sandwichtoast.dm
index 8b5fc86d82cb6..9f977a7702882 100644
--- a/code/game/objects/items/food/sandwichtoast.dm
+++ b/code/game/objects/items/food/sandwichtoast.dm
@@ -9,24 +9,10 @@
/datum/reagent/consumable/nutriment/vitamin = 1
)
tastes = list("meat" = 2, "cheese" = 1, "bread" = 2, "lettuce" = 1)
- microwaved_type = /obj/item/food/toastedsandwich
foodtypes = GRAIN | VEGETABLES
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
-/obj/item/food/toastedsandwich
- name = "toasted sandwich"
- desc = "Now if you only had a pepper bar."
- icon = 'icons/obj/food/burgerbread.dmi'
- icon_state = "toastedsandwich"
- trash_type = /obj/item/trash/plate
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 6,
- /datum/reagent/carbon = 2
- )
- tastes = list("toast" = 1)
- foodtypes = GRAIN
-
/obj/item/food/grilled_cheese_sandwich
name = "grilled cheese sandwich"
desc = "A warm, melty sandwich that goes perfectly with tomato soup."
@@ -43,6 +29,20 @@
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
+/obj/item/food/cheese_sandwich
+ name = "cheese sandwich"
+ desc = "A light snack for a warm day. ...but what if you grilled it?"
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "sandwich"
+ trash_type = /obj/item/trash/plate
+ food_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ tastes = list("bread" = 1, "cheese" = 1)
+ foodtypes = GRAIN | DAIRY
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/cheese_sandwich/make_grillable()
+ AddComponent(/datum/component/grillable, /obj/item/food/grilled_cheese_sandwich, rand(30 SECONDS, 60 SECONDS), TRUE)
+
/obj/item/food/jellysandwich
name = "jelly sandwich"
desc = "You wish you had some peanut butter to go with this..."
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 3cc4a0a6d37a9..55047742d7d46 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -82,6 +82,7 @@
throwforce = 5
throw_speed = 3
throw_range = 7
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 1.5)
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
custom_price = 20
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index 5df5f5d218f76..e4f792a46c54d 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -150,7 +150,7 @@
block_upgrade_walk = 1
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
- custom_materials = null
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 10)
resistance_flags = FLAMMABLE
transparent = FALSE
max_integrity = 55
diff --git a/code/game/objects/items/stacks/ores/ore_type.dm b/code/game/objects/items/stacks/ores/ore_type.dm
index 817e5823af784..8220463da6814 100644
--- a/code/game/objects/items/stacks/ores/ore_type.dm
+++ b/code/game/objects/items/stacks/ores/ore_type.dm
@@ -84,7 +84,7 @@ STACKSIZE_MACRO(/obj/item/stack/ore/glass)
icon_state = "volcanic_sand"
singular_name = "volcanic ash pile"
-STACKSIZE_MACRO(/obj/item/stack/ore/basalt)
+STACKSIZE_MACRO(/obj/item/stack/ore/glass/basalt)
/* Plasma ore */
diff --git a/code/game/objects/items/stacks/sheets/mineral/exotics.dm b/code/game/objects/items/stacks/sheets/mineral/exotics.dm
index 0c46b0d5256cc..0453b51e9766d 100644
--- a/code/game/objects/items/stacks/sheets/mineral/exotics.dm
+++ b/code/game/objects/items/stacks/sheets/mineral/exotics.dm
@@ -19,6 +19,7 @@ Exotic mineral Sheets
point_value = 50
merge_type = /obj/item/stack/sheet/mineral/bananium
material_type = /datum/material/bananium
+ walltype = /turf/closed/wall/mineral/bananium
/obj/item/stack/sheet/mineral/bananium/get_recipes()
return GLOB.bananium_recipes
diff --git a/code/game/objects/items/stacks/sheets/mineral/exotics_recipes.dm b/code/game/objects/items/stacks/sheets/mineral/exotics_recipes.dm
index 8934f8c3670f6..3ef7790683d50 100644
--- a/code/game/objects/items/stacks/sheets/mineral/exotics_recipes.dm
+++ b/code/game/objects/items/stacks/sheets/mineral/exotics_recipes.dm
@@ -27,3 +27,10 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \
))
STACKSIZE_MACRO(/obj/item/stack/sheet/mineral/abductor)
+
+/* Meat */
+GLOBAL_LIST_INIT(meat_recipes, list (
+ //new/datum/stack_recipe("meat recipe example", /obj/structure/bed/meat, 2, one_per_turf = TRUE, on_floor = TRUE),
+ ))
+
+STACKSIZE_MACRO(/obj/item/stack/sheet/meat)
diff --git a/code/game/objects/items/stacks/sheets/mineral/materials.dm b/code/game/objects/items/stacks/sheets/mineral/materials.dm
index 3730ab8a64b7c..256533a7ab67a 100644
--- a/code/game/objects/items/stacks/sheets/mineral/materials.dm
+++ b/code/game/objects/items/stacks/sheets/mineral/materials.dm
@@ -28,6 +28,7 @@ Mineral Sheets
mats_per_unit = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT)
sheettype = "sandstone"
merge_type = /obj/item/stack/sheet/mineral/sandstone
+ walltype = /turf/closed/wall/mineral/sandstone
/obj/item/stack/sheet/mineral/sandstone/get_recipes()
return GLOB.sandstone_recipes
@@ -45,6 +46,7 @@ Mineral Sheets
point_value = 25
merge_type = /obj/item/stack/sheet/mineral/diamond
material_type = /datum/material/diamond
+ walltype = /turf/closed/wall/mineral/diamond
/obj/item/stack/sheet/mineral/diamond/get_recipes()
return GLOB.diamond_recipes
@@ -62,6 +64,7 @@ Mineral Sheets
point_value = 20
merge_type = /obj/item/stack/sheet/mineral/uranium
material_type = /datum/material/uranium
+ walltype = /turf/closed/wall/mineral/uranium
/obj/item/stack/sheet/mineral/uranium/get_recipes()
return GLOB.uranium_recipes
@@ -81,6 +84,7 @@ Mineral Sheets
point_value = 20
merge_type = /obj/item/stack/sheet/mineral/plasma
material_type = /datum/material/plasma
+ walltype = /turf/closed/wall/mineral/plasma
/obj/item/stack/sheet/mineral/plasma/suicide_act(mob/living/carbon/user)
user.visible_message("[user] begins licking \the [src]! It looks like [user.p_theyre()] trying to commit suicide! ")
@@ -117,6 +121,7 @@ Mineral Sheets
point_value = 20
merge_type = /obj/item/stack/sheet/mineral/gold
material_type = /datum/material/gold
+ walltype = /turf/closed/wall/mineral/gold
/obj/item/stack/sheet/mineral/gold/get_recipes()
return GLOB.gold_recipes
@@ -135,6 +140,7 @@ Mineral Sheets
merge_type = /obj/item/stack/sheet/mineral/silver
material_type = /datum/material/silver
tableVariant = /obj/structure/table/optable
+ walltype = /turf/closed/wall/mineral/silver
/obj/item/stack/sheet/mineral/silver/get_recipes()
return GLOB.silver_recipes
@@ -174,6 +180,7 @@ Mineral Sheets
point_value = 20
merge_type = /obj/item/stack/sheet/mineral/titanium
material_type = /datum/material/titanium
+ walltype = /turf/closed/wall/mineral/titanium
/obj/item/stack/sheet/mineral/titanium/get_recipes()
return GLOB.titanium_recipes
@@ -195,6 +202,7 @@ Mineral Sheets
point_value = 45
merge_type = /obj/item/stack/sheet/mineral/plastitanium
material_flags = NONE
+ walltype = /turf/closed/wall/mineral/plastitanium
/obj/item/stack/sheet/mineral/plastitanium/get_recipes()
return GLOB.plastitanium_recipes
diff --git a/code/game/objects/items/stacks/sheets/miscellaneous/miscellaneous_mats.dm b/code/game/objects/items/stacks/sheets/miscellaneous/miscellaneous_mats.dm
index b3b8638c62526..0c2b11a72fed6 100644
--- a/code/game/objects/items/stacks/sheets/miscellaneous/miscellaneous_mats.dm
+++ b/code/game/objects/items/stacks/sheets/miscellaneous/miscellaneous_mats.dm
@@ -135,3 +135,17 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
desc = "A source of raw socialism, capable of bringing forth the prophesized Soviet Golem."
icon_state = "sheet-stalinium"
merge_type = /obj/item/stack/sheet/stalinium
+
+/obj/item/stack/sheet/meat
+ name = "meat sheets"
+ desc = "Something's bloody meat compressed into a nice solid sheet"
+ singular_name = "meat sheet"
+ icon_state = "sheet-meat"
+ material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR
+ mats_per_unit = list(/datum/material/meat = MINERAL_MATERIAL_AMOUNT)
+ merge_type = /obj/item/stack/sheet/meat
+ material_type = /datum/material/meat
+ material_modifier = 1 //None of that wussy stuff
+
+/obj/item/stack/sheet/meat/get_recipes()
+ return GLOB.meat_recipes
diff --git a/code/game/objects/items/stacks/sheets/organic/wood.dm b/code/game/objects/items/stacks/sheets/organic/wood.dm
index ba78f3e6e14af..4f214afd20bc5 100644
--- a/code/game/objects/items/stacks/sheets/organic/wood.dm
+++ b/code/game/objects/items/stacks/sheets/organic/wood.dm
@@ -16,11 +16,14 @@ Woods Sheets
icon_state = "sheet-wood"
item_state = "sheet-wood"
icon = 'icons/obj/stacks/organic.dmi'
+ mats_per_unit = list(/datum/material/wood=MINERAL_MATERIAL_AMOUNT)
sheettype = "wood"
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0)
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/wood
+ material_type = /datum/material/wood
grind_results = list(/datum/reagent/carbon = 20)
+ walltype = /turf/closed/wall/mineral/wood
/obj/item/stack/sheet/wood/get_recipes()
return GLOB.wood_recipes
diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm
index 16515791b97ea..1103a669f4b75 100644
--- a/code/game/objects/items/stacks/sheets/sheets.dm
+++ b/code/game/objects/items/stacks/sheets/sheets.dm
@@ -13,6 +13,8 @@
material_flags = MATERIAL_EFFECTS
var/sheettype = null //this is used for girders in the creation of walls/false walls
var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity.
+ ///What type of wall does this sheet spawn
+ var/walltype
/obj/item/stack/sheet/Initialize(mapload, new_amount, merge)
. = ..()
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 4baa1301b6b70..acbd02ae01b91 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -12,6 +12,7 @@
throw_range = 7
max_amount = 60
novariants = TRUE
+ material_flags = MATERIAL_EFFECTS
/// What type of turf does this tile produce.
var/turf_type = null
/// Determines certain welder interactions.
@@ -26,6 +27,24 @@
if(tile_reskin_types)
tile_reskin_types = tile_reskin_list(tile_reskin_types)
+/obj/item/stack/tile/examine(mob/user)
+ . = ..()
+ if(throwforce && !is_cyborg) //do not want to divide by zero or show the message to borgs who can't throw
+ var/verb
+ switch(CEILING(MAX_LIVING_HEALTH / throwforce, 1)) //throws to crit a human
+ if(1 to 3)
+ verb = "superb"
+ if(4 to 6)
+ verb = "great"
+ if(7 to 9)
+ verb = "good"
+ if(10 to 12)
+ verb = "fairly decent"
+ if(13 to 15)
+ verb = "mediocre"
+ if(!verb)
+ return
+ . += "Those could work as a [verb] throwing weapon. "
/obj/item/stack/tile/attackby(obj/item/W, mob/user, params)
if (W.tool_behaviour == TOOL_WELDER)
@@ -498,7 +517,7 @@
/obj/item/stack/tile/iron
name = "floor tile"
singular_name = "floor tile"
- desc = "Those could work as a pretty decent throwing weapon."
+ desc = "The ground you walk on."
icon_state = "tile"
item_state = "tile"
force = 6
@@ -596,3 +615,18 @@
icon_state = "tile_drydock"
custom_materials = list(/datum/material/iron=1000, /datum/material/plasma=1000)
turf_type = /turf/open/floor/dock/drydock
+
+/obj/item/stack/tile/material
+ name = "floor tile"
+ singular_name = "floor tile"
+ desc = "The ground you walk on."
+ throwforce = 10
+ icon_state = "material_tile"
+ turf_type = /turf/open/floor/material
+ material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+ merge_type = /obj/item/stack/tile/material
+
+/obj/item/stack/tile/material/place_tile(turf/open/target_plating, mob/user)
+ . = ..()
+ var/turf/open/floor/material/floor = .
+ floor?.set_custom_materials(mats_per_unit)
diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm
index dba7a2e16b003..28e2eef2001fd 100644
--- a/code/game/objects/items/vending_items.dm
+++ b/code/game/objects/items/vending_items.dm
@@ -22,6 +22,7 @@
// Built automatically from the corresponding vending machine.
// If null, considered to be full. Otherwise, is list(/typepath = amount).
var/list/products
+ var/list/product_categories
var/list/contraband
var/list/premium
@@ -40,7 +41,7 @@
. += "It can restock [num] item\s."
/obj/item/vending_refill/get_part_rating()
- if (!products || !contraband || !premium)
+ if (!products || !product_categories || !contraband || !premium)
return INFINITY
. = 0
for(var/key in products)
@@ -49,3 +50,9 @@
. += contraband[key]
for(var/key in premium)
. += premium[key]
+ for (var/list/category as anything in product_categories)
+ var/list/products = category["products"]
+ for (var/product_key in products)
+ . += products[product_key]
+
+ return .
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 8c2d32d682cdc..a85793b9fc005 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -689,6 +689,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
force = 13
throwforce = 6
attack_verb = list("beat", "smacked")
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 3.5)
w_class = WEIGHT_CLASS_HUGE
var/homerun_ready = 0
var/homerun_able = 0
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 64b66506c069b..b3ba40a6ef6b4 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -4,9 +4,12 @@
if(QDELETED(src))
stack_trace("[src] taking damage after deletion")
return
+ if(obj_integrity <= 0)
+ stack_trace("[src] taking damage while having <= 0 integrity")
+ return
if(sound_effect)
play_attack_sound(damage_amount, damage_type, damage_flag)
- if((resistance_flags & INDESTRUCTIBLE) || obj_integrity <= 0)
+ if(resistance_flags & INDESTRUCTIBLE)
return
damage_amount = run_obj_armor(damage_amount, damage_type, damage_flag, attack_dir, armour_penetration)
if(damage_amount < DAMAGE_PRECISION)
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index decf5bd890d9c..026b9dc5561a1 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -238,6 +238,7 @@
name = "painting frame"
desc = "The perfect showcase for your favorite deathtrap memories."
icon = 'icons/obj/decals.dmi'
+ custom_materials = list(/datum/material/wood = 2000)
flags_1 = NONE
icon_state = "frame-empty"
result_path = /obj/structure/sign/painting
@@ -249,6 +250,7 @@
icon = 'icons/obj/decals.dmi'
icon_state = "frame-empty"
base_icon_state = "frame" //temporal replacement before the update_appearance() port
+ custom_materials = list(/datum/material/wood = 2000)
buildable_sign = FALSE
///Canvas we're currently displaying.
var/obj/item/canvas/current_canvas
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 62fec0c853c3d..e9fd7f1bbf230 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -121,6 +121,7 @@
//Overlay is similar enough for both that we can use the same mask for both
. += emissive_appearance(icon, icon_locked, src.layer)
+ ADD_LUM_SOURCE(src, LUM_SOURCE_MANAGED_OVERLAY)
. += locked ? icon_locked : icon_unlocked
/obj/structure/closet/update_appearance(updates=ALL)
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 74c01cb144705..b016188c0b4c9 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -168,7 +168,7 @@
qdel(src)
return
- if(S.sheettype && S.sheettype != "runed")
+ if(S.sheettype != "runed")
var/M = S.sheettype
if(state == GIRDER_DISPLACED)
if(S.get_amount() < 2)
@@ -195,7 +195,16 @@
S.use(2)
balloon_alert(user, "You add plating.")
var/turf/T = get_turf(src)
- T.PlaceOnTop(text2path("/turf/closed/wall/mineral/[M]"))
+ if(S.walltype)
+ T.PlaceOnTop(S.walltype)
+ else
+ var/turf/newturf = T.PlaceOnTop(/turf/closed/wall/material)
+ var/list/material_list = list()
+ if(S.material_type)
+ material_list[SSmaterials.GetMaterialRef(S.material_type)] = MINERAL_MATERIAL_AMOUNT * 2
+ if(material_list)
+ newturf.set_custom_materials(material_list)
+
transfer_fingerprints_to(T)
qdel(src)
return
diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm
index 8513d9835c88b..3b3b2f65a15a0 100644
--- a/code/game/objects/structures/noticeboard.dm
+++ b/code/game/objects/structures/noticeboard.dm
@@ -5,6 +5,9 @@
desc = "A board for pinning important notices upon."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "nboard00"
+ custom_materials = list(
+ /datum/material/wood = MINERAL_MATERIAL_AMOUNT,
+ )
layer = ABOVE_WINDOW_LAYER
density = FALSE
anchored = TRUE
diff --git a/code/game/turfs/closed/wall/material_walls.dm b/code/game/turfs/closed/wall/material_walls.dm
new file mode 100644
index 0000000000000..14a9087bbd4d4
--- /dev/null
+++ b/code/game/turfs/closed/wall/material_walls.dm
@@ -0,0 +1,26 @@
+/turf/closed/wall/material
+ name = "wall"
+ desc = "A huge chunk of material used to separate rooms."
+ icon = 'icons/turf/walls/materialwall.dmi'
+ icon_state = "materialwall-0"
+ base_icon_state = "materialwall"
+ canSmoothWith = list(/turf/closed/wall/material)
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_MATERIAL_WALLS, SMOOTH_GROUP_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_MATERIAL_WALLS)
+ material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+
+/turf/closed/wall/material/break_wall()
+ for(var/i in custom_materials)
+ var/datum/material/M = i
+ new M.sheet_type(src, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1))
+ if(girder_type)
+ return new girder_type(src)
+
+/turf/closed/wall/material/devastate_wall()
+ for(var/i in custom_materials)
+ var/datum/material/M = i
+ new M.sheet_type(src, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1))
+
+/turf/closed/wall/material/mat_update_desc(mat)
+ desc = "A huge chunk of [mat] used to separate rooms."
diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm
index 1cb488f34eb23..6dcd409cc3e94 100644
--- a/code/game/turfs/closed/wall/mineral_walls.dm
+++ b/code/game/turfs/closed/wall/mineral_walls.dm
@@ -171,6 +171,7 @@
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WOOD_WALLS)
canSmoothWith = list(SMOOTH_GROUP_WOOD_WALLS)
+ custom_materials = list(/datum/material/wood = 4000)
max_integrity = 200
damage_deflection = 0
diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm
index df8f24a35a679..8fc40fedaf0ea 100644
--- a/code/game/turfs/open/floor.dm
+++ b/code/game/turfs/open/floor.dm
@@ -126,9 +126,17 @@
if(user && !silent)
to_chat(user, "You remove the floor tile. ")
if(floor_tile && make_tile)
- new floor_tile(src)
+ spawn_tile()
return make_plating()
+/turf/open/floor/proc/has_tile()
+ return floor_tile
+
+/turf/open/floor/proc/spawn_tile()
+ if(!has_tile())
+ return null
+ return new floor_tile(src)
+
/turf/open/floor/singularity_pull(S, current_size)
..()
if(current_size == STAGE_THREE)
@@ -287,3 +295,18 @@
variants += list("[icon_state]" = 1)
for(var/i in 1 to max)
variants += list("[icon_state][i]" = 1)
+
+/turf/open/floor/material
+ name = "floor"
+ icon_state = "materialfloor"
+ material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+ floor_tile = /obj/item/stack/tile/material
+
+/turf/open/floor/material/has_tile()
+ return LAZYLEN(custom_materials)
+
+/turf/open/floor/material/spawn_tile()
+ . = ..()
+ if(.)
+ var/obj/item/stack/tile = .
+ tile.set_mats_per_unit(custom_materials, 1)
diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm
index d6e5d3c22e004..f76676a0d20a9 100644
--- a/code/game/turfs/open/floor/plating.dm
+++ b/code/game/turfs/open/floor/plating.dm
@@ -82,7 +82,7 @@
if(do_after(user, 30, target = src))
if (R.get_amount() >= 1 && !istype(src, /turf/open/floor/engine))
PlaceOnTop(/turf/open/floor/engine, flags = CHANGETURF_INHERIT_AIR)
- playsound(src, 'sound/items/deconstruct.ogg', 80, 1)
+ playsound(src, 'sound/items/deconstruct.ogg', 80, TRUE)
R.use(1)
to_chat(user, "You reinforce the floor. ")
return
@@ -111,7 +111,7 @@
return
var/obj/item/stack/tile/tile = C
tile.place_tile(src)
- playsound(src, 'sound/weapons/genhit.ogg', 50, 1)
+ playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE)
else
to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage. ")
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index f630ba0bb35ca..760a3a6e2a0fe 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -130,6 +130,15 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists)
if (opacity)
directional_opacity = ALL_CARDINALS
+ if(custom_materials)
+
+ var/temp_list = list()
+ for(var/i in custom_materials)
+ temp_list[SSmaterials.GetMaterialRef(i)] = custom_materials[i] //Get the proper instanced version
+
+ custom_materials = null //Null the list to prepare for applying the materials properly
+ set_custom_materials(temp_list)
+
ComponentInitialize()
if(isopenturf(src))
var/turf/open/O = src
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index ee0b2723b089e..f8322f8cd4cec 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -18,6 +18,7 @@ GLOBAL_PROTECT(admin_verbs_default)
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/stop_sounds,
/client/proc/mark_datum_mapview,
+ /client/proc/tag_datum_mapview,
/client/proc/requests,
)
GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
@@ -76,6 +77,7 @@ GLOBAL_PROTECT(admin_verbs_admin)
/client/proc/delete_book,
/client/proc/cmd_admin_send_pda_msg,
/client/proc/fax_panel, /*send a paper to fax*/
+ /datum/admins/proc/display_tags,
)
GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/ban_panel, /client/proc/stickybanpanel, /client/proc/old_ban_panel))
GLOBAL_PROTECT(admin_verbs_ban)
diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm
index b06241e919add..8a58558416126 100644
--- a/code/modules/admin/callproc/callproc.dm
+++ b/code/modules/admin/callproc/callproc.dm
@@ -172,7 +172,7 @@ GLOBAL_PROTECT(LastAdminCalledProc)
if(named_arg)
named_args[named_arg] = value["value"]
else
- . += value["value"]
+ . += LIST_VALUE_WRAP_LISTS(value["value"])
if(LAZYLEN(named_args))
. += named_args
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 0e4e9c3b412cf..4e327ef6e3992 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -39,6 +39,9 @@ GLOBAL_PROTECT(href_token)
/// Banning Panel
var/datum/admin_ban_panel/ban_panel
+ /// A lazylist of tagged datums, for quick reference with the View Tags verb
+ var/list/tagged_datums
+
/datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE, protected)
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
diff --git a/code/modules/admin/tag.dm b/code/modules/admin/tag.dm
new file mode 100644
index 0000000000000..beb202325edbd
--- /dev/null
+++ b/code/modules/admin/tag.dm
@@ -0,0 +1,108 @@
+/**
+ * Inserts the target_datum into [/datum/admins/var/tagged_datums], for later reference.
+ *
+ * Arguments:
+ * * target_datum - The datum you want to create a tag for
+ */
+/datum/admins/proc/add_tagged_datum(datum/target_datum)
+ if(LAZYFIND(tagged_datums, target_datum))
+ to_chat(owner, "[target_datum] is already tagged! ")
+ return
+
+ LAZYADD(tagged_datums, target_datum)
+ RegisterSignal(target_datum, COMSIG_PARENT_QDELETING, PROC_REF(handle_tagged_del), override = TRUE)
+ to_chat(owner, "[target_datum] has been tagged. ")
+
+/// Get ahead of the curve with deleting
+/datum/admins/proc/handle_tagged_del(datum/source)
+ SIGNAL_HANDLER
+
+ if(owner)
+ to_chat(owner, "Tagged datum [source] ([source.type]) has been deleted. ")
+ remove_tagged_datum(source, silent = TRUE)
+
+/**
+ * Attempts to remove the specified datum from [/datum/admins/var/tagged_datums] if it exists
+ *
+ * Arguments:
+ * * target_datum - The datum you want to remove from the tagged_datums list
+ * * silent - If TRUE, won't print messages to the owner's chat
+ */
+/datum/admins/proc/remove_tagged_datum(datum/target_datum, silent=FALSE)
+ if(!istype(target_datum))
+ return
+
+ if(LAZYFIND(tagged_datums, target_datum))
+ LAZYREMOVE(tagged_datums, target_datum)
+ if(!silent)
+ to_chat(owner, "[target_datum] has been untagged. ")
+ else if(!silent)
+ to_chat(owner, "[target_datum] was not already tagged. ")
+
+/// Quick define for readability
+#define TAG_DEL(X) "(UNTAG ) "
+#define TAG_MARK(X) "(MARK ) "
+#define TAG_SIMPLE_HEALTH(X) "Health: [X.health] "
+#define TAG_CARBON_HEALTH(X) "Health: [X.health] (\
+ [X.getBruteLoss()] \
+ [X.getFireLoss()] \
+ [X.getToxLoss()] \
+ [X.getOxyLoss()] \
+ [X.getCloneLoss() ? " [X.getCloneLoss()] " : ""])"
+
+/// Display all of the tagged datums
+/datum/admins/proc/display_tags()
+ set category = "Admin"
+ set name = "View Tags"
+
+ if (!istype(src, /datum/admins))
+ src = usr.client.holder
+ if (!istype(src, /datum/admins))
+ to_chat(usr, "Error: you are not an admin! ")
+ return
+
+ var/index = 0
+ var/list/dat = list("
Tag Menu ")
+
+ dat += "Refresh "
+ if(LAZYLEN(tagged_datums))
+ for(var/datum/iter_datum as anything in tagged_datums)
+ index++
+ var/specific_info
+
+ if(isnull(iter_datum))
+ dat += "\t[index]: Null reference - Check runtime logs!"
+ stack_trace("Null datum found in tagged datum menu! User: [usr]")
+ continue
+ else if(iscarbon(iter_datum))
+ var/mob/living/carbon/resolved_carbon = iter_datum
+ specific_info = "[TAG_CARBON_HEALTH(resolved_carbon)] | [AREACOORD(resolved_carbon)] [ADMIN_PP(iter_datum)] [ADMIN_FLW(iter_datum)]"
+ else if(isliving(iter_datum))
+ var/mob/living/resolved_living = iter_datum
+ specific_info = "[TAG_SIMPLE_HEALTH(resolved_living)] | [AREACOORD(resolved_living)] [ADMIN_PP(iter_datum)] [ADMIN_FLW(iter_datum)]"
+ else if(ismob(iter_datum))
+ var/atom/resolved_atom = iter_datum // needed for ADMIN_JMP
+ specific_info = "[AREACOORD(resolved_atom)] [ADMIN_PP(iter_datum)] [ADMIN_FLW(iter_datum)]"
+ else if(ismovable(iter_datum))
+ var/atom/resolved_atom = iter_datum // needed for ADMIN_JMP
+ specific_info = "[AREACOORD(resolved_atom)] [ADMIN_FLW(iter_datum)]"
+ else if(isatom(iter_datum))
+ var/atom/resolved_atom = iter_datum // needed for ADMIN_JMP
+ specific_info = "[AREACOORD(resolved_atom)] [ADMIN_JMP(resolved_atom)]"
+ else if(istype(iter_datum, /datum/controller/subsystem))
+ var/datum/controller/subsystem/resolved_subsystem = iter_datum
+ specific_info = "[resolved_subsystem.stat_entry()]"
+ // else, it's just a /datum
+
+ dat += "\t[index]: [iter_datum] | [specific_info] | [ADMIN_VV(iter_datum)]| [TAG_DEL(iter_datum)] | [iter_datum == marked_datum ? "Marked " : TAG_MARK(iter_datum)] "
+ dat += "\t([iter_datum.type]) "
+ else
+ dat += "No datums tagged :("
+
+ dat = dat.Join(" ")
+ usr << browse(dat, "window=tag;size=800x480")
+
+#undef TAG_DEL
+#undef TAG_MARK
+#undef TAG_SIMPLE_HEALTH
+#undef TAG_CARBON_HEALTH
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index a0b3ef5ba447f..c99e67824bddb 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1907,6 +1907,35 @@
return
GLOB.interviews.ui_interact(usr)
+ else if(href_list["tag_datum"])
+ if(!check_rights(R_ADMIN))
+ return
+ var/datum/datum_to_tag = locate(href_list["tag_datum"])
+ if(!datum_to_tag)
+ return
+ return add_tagged_datum(datum_to_tag)
+
+ else if(href_list["del_tag"])
+ if(!check_rights(R_ADMIN))
+ return
+ var/datum/datum_to_remove = locate(href_list["del_tag"])
+ if(!datum_to_remove)
+ return
+ return remove_tagged_datum(datum_to_remove)
+
+ else if(href_list["show_tags"])
+ if(!check_rights(R_ADMIN))
+ return
+ return display_tags()
+
+ else if(href_list["mark_datum"])
+ if(!check_rights(R_ADMIN))
+ return
+ var/datum/datum_to_mark = locate(href_list["mark_datum"])
+ if(!datum_to_mark)
+ return
+ return usr.client?.mark_datum(datum_to_mark)
+
else if(href_list["backstory_select"])
if(!check_rights(R_ADMIN))
return
diff --git a/code/modules/admin/verbs/cluwneplayer.dm b/code/modules/admin/verbs/cluwneplayer.dm
index e19f75f7bacaf..42df6bd2a4c25 100644
--- a/code/modules/admin/verbs/cluwneplayer.dm
+++ b/code/modules/admin/verbs/cluwneplayer.dm
@@ -8,10 +8,12 @@
var/mob/living/simple_animal/cluwne/newmob = new(get_turf(src))
- if (client)
+ if(client)
client.give_award(/datum/award/achievement/misc/cluwne, client.mob)
- M.transfer_to(newmob)
+ if(mind) // If the mob has a mind, we transfer
+ M.transfer_to(newmob)
+
if(key) // afk (no mind)
newmob.key = key
diff --git a/code/modules/admin/view_variables/color_matrix_editor.dm b/code/modules/admin/view_variables/color_matrix_editor.dm
new file mode 100644
index 0000000000000..1f1634a284b6c
--- /dev/null
+++ b/code/modules/admin/view_variables/color_matrix_editor.dm
@@ -0,0 +1,129 @@
+INITIALIZE_IMMEDIATE(/atom/movable/screen/color_matrix_proxy_view)
+
+/atom/movable/screen/color_matrix_proxy_view
+ name = "color_matrix_proxy_view"
+ del_on_map_removal = FALSE
+ layer = GAME_PLANE
+ plane = GAME_PLANE
+
+ var/list/plane_masters = list()
+
+ /// The client that is watching this view
+ var/client/client
+
+/atom/movable/screen/color_matrix_proxy_view/Initialize(mapload)
+ . = ..()
+
+ assigned_map = "color_matrix_proxy_[REF(src)]"
+ set_position(1, 1)
+
+/atom/movable/screen/color_matrix_proxy_view/Destroy()
+ for (var/plane_master in plane_masters)
+ client?.screen -= plane_master
+ qdel(plane_master)
+
+ client?.clear_map(assigned_map)
+
+ client = null
+ plane_masters = null
+
+ return ..()
+
+/atom/movable/screen/color_matrix_proxy_view/proc/register_to_client(client/client)
+ QDEL_LIST(plane_masters)
+
+ src.client = client
+
+ if (!client)
+ return
+
+ for (var/plane_master_type in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/blackness)
+ var/atom/movable/screen/plane_master/plane_master = new plane_master_type()
+ plane_master.screen_loc = "[assigned_map]:CENTER"
+ client?.screen |= plane_master
+
+ plane_masters += plane_master
+
+ client?.register_map_obj(src)
+
+/datum/color_matrix_editor
+ var/client/owner
+ var/datum/weakref/target
+ var/atom/movable/screen/color_matrix_proxy_view/proxy_view
+ var/list/current_color
+ var/closed
+
+/datum/color_matrix_editor/New(user, atom/_target = null)
+ owner = CLIENT_FROM_VAR(user)
+ if(islist(_target?.color))
+ current_color = _target.color
+ else if(istext(_target?.color))
+ current_color = color_hex2color_matrix(_target.color)
+ else
+ current_color = color_matrix_identity()
+ proxy_view = new
+ if(_target)
+ target = WEAKREF(_target)
+ proxy_view.appearance = image(_target)
+ else
+ proxy_view.appearance = image('icons/misc/colortest.dmi', "colors")
+
+ proxy_view.color = current_color
+ proxy_view.register_to_client(owner)
+
+/datum/color_matrix_editor/Destroy(force, ...)
+ QDEL_NULL(proxy_view)
+ return ..()
+
+/datum/color_matrix_editor/ui_state(mob/user)
+ return GLOB.admin_state
+
+/datum/color_matrix_editor/ui_static_data(mob/user)
+ var/list/data = list()
+ data["mapRef"] = proxy_view.assigned_map
+
+ return data
+
+/datum/color_matrix_editor/ui_data(mob/user)
+ var/list/data = list()
+ data["currentColor"] = current_color
+
+ return data
+
+/datum/color_matrix_editor/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ColorMatrixEditor")
+ ui.open()
+
+/datum/color_matrix_editor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return
+ switch(action)
+ if("transition_color")
+ current_color = params["color"]
+ animate(proxy_view, time = 4, color = current_color)
+ if("confirm")
+ on_confirm()
+ SStgui.close_uis(src)
+
+/datum/color_matrix_editor/ui_close(mob/user)
+ . = ..()
+ closed = TRUE
+
+/datum/color_matrix_editor/proc/on_confirm()
+ var/atom/target_atom = target?.resolve()
+ if(istype(target_atom))
+ target_atom.add_atom_colour(current_color, ADMIN_COLOUR_PRIORITY)
+
+/datum/color_matrix_editor/proc/wait()
+ while(!closed)
+ stoplag(1)
+
+/client/proc/open_color_matrix_editor(atom/in_atom)
+ var/datum/color_matrix_editor/editor = new /datum/color_matrix_editor(src, in_atom)
+ editor.ui_interact(mob)
+ editor.wait()
+ . = editor.current_color
+ qdel(editor)
diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm
index 0ef5615f04350..8aea000a1a631 100644
--- a/code/modules/admin/view_variables/debug_variables.dm
+++ b/code/modules/admin/view_variables/debug_variables.dm
@@ -1,88 +1,125 @@
#define VV_HTML_ENCODE(thing) ( sanitize ? html_encode(thing) : thing )
/// Get displayed variable in VV variable list
-/proc/debug_variable(name, value, level, datum/D, sanitize = TRUE) //if D is a list, name will be index, and value will be assoc value.
- var/header
- if(D)
- if(islist(D))
+/proc/debug_variable(name, value, level, datum/owner, sanitize = TRUE, display_flags = NONE) //if D is a list, name will be index, and value will be assoc value.
+ if(owner)
+ if(islist(owner))
var/index = name
if (value)
- name = D[name] //name is really the index until this line
+ name = owner[name] //name is really the index until this line
else
- value = D[name]
- header = "([VV_HREF_TARGET_1V(D, VV_HK_LIST_EDIT, "E", index)]) ([VV_HREF_TARGET_1V(D, VV_HK_LIST_CHANGE, "C", index)]) ([VV_HREF_TARGET_1V(D, VV_HK_LIST_REMOVE, "-", index)]) "
+ value = owner[name]
+ . = " ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_EDIT, "E", index)]) ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_CHANGE, "C", index)]) ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_REMOVE, "-", index)]) "
else
- header = " ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_EDIT, "E", name)]) ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_CHANGE, "C", name)]) ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_MASSEDIT, "M", name)]) "
+ . = " ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_EDIT, "E", name)]) ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_CHANGE, "C", name)]) ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_MASSEDIT, "M", name)]) "
else
- header = " "
+ . = " "
- var/item
- if (isnull(value))
- item = "[VV_HTML_ENCODE(name)] = null "
+ var/name_part = VV_HTML_ENCODE(name)
+ if(level > 0 || islist(owner)) //handling keys in assoc lists
+ if(istype(name,/datum))
+ name_part = "[VV_HTML_ENCODE(name)] [REF(name)] "
+ else if(islist(name))
+ var/list/list_value = name
+ name_part = " /list ([length(list_value)]) [REF(name)] "
- else if (istext(value))
- item = "[VV_HTML_ENCODE(name)] = \"[VV_HTML_ENCODE(value)]\" "
+ . = "[.][name_part] = "
- else if (isicon(value))
+ var/item = _debug_variable_value(name, value, level, owner, sanitize, display_flags)
+
+ return "[.][item] "
+
+// This is split into a seperate proc mostly to make errors that happen not break things too much
+/proc/_debug_variable_value(name, value, level, datum/owner, sanitize, display_flags)
+ . = "DISPLAY_ERROR: ([value] [REF(value)])" // Make sure this line can never runtime
+
+ if(isnull(value))
+ return "null "
+
+ if(istext(value))
+ return "\"[VV_HTML_ENCODE(value)]\" "
+
+ if(isicon(value))
#ifdef VARSICON
- var/icon/I = icon(value)
+ var/icon/icon_value = icon(value)
var/rnd = rand(1,10000)
- var/rname = "tmp[REF(I)][rnd].png"
- usr << browse_rsc(I, rname)
- item = "[VV_HTML_ENCODE(name)] = ([value] ) "
+ var/rname = "tmp[REF(icon_value)][rnd].png"
+ usr << browse_rsc(icon_value, rname)
+ return "([value] ) "
#else
- item = "[VV_HTML_ENCODE(name)] = /icon ([value] )"
+ return "/icon ([value] )"
#endif
- else if (isfile(value))
- item = "[VV_HTML_ENCODE(name)] = '[value]' "
+ if(isappearance(value))
+ var/image/actually_an_appearance = value
+ return "/appearance ([actually_an_appearance.icon] )"
- else if(istype(value,/matrix)) // Needs to be before datum
- var/matrix/M = value
- item = {"[VV_HTML_ENCODE(name)] =
-
-
-
- [M.a] [M.d] 0
- [M.b] [M.e] 0
- [M.c] [M.f] 1
-
-
"} //TODO link to modify_transform wrapper for all matrices
- else if (istype(value, /datum))
- var/datum/DV = value
- if ("[DV]" != "[DV.type]") //if the thing as a name var, lets use it.
- item = "[VV_HTML_ENCODE(name)] [REF(value)] = [DV] [DV.type]"
- else
- item = "[VV_HTML_ENCODE(name)] [REF(value)] = [DV.type]"
+ if(isfilter(value))
+ var/datum/filter_value = value
+ return "/filter ([filter_value.type] [REF(filter_value)] )"
+
+ if(isfile(value))
+ return "'[value]' "
- else if (islist(value))
- var/list/L = value
+ if(isdatum(value))
+ var/datum/datum_value = value
+ return datum_value.debug_variable_value(name, level, owner, sanitize, display_flags)
+
+ if(islist(value) || (name in GLOB.vv_special_lists)) // Some special lists arent detectable as a list through istype
+ var/list/list_value = value
var/list/items = list()
- if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD)))
- for (var/i in 1 to L.len)
- var/key = L[i]
+ // This is becuse some lists either dont count as lists or a locate on their ref will return null
+ var/link_vars = "Vars=[REF(value)]"
+ if(name in GLOB.vv_special_lists)
+ link_vars = "Vars=[REF(owner)];special_varname=[name]"
+
+ if (!(display_flags & VV_ALWAYS_CONTRACT_LIST) && list_value.len > 0 && list_value.len <= (IS_NORMAL_LIST(list_value) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD))
+ for (var/i in 1 to list_value.len)
+ var/key = list_value[i]
var/val
- if (IS_NORMAL_LIST(L) && !isnum_safe(key))
- val = L[key]
- if (isnull(val)) // we still want to display non-null false values, such as 0 or ""
+ if (IS_NORMAL_LIST(list_value) && !isnum(key))
+ val = list_value[key]
+ if (isnull(val)) // we still want to display non-null false values, such as 0 or ""
val = key
key = i
items += debug_variable(key, val, level + 1, sanitize = sanitize)
- item = "[VV_HTML_ENCODE(name)] = /list ([L.len]) "
+ return "/list ([list_value.len]) "
else
- item = "[VV_HTML_ENCODE(name)] = /list ([L.len]) "
+ return "/list ([list_value.len]) "
- else if (name in GLOB.bitfields)
+ if(name in GLOB.bitfields)
var/list/flags = list()
for (var/i in GLOB.bitfields[name])
if (value & GLOB.bitfields[name][i])
flags += i
- item = "[VV_HTML_ENCODE(name)] = [VV_HTML_ENCODE(jointext(flags, ", "))]"
+ if(length(flags))
+ return "[VV_HTML_ENCODE(jointext(flags, ", "))]"
+ else
+ return "NONE"
else
- item = "[VV_HTML_ENCODE(name)] = [VV_HTML_ENCODE(value)] "
+ return "[VV_HTML_ENCODE(value)] "
+
+/datum/proc/debug_variable_value(name, level, datum/owner, sanitize, display_flags)
+ if("[src]" != "[type]") // If we have a name var, let's use it.
+ return "[src] [type] [REF(src)] "
+ else
+ return "[type] [REF(src)] "
+
+/datum/weakref/debug_variable_value(name, level, datum/owner, sanitize, display_flags)
+ . = ..()
+ return "[.] (Resolve) "
- return "[header][item]"
+/matrix/debug_variable_value(name, level, datum/owner, sanitize, display_flags)
+ return {"
+
+
+
+ [a] [d] 0
+ [b] [e] 0
+ [c] [f] 1
+
+
"} //TODO link to modify_transform wrapper for all matrices
#undef VV_HTML_ENCODE
diff --git a/code/modules/admin/view_variables/get_variables.dm b/code/modules/admin/view_variables/get_variables.dm
index 45d3a82348234..c59391371dff0 100644
--- a/code/modules/admin/view_variables/get_variables.dm
+++ b/code/modules/admin/view_variables/get_variables.dm
@@ -2,7 +2,7 @@
if(isnull(var_value))
. = VV_NULL
- else if(isnum_safe(var_value))
+ else if(isnum(var_value))
if(var_name in GLOB.bitfields)
. = VV_BITFIELD
else
@@ -11,6 +11,8 @@
else if(istext(var_value))
if(findtext(var_value, "\n"))
. = VV_MESSAGE
+ else if(findtext(var_value, GLOB.is_color))
+ . = VV_COLOR
else
. = VV_TEXT
@@ -26,7 +28,10 @@
else if(istype(var_value, /client))
. = VV_CLIENT
- else if(istype(var_value, /datum))
+ else if(isweakref(var_value))
+ . = VV_WEAKREF
+
+ else if(isdatum(var_value))
. = VV_DATUM_REFERENCE
else if(ispath(var_value))
@@ -38,7 +43,10 @@
. = VV_TYPE
else if(islist(var_value))
- . = VV_LIST
+ if(var_name in GLOB.color_vars)
+ . = VV_COLOR_MATRIX
+ else
+ . = VV_LIST
else if(isfile(var_value))
. = VV_FILE
@@ -54,6 +62,8 @@
VV_TEXT,
VV_MESSAGE,
VV_ICON,
+ VV_COLOR,
+ VV_COLOR_MATRIX,
VV_ATOM_REFERENCE,
VV_DATUM_REFERENCE,
VV_MOB_REFERENCE,
@@ -67,9 +77,11 @@
VV_NEW_TYPE,
VV_NEW_LIST,
VV_NULL,
+ VV_INFINITY,
VV_RESTORE_DEFAULT,
VV_TEXT_LOCATE,
VV_PROCCALL_RETVAL,
+ VV_WEAKREF,
)
var/markstring
@@ -77,6 +89,15 @@
markstring = "[VV_MARKED_DATUM] (CURRENT: [(istype(holder) && istype(holder.marked_datum))? holder.marked_datum.type : "NULL"])"
classes += markstring
+ var/list/tagstrings = new
+ if(!(VV_TAGGED_DATUM in restricted_classes) && holder && LAZYLEN(holder.tagged_datums))
+ var/i = 0
+ for(var/datum/iter_tagged_datum as anything in holder.tagged_datums)
+ i++
+ var/new_tagstring = "[VV_TAGGED_DATUM] #[i]: [iter_tagged_datum.type])"
+ tagstrings[new_tagstring] = iter_tagged_datum
+ classes += new_tagstring
+
if(restricted_classes)
classes -= restricted_classes
@@ -87,6 +108,12 @@
if(holder && holder.marked_datum && .["class"] == markstring)
.["class"] = VV_MARKED_DATUM
+ if(holder && tagstrings[.["class"]])
+ var/datum/chosen_datum = tagstrings[.["class"]]
+ .["value"] = chosen_datum
+ .["class"] = VV_TAGGED_DATUM
+
+
switch(.["class"])
if(VV_TEXT)
.["value"] = input("Enter new text:", "Text", current_value) as null|text
@@ -178,6 +205,19 @@
return
.["value"] = things[value]
+ if(VV_WEAKREF)
+ var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types())
+ var/subtypes = vv_subtype_prompt(type)
+ if(subtypes == null)
+ .["class"] = null
+ return
+ var/list/things = vv_reference_list(type, subtypes)
+ var/value = input("Select reference:", "Reference", current_value) as null|anything in things
+ if(!value)
+ .["class"] = null
+ return
+ .["value"] = WEAKREF(things[value])
+
if(VV_CLIENT)
.["value"] = input("Select reference:", "Reference", current_value) as null|anything in GLOB.clients
if(.["value"] == null)
@@ -202,10 +242,15 @@
.["class"] = null
return
+ if(VV_TAGGED_DATUM)
+ if(.["value"] == null)
+ .["class"] = null
+ return
+
if(VV_PROCCALL_RETVAL)
var/list/get_retval = list()
callproc_blocking(get_retval)
- .["value"] = get_retval[1] //should have been set in proccall!
+ .["value"] = get_retval[1] //should have been set in proccall!
if(.["value"] == null)
.["class"] = null
return
@@ -250,8 +295,23 @@
.["value"] = newguy
if(VV_NEW_LIST)
- .["value"] = list()
.["type"] = /list
+ var/list/value = list()
+
+ var/expectation = alert("Would you like to populate the list", "Populate List?", "Yes", "No")
+ if(!expectation || expectation == "No")
+ .["value"] = value
+ return .
+
+ var/list/insert = null
+ while(TRUE)
+ insert = vv_get_value(restricted_classes = list(VV_RESTORE_DEFAULT))
+ if(!insert["class"])
+ break
+ value += LIST_VALUE_WRAP_LISTS(insert["value"])
+
+
+ .["value"] = value
if(VV_TEXT_LOCATE)
var/datum/D
@@ -261,11 +321,25 @@
break
D = locate(ref)
if(!D)
- alert("Invalid ref!")
+ tgui_alert(usr,"Invalid ref!")
continue
if(!D.can_vv_mark())
- alert("Datum can not be marked!")
+ tgui_alert(usr,"Datum can not be marked!")
continue
while(!D)
.["type"] = D.type
.["value"] = D
+
+ if(VV_COLOR)
+ .["value"] = input("Enter new color:", "Color", current_value) as color|null
+ if(.["value"] == null)
+ .["class"] = null
+ return
+
+ if(VV_COLOR_MATRIX)
+ .["value"] = open_color_matrix_editor()
+ if(.["value"] == color_matrix_identity()) //identity is equivalent to null
+ .["class"] = null
+
+ if(VV_INFINITY)
+ .["value"] = INFINITY
diff --git a/code/modules/admin/view_variables/tag_datum.dm b/code/modules/admin/view_variables/tag_datum.dm
new file mode 100644
index 0000000000000..3b611e3cdf934
--- /dev/null
+++ b/code/modules/admin/view_variables/tag_datum.dm
@@ -0,0 +1,18 @@
+/client/proc/tag_datum(datum/target_datum)
+ if(!holder || QDELETED(target_datum))
+ return
+ holder.add_tagged_datum(target_datum)
+
+/client/proc/toggle_tag_datum(datum/target_datum)
+ if(!holder || !target_datum)
+ return
+
+ if(LAZYFIND(holder.tagged_datums, target_datum))
+ holder.remove_tagged_datum(target_datum)
+ else
+ holder.add_tagged_datum(target_datum)
+
+/client/proc/tag_datum_mapview(datum/target_datum as mob|obj|turf|area in view(view))
+ set category = "Debug"
+ set name = "Tag Datum"
+ tag_datum(target_datum)
diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm
index 9a0956174b0a2..f753221828cea 100644
--- a/code/modules/admin/view_variables/topic.dm
+++ b/code/modules/admin/view_variables/topic.dm
@@ -11,7 +11,10 @@
else if(islist(target))
vv_do_list(target, href_list)
if(href_list["Vars"])
- debug_variables(locate(href_list["Vars"]))
+ var/datum/vars_target = locate(href_list["Vars"])
+ if(href_list["special_varname"]) // Some special vars can't be located even if you have their ref, you have to use this instead
+ vars_target = vars_target.vars[href_list["special_varname"]]
+ debug_variables(vars_target)
//Stuff below aren't in dropdowns/etc.
diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm
index b02ef9d96a6f2..5765199b84bb9 100644
--- a/code/modules/admin/view_variables/topic_basic.dm
+++ b/code/modules/admin/view_variables/topic_basic.dm
@@ -57,7 +57,8 @@
if(href_list[VV_HK_MARK] && check_rights(R_VAREDIT))
usr.client.mark_datum(target)
-
+ if(href_list[VV_HK_TAG])
+ usr.client.tag_datum(target)
if(href_list[VV_HK_ADDCOMPONENT])
if(!check_rights(R_VAREDIT))
return
diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm
index fe337274443ab..136d82b732cbc 100644
--- a/code/modules/admin/view_variables/view_variables.dm
+++ b/code/modules/admin/view_variables/view_variables.dm
@@ -1,52 +1,65 @@
-/client/proc/debug_variables(datum/D in world)
+/client/proc/debug_variables(datum/thing in world)
set category = "Debug"
set name = "View Variables"
//set src in world
var/static/cookieoffset = rand(1, 9999) //to force cookies to reset after the round.
- if(!usr.client || !usr.client.holder) //This is usr because admins can call the proc on other clients, even if they're not admins, to show them VVs.
+ if(!usr.client || !usr.client.holder) //This is usr because admins can call the proc on other clients, even if they're not admins, to show them VVs.
to_chat(usr, "You need to be an administrator to access this. ")
return
- if(!D)
+ if(!thing)
return
var/datum/asset/asset_cache_datum = get_asset_datum(/datum/asset/simple/vv)
asset_cache_datum.send(usr)
- var/islist = islist(D)
- if(!islist && !istype(D))
+ var/islist = islist(thing) || (!isdatum(thing) && hascall(thing, "Cut")) // Some special lists dont count as lists, but can be detected by if they have list procs
+ if(!islist && !isdatum(thing))
return
var/title = ""
- var/refid = REF(D)
+ var/refid = REF(thing)
var/icon/sprite
var/hash
- var/type = islist? /list : D.type
+ var/type = islist? /list : thing.type
+ var/no_icon = FALSE
- if(istype(D, /atom))
- sprite = getFlatIcon(D)
- hash = md5(icon2base64(sprite))
- if(hash) //Fixes VV shitting it's pants if the icon isn't valid
- src << browse_rsc(sprite, "vv[hash].png")
+ if(isatom(thing))
+ sprite = getFlatIcon(thing)
+ if(!sprite)
+ no_icon = TRUE
- title = "[D] ([REF(D)]) = [type]"
- var/formatted_type = replacetext("[type]", "/", "/")
+ else if(isimage(thing))
+ var/image/image_object = thing
+ sprite = icon(image_object.icon, image_object.icon_state)
var/sprite_text
if(sprite)
- sprite_text = ""
- var/list/header = islist(D)? list("/list ") : D.vv_get_header()
+ hash = md5(sprite)
+ src << browse_rsc(sprite, "vv[hash].png")
+ sprite_text = no_icon ? "\[NO ICON\]" : " "
+
+ title = "[thing] ([REF(thing)]) = [type]"
+ var/formatted_type = replacetext("[type]", "/", "/")
+
+ var/list/header = islist ? list("/list ") : thing.vv_get_header()
+
+ var/ref_line = "@[copytext(refid, 2, -1)]" // get rid of the brackets, add a @ prefix for copy pasting in asay
var/marked_line
- if(holder && holder.marked_datum && holder.marked_datum == D)
+ if(holder && holder.marked_datum && holder.marked_datum == thing)
marked_line = VV_MSG_MARKED
+ var/tagged_line
+ if(holder && LAZYFIND(holder.tagged_datums, thing))
+ var/tag_index = LAZYFIND(holder.tagged_datums, thing)
+ tagged_line = VV_MSG_TAGGED(tag_index)
var/varedited_line
- if(!islist && (D.datum_flags & DF_VAR_EDITED))
+ if(!islist && (thing.datum_flags & DF_VAR_EDITED))
varedited_line = VV_MSG_EDITED
var/deleted_line
- if(!islist && D.gc_destroyed)
+ if(!islist && thing.gc_destroyed)
deleted_line = VV_MSG_DELETED
var/list/dropdownoptions
@@ -66,28 +79,29 @@
var/link = dropdownoptions[name]
dropdownoptions[i] = "[name] "
else
- dropdownoptions = D.vv_get_dropdown()
+ dropdownoptions = thing.vv_get_dropdown()
var/list/names = list()
if(!islist)
- for(var/V in D.vars)
- names += V
- sleep(1)
+ for(var/varname in thing.vars)
+ names += varname
+
+ sleep(1 TICKS)
var/list/variable_html = list()
if(islist)
- var/list/L = D
- for(var/i in 1 to L.len)
- var/key = L[i]
+ var/list/list_value = thing
+ for(var/i in 1 to list_value.len)
+ var/key = list_value[i]
var/value
- if(IS_NORMAL_LIST(L) && IS_VALID_ASSOC_KEY(key))
- value = L[key]
- variable_html += debug_variable(i, value, 0, L)
+ if(IS_NORMAL_LIST(list_value) && IS_VALID_ASSOC_KEY(key))
+ value = list_value[key]
+ variable_html += debug_variable(i, value, 0, list_value)
else
names = sort_list(names)
- for(var/V in names)
- if(D.can_vv_get(V))
- variable_html += D.vv_get_var(V)
+ for(var/varname in names)
+ if(thing.can_vv_get(varname))
+ variable_html += thing.vv_get_var(varname)
var/html = {"
@@ -114,8 +128,8 @@
var ca = document.cookie.split(';');
for(var i=0; i
[formatted_type]
+ [ref_line]
[marked_line]
+ [tagged_line]
[varedited_line]
[deleted_line]
@@ -263,5 +279,5 @@ datumrefresh=[refid];[HrefToken()]'>Refresh
"}
src << browse(html, "window=variables[refid];size=475x650")
-/client/proc/vv_update_display(datum/D, span, content)
- src << output("[span]:[content]", "variables[REF(D)].browser:replace_span")
+/client/proc/vv_update_display(datum/thing, span, content)
+ src << output("[span]:[content]", "variables[REF(thing)].browser:replace_span")
diff --git a/code/modules/antagonists/clock_cult/clockwork_massive.dm b/code/modules/antagonists/clock_cult/clockwork_massive.dm
index 7ad4dfb145675..46c74b77669fa 100644
--- a/code/modules/antagonists/clock_cult/clockwork_massive.dm
+++ b/code/modules/antagonists/clock_cult/clockwork_massive.dm
@@ -69,24 +69,30 @@ GLOBAL_LIST_INIT(clockwork_portals, list())
to_chat(world, pick(phase_messages))
/obj/structure/destructible/clockwork/massive/celestial_gateway/deconstruct(disassembled = TRUE)
- if(!(flags_1 & NODECONSTRUCT_1))
- if(!disassembled)
- resistance_flags |= INDESTRUCTIBLE
- visible_message("[src] begins to pulse uncontrollably... you might want to run! ")
- sound_to_playing_players(volume = 50, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_disrupted.ogg'))
- for(var/mob/M in GLOB.player_list)
- var/turf/T = get_turf(M)
- if((T && T.get_virtual_z_level() == get_virtual_z_level()) || is_servant_of_ratvar(M))
- M.playsound_local(M, 'sound/machines/clockcult/ark_deathrattle.ogg', 100, FALSE, pressure_affected = FALSE)
- sleep(27)
- explosion(src, 1, 3, 8, 8)
- sound_to_playing_players('sound/effects/explosion_distant.ogg', volume = 50)
- for(var/obj/effect/portal/wormhole/clockcult/CC in GLOB.all_wormholes)
- qdel(CC)
- SSshuttle.clearHostileEnvironment(src)
- set_security_level(SEC_LEVEL_RED)
- sleep(300)
- SSticker.force_ending = TRUE
+ if((flags_1 & NODECONSTRUCT_1))
+ return
+ if(disassembled)
+ return
+ resistance_flags |= INDESTRUCTIBLE
+ visible_message("[src] begins to pulse uncontrollably... you might want to run! ")
+ sound_to_playing_players(volume = 50, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_disrupted.ogg'))
+ for(var/mob/M in GLOB.player_list)
+ var/turf/T = get_turf(M)
+ if((T && T.get_virtual_z_level() == get_virtual_z_level()) || is_servant_of_ratvar(M))
+ M.playsound_local(M, 'sound/machines/clockcult/ark_deathrattle.ogg', 100, FALSE, pressure_affected = FALSE)
+ addtimer(CALLBACK(src, PROC_REF(last_call)), 27)
+
+/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/last_call()
+ explosion(src, 1, 3, 8, 8)
+ sound_to_playing_players('sound/effects/explosion_distant.ogg', volume = 50)
+ for(var/obj/effect/portal/wormhole/clockcult/CC in GLOB.all_wormholes)
+ qdel(CC)
+ SSshuttle.clearHostileEnvironment(src)
+ set_security_level(SEC_LEVEL_RED)
+ addtimer(CALLBACK(src, PROC_REF(clockies_win)), 300)
+
+/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/clockies_win()
+ SSticker.force_ending = TRUE
qdel(src)
/obj/structure/destructible/clockwork/massive/celestial_gateway/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration)
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index f4fea0d2ca283..507c5627e06ce 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -166,11 +166,10 @@
/datum/asset/simple/namespaced/fontawesome
legacy = TRUE
assets = list(
- "fa-regular-400.eot" = 'html/font-awesome/webfonts/fa-regular-400.eot',
- "fa-regular-400.woff" = 'html/font-awesome/webfonts/fa-regular-400.woff',
- "fa-solid-900.eot" = 'html/font-awesome/webfonts/fa-solid-900.eot',
- "fa-solid-900.woff" = 'html/font-awesome/webfonts/fa-solid-900.woff',
- "v4shim.css" = 'html/font-awesome/css/v4-shims.min.css'
+ "fa-regular-400.ttf" = 'html/font-awesome/webfonts/fa-regular-400.ttf',
+ "fa-solid-900.ttf" = 'html/font-awesome/webfonts/fa-solid-900.ttf',
+ "fa-v4compatibility.ttf" = 'html/font-awesome/webfonts/fa-v4compatibility.ttf',
+ "v4shim.css" = 'html/font-awesome/css/v4-shims.min.css',
)
parents = list("font-awesome.css" = 'html/font-awesome/css/all.min.css')
diff --git a/code/modules/client/loadout/loadout_accessories.dm b/code/modules/client/loadout/loadout_accessories.dm
index 0e39ffdbb2923..60c18fcbc94be 100644
--- a/code/modules/client/loadout/loadout_accessories.dm
+++ b/code/modules/client/loadout/loadout_accessories.dm
@@ -156,6 +156,10 @@
display_name = "circular glasses"
path = /obj/item/clothing/glasses/regular/circle
+/datum/gear/accessory/glasses/circle_sunglasses
+ display_name = "circular sunglasses"
+ path = /obj/item/clothing/glasses/sunglasses/circle_sunglasses
+
/datum/gear/accessory/glasses/sunglasses
display_name = "sunglasses"
path = /obj/item/clothing/glasses/sunglasses
diff --git a/code/modules/client/loadout/loadout_uniform.dm b/code/modules/client/loadout/loadout_uniform.dm
index 1a374bb2e6ad1..3d10f591c6aad 100644
--- a/code/modules/client/loadout/loadout_uniform.dm
+++ b/code/modules/client/loadout/loadout_uniform.dm
@@ -248,6 +248,10 @@
display_name = "white and green suit"
path = /obj/item/clothing/under/suit/white_on_white
+/datum/gear/uniform/suit/relaxed
+ display_name = "relaxed slacks"
+ path = /obj/item/clothing/under/suit/relaxed
+
/datum/gear/uniform/suit/sl_suit
display_name = "amish suit"
path = /obj/item/clothing/under/suit/sl
diff --git a/code/modules/client/verbs/looc.dm b/code/modules/client/verbs/looc.dm
index 6b5c11abfb457..22b74454a21cc 100644
--- a/code/modules/client/verbs/looc.dm
+++ b/code/modules/client/verbs/looc.dm
@@ -73,7 +73,11 @@ GLOBAL_VAR_INIT(looc_allowed, TRUE)
for(var/client/client in GLOB.admins)
if(!client.prefs.read_player_preference(/datum/preference/toggle/chat_ooc))
continue
- var/prefix = "[(client in targets) ? "" : "(R)"]LOOC"
+ var/prefix
+ if(in_view[get_turf(client.mob)])
+ prefix = "[(client in targets) ? "" : "(R)"]LOOC (NEARBY)"
+ else
+ prefix = "[(client in targets) ? "" : "(R)"]LOOC"
to_chat(client, "[prefix]: [ADMIN_LOOKUPFLW(mob)]: [msg] ", avoid_highlighting = (client == src))
/proc/log_looc(text)
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 32f919ef77e17..799def9787b81 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -249,6 +249,12 @@
icon_state = "circle_glasses"
item_state = "circle_glasses"
+/obj/item/clothing/glasses/sunglasses/circle_sunglasses
+ name = "circle sunglasses"
+ desc = "Shit's pimpin'"
+ icon_state = "circle_sunglasses"
+ item_state = "circle_sunglasses"
+
//Here lies green glasses, so ugly they died. RIP
/obj/item/clothing/glasses/sunglasses
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 23278fc7f1c71..75ee19d22c3a3 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -196,6 +196,7 @@
desc = "A creepy wooden mask. Surprisingly expressive for a poorly carved bit of wood."
icon_state = "tiki_eyebrow"
item_state = "tiki_eyebrow"
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 1.25)
resistance_flags = FLAMMABLE
max_integrity = 100
actions_types = list(/datum/action/item_action/adjust)
diff --git a/code/modules/clothing/shoes/color.dm b/code/modules/clothing/shoes/color.dm
index 391919f2825ba..72ff41ae34335 100644
--- a/code/modules/clothing/shoes/color.dm
+++ b/code/modules/clothing/shoes/color.dm
@@ -50,6 +50,7 @@
name = "rainbow shoes"
desc = "Very gay shoes."
icon_state = "rain_bow"
+
greyscale_colors = null
greyscale_config = null
greyscale_config_inhand_left = null
@@ -103,3 +104,24 @@
if(!do_after(hummie,15 SECONDS, src))
return FALSE
return ..()
+
+/obj/item/clothing/shoes/sneakers/mime
+ name = "mime shoes"
+ greyscale_colors = "#ffffff#ffffff"
+
+/obj/item/clothing/shoes/sneakers/marisa
+ desc = "A pair of magic black shoes."
+ name = "magic shoes"
+ worn_icon_state = "marisa"
+ greyscale_colors = "#545454#ffffff"
+ greyscale_config = /datum/greyscale_config/sneakers_marisa
+ greyscale_config_worn = null
+ strip_delay = 5
+ equip_delay_other = 50
+ permeability_coefficient = 0.9
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/obj/item/clothing/shoes/sneakers/cyborg
+ name = "cyborg boots"
+ desc = "Shoes for a cyborg costume."
+ greyscale_colors = "#4e4e4e#4e4e4e"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 364ae9828cdbd..a58e4c78e8118 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -1,10 +1,6 @@
/obj/item/clothing/shoes/proc/step_action() //this was made to rewrite clown shoes squeaking
SEND_SIGNAL(src, COMSIG_SHOES_STEP_ACTION)
-/obj/item/clothing/shoes/sneakers/mime
- name = "mime shoes"
- greyscale_colors = "#ffffff#ffffff"
-
/obj/item/clothing/shoes/combat //basic syndicate combat boots for nuke ops and mob corpses
name = "combat boots"
desc = "High speed, low drag combat boots."
@@ -29,23 +25,12 @@
desc = "A pair of rather plain wooden sandals."
name = "sandals"
icon_state = "wizard"
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 0.5)
strip_delay = 50
equip_delay_other = 50
permeability_coefficient = 0.9
strip_delay = 5
-/obj/item/clothing/shoes/sneakers/marisa
- desc = "A pair of magic black shoes."
- name = "magic shoes"
- worn_icon_state = "marisa"
- greyscale_colors = "#545454#ffffff"
- greyscale_config = /datum/greyscale_config/sneakers_marisa
- greyscale_config_worn = null
- strip_delay = 5
- equip_delay_other = 50
- permeability_coefficient = 0.9
- resistance_flags = FIRE_PROOF | ACID_PROOF
-
/obj/item/clothing/shoes/sandal/magic
name = "magical sandals"
desc = "A pair of sandals imbued with magic."
@@ -211,11 +196,6 @@
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
-/obj/item/clothing/shoes/sneakers/cyborg
- name = "cyborg boots"
- desc = "Shoes for a cyborg costume."
- greyscale_colors = "#4e4e4e#4e4e4e"
-
/obj/item/clothing/shoes/laceup
name = "laceup shoes"
desc = "The height of fashion, and they're pre-polished!"
@@ -292,48 +272,6 @@
. = ..()
AddComponent(/datum/component/squeak, list('sound/machines/clockcult/integration_cog_install.ogg' = 1, 'sound/magic/clockwork/fellowship_armory.ogg' = 1), 50)
-/obj/item/clothing/shoes/wheelys
- name = "Wheely-Heels"
- desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." //Thanks Fel
- item_state = "wheelys"
- greyscale_colors = "#545454#ffffff"
- greyscale_config = /datum/greyscale_config/sneakers_wheelys
- icon_state = "sneakers"
- worn_icon_state = "wheelys"
- actions_types = list(/datum/action/item_action/wheelys)
- var/wheelToggle = FALSE //False means wheels are not popped out
- var/obj/vehicle/ridden/scooter/wheelys/W
-
-/obj/item/clothing/shoes/wheelys/Initialize(mapload)
- . = ..()
- W = new /obj/vehicle/ridden/scooter/wheelys(null)
-
-/obj/item/clothing/shoes/wheelys/ui_action_click(mob/user, action)
- if(!isliving(user))
- return
- if(!istype(user.get_item_by_slot(ITEM_SLOT_FEET), /obj/item/clothing/shoes/wheelys))
- to_chat(user, "You must be wearing the wheely-heels to use them! ")
- return
- if(!(W.is_occupant(user)))
- wheelToggle = FALSE
- if(wheelToggle)
- W.unbuckle_mob(user)
- wheelToggle = FALSE
- return
- W.forceMove(get_turf(user))
- W.buckle_mob(user)
- wheelToggle = TRUE
-
-/obj/item/clothing/shoes/wheelys/dropped(mob/user)
- ..()
- if(wheelToggle)
- W.unbuckle_mob(user)
- wheelToggle = FALSE
-
-/obj/item/clothing/shoes/wheelys/Destroy()
- QDEL_NULL(W)
- . = ..()
-
/obj/item/clothing/shoes/kindleKicks
name = "Kindle Kicks"
desc = "They'll sure kindle something in you, and it's not childhood nostalgia..."
diff --git a/code/modules/clothing/shoes/wheelys.dm b/code/modules/clothing/shoes/wheelys.dm
new file mode 100644
index 0000000000000..6a2eaad54784e
--- /dev/null
+++ b/code/modules/clothing/shoes/wheelys.dm
@@ -0,0 +1,45 @@
+/obj/item/clothing/shoes/wheelys
+ name = "Wheely-Heels"
+ desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." //Thanks Fel
+ icon_state = "sneakers"
+ worn_icon_state = "wheelys"
+ item_state = "wheelys"
+ greyscale_colors = "#545454#ffffff"
+ greyscale_config = /datum/greyscale_config/sneakers_wheelys
+ worn_x_dimension = 64
+ worn_y_dimension = 64
+ actions_types = list(/datum/action/item_action/wheelys)
+ ///False means wheels are not popped out
+ var/wheelToggle = FALSE
+ ///The vehicle associated with the shoes
+ var/obj/vehicle/ridden/scooter/wheelys/W
+
+/obj/item/clothing/shoes/wheelys/Initialize(mapload)
+ . = ..()
+ W = new /obj/vehicle/ridden/scooter/wheelys(null)
+
+/obj/item/clothing/shoes/wheelys/ui_action_click(mob/user, action)
+ if(!isliving(user))
+ return
+ if(!istype(user.get_item_by_slot(ITEM_SLOT_FEET), /obj/item/clothing/shoes/wheelys))
+ balloon_alert(user, "must be worn!")
+ return
+ if(!(W.is_occupant(user)))
+ wheelToggle = FALSE
+ if(wheelToggle)
+ W.unbuckle_mob(user)
+ wheelToggle = FALSE
+ return
+ W.forceMove(get_turf(user))
+ W.buckle_mob(user)
+ wheelToggle = TRUE
+
+/obj/item/clothing/shoes/wheelys/dropped(mob/user)
+ ..()
+ if(wheelToggle)
+ W.unbuckle_mob(user)
+ wheelToggle = FALSE
+
+/obj/item/clothing/shoes/wheelys/Destroy()
+ QDEL_NULL(W)
+ . = ..()
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index d6bd7718c8d28..0716b2cb5ef24 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -234,11 +234,11 @@
desc = "A multi-colored jumpsuit!"
icon_state = "rainbow"
item_state = "rainbow"
- can_adjust = FALSE
greyscale_config = null
greyscale_config_inhand_left = null
greyscale_config_inhand_right = null
greyscale_config_worn = null
+ can_adjust = FALSE
/obj/item/clothing/under/color/jumpskirt/rainbow
name = "rainbow jumpskirt"
@@ -249,6 +249,7 @@
greyscale_config_inhand_left = null
greyscale_config_inhand_right = null
greyscale_config_worn = null
+ can_adjust = FALSE
/obj/item/clothing/under/color/rainbow/denied
name = "ERROR jumpsuit"
diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm
index a717bc8fb3a85..a5f046efd97aa 100644
--- a/code/modules/clothing/under/suits.dm
+++ b/code/modules/clothing/under/suits.dm
@@ -30,6 +30,13 @@
item_state = "blackslacks"
can_adjust = TRUE
+/obj/item/clothing/under/suit/relaxed
+ name = "relaxed slacks"
+ desc = "A somewhat less professional set of black slacks and a white dress shirt."
+ icon_state = "relaxed"
+ item_state = "relaxed"
+ can_adjust = TRUE
+
/obj/item/clothing/under/suit/black/skirt
name = "black suitskirt"
desc = "A professional black suit. Nanotrasen Investigation Bureau approved!"
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index 181e3e404cc2c..00f32debdeac2 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -56,7 +56,7 @@
originMachine.visible_message("[originMachine] beeps and seems lifeless.")
kill()
return
- vendingMachines = remove_nulls_from_list(vendingMachines)
+ vendingMachines = list_clear_nulls(vendingMachines)
if(!vendingMachines.len) //if every machine is infected
infectedMachines.Add(originMachine)
for(var/obj/machinery/vending/upriser in infectedMachines)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/griddle.dm b/code/modules/food_and_drinks/kitchen_machinery/griddle.dm
new file mode 100644
index 0000000000000..2d47a4e325322
--- /dev/null
+++ b/code/modules/food_and_drinks/kitchen_machinery/griddle.dm
@@ -0,0 +1,149 @@
+/obj/machinery/griddle
+ name = "griddle"
+ desc = "Because using pans is for pansies."
+ icon = 'icons/obj/machines/kitchenmachines.dmi'
+ icon_state = "griddle1_off"
+ density = TRUE
+ pass_flags_self = PASSMACHINE | PASSTABLE| LETPASSTHROW
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 5
+ layer = BELOW_OBJ_LAYER
+ circuit = /obj/item/circuitboard/machine/griddle
+ processing_flags = START_PROCESSING_MANUALLY
+ resistance_flags = FIRE_PROOF
+
+ ///Things that are being griddled right now
+ var/list/griddled_objects = list()
+ ///Looping sound for the grill
+ var/datum/looping_sound/grill/grill_loop
+ ///Whether or not the machine is turned on right now
+ var/on = FALSE
+ ///What variant of griddle is this?
+ var/variant = 1
+ ///How many shit fits on the griddle?
+ var/max_items = 8
+
+/obj/machinery/griddle/Initialize()
+ . = ..()
+ grill_loop = new(src, FALSE)
+ if(isnum(variant))
+ variant = rand(1,3)
+ // Add expose_reagent to add pancakes. I tried already. https://github.com/BeeStation/BeeStation-Hornet/pull/8479
+ //RegisterSignal(src, COMSIG_ATOM_EXPOSE_REAGENT, PROC_REF(on_expose_reagent))
+
+/obj/machinery/griddle/Destroy()
+ QDEL_NULL(grill_loop)
+ return ..()
+
+/obj/machinery/griddle/crowbar_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(flags_1 & NODECONSTRUCT_1)
+ return
+ if(default_deconstruction_crowbar(I, ignore_panel = TRUE))
+ return
+ variant = rand(1,3)
+
+/* See https://github.com/BeeStation/BeeStation-Hornet/pull/8479
+/obj/machinery/griddle/proc/on_expose_reagent(atom/parent_atom, datum/reagent/exposing_reagent, reac_volume)
+ SIGNAL_HANDLER
+
+ if(griddled_objects.len >= max_items || !istype(exposing_reagent, /datum/reagent/consumable/pancakebatter) || reac_volume < 5)
+ return NONE //make sure you have space... it's actually batter... and a proper amount of it.
+
+ for(var/pancakes in 1 to FLOOR(reac_volume, 5) step 5) //this adds as many pancakes as you possibly could make, with 5u needed per pancake
+ var/obj/item/food/pancakes/raw/new_pancake = new(src)
+ new_pancake.pixel_x = rand(16,-16)
+ new_pancake.pixel_y = rand(16,-16)
+ AddToGrill(new_pancake)
+ if(griddled_objects.len >= max_items)
+ break
+ visible_message("[exposing_reagent] begins to cook on [src]. ")
+ return NONE
+*/
+
+/obj/machinery/griddle/crowbar_act(mob/living/user, obj/item/I)
+ . = ..()
+ return default_deconstruction_crowbar(I, ignore_panel = TRUE)
+
+/obj/machinery/griddle/attackby(obj/item/I, mob/user, params)
+ if(griddled_objects.len >= max_items)
+ to_chat(user, "[src] can't fit more items! ")
+ return
+ var/list/modifiers = params2list(params)
+ //Center the icon where the user clicked.
+ if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, ICON_Y))
+ return
+ if(user.transferItemToLoc(I, src, silent = FALSE))
+ //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
+ I.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2)
+ I.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2)
+ to_chat(user, "You place [I] on [src]. ")
+ AddToGrill(I, user)
+ update_appearance()
+ else
+ return ..()
+
+/obj/machinery/griddle/attack_hand(mob/user)
+ . = ..()
+ on = !on
+ if(on)
+ begin_processing()
+ else
+ end_processing()
+ update_appearance()
+ update_grill_audio()
+
+
+/obj/machinery/griddle/proc/AddToGrill(obj/item/item_to_grill, mob/user)
+ vis_contents += item_to_grill
+ griddled_objects += item_to_grill
+ item_to_grill.flags_1 |= IS_ONTOP_1
+ RegisterSignal(item_to_grill, COMSIG_MOVABLE_MOVED, PROC_REF(ItemMoved))
+ RegisterSignal(item_to_grill, COMSIG_GRILL_COMPLETED, PROC_REF(GrillCompleted))
+ RegisterSignal(item_to_grill, COMSIG_PARENT_QDELETING, PROC_REF(ItemRemovedFromGrill))
+ update_grill_audio()
+
+/obj/machinery/griddle/proc/ItemRemovedFromGrill(obj/item/I)
+ SIGNAL_HANDLER
+ I.flags_1 &= ~IS_ONTOP_1
+ griddled_objects -= I
+ vis_contents -= I
+ UnregisterSignal(I, list(COMSIG_GRILL_COMPLETED, COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING))
+ update_grill_audio()
+
+/obj/machinery/griddle/proc/ItemMoved(obj/item/I, atom/OldLoc, Dir, Forced)
+ SIGNAL_HANDLER
+ ItemRemovedFromGrill(I)
+
+/obj/machinery/griddle/proc/GrillCompleted(obj/item/source, atom/grilled_result)
+ SIGNAL_HANDLER
+ AddToGrill(grilled_result)
+
+/obj/machinery/griddle/proc/update_grill_audio()
+ if(on && griddled_objects.len)
+ grill_loop.start()
+ else
+ grill_loop.stop()
+
+/obj/machinery/griddle/wrench_act(mob/living/user, obj/item/I)
+ ..()
+ default_unfasten_wrench(user, I, 2 SECONDS)
+ return TRUE
+
+///Override to prevent storage dumping onto the griddle until I figure out how to navigate the mess that is storage code to allow me to nicely move the dumped objects onto the griddle.
+/obj/machinery/griddle/get_dumping_location(obj/item/storage/source, mob/user)
+ return
+
+/obj/machinery/griddle/process(delta_time)
+ ..()
+ for(var/i in griddled_objects)
+ var/obj/item/griddled_item = i
+ if(SEND_SIGNAL(griddled_item, COMSIG_ITEM_GRILLED, src, delta_time) & COMPONENT_HANDLED_GRILLING)
+ continue
+ griddled_item.fire_act(1000) //Hot hot hot!
+ if(prob(10))
+ visible_message("[griddled_item] doesn't seem to be doing too great on the [src]! ")
+
+/obj/machinery/griddle/update_icon_state()
+ icon_state = "griddle[variant]_[on ? "on" : "off"]"
+ return ..()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
index 426cd431cd1ff..3963ffa3cfb0e 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
@@ -9,10 +9,11 @@
icon = 'icons/obj/kitchen.dmi'
icon_state = "grill_open"
density = TRUE
+ pass_flags_self = PASSMACHINE | LETPASSTHROW // sorta like griddles
layer = BELOW_OBJ_LAYER
use_power = NO_POWER_USE
var/grill_fuel = 0
- var/obj/item/reagent_containers/food/grilled_item
+ var/obj/item/food/grilled_item
var/grill_time = 0
var/datum/looping_sound/grill/grill_loop
@@ -20,13 +21,20 @@
. = ..()
grill_loop = new(src, FALSE)
-/obj/machinery/grill/update_icon()
+/obj/machinery/grill/Destroy()
+ grilled_item = null
+ QDEL_NULL(grill_loop)
+ return ..()
+
+/obj/machinery/grill/update_icon_state()
if(grilled_item)
icon_state = "grill"
- else if(grill_fuel > 0)
+ return ..()
+ if(grill_fuel > 0)
icon_state = "grill_on"
- else
- icon_state = "grill_open"
+ return ..()
+ icon_state = "grill_open"
+ return ..()
/obj/machinery/grill/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/sheet/mineral/coal) || istype(I, /obj/item/stack/sheet/wood))
@@ -38,36 +46,36 @@
else
grill_fuel += (50 * stackamount)
S.use(stackamount)
- update_icon()
+ update_appearance()
return
if(I.resistance_flags & INDESTRUCTIBLE)
to_chat(user, "You don't feel it would be wise to grill [I]... ")
return ..()
- if(istype(I, /obj/item/reagent_containers))
- if(istype(I, /obj/item/reagent_containers/food) && !istype(I, /obj/item/reagent_containers/food/drinks))
- if(HAS_TRAIT(I, TRAIT_NODROP) || (I.item_flags & (ABSTRACT | DROPDEL)))
- return ..()
- else if(!grill_fuel)
- to_chat(user, "There is not enough fuel. ")
- return
- else if(!grilled_item && user.transferItemToLoc(I, src))
- grilled_item = I
- to_chat(user, "You put the [grilled_item] on [src]. ")
- update_icon()
- grill_loop.start()
- return
- else
- if(I.reagents.has_reagent(/datum/reagent/consumable/monkey_energy))
- grill_fuel += (20 * (I.reagents.get_reagent_amount(/datum/reagent/consumable/monkey_energy)))
- to_chat(user, "You pour the Monkey Energy in [src]. ")
- I.reagents.remove_reagent(/datum/reagent/consumable/monkey_energy, I.reagents.get_reagent_amount(/datum/reagent/consumable/monkey_energy))
- update_icon()
- return
+ if(istype(I, /obj/item/reagent_containers/glass))
+ if(I.reagents.has_reagent(/datum/reagent/consumable/monkey_energy))
+ grill_fuel += (20 * (I.reagents.get_reagent_amount(/datum/reagent/consumable/monkey_energy)))
+ to_chat(user, "You pour the Monkey Energy in [src]. ")
+ I.reagents.remove_reagent(/datum/reagent/consumable/monkey_energy, I.reagents.get_reagent_amount(/datum/reagent/consumable/monkey_energy))
+ update_appearance()
+ return
+ else if(IS_EDIBLE(I))
+ if(HAS_TRAIT(I, TRAIT_NODROP) || (I.item_flags & (ABSTRACT | DROPDEL)))
+ return ..()
+ else if(!grill_fuel)
+ to_chat(user, "There is not enough fuel. ")
+ return
+ else if(!grilled_item && user.transferItemToLoc(I, src))
+ grilled_item = I
+ RegisterSignal(grilled_item, COMSIG_GRILL_COMPLETED, PROC_REF(GrillCompleted))
+ to_chat(user, "You put the [grilled_item] on [src]. ")
+ update_appearance()
+ grill_loop.start()
+ return
..()
/obj/machinery/grill/process(delta_time)
..()
- update_icon()
+ update_appearance()
if(grill_fuel <= 0)
return
else
@@ -77,6 +85,7 @@
smoke.set_up(1, loc)
smoke.start()
if(grilled_item)
+ SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILLED, src, delta_time)
grill_time += delta_time
grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 0.5 * delta_time)
grill_fuel -= GRILL_FUELUSAGE_ACTIVE * delta_time
@@ -88,11 +97,6 @@
grilled_item = null
return ..()
-/obj/machinery/grill/Destroy()
- QDEL_NULL(grill_loop)
- grilled_item = null
- . = ..()
-
/obj/machinery/grill/handle_atom_del(atom/A)
if(A == grilled_item)
grilled_item = null
@@ -117,30 +121,21 @@
if(grilled_item)
to_chat(user, "You take out [grilled_item] from [src]. ")
grilled_item.forceMove(drop_location())
- update_icon()
+ update_appearance()
return
return ..()
/obj/machinery/grill/proc/finish_grill()
- switch(grill_time) //no 0-20 to prevent spam
- if(20 to 30)
- grilled_item.name = "lightly-grilled [grilled_item.name]"
- grilled_item.desc = "[grilled_item.desc] It's been lightly grilled."
- if(30 to 80)
- grilled_item.name = "grilled [grilled_item.name]"
- grilled_item.desc = "[grilled_item.desc] It's been grilled."
- grilled_item.foodtype |= FRIED
- if(80 to 100)
- grilled_item.name = "heavily grilled [grilled_item.name]"
- grilled_item.desc = "[grilled_item.desc] It's been heavily grilled."
- grilled_item.foodtype |= FRIED
- if(100 to INFINITY) //grill marks reach max alpha
- grilled_item.name = "Powerfully Grilled [grilled_item.name]"
- grilled_item.desc = "A [grilled_item.name]. Reminds you of your wife, wait, no, it's prettier!"
- grilled_item.foodtype |= FRIED
+ SEND_SIGNAL(grilled_item, COMSIG_GRILL_FOOD, grilled_item, grill_time)
grill_time = 0
+ UnregisterSignal(grilled_item, COMSIG_GRILL_COMPLETED, PROC_REF(GrillCompleted))
grill_loop.stop()
+///Called when a food is transformed by the grillable component
+/obj/machinery/grill/proc/GrillCompleted(obj/item/source, atom/grilled_result)
+ SIGNAL_HANDLER
+ grilled_item = grilled_result //use the new item!!
+
/obj/machinery/grill/unwrenched
anchored = FALSE
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index d60f250236763..1d09b6b72a037 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -29,8 +29,10 @@
/obj/machinery/processor/proc/process_food(datum/food_processor_process/recipe, atom/movable/what)
if (recipe.output && loc && !QDELETED(src))
- for(var/i = 0, i < rating_amount, i++)
+ var/cached_multiplier = (recipe.food_multiplier * rating_amount)
+ for(var/i in 1 to cached_multiplier)
new recipe.output(drop_location())
+
if (ismob(what))
var/mob/themob = what
themob.gib(TRUE,TRUE,TRUE)
diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm
index e80e29079a6e9..42bf986021265 100644
--- a/code/modules/food_and_drinks/recipes/processor_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm
@@ -2,11 +2,56 @@
var/input
var/output
var/time = 40
+ /// The machine required to do this recipe
var/required_machine = /obj/machinery/processor
+ /// Multiplied additional food made when processed
+ var/food_multiplier = 1
/datum/food_processor_process/meat
input = /obj/item/food/meat/slab
- output = /obj/item/food/meatball
+ output = /obj/item/food/raw_meatball
+ food_multiplier = 3
+
+/datum/food_processor_process/cutlet
+ input = /obj/item/food/meat/cutlet/plain
+ output = /obj/item/food/raw_meatball
+
+/datum/food_processor_process/meat/human
+ input = /obj/item/food/meat/slab/human
+ output = /obj/item/food/raw_meatball/human
+
+/datum/food_processor_process/cutlet/human
+ input = /obj/item/food/meat/cutlet/plain/human
+ output = /obj/item/food/raw_meatball/human
+
+/datum/food_processor_process/meat/corgi
+ input = /obj/item/food/meat/slab/corgi
+ output = /obj/item/food/raw_meatball/corgi
+
+/datum/food_processor_process/meat/xeno
+ input = /obj/item/food/meat/slab/xeno
+ output = /obj/item/food/raw_meatball/xeno
+
+/datum/food_processor_process/cutlet/xeno
+ input = /obj/item/food/meat/cutlet/xeno
+ output = /obj/item/food/raw_meatball/xeno
+
+/datum/food_processor_process/meat/bear
+ input = /obj/item/food/meat/slab/bear
+ output = /obj/item/food/raw_meatball/bear
+
+/datum/food_processor_process/cutlet/bear
+ input = /obj/item/food/meat/cutlet/bear
+ output = /obj/item/food/raw_meatball/bear
+
+/datum/food_processor_process/meat/chicken
+ input = /obj/item/food/meat/slab/chicken
+ output = /obj/item/food/raw_meatball/chicken
+ food_multiplier = 3
+
+/datum/food_processor_process/cutlet/chicken
+ input = /obj/item/food/meat/cutlet/chicken
+ output = /obj/item/food/raw_meatball/chicken
/datum/food_processor_process/bacon
input = /obj/item/food/meat/rawcutlet
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
index 6ecf1a02fcf8b..24bc4b08519b5 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
@@ -8,10 +8,10 @@
name = "Human burger"
reqs = list(
/obj/item/food/bun = 1,
- /obj/item/food/meat/steak/plain/human = 1
+ /obj/item/food/patty/human = 1
)
parts = list(
- /obj/item/food/meat/steak/plain/human = 1
+ /obj/item/food/patty = 1
)
result = /obj/item/food/burger/human
subcategory = CAT_BURGER
@@ -19,7 +19,7 @@
/datum/crafting_recipe/food/burger
name = "Burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/food/bun = 1
)
@@ -29,7 +29,7 @@
/datum/crafting_recipe/food/corgiburger
name = "Corgi burger"
reqs = list(
- /obj/item/food/meat/slab/corgi = 1,
+ /obj/item/food/patty/corgi = 1,
/obj/item/food/bun = 1
)
@@ -57,7 +57,7 @@
/datum/crafting_recipe/food/xenoburger
name = "Xeno burger"
reqs = list(
- /obj/item/food/meat/steak/xeno = 1,
+ /obj/item/food/patty/xeno = 1,
/obj/item/food/bun = 1
)
result = /obj/item/food/burger/xeno
@@ -66,7 +66,7 @@
/datum/crafting_recipe/food/bearger
name = "Bearger"
reqs = list(
- /obj/item/food/meat/steak/bear = 1,
+ /obj/item/food/patty/bear = 1,
/obj/item/food/bun = 1
)
result = /obj/item/food/burger/bearger
@@ -122,7 +122,7 @@
/datum/crafting_recipe/food/redburger
name = "Red burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/red = 1,
/obj/item/food/bun = 1
)
@@ -132,7 +132,7 @@
/datum/crafting_recipe/food/orangeburger
name = "Orange burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/orange = 1,
/obj/item/food/bun = 1
)
@@ -142,7 +142,7 @@
/datum/crafting_recipe/food/yellowburger
name = "Yellow burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/yellow = 1,
/obj/item/food/bun = 1
)
@@ -152,7 +152,7 @@
/datum/crafting_recipe/food/greenburger
name = "Green burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/green = 1,
/obj/item/food/bun = 1
)
@@ -162,7 +162,7 @@
/datum/crafting_recipe/food/blueburger
name = "Blue burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/blue = 1,
/obj/item/food/bun = 1
)
@@ -172,7 +172,7 @@
/datum/crafting_recipe/food/purpleburger
name = "Purple burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/purple = 1,
/obj/item/food/bun = 1
)
@@ -182,7 +182,7 @@
/datum/crafting_recipe/food/blackburger
name = "Black burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/black = 1,
/obj/item/food/bun = 1
)
@@ -192,7 +192,7 @@
/datum/crafting_recipe/food/whiteburger
name = "White burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/toy/crayon/white = 1,
/obj/item/food/bun = 1
)
@@ -211,7 +211,7 @@
/datum/crafting_recipe/food/bigbiteburger
name = "Big bite burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 3,
+ /obj/item/food/patty/plain = 3,
/obj/item/food/cheese/wedge = 2,
/obj/item/food/bun = 1
)
@@ -223,7 +223,7 @@
reqs = list(
/datum/reagent/consumable/sodiumchloride = 5,
/datum/reagent/consumable/blackpepper = 5,
- /obj/item/food/meat/steak/plain = 5,
+ /obj/item/food/patty/plain = 5,
/obj/item/food/grown/tomato = 4,
/obj/item/food/cheese/wedge = 3,
/obj/item/food/boiledegg = 1,
@@ -255,7 +255,7 @@
/datum/crafting_recipe/food/fivealarmburger
name = "Five alarm burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/food/grown/ghost_chili = 2,
/obj/item/food/bun = 1
)
@@ -313,7 +313,7 @@
/datum/crafting_recipe/food/cheeseburger
name = "Cheese Burger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1,
+ /obj/item/food/patty/plain = 1,
/obj/item/food/cheese/wedge = 1,
/obj/item/food/bun = 1
)
@@ -353,7 +353,7 @@
/datum/crafting_recipe/food/chickenburger
name = "Chicken Sandwich"
reqs = list(
- /obj/item/food/meat/steak/chicken = 1,
+ /obj/item/food/patty/chicken = 1,
/datum/reagent/consumable/mayonnaise = 5,
/obj/item/food/bun = 1
)
@@ -363,7 +363,7 @@
/datum/crafting_recipe/food/crazyhamburger
name = "Crazy Hamburger"
reqs = list(
- /obj/item/food/meat/steak/plain = 1, // we have no horse meat sadly
+ /obj/item/food/patty/plain = 1, // we have no horse meat sadly
/obj/item/food/grown/chili = 2,
/datum/reagent/consumable/cooking_oil = 20,
/obj/item/food/grown/nettle/death = 2, // closest thing to "grass of death"
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
index 41ad014451470..7b539a450b8c4 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -141,7 +141,7 @@
/obj/item/food/meatball = 1,
/obj/item/food/meat/cutlet = 2
)
- result = /obj/item/food/sausage
+ result = /obj/item/food/raw_sausage
subcategory = CAT_MEAT
/datum/crafting_recipe/food/nugget
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
index ca80830f284b8..88301a9d199bf 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -16,13 +16,13 @@
result = /obj/item/food/sandwich
subcategory = CAT_SANDWICH
-/datum/crafting_recipe/food/grilled_cheese_sandwich
+/datum/crafting_recipe/food/cheese_sandwich
name = "Cheese sandwich"
reqs = list(
/obj/item/food/breadslice/plain = 2,
/obj/item/food/cheese/wedge = 2
)
- result = /obj/item/food/grilled_cheese_sandwich
+ result = /obj/item/food/cheese_sandwich
subcategory = CAT_SANDWICH
/datum/crafting_recipe/food/slimesandwich
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 14e8832ff2606..694593f8e28f7 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -292,9 +292,9 @@
var/mob/living/L = A
L.adjust_fire_stacks(fire_stack_strength * 0.5 * delta_time)
L.IgniteMob()
- else if(istype(A, /obj/item) && DT_PROB(10, delta_time))
- var/obj/item/O = A
- O.microwave_act()
+ else if(istype(A, /obj/item))
+ var/obj/item/grilled_item = A
+ SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILLED, src, delta_time) //Not a big fan, maybe make this use fire_act() in the future.
/obj/structure/bonfire/process(delta_time)
if(needs_oxygen && !CheckOxygen())
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 98684b32144d5..533b9e7e7b714 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -129,7 +129,7 @@
return
to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]! ")
var/obj/created = new prize.equipment_path(loc)
- if (M.CanReach(src))
+ if (M.CanReach(src) && isitem(created))
M.put_in_hands(created)
SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]"))
. = TRUE
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index be290ffa21dad..33c789d845e56 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -766,7 +766,7 @@
else
set_stat(CONSCIOUS)
if(!is_blind())
- var/datum/component/blind_sense/B = GetComponent(/datum/component/blind_sense)
+ var/datum/component/blind_sense/B = GetComponent(/datum/component/blind_sense)
B?.RemoveComponent()
update_mobility()
update_damage_hud()
@@ -801,6 +801,9 @@
if(!getorganslot(ORGAN_SLOT_LIVER))
return FALSE
+ // We don't want walking husks god no
+ if(HAS_TRAIT(src, TRAIT_HUSK))
+ src.cure_husk()
return ..()
/mob/living/carbon/fully_heal(admin_revive = FALSE)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 75b9770b02f25..46fd45fd1bb3e 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -588,8 +588,9 @@
to_chat(C, "You feel a breath of fresh air, which is a sensation you don't recognise. ")
/mob/living/carbon/human/cuff_resist(obj/item/I)
- if(dna && dna.check_mutation(HULK))
- say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
+ if(HAS_TRAIT(src, TRAIT_FAST_CUFF_REMOVAL))
+ if(dna && dna.check_mutation(HULK))
+ say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
if(..(I, cuff_break = FAST_CUFFBREAK))
dropItemToGround(I)
else
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 8223885b6036f..52e0b37c4cc8c 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -8,7 +8,7 @@
meat = /obj/item/food/meat/slab/human/mutant/zombie
species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING)
inherent_traits = list(TRAIT_TOXIMMUNE,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,\
- TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH,TRAIT_NOCLONELOSS)
+ TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH,TRAIT_NOCLONELOSS, TRAIT_FAST_CUFF_REMOVAL)
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
mutanttongue = /obj/item/organ/tongue/zombie
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 4ef1b04c85762..55e8d04d80df4 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -93,6 +93,40 @@ There are several things that need to be remembered:
//damage overlays
update_damage_overlays()
+/mob/living/carbon/human/update_clothing(slot_flags)
+ if(slot_flags & ITEM_SLOT_BACK)
+ update_inv_back()
+ if(slot_flags & ITEM_SLOT_MASK)
+ update_inv_wear_mask()
+ if(slot_flags & ITEM_SLOT_NECK)
+ update_inv_neck()
+ if(slot_flags & ITEM_SLOT_HANDCUFFED)
+ update_inv_handcuffed()
+ if(slot_flags & ITEM_SLOT_LEGCUFFED)
+ update_inv_legcuffed()
+ if(slot_flags & ITEM_SLOT_BELT)
+ update_inv_belt()
+ if(slot_flags & ITEM_SLOT_ID)
+ update_inv_wear_id()
+ if(slot_flags & ITEM_SLOT_EARS)
+ update_inv_ears()
+ if(slot_flags & ITEM_SLOT_EYES)
+ update_inv_glasses()
+ if(slot_flags & ITEM_SLOT_GLOVES)
+ update_inv_gloves()
+ if(slot_flags & ITEM_SLOT_HEAD)
+ update_inv_head()
+ if(slot_flags & ITEM_SLOT_FEET)
+ update_inv_shoes()
+ if(slot_flags & ITEM_SLOT_OCLOTHING)
+ update_inv_wear_suit()
+ if(slot_flags & ITEM_SLOT_ICLOTHING)
+ update_inv_w_uniform()
+ if(slot_flags & ITEM_SLOT_SUITSTORE)
+ update_inv_s_store()
+ if(slot_flags & ITEM_SLOT_LPOCKET || slot_flags & ITEM_SLOT_RPOCKET)
+ update_inv_pockets()
+
/* --------------------------------------- */
//vvvvvv UPDATE_INV PROCS vvvvvv
diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm
index baa849705bb87..57a54c5f479ff 100644
--- a/code/modules/mob/update_icons.dm
+++ b/code/modules/mob/update_icons.dm
@@ -4,6 +4,9 @@
/mob/proc/regenerate_icons() //TODO: phase this out completely if possible
return
+/mob/proc/update_clothing(slot_flags)
+ return
+
/mob/proc/update_icons()
return
diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm
index 200faa172dabb..0660c0fb637de 100644
--- a/code/modules/photography/photos/frame.dm
+++ b/code/modules/photography/photos/frame.dm
@@ -4,7 +4,7 @@
name = "picture frame"
desc = "The perfect showcase for your favorite deathtrap memories."
icon = 'icons/obj/decals.dmi'
- custom_materials = null
+ custom_materials = list(/datum/material/wood = 2000)
flags_1 = 0
icon_state = "frame-empty"
result_path = /obj/structure/sign/picture_frame
@@ -65,6 +65,7 @@
desc = "Every time you look it makes you laugh."
icon = 'icons/obj/decals.dmi'
icon_state = "frame-empty"
+ custom_materials = list(/datum/material/wood = 2000)
layer = ABOVE_WINDOW_LAYER
var/obj/item/photo/framed
var/persistence_id
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 9e0ce641eeab8..ce4b100c3cfe0 100755
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -431,6 +431,7 @@
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50, 100)
volume = 100
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT)
reagent_flags = OPENCONTAINER
spillable = TRUE
var/obj/item/grinded
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 32454a53fea2f..f388dbfb71a8f 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -571,6 +571,14 @@
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+/datum/design/board/griddle
+ name = "Machine Design (Griddle)"
+ desc = "The circuit board for a Griddle."
+ id = "griddle"
+ build_path = /obj/item/circuitboard/machine/griddle
+ category = list ("Misc. Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
/datum/design/board/donksofttoyvendor
name = "Machine Design (Donksoft Toy Vendor Board)"
desc = "The circuit board for a Donksoft Toy Vendor."
@@ -723,3 +731,11 @@
build_path = /obj/item/electronics/genpop_interface
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
category = list("Misc. Machinery")
+
+/datum/design/board/sheetifier
+ name = "Sheetifier"
+ desc = "This machine turns weird things into sheets."
+ id = "sheetifier"
+ build_path = /obj/item/circuitboard/machine/sheetifier
+ category = list ("Misc. Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_ALL
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 9174d2dc8b990..c2de7f1b63abe 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -287,7 +287,7 @@
"dish_drive",
"fat_sucker",
"gibber",
- "gibber",
+ "griddle",
"microwave",
"monkey_recycler",
"processor",
@@ -451,6 +451,7 @@
"rcd_loaded",
"rpd_loaded",
"weldingmask",
+ "sheetifier"
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
diff --git a/code/modules/tgui/status_composers.dm b/code/modules/tgui/status_composers.dm
index 3384a89449f03..9a2200eda3b65 100644
--- a/code/modules/tgui/status_composers.dm
+++ b/code/modules/tgui/status_composers.dm
@@ -47,6 +47,14 @@
/proc/ui_status_user_is_abled(mob/user, atom/source)
return user.shared_ui_interaction(source)
+/// Return UI_INTERACTIVE if the user is strictly adjacent to the target atom, whether they can see it or not.
+/// Return UI_CLOSE otherwise.
+/proc/ui_status_user_strictly_adjacent(mob/user, atom/target)
+ if(get_dist(target, user) > 1)
+ return UI_CLOSE
+
+ return UI_INTERACTIVE
+
/// Returns a UI status such that advanced tool users will be able to update,
/// but everyone else can only watch.
/proc/ui_status_user_is_advanced_tool_user(mob/user, atom/source)
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 924f08a59d823..cc928a429e305 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -26,15 +26,23 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
name = "generic"
///Typepath of the product that is created when this record "sells"
var/product_path = null
+
///How many of this product we currently have
var/amount = 0
+
///How many we can store at maximum
var/max_amount = 0
+
///Does the item have a custom price override
var/custom_price
+
///Does the item have a custom premium price override
var/custom_premium_price
+ /// The category the product was in, if any.
+ /// Sourced directly from product_categories.
+ var/category
+
/**
* # vending machines
*
@@ -78,7 +86,19 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
*
* form should be list(/type/path = amount, /type/path2 = amount2)
*/
- var/list/products = list()
+ var/list/products = list()
+
+ /**
+ * List of products this machine sells, categorized.
+ * Can only be used as an alternative to `products`, not alongside it.
+ *
+ * Form should be list(
+ * "name" = "Category Name",
+ * "icon" = "UI Icon (Font Awesome or tgfont)",
+ * "products" = list(/type/path = amount, ...),
+ * )
+ */
+ var/list/product_categories = null
/**
* List of products this machine sells when you hack it
@@ -184,9 +204,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
. = ..()
wires = new /datum/wires/vending(src)
if(build_inv) //non-constructable vending machine
- build_inventory(products, product_records)
- build_inventory(contraband, hidden_records)
- build_inventory(premium, coin_records)
+ build_inventories()
slogan_list = splittext(product_slogans, ";")
// So not all machines speak at the exact same time.
@@ -219,12 +237,14 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
if(!component_parts)
return
+ build_products_from_categories()
+
product_records = list()
hidden_records = list()
coin_records = list()
- build_inventory(products, product_records, start_empty = TRUE)
- build_inventory(contraband, hidden_records, start_empty = TRUE)
- build_inventory(premium, coin_records, start_empty = TRUE)
+
+ build_inventories(start_empty = TRUE)
+
for(var/obj/item/vending_refill/VR in component_parts)
restock(VR)
@@ -271,7 +291,14 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
* * recordlist - the list containing /datum/data/vending_product datums
* * startempty - should we set vending_product record amount from the product list (so it's prefilled at roundstart)
*/
-/obj/machinery/vending/proc/build_inventory(list/productlist, list/recordlist, start_empty = FALSE)
+/obj/machinery/vending/proc/build_inventory(list/productlist, list/recordlist, list/categories, start_empty = FALSE)
+
+ var/list/product_to_category = list()
+ for (var/list/category as anything in categories)
+ var/list/products = category["products"]
+ for (var/product_key in products)
+ product_to_category[product_key] = category
+
for(var/typepath in productlist)
var/amount = productlist[typepath]
if(isnull(amount))
@@ -286,7 +313,32 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
R.max_amount = amount
R.custom_price = initial(temp.custom_price)
R.custom_premium_price = initial(temp.custom_premium_price)
+ R.category = product_to_category[typepath]
recordlist += R
+
+/obj/machinery/vending/proc/build_inventories(start_empty)
+ build_inventory(products, product_records, product_categories, start_empty)
+ build_inventory(contraband, hidden_records, create_categories_from(contraband, "mask", "Contraband"), start_empty)
+ build_inventory(premium, coin_records, create_categories_from(premium, "coins", "Premium"), start_empty)
+
+/obj/machinery/vending/proc/create_categories_from(products, icon, name)
+ return list(list(
+ "name" = name,
+ "icon" = icon,
+ "products" = products,
+ ))
+
+/obj/machinery/vending/proc/build_products_from_categories()
+ if (isnull(product_categories))
+ return
+
+ products = list()
+
+ for (var/list/category in product_categories)
+ var/list/category_products = category["products"]
+ for (var/product_key in category_products)
+ products[product_key] += category_products[product_key]
+
/**
* Refill a vending machine from a refill canister
*
@@ -303,9 +355,25 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
if (!canister.premium)
canister.premium = premium.Copy()
. = 0
- . += refill_inventory(canister.products, product_records)
+ if (isnull(canister.product_categories) && !isnull(product_categories))
+ canister.product_categories = product_categories.Copy()
+
+ if (!isnull(canister.product_categories))
+ var/list/products_unwrapped = list()
+ for (var/list/category as anything in canister.product_categories)
+ var/list/products = category["products"]
+ for (var/product_key in products)
+ products_unwrapped[product_key] += products[product_key]
+
+ . += refill_inventory(products_unwrapped, product_records)
+ else
+ . += refill_inventory(canister.products, product_records)
+
. += refill_inventory(canister.contraband, hidden_records)
. += refill_inventory(canister.premium, coin_records)
+
+ return .
+
/**
* Refill our inventory from the passed in product list into the record list
*
@@ -335,7 +403,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
if (!R)
CRASH("Constructible vending machine did not have a refill canister")
- R.products = unbuild_inventory(product_records)
+ unbuild_inventory_into(product_records, R.products, R.product_categories)
R.contraband = unbuild_inventory(hidden_records)
R.premium = unbuild_inventory(coin_records)
@@ -348,6 +416,50 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
var/datum/data/vending_product/record = R
.[record.product_path] += record.amount
+/// Put stuff in product_categories if the products have a category, otherwise put them in products
+/obj/machinery/vending/proc/unbuild_inventory_into(list/product_records, list/products, list/product_categories)
+ products?.Cut()
+ product_categories?.Cut()
+
+ var/others_have_category = null
+
+ var/list/categories_to_index = list()
+
+ for (var/datum/data/vending_product/record as anything in product_records)
+ var/list/category = record.category
+ var/has_category = !isnull(category)
+
+ if (isnull(others_have_category))
+ others_have_category = has_category
+ else if (others_have_category != has_category)
+ if (has_category)
+ WARNING("[record.product_path] in [type] has a category, but other products don't")
+ else
+ WARNING("[record.product_path] in [type] does not have a category, but other products do")
+
+ continue
+
+ if (has_category)
+ var/index = categories_to_index.Find(category)
+
+ if (index)
+ var/list/category_in_list = product_categories[index]
+ var/list/products_in_category = category_in_list["products"]
+ products_in_category[record.product_path] += record.amount
+ else
+ categories_to_index += list(category)
+ index = categories_to_index.len
+
+ var/list/category_clone = category.Copy()
+
+ var/list/initial_product_list = list()
+ initial_product_list[record.product_path] = record.amount
+ category_clone["products"] = initial_product_list
+
+ product_categories += list(category_clone)
+ else
+ products[record.product_path] = record.amount
+
/obj/machinery/vending/crowbar_act(mob/living/user, obj/item/I)
if(!component_parts)
return FALSE
@@ -647,45 +759,57 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, "Vending")
+ ui = new(user, src, "Vending", name)
ui.open()
/obj/machinery/vending/ui_static_data(mob/user)
- . = list()
- .["onstation"] = onstation
- .["department_bitflag"] = dept_req_for_free
- .["product_records"] = list()
- for (var/datum/data/vending_product/R in product_records)
- var/list/data = list(
- path = replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-"),
- name = R.name,
- price = R.custom_price || default_price,
- max_amount = R.max_amount,
- ref = REF(R)
- )
- .["product_records"] += list(data)
- .["coin_records"] = list()
- for (var/datum/data/vending_product/R in coin_records)
- var/list/data = list(
- path = replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-"),
- name = R.name,
- price = R.custom_premium_price || extra_price,
- max_amount = R.max_amount,
- ref = REF(R),
- premium = TRUE
- )
- .["coin_records"] += list(data)
- .["hidden_records"] = list()
- for (var/datum/data/vending_product/R in hidden_records)
- var/list/data = list(
- path = replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-"),
- name = R.name,
- price = R.custom_price || default_price,
- max_amount = R.max_amount,
- ref = REF(R),
- premium = TRUE
+ var/list/data = list()
+ data["onstation"] = onstation
+ data["department_bitflag"] = dept_req_for_free
+ data["product_records"] = list()
+
+ var/list/categories = list()
+
+ data["product_records"] = collect_records_for_static_data(product_records, categories)
+ data["coin_records"] = collect_records_for_static_data(coin_records, categories, premium = TRUE)
+ data["hidden_records"] = collect_records_for_static_data(hidden_records, categories, premium = TRUE)
+
+ data["categories"] = categories
+
+ return data
+
+/obj/machinery/vending/proc/collect_records_for_static_data(list/records, list/categories, premium)
+ var/static/list/default_category = list(
+ "name" = "Products",
+ "icon" = "cart-shopping",
+ )
+
+ var/list/out_records = list()
+
+ for (var/datum/data/vending_product/record as anything in records)
+ var/list/static_record = list(
+ path = replacetext(replacetext("[record.product_path]", "/obj/item/", ""), "/", "-"),
+ name = record.name,
+ price = premium ? (record.custom_premium_price || extra_price) : (record.custom_price || default_price),
+ max_amount = record.max_amount,
+ ref = REF(record),
)
- .["hidden_records"] += list(data)
+
+ var/list/category = record.category || default_category
+ if (!isnull(category))
+ if (!(category["name"] in categories))
+ categories[category["name"]] = list(
+ "icon" = category["icon"],
+ )
+
+ static_record["category"] = category["name"]
+
+ if (premium)
+ static_record["premium"] = TRUE
+
+ out_records += list(static_record)
+
+ return out_records
/obj/machinery/vending/ui_data(mob/user)
. = list()
@@ -711,8 +835,13 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
if(R)
.["user"]["job"] = R.fields["rank"]
.["stock"] = list()
- for (var/datum/data/vending_product/R in product_records + coin_records + hidden_records)
- .["stock"]["[replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-")]"] = R.amount
+ for (var/datum/data/vending_product/product_record in product_records + coin_records + hidden_records)
+ var/list/product_data = list(
+ name = product_record.name,
+ amount = product_record.amount,
+ )
+
+ .["stock"][product_record.name] = product_data
.["extended_inventory"] = extended_inventory
/obj/machinery/vending/ui_act(action, params)
@@ -721,83 +850,141 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
return
switch(action)
if("vend")
- if(!vend_ready)
- return
- if(panel_open)
- to_chat(usr, "The vending machine cannot dispense products while its service panel is open! ")
- return
- vend_ready = FALSE //One thing at a time!!
- var/datum/data/vending_product/R = locate(params["ref"])
- var/list/record_to_check = product_records + coin_records
- if(extended_inventory)
- record_to_check = product_records + coin_records + hidden_records
- if(!R || !istype(R) || !R.product_path)
- vend_ready = TRUE
- return
- var/price_to_use = default_price
- if(R.custom_price)
- price_to_use = R.custom_price
- if(R in hidden_records)
- if(!extended_inventory)
- vend_ready = TRUE
- return
- else if (!(R in record_to_check))
- vend_ready = TRUE
- message_admins("Vending machine exploit attempted by [ADMIN_LOOKUPFLW(usr)]!")
- return
- if (R.amount <= 0)
- say("Sold out of [R.name].")
- flick(icon_deny,src)
- vend_ready = TRUE
- return
- if(onstation && ishuman(usr))
- var/mob/living/carbon/human/H = usr
- var/obj/item/card/id/C = H.get_idcard(TRUE)
+ . = vend(params)
+ if("select_colors")
+ . = select_colors(params)
- var/datum/bank_account/account = C?.registered_account
- if(account?.account_job && (account?.active_departments & dept_req_for_free))
- price_to_use = 0
- if(coin_records.Find(R))
- price_to_use = R.custom_premium_price ? R.custom_premium_price : extra_price
- if(price_to_use)
- if(!H.spend_cash(price_to_use))
- var/additional_message = ""
- if(!C)
- additional_message += "No ID card found. "
- if(!C?.registered_account)
- additional_message += "No account found. "
- say("[additional_message]Not enough funds to purchase [R.name].")
- flick(icon_deny,src)
- vend_ready = TRUE
- return
+/obj/machinery/vending/proc/can_vend(user, silent=FALSE)
+ . = FALSE
+ if(!vend_ready)
+ return
+ if(panel_open)
+ to_chat(user, "The vending machine cannot dispense products while its service panel is open! ")
+ return
+ return TRUE
- // each department (seller_department) will earn the profit
- if(price_to_use && seller_department)
- var/list/dept_list = SSeconomy.get_dept_id_by_bitflag(seller_department)
- if(length(dept_list))
- price_to_use = round(price_to_use/length(dept_list))
- for(var/datum/bank_account/department/D in dept_list)
- if(D)
- D.adjust_money(price_to_use)
-
- if(last_shopper != REF(usr) || COOLDOWN_FINISHED(src, purchase_message_cooldown))
- say("Thank you for shopping with [src]!")
- COOLDOWN_START(src, purchase_message_cooldown, (5 SECONDS))
- //This is not the best practice, but it's safe enough here since the chances of two people using a machine with the same ref in 5 seconds is fuck low
- last_shopper = REF(usr)
- use_power(5)
- if(icon_vend) //Show the vending animation if needed
- flick(icon_vend,src)
- playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3)
- var/obj/item/vended_item = new R.product_path(get_turf(src))
- R.amount--
- if(usr.CanReach(src) && usr.put_in_hands(vended_item))
- to_chat(usr, "You take [R.name] out of the slot. ")
- else
- to_chat(usr, "[capitalize(R.name)] falls onto the floor! ")
- . = TRUE
- SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[R.product_path]"))
+/obj/machinery/vending/proc/select_colors(list/params)
+ . = TRUE
+ if(!can_vend(usr))
+ return
+ var/datum/data/vending_product/product = locate(params["ref"])
+ var/atom/fake_atom = product.product_path
+
+ var/list/allowed_configs = list()
+ var/config = initial(fake_atom.greyscale_config)
+ if(!config)
+ return
+ allowed_configs += "[config]"
+ if(ispath(fake_atom, /obj/item))
+ var/obj/item/item = fake_atom
+ if(initial(item.greyscale_config_worn))
+ allowed_configs += "[initial(item.greyscale_config_worn)]"
+ if(initial(item.greyscale_config_inhand_left))
+ allowed_configs += "[initial(item.greyscale_config_inhand_left)]"
+ if(initial(item.greyscale_config_inhand_right))
+ allowed_configs += "[initial(item.greyscale_config_inhand_right)]"
+
+ var/datum/greyscale_modify_menu/menu = new(
+ src, usr, allowed_configs, CALLBACK(src, PROC_REF(vend_greyscale), params),
+ starting_icon_state=initial(fake_atom.icon_state),
+ starting_config=initial(fake_atom.greyscale_config),
+ starting_colors=initial(fake_atom.greyscale_colors)
+ )
+ menu.ui_interact(usr)
+
+/obj/machinery/vending/proc/vend_greyscale(list/params, datum/greyscale_modify_menu/menu)
+ if(usr != menu.user)
+ return
+ if(!menu.target.can_interact(usr))
+ return
+ vend(params, menu.split_colors)
+
+/obj/machinery/vending/proc/vend(list/params, list/greyscale_colors)
+ . = TRUE
+ if(!can_vend(usr))
+ return
+ vend_ready = FALSE //One thing at a time!!
+ var/datum/data/vending_product/R = locate(params["ref"])
+ var/list/record_to_check = product_records + coin_records
+ if(extended_inventory)
+ record_to_check = product_records + coin_records + hidden_records
+ if(!R || !istype(R) || !R.product_path)
+ vend_ready = TRUE
+ return
+ var/price_to_use = default_price
+ if(R.custom_price)
+ price_to_use = R.custom_price
+ if(R in hidden_records)
+ if(!extended_inventory)
+ vend_ready = TRUE
+ return
+ else if (!(R in record_to_check))
+ vend_ready = TRUE
+ message_admins("Vending machine exploit attempted by [ADMIN_LOOKUPFLW(usr)]!")
+ return
+ if (R.amount <= 0)
+ say("Sold out of [R.name].")
+ flick(icon_deny,src)
+ vend_ready = TRUE
+ return
+ if(onstation)
+ var/obj/item/card/id/C
+ if(isliving(usr))
+ var/mob/living/L = usr
+ C = L.get_idcard(TRUE)
+ if(!C)
+ say("No card found.")
+ flick(icon_deny,src)
+ vend_ready = TRUE
+ return
+ else if (!C.registered_account)
+ say("No account found.")
+ flick(icon_deny,src)
+ vend_ready = TRUE
+ return
+ else if(!C.registered_account.account_job)
+ say("Departmental accounts have been blacklisted from personal expenses due to embezzlement.")
+ flick(icon_deny, src)
+ vend_ready = TRUE
+ return
+
+ var/datum/bank_account/account = C.registered_account
+ if(account.account_job && (account.active_departments & dept_req_for_free))
+ price_to_use = 0
+ if(coin_records.Find(R) || hidden_records.Find(R))
+ price_to_use = R.custom_premium_price ? R.custom_premium_price : extra_price
+ if(price_to_use && !account.adjust_money(-price_to_use))
+ say("You do not possess the funds to purchase [R.name].")
+ flick(icon_deny,src)
vend_ready = TRUE
+ return
+
+ if(price_to_use && seller_department)
+ var/list/dept_list = SSeconomy.get_dept_id_by_bitflag(seller_department)
+ if(length(dept_list))
+ price_to_use = round(price_to_use/length(dept_list))
+ for(var/datum/bank_account/department/D in dept_list)
+ if(D)
+ D.adjust_money(price_to_use)
+
+ if(last_shopper != usr || purchase_message_cooldown < world.time)
+ say("Thank you for shopping with [src]!")
+ purchase_message_cooldown = world.time + 5 SECONDS
+ last_shopper = usr
+ use_power(5)
+ if(icon_vend) //Show the vending animation if needed
+ flick(icon_vend,src)
+ playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3)
+ var/obj/item/vended_item = new R.product_path(get_turf(src))
+ if(greyscale_colors)
+ vended_item.set_greyscale(colors=greyscale_colors)
+ R.amount--
+ if(usr.CanReach(src) && usr.put_in_hands(vended_item))
+ to_chat(usr, "You take [R.name] out of the slot. ")
+ else
+ to_chat(usr, "[capitalize(R.name)] falls onto the floor! ")
+ SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[R.product_path]"))
+ vend_ready = TRUE
/obj/machinery/vending/process(delta_time)
if(machine_stat & (BROKEN|NOPOWER))
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index 402ae979b0c6a..933d7e6d82f20 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -41,6 +41,7 @@
/obj/item/clothing/under/dress/skirt = 1,
/obj/item/clothing/accessory/waistcoat = 1,
/obj/item/clothing/under/suit/black = 1,
+ /obj/item/clothing/under/suit/relaxed = 1,
/obj/item/clothing/head/that = 1,
/obj/item/clothing/under/costume/kilt = 1,
/obj/item/clothing/head/beret/vintage = 1,
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index 68986c1a8b413..a04b245598aa1 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -1,153 +1,204 @@
-//DON'T FORGET TO CHANGE THE REFILL SIZE IF YOU CHANGE THE MACHINE'S CONTENTS!
/obj/machinery/vending/clothing
- name = "ClothesMate" //renamed to make the slogan rhyme
+ name = "ClothesMate"
desc = "A vending machine for clothing."
icon_state = "clothes"
icon_deny = "clothes-deny"
product_slogans = "Dress for success!;Prepare to look swagalicious!;Look at all this swag!;Why leave style up to fate? Use the ClothesMate!"
vend_reply = "Thank you for using the ClothesMate!"
light_color = LIGHT_COLOR_GREEN
- products = list(/obj/item/clothing/head/beanie = 3,
- /obj/item/clothing/head/beanie/black = 3,
- /obj/item/clothing/head/beanie/red = 3,
- /obj/item/clothing/head/beanie/green = 3,
- /obj/item/clothing/head/beanie/darkblue = 3,
- /obj/item/clothing/head/beanie/purple = 3,
- /obj/item/clothing/head/beanie/yellow = 3,
- /obj/item/clothing/head/beanie/orange = 3,
- /obj/item/clothing/head/beanie/cyan = 3,
- /obj/item/clothing/head/beanie/christmas = 3,
- /obj/item/clothing/head/beanie/striped = 3,
- /obj/item/clothing/head/beanie/stripedred = 3,
- /obj/item/clothing/head/beanie/stripedblue = 3,
- /obj/item/clothing/head/beanie/stripedgreen = 3,
- /obj/item/clothing/head/beanie/rasta = 3,
- /obj/item/clothing/head/beret = 3,
- /obj/item/clothing/head/beret/black = 3,
- /obj/item/clothing/head/kippah = 3,
- /obj/item/clothing/head/taqiyahred = 3,
- /obj/item/clothing/gloves/fingerless = 2,
- /obj/item/clothing/neck/scarf/pink = 3,
- /obj/item/clothing/neck/scarf/red = 3,
- /obj/item/clothing/neck/scarf/green = 3,
- /obj/item/clothing/neck/scarf/darkblue = 3,
- /obj/item/clothing/neck/scarf/purple = 3,
- /obj/item/clothing/neck/scarf/yellow = 3,
- /obj/item/clothing/neck/scarf/orange = 3,
- /obj/item/clothing/neck/scarf/cyan = 3,
- /obj/item/clothing/neck/scarf = 3,
- /obj/item/clothing/neck/scarf/black = 3,
- /obj/item/clothing/neck/scarf/zebra = 3,
- /obj/item/clothing/neck/scarf/christmas = 3,
- /obj/item/clothing/neck/stripedredscarf = 3,
- /obj/item/clothing/neck/stripedbluescarf = 3,
- /obj/item/clothing/neck/stripedgreenscarf = 3,
- /obj/item/clothing/neck/tie/blue = 3,
- /obj/item/clothing/neck/tie/red = 3,
- /obj/item/clothing/neck/tie/black = 3,
- /obj/item/clothing/neck/tie/horrible = 3,
- /obj/item/storage/belt/fannypack = 3,
- /obj/item/storage/belt/fannypack/blue = 3,
- /obj/item/storage/belt/fannypack/red = 3,
- /obj/item/clothing/ears/headphones = 2,
- /obj/item/clothing/under/misc/overalls = 2,
- /obj/item/clothing/under/pants/jeans = 2,
- /obj/item/clothing/under/pants/classicjeans = 2,
- /obj/item/clothing/under/pants/camo = 2,
- /obj/item/clothing/under/pants/blackjeans = 2,
- /obj/item/clothing/under/pants/khaki = 2,
- /obj/item/clothing/under/pants/white = 2,
- /obj/item/clothing/under/pants/red = 2,
- /obj/item/clothing/under/pants/black = 2,
- /obj/item/clothing/under/pants/tan = 2,
- /obj/item/clothing/under/pants/track = 2,
- /obj/item/clothing/suit/hooded/hoodie = 3,
- /obj/item/clothing/suit/hooded/hoodie/blue = 3,
- /obj/item/clothing/suit/hooded/hoodie/green = 3,
- /obj/item/clothing/suit/hooded/hoodie/orange = 3,
- /obj/item/clothing/suit/hooded/hoodie/pink = 3,
- /obj/item/clothing/suit/hooded/hoodie/red = 3,
- /obj/item/clothing/suit/hooded/hoodie/black = 3,
- /obj/item/clothing/suit/hooded/hoodie/yellow = 3,
- /obj/item/clothing/suit/hooded/hoodie/darkblue = 3,
- /obj/item/clothing/suit/hooded/hoodie/teal = 3,
- /obj/item/clothing/suit/hooded/hoodie/purple = 3,
- /obj/item/clothing/shoes/winterboots = 3,
- /obj/item/clothing/shoes/jackboots_replica = 3,
- /obj/item/clothing/shoes/sneakers/black = 4,
- /obj/item/clothing/shoes/sneakers/brown = 4,
- /obj/item/clothing/shoes/sneakers/yellow = 4,
- /obj/item/clothing/shoes/sneakers/green = 4,
- /obj/item/clothing/shoes/sneakers/blue = 4,
- /obj/item/clothing/shoes/sneakers/purple = 4,
- /obj/item/clothing/shoes/sneakers/red = 4,
- /obj/item/clothing/shoes/sneakers/orange = 4,
- /obj/item/clothing/shoes/sneakers/white = 4,
- /obj/item/clothing/head/wig/natural = 4,
- /obj/item/clothing/under/dress/skirt/plaid = 2,
- /obj/item/clothing/under/dress/skirt/plaid/blue = 2,
- /obj/item/clothing/under/dress/skirt/plaid/green = 2,
- /obj/item/clothing/under/dress/skirt/plaid/purple = 2,
- /obj/item/clothing/under/dress/skirt = 2,
- /obj/item/clothing/under/dress/skirt/blue = 2,
- /obj/item/clothing/under/dress/skirt/red = 2,
- /obj/item/clothing/under/dress/skirt/purple = 2,
- /obj/item/clothing/suit/jacket = 2,
- /obj/item/clothing/suit/jacket/puffer/vest = 2,
- /obj/item/clothing/suit/jacket/puffer = 2,
- /obj/item/clothing/suit/toggle/softshell = 2,
- /obj/item/clothing/suit/jacket/letterman = 2,
- /obj/item/clothing/suit/jacket/letterman_red = 2,
- /obj/item/clothing/glasses/sunglasses = 2,
- /obj/item/clothing/glasses/regular = 2,
- /obj/item/clothing/glasses/regular/jamjar = 1,
- /obj/item/clothing/glasses/orange = 1,
- /obj/item/clothing/glasses/red = 1,
- /obj/item/clothing/under/suit/navy = 1,
- /obj/item/clothing/under/suit/black_really = 1,
- /obj/item/clothing/under/suit/burgundy = 1,
- /obj/item/clothing/under/suit/charcoal = 1,
- /obj/item/clothing/under/suit/white = 1,
- /obj/item/clothing/under/suit/sl = 1,
- /obj/item/clothing/accessory/waistcoat = 1,
- /obj/item/clothing/head/that = 1,
- /obj/item/clothing/head/fedora = 1,
- /obj/item/clothing/glasses/monocle = 1,
- /obj/item/clothing/head/sombrero = 1,
- /obj/item/clothing/suit/poncho = 1,
- /obj/item/clothing/head/cowboy = 1,
- /obj/item/clothing/under/costume/kilt = 1,
- /obj/item/clothing/under/dress/sundress = 1,
- /obj/item/clothing/under/dress/striped = 1,
- /obj/item/clothing/under/dress/sailor = 1,
- /obj/item/clothing/under/dress/redeveninggown = 1,
- /obj/item/clothing/under/dress/blacktango = 1,
- /obj/item/clothing/suit/ianshirt = 1,
- /obj/item/clothing/suit/hooded/wintercoat/old = 3,
- /obj/item/clothing/suit/hooded/wintercoat/white = 3,
- /obj/item/clothing/shoes/laceup = 2,
- /obj/item/clothing/shoes/sandal = 2,
- /obj/item/clothing/suit/jacket/miljacket = 1,
- /obj/item/clothing/suit/apron/purple_bartender = 2,
- /obj/item/clothing/under/rank/civilian/bartender/purple = 2)
- contraband = list(/obj/item/clothing/under/syndicate/tacticool = 1,
- /obj/item/clothing/mask/balaclava = 1,
- /obj/item/clothing/head/ushanka = 1,
- /obj/item/clothing/under/costume/soviet = 1,
- /obj/item/storage/belt/fannypack/black = 2,
- /obj/item/clothing/suit/jacket/letterman_syndie = 1,
- /obj/item/clothing/under/costume/jabroni = 1,
- /obj/item/clothing/suit/vapeshirt = 1,
- /obj/item/clothing/under/costume/geisha = 1)
- premium = list(/obj/item/clothing/under/suit/checkered = 1,
- /obj/item/clothing/suit/jacket/leather = 1,
- /obj/item/clothing/suit/jacket/leather/overcoat = 1,
- /obj/item/clothing/under/pants/mustangjeans = 1,
- /obj/item/clothing/neck/necklace/dope = 3,
- /obj/item/clothing/suit/jacket/letterman_nanotrasen = 1)
+ product_categories = list(
+ list(
+ "name" = "Head",
+ "icon" = "hat-cowboy",
+ "products" = list(
+ /obj/item/clothing/head/wig/natural = 4,
+ /obj/item/clothing/head/beanie = 3,
+ /obj/item/clothing/head/beanie/black = 3,
+ /obj/item/clothing/head/beanie/red = 3,
+ /obj/item/clothing/head/beanie/green = 3,
+ /obj/item/clothing/head/beanie/darkblue = 3,
+ /obj/item/clothing/head/beanie/purple = 3,
+ /obj/item/clothing/head/beanie/yellow = 3,
+ /obj/item/clothing/head/beanie/orange = 3,
+ /obj/item/clothing/head/beanie/cyan = 3,
+ /obj/item/clothing/head/beanie/christmas = 3,
+ /obj/item/clothing/head/beanie/striped = 3,
+ /obj/item/clothing/head/beanie/stripedred = 3,
+ /obj/item/clothing/head/beanie/stripedblue = 3,
+ /obj/item/clothing/head/beanie/stripedgreen = 3,
+ /obj/item/clothing/head/beanie/rasta = 3,
+ /obj/item/clothing/head/beret = 3,
+ /obj/item/clothing/head/beret/black = 3,
+ /obj/item/clothing/neck/scarf/pink = 3,
+ /obj/item/clothing/neck/scarf/red = 3,
+ /obj/item/clothing/neck/scarf/green = 3,
+ /obj/item/clothing/neck/scarf/darkblue = 3,
+ /obj/item/clothing/neck/scarf/purple = 3,
+ /obj/item/clothing/neck/scarf/yellow = 3,
+ /obj/item/clothing/neck/scarf/orange = 3,
+ /obj/item/clothing/neck/scarf/cyan = 3,
+ /obj/item/clothing/neck/scarf = 3,
+ /obj/item/clothing/neck/scarf/black = 3,
+ /obj/item/clothing/neck/scarf/zebra = 3,
+ /obj/item/clothing/neck/scarf/christmas = 3,
+ /obj/item/clothing/neck/stripedredscarf = 3,
+ /obj/item/clothing/neck/stripedbluescarf = 3,
+ /obj/item/clothing/neck/stripedgreenscarf = 3,
+ /obj/item/clothing/neck/tie/blue = 3,
+ /obj/item/clothing/neck/tie/red = 3,
+ /obj/item/clothing/neck/tie/black = 3,
+ /obj/item/clothing/neck/tie/horrible = 3,
+ /obj/item/clothing/head/kippah = 3,
+ /obj/item/clothing/head/taqiyahred = 3,
+ /obj/item/clothing/head/that = 1,
+ /obj/item/clothing/head/fedora = 1,
+ /obj/item/clothing/head/cowboy = 1,
+ /obj/item/clothing/head/sombrero = 1,
+
+ ),
+ ),
+
+ list(
+ "name" = "Accessories",
+ "icon" = "glasses",
+ "products" = list(
+ /obj/item/clothing/accessory/waistcoat = 1,
+ /obj/item/clothing/glasses/regular = 2,
+ /obj/item/clothing/glasses/regular/jamjar = 1,
+ /obj/item/clothing/glasses/regular/circle = 1,
+ /obj/item/clothing/glasses/sunglasses = 2,
+ /obj/item/clothing/glasses/sunglasses/circle_sunglasses = 1,
+ /obj/item/clothing/glasses/orange = 1,
+ /obj/item/clothing/glasses/red = 1,
+ /obj/item/clothing/gloves/fingerless = 2,
+ /obj/item/storage/belt/fannypack = 3,
+ /obj/item/storage/belt/fannypack/blue = 3,
+ /obj/item/storage/belt/fannypack/red = 3,
+ ),
+ ),
+
+ list(
+ "name" = "Under",
+ "icon" = "shirt",
+ "products" = list(
+ /obj/item/clothing/under/pants/jeans = 2,
+ /obj/item/clothing/under/pants/classicjeans = 2,
+ /obj/item/clothing/under/pants/blackjeans = 2,
+ /obj/item/clothing/under/pants/khaki = 2,
+ /obj/item/clothing/under/pants/white = 2,
+ /obj/item/clothing/under/pants/red = 2,
+ /obj/item/clothing/under/pants/black = 2,
+ /obj/item/clothing/under/pants/tan = 2,
+ /obj/item/clothing/under/dress/sundress = 1,
+ /obj/item/clothing/under/dress/blacktango = 1,
+ /obj/item/clothing/under/dress/redeveninggown = 1,
+ /obj/item/clothing/under/dress/skirt/plaid = 2,
+ /obj/item/clothing/under/dress/skirt/plaid/blue = 2,
+ /obj/item/clothing/under/dress/skirt/plaid/green = 2,
+ /obj/item/clothing/under/dress/skirt/plaid/purple = 2,
+ /obj/item/clothing/under/dress/skirt = 2,
+ /obj/item/clothing/under/dress/skirt/blue = 2,
+ /obj/item/clothing/under/dress/skirt/red = 2,
+ /obj/item/clothing/under/dress/skirt/purple = 2,
+ /obj/item/clothing/under/misc/overalls = 2,
+ /obj/item/clothing/under/pants/camo = 2,
+ /obj/item/clothing/under/pants/track = 2,
+ /obj/item/clothing/under/costume/kilt = 1,
+ /obj/item/clothing/under/dress/striped = 1,
+ /obj/item/clothing/under/dress/sailor = 1,
+ ),
+ ),
+
+ list(
+ "name" = "Suits & Skirts",
+ "icon" = "vest",
+ "products" = list(
+ /obj/item/clothing/suit/hooded/wintercoat/old = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/white = 3,
+ /obj/item/clothing/under/suit/navy = 1,
+ /obj/item/clothing/under/suit/black_really = 1,
+ /obj/item/clothing/under/suit/burgundy = 1,
+ /obj/item/clothing/under/suit/charcoal = 1,
+ /obj/item/clothing/under/suit/white = 1,
+ /obj/item/clothing/under/suit/sl = 1,
+ /obj/item/clothing/under/suit/tan = 1,
+ /obj/item/clothing/suit/jacket = 2,
+ /obj/item/clothing/suit/jacket/puffer/vest = 2,
+ /obj/item/clothing/suit/jacket/puffer = 2,
+ /obj/item/clothing/suit/toggle/softshell = 2,
+ /obj/item/clothing/suit/jacket/letterman = 2,
+ /obj/item/clothing/suit/jacket/letterman_red = 2,
+ /obj/item/clothing/suit/poncho = 1,
+ /obj/item/clothing/suit/jacket/miljacket = 1,
+ /obj/item/clothing/suit/hooded/hoodie = 3,
+ /obj/item/clothing/suit/hooded/hoodie/blue = 3,
+ /obj/item/clothing/suit/hooded/hoodie/green = 3,
+ /obj/item/clothing/suit/hooded/hoodie/orange = 3,
+ /obj/item/clothing/suit/hooded/hoodie/pink = 3,
+ /obj/item/clothing/suit/hooded/hoodie/red = 3,
+ /obj/item/clothing/suit/hooded/hoodie/black = 3,
+ /obj/item/clothing/suit/hooded/hoodie/yellow = 3,
+ /obj/item/clothing/suit/hooded/hoodie/darkblue = 3,
+ /obj/item/clothing/suit/hooded/hoodie/teal = 3,
+ /obj/item/clothing/suit/hooded/hoodie/purple = 3,
+ /obj/item/clothing/suit/ianshirt = 1,
+ ),
+ ),
+
+ list(
+ "name" = "Shoes",
+ "icon" = "socks",
+ "products" = list(
+ /obj/item/clothing/shoes/sneakers/black = 4,
+ /obj/item/clothing/shoes/sneakers/brown = 4,
+ /obj/item/clothing/shoes/sneakers/yellow = 4,
+ /obj/item/clothing/shoes/sneakers/green = 4,
+ /obj/item/clothing/shoes/sneakers/blue = 4,
+ /obj/item/clothing/shoes/sneakers/purple = 4,
+ /obj/item/clothing/shoes/sneakers/red = 4,
+ /obj/item/clothing/shoes/sneakers/orange = 4,
+ /obj/item/clothing/shoes/sneakers/white = 4,
+ /obj/item/clothing/shoes/sandal = 2,
+ /obj/item/clothing/shoes/laceup = 2,
+ /obj/item/clothing/shoes/winterboots = 3,
+ /obj/item/clothing/shoes/jackboots_replica = 3,
+ ),
+ ),
+
+ list(
+ "name" = "Special",
+ "icon" = "star",
+ "products" = list(
+ /obj/item/clothing/ears/headphones = 2,
+ /obj/item/clothing/glasses/monocle = 1,
+ /obj/item/clothing/suit/apron/purple_bartender = 2,
+ /obj/item/clothing/under/rank/civilian/bartender/purple = 2
+ ),
+ ),
+ )
+
+ contraband = list(
+ /obj/item/clothing/under/syndicate/tacticool = 1,
+ /obj/item/clothing/mask/balaclava = 1,
+ /obj/item/clothing/head/ushanka = 1,
+ /obj/item/clothing/under/costume/soviet = 1,
+ /obj/item/storage/belt/fannypack/black = 2,
+ /obj/item/clothing/suit/jacket/letterman_syndie = 1,
+ /obj/item/clothing/under/costume/jabroni = 1,
+ /obj/item/clothing/suit/vapeshirt = 1,
+ /obj/item/clothing/under/costume/geisha = 1
+ )
+ premium = list(
+ /obj/item/clothing/under/suit/checkered = 1,
+ /obj/item/clothing/suit/jacket/leather = 1,
+ /obj/item/clothing/suit/jacket/leather/overcoat = 1,
+ /obj/item/clothing/under/pants/mustangjeans = 1,
+ /obj/item/clothing/neck/necklace/dope = 3,
+ /obj/item/clothing/suit/jacket/letterman_nanotrasen = 1
+ )
refill_canister = /obj/item/vending_refill/clothing
- default_price = 40
- extra_price = 60
+ default_price = PAYCHECK_MEDIUM
+ extra_price = PAYCHECK_HARD
dept_req_for_free = NO_FREEBIES
/obj/item/vending_refill/clothing
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index 9b7da91332875..839198b55b3f5 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -87,6 +87,9 @@
C.visible_message("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes! ", "You HUNGER! ")
playsound(C.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
+ if(C.handcuffed)
+ C.visible_message("[owner] continues convulsing breaking free of [owner.p_their()] restraints! ")
+ C.uncuff()
C.do_jitter_animation(living_transformation_time)
C.Stun(living_transformation_time)
to_chat(C, "You are now a zombie! Do not seek to be cured, do not help any non-zombies in any way, do not harm your zombie brethren and spread the disease by killing others. You are a creature of hunger and violence. ")
diff --git a/html/changelog.html b/html/changelog.html
index 759f87d1a514b..00b9623d13b2d 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,93 @@
-->
+
06 April 2024
+
Miliviu updated:
+
+ LOOC will now tell you if you were near the sender
+ cryogenic freezer no longer accepts mobs that were never controlled by a player
+
+
Ratón updated:
+
+ Heretics can no longer create walking husks by sacrificing a husked target.
+ No more floating things spat out of fabricators!
+
+
XeonMations updated:
+
+ Added tan suits to the clothesmate
+
+
rkz, Dakae updated:
+
+ removed sleeper in deconstruct()
+
+
+
05 April 2024
+
EvilDragonfiend updated:
+
+ view tags verb is now in Admin category instead of Admin.Game
+
+
Miliviu updated:
+
+ Updated the Webmap URL to the new domain
+ Multiple Random Arcades now work and spawn a random arcade
+
+
Ratón updated:
+
+ lockers now glow in the dark
+ Vendors will no longer try to put mobs in your hands
+
+
rkz, Krysonism updated:
+
+ Chicken, Lizardmeat, synthmeat now have their own meat sprites
+ replaces sprites for meat
+
+
+
04 April 2024
+
ClownMoff updated:
+
+ KiloStation cryo tubes now face the proper direction for them to work.
+
+
EvilDragonfiend updated:
+
+ explodable component no longer executes loop to explode again
+
+
rkz, ArcaneMusic, qustinnus, 4Dplanner, cacogen, AnturK updated:
+
+ Adds meat & wood material datums
+ Sheetifier machine, for making raw meat into a building material!
+ tile & walls support for the basemat system
+ more wooden items are now flammable
+
+
+
03 April 2024
+
EveLed updated:
+
+ added circular sunglasses
+ added relaxed slacks
+ added circular sunglasses to the clothing vendor
+ added circular glasses to the clothes vendor
+ added relaxed slacks to the autodrobe
+ sprites for circular sunglasses
+ sprites for relaxed slacks
+
+
HowToLoLu updated:
+
+ CTF is no longer completely dark
+
+
+
02 April 2024
+
pigeonverde, rkz, qustinnus(deleted account, credit him anyway), tralezab, Sylphet, JohnFulpWillard, FernandoJ8 updated:
+
+ A new kitchen machine, the griddle, for cooking your meats on!
+ remapped kitchens to support new machine
+ Most meats are cooked through the griddle, rather than microwaving. Not following this will lead to your meat just producing a burnt mess when you microwave it.
+ burgers are now made with meat patties. These patties can be made by rolling a meatball.
+ patty sprites, new meatballs sprites, new sausage sprites, griddle sprites, steam animation
+ Upgrading the food processor actually works.
+ Added check to prevent mindless runtime when cluwning mob
+ Grills now grill food, not reagent containers
+
+
01 April 2024
ClownMoff updated:
@@ -680,35 +767,6 @@ Tyranicranger4 updated:
Logs roundstart Heretic objectives
-
- 03 February 2024
- Varo updated:
-
- Kilo Mebay: removed random decals, added a fire extinguisher, fixed map errors.
-
-
- 31 January 2024
- @BriggsIDP @MarkusLarsson421 updated:
-
- new Prefab map folder for any .DME files not used in game, but for mappers to store prefabs permanently
- RandomMapHelper.dmm
-
- BriggsIDP updated:
-
- Added a Prefab folder and Departments.dmm file for mappers
-
- Hardly updated:
-
- Re-added voltaic to the list of languages multilingual quirk users can choose.
-
- Markus Larsson, XeonMations updated:
-
- Remapped kilostation's security department to look nicer and function better.
-
- Varo, MarkusLarsson421 updated:
-
- Reworks the lobby, changes the front desk position to where cloning was, moves genetics to the big monkey room, moves cloning where genetic was, adds a surgery room, reworks the CMO office, storage and chemistry room, removes a big part of virology and places it all below chemistry, tweaks some maintenance areas
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 1bde93693d4fd..04c17354fa9b4 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -42941,3 +42941,62 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
rkz, Rohesie:
- refactor: progressbar handling, especially deletion
- code_imp: adds stack traces & code docs to progressbars
+2024-04-02:
+ pigeonverde, rkz, qustinnus(deleted account, credit him anyway), tralezab, Sylphet, JohnFulpWillard, FernandoJ8:
+ - rscadd: A new kitchen machine, the griddle, for cooking your meats on!
+ - rscadd: remapped kitchens to support new machine
+ - tweak: Most meats are cooked through the griddle, rather than microwaving. Not
+ following this will lead to your meat just producing a burnt mess when you microwave
+ it.
+ - tweak: burgers are now made with meat patties. These patties can be made by rolling
+ a meatball.
+ - rscadd: patty sprites, new meatballs sprites, new sausage sprites, griddle sprites,
+ steam animation
+ - balance: Upgrading the food processor actually works.
+ - code_imp: Added check to prevent mindless runtime when cluwning mob
+ - bugfix: Grills now grill food, not reagent containers
+2024-04-03:
+ EveLed:
+ - rscadd: added circular sunglasses
+ - rscadd: added relaxed slacks
+ - rscadd: added circular sunglasses to the clothing vendor
+ - rscadd: added circular glasses to the clothes vendor
+ - rscadd: added relaxed slacks to the autodrobe
+ - imageadd: sprites for circular sunglasses
+ - imageadd: sprites for relaxed slacks
+ HowToLoLu:
+ - bugfix: CTF is no longer completely dark
+2024-04-04:
+ ClownMoff:
+ - tweak: KiloStation cryo tubes now face the proper direction for them to work.
+ EvilDragonfiend:
+ - bugfix: explodable component no longer executes loop to explode again
+ rkz, ArcaneMusic, qustinnus, 4Dplanner, cacogen, AnturK:
+ - rscadd: Adds meat & wood material datums
+ - rscadd: Sheetifier machine, for making raw meat into a building material!
+ - rscadd: tile & walls support for the basemat system
+ - tweak: more wooden items are now flammable
+2024-04-05:
+ EvilDragonfiend:
+ - bugfix: view tags verb is now in Admin category instead of Admin.Game
+ Miliviu:
+ - tweak: Updated the Webmap URL to the new domain
+ - bugfix: Multiple Random Arcades now work and spawn a random arcade
+ "Rat\xF3n":
+ - bugfix: lockers now glow in the dark
+ - bugfix: Vendors will no longer try to put mobs in your hands
+ rkz, Krysonism:
+ - rscadd: Chicken, Lizardmeat, synthmeat now have their own meat sprites
+ - rscadd: replaces sprites for meat
+2024-04-06:
+ Miliviu:
+ - admin: LOOC will now tell you if you were near the sender
+ - tweak: cryogenic freezer no longer accepts mobs that were never controlled by
+ a player
+ "Rat\xF3n":
+ - bugfix: Heretics can no longer create walking husks by sacrificing a husked target.
+ - bugfix: No more floating things spat out of fabricators!
+ XeonMations:
+ - rscadd: Added tan suits to the clothesmate
+ rkz, Dakae:
+ - code_imp: removed sleeper in deconstruct()
diff --git a/html/font-awesome/css/all.min.css b/html/font-awesome/css/all.min.css
index a3fb0572e89d1..096ceb4fc5638 100644
--- a/html/font-awesome/css/all.min.css
+++ b/html/font-awesome/css/all.min.css
@@ -1,5 +1,6 @@
/*!
- * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 6.1.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2022 Fonticons, Inc.
*/
-.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(fa-regular-400.eot);src:url(fa-regular-400.eot?#iefix) format("embedded-opentype"),url(fa-regular-400.woff) format("woff")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(fa-solid-900.eot);src:url(fa-solid-900.eot?#iefix) format("embedded-opentype"),url(fa-solid-900.woff) format("woff")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}
+.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-duotone,.fa-light,.fa-regular,.fa-solid,.fa-thin,.fab,.fad,.fal,.far,.fas,.fat{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-a:before{content:"\41"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-anchor:before{content:"\f13d"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-anchor-lock:before{content:"\e4ad"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-ankh:before{content:"\f644"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-archway:before{content:"\f557"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-arrow-trend-down:before{content:"\e097"}.fa-arrow-trend-up:before{content:"\e098"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-arrows-spin:before{content:"\e4bb"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-asterisk:before{content:"\2a"}.fa-at:before{content:"\40"}.fa-atom:before{content:"\f5d2"}.fa-audio-description:before{content:"\f29e"}.fa-austral-sign:before{content:"\e0a9"}.fa-award:before{content:"\f559"}.fa-b:before{content:"\42"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-backward:before{content:"\f04a"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-baht-sign:before{content:"\e0ac"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-barcode:before{content:"\f02a"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-bell:before{content:"\f0f3"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blog:before{content:"\f781"}.fa-bold:before{content:"\f032"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-book-bookmark:before{content:"\e0bb"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-bookmark:before{content:"\f02e"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-bore-hole:before{content:"\e4c3"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-bottle-water:before{content:"\e4c5"}.fa-bowl-food:before{content:"\e4c6"}.fa-bowl-rice:before{content:"\e2eb"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes-packing:before{content:"\e4c7"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-bread-slice:before{content:"\f7ec"}.fa-bridge:before{content:"\e4c8"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-bridge-water:before{content:"\e4ce"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broom:before{content:"\f51a"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-brush:before{content:"\f55d"}.fa-bucket:before{content:"\e4cf"}.fa-bug:before{content:"\f188"}.fa-bug-slash:before{content:"\e490"}.fa-bugs:before{content:"\e4d0"}.fa-building:before{content:"\f1ad"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-building-circle-check:before{content:"\e4d2"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-building-flag:before{content:"\e4d5"}.fa-building-lock:before{content:"\e4d6"}.fa-building-ngo:before{content:"\e4d7"}.fa-building-shield:before{content:"\e4d8"}.fa-building-un:before{content:"\e4d9"}.fa-building-user:before{content:"\e4da"}.fa-building-wheat:before{content:"\e4db"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-burst:before{content:"\e4dc"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-c:before{content:"\43"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-week:before{content:"\f784"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-camera-rotate:before{content:"\e0d8"}.fa-campground:before{content:"\f6bb"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-car-on:before{content:"\e4dd"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-car-side:before{content:"\f5e4"}.fa-car-tunnel:before{content:"\e4de"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-cart-plus:before{content:"\f217"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cedi-sign:before{content:"\e0df"}.fa-cent-sign:before{content:"\e3f5"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-charging-station:before{content:"\f5e7"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-chart-column:before{content:"\e0e3"}.fa-chart-gantt:before{content:"\e0e4"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-chart-simple:before{content:"\e473"}.fa-check:before{content:"\f00c"}.fa-check-double:before{content:"\f560"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-child-dress:before{content:"\e59c"}.fa-child-reaching:before{content:"\e59d"}.fa-child-rifle:before{content:"\e4e0"}.fa-children:before{content:"\e4e1"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-circle-nodes:before{content:"\e4e2"}.fa-circle-notch:before{content:"\f1ce"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-city:before{content:"\f64f"}.fa-clapperboard:before{content:"\e131"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clipboard-question:before{content:"\e4e3"}.fa-clipboard-user:before{content:"\f7f3"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-clover:before{content:"\e139"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-code-commit:before{content:"\f386"}.fa-code-compare:before{content:"\e13a"}.fa-code-fork:before{content:"\e13b"}.fa-code-merge:before{content:"\f387"}.fa-code-pull-request:before{content:"\e13c"}.fa-coins:before{content:"\f51e"}.fa-colon-sign:before{content:"\e140"}.fa-comment:before{content:"\f075"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-compress:before{content:"\f066"}.fa-computer:before{content:"\e4e5"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cow:before{content:"\f6c8"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-d:before{content:"\44"}.fa-database:before{content:"\f1c0"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-democrat:before{content:"\f747"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-dharmachakra:before{content:"\f655"}.fa-diagram-next:before{content:"\e476"}.fa-diagram-predecessor:before{content:"\e477"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-diagram-successor:before{content:"\e47a"}.fa-diamond:before{content:"\f219"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-disease:before{content:"\f7fa"}.fa-display:before{content:"\e163"}.fa-divide:before{content:"\f529"}.fa-dna:before{content:"\f471"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-dong-sign:before{content:"\e169"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dove:before{content:"\f4ba"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-download:before{content:"\f019"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-e:before{content:"\45"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elevator:before{content:"\e16d"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-equals:before{content:"\3d"}.fa-eraser:before{content:"\f12d"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-exclamation:before{content:"\21"}.fa-expand:before{content:"\f065"}.fa-explosion:before{content:"\e4e9"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-eye-slash:before{content:"\f070"}.fa-f:before{content:"\46"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-fan:before{content:"\f863"}.fa-faucet:before{content:"\e005"}.fa-faucet-drip:before{content:"\e006"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-ferry:before{content:"\e4ea"}.fa-file:before{content:"\f15b"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-file-audio:before{content:"\f1c7"}.fa-file-circle-check:before{content:"\e5a0"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-file-circle-plus:before{content:"\e494"}.fa-file-circle-question:before{content:"\e4ef"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-excel:before{content:"\f1c3"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-file-medical:before{content:"\f477"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-shield:before{content:"\e4f0"}.fa-file-signature:before{content:"\f573"}.fa-file-video:before{content:"\f1c8"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-file-word:before{content:"\f1c2"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-burner:before{content:"\e4f1"}.fa-fire-extinguisher:before{content:"\f134"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-fish:before{content:"\f578"}.fa-fish-fins:before{content:"\e4f2"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flask-vial:before{content:"\e4f3"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-florin-sign:before{content:"\e184"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-folder-closed:before{content:"\e185"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-folder-tree:before{content:"\f802"}.fa-font:before{content:"\f031"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-franc-sign:before{content:"\e18f"}.fa-frog:before{content:"\f52e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-g:before{content:"\47"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-glass-water:before{content:"\e4f4"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-glasses:before{content:"\f530"}.fa-globe:before{content:"\f0ac"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-greater-than:before{content:"\3e"}.fa-greater-than-equal:before{content:"\f532"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-guarani-sign:before{content:"\e19a"}.fa-guitar:before{content:"\f7a6"}.fa-gun:before{content:"\e19b"}.fa-h:before{content:"\48"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-handcuffs:before{content:"\e4f8"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-hands-bound:before{content:"\e4f9"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-hands-clapping:before{content:"\e1a8"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-handshake:before{content:"\f2b5"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-hashtag:before{content:"\23"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-heart-circle-plus:before{content:"\e500"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-helicopter-symbol:before{content:"\e502"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-helmet-un:before{content:"\e503"}.fa-highlighter:before{content:"\f591"}.fa-hill-avalanche:before{content:"\e507"}.fa-hill-rockslide:before{content:"\e508"}.fa-hippo:before{content:"\f6ed"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-house-chimney-user:before{content:"\e065"}.fa-house-chimney-window:before{content:"\e00d"}.fa-house-circle-check:before{content:"\e509"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-house-crack:before{content:"\e3b1"}.fa-house-fire:before{content:"\e50c"}.fa-house-flag:before{content:"\e50d"}.fa-house-flood-water:before{content:"\e50e"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-house-lock:before{content:"\e510"}.fa-house-medical:before{content:"\e3b2"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-house-medical-flag:before{content:"\e514"}.fa-house-signal:before{content:"\e012"}.fa-house-tsunami:before{content:"\e515"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-hurricane:before{content:"\f751"}.fa-i:before{content:"\49"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-images:before{content:"\f302"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-italic:before{content:"\f033"}.fa-j:before{content:"\4a"}.fa-jar:before{content:"\e516"}.fa-jar-wheat:before{content:"\e517"}.fa-jedi:before{content:"\f669"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-jet-fighter-up:before{content:"\e518"}.fa-joint:before{content:"\f595"}.fa-jug-detergent:before{content:"\e519"}.fa-k:before{content:"\4b"}.fa-kaaba:before{content:"\f66b"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-khanda:before{content:"\f66d"}.fa-kip-sign:before{content:"\e1c4"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-kitchen-set:before{content:"\e51a"}.fa-kiwi-bird:before{content:"\f535"}.fa-l:before{content:"\4c"}.fa-land-mine-on:before{content:"\e51b"}.fa-landmark:before{content:"\f66f"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-landmark-flag:before{content:"\e51c"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-file:before{content:"\e51d"}.fa-laptop-medical:before{content:"\f812"}.fa-lari-sign:before{content:"\e1c8"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-lemon:before{content:"\f094"}.fa-less-than:before{content:"\3c"}.fa-less-than-equal:before{content:"\f537"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-lines-leaning:before{content:"\e51e"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-lira-sign:before{content:"\f195"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-location-arrow:before{content:"\f124"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-location-pin-lock:before{content:"\e51f"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-locust:before{content:"\e520"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-m:before{content:"\4d"}.fa-magnet:before{content:"\f076"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-manat-sign:before{content:"\e1d5"}.fa-map:before{content:"\f279"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-pin:before{content:"\f276"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-and-venus:before{content:"\f224"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-mask:before{content:"\f6fa"}.fa-mask-face:before{content:"\e1d7"}.fa-mask-ventilator:before{content:"\e524"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-mattress-pillow:before{content:"\e525"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-medal:before{content:"\f5a2"}.fa-memory:before{content:"\f538"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-mill-sign:before{content:"\e1ed"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-mitten:before{content:"\f7b5"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-mobile-button:before{content:"\f10b"}.fa-mobile-retro:before{content:"\e527"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-money-bills:before{content:"\e1f3"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-mosquito-net:before{content:"\e52c"}.fa-motorcycle:before{content:"\f21c"}.fa-mound:before{content:"\e52d"}.fa-mountain:before{content:"\f6fc"}.fa-mountain-city:before{content:"\e52e"}.fa-mountain-sun:before{content:"\e52f"}.fa-mug-hot:before{content:"\f7b6"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-music:before{content:"\f001"}.fa-n:before{content:"\4e"}.fa-naira-sign:before{content:"\e1f6"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-not-equal:before{content:"\f53e"}.fa-notdef:before{content:"\e1fe"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-notes-medical:before{content:"\f481"}.fa-o:before{content:"\4f"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-oil-can:before{content:"\f613"}.fa-oil-well:before{content:"\e532"}.fa-om:before{content:"\f679"}.fa-otter:before{content:"\f700"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-p:before{content:"\50"}.fa-pager:before{content:"\f815"}.fa-paint-roller:before{content:"\f5aa"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-palette:before{content:"\f53f"}.fa-pallet:before{content:"\f482"}.fa-panorama:before{content:"\e209"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-passport:before{content:"\f5ab"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-pause:before{content:"\f04c"}.fa-paw:before{content:"\f1b0"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-people-group:before{content:"\e533"}.fa-people-line:before{content:"\e534"}.fa-people-pulling:before{content:"\e535"}.fa-people-robbery:before{content:"\e536"}.fa-people-roof:before{content:"\e537"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-person-booth:before{content:"\f756"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-person-burst:before{content:"\e53b"}.fa-person-cane:before{content:"\e53c"}.fa-person-chalkboard:before{content:"\e53d"}.fa-person-circle-check:before{content:"\e53e"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-person-circle-minus:before{content:"\e540"}.fa-person-circle-plus:before{content:"\e541"}.fa-person-circle-question:before{content:"\e542"}.fa-person-circle-xmark:before{content:"\e543"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-person-dress-burst:before{content:"\e544"}.fa-person-drowning:before{content:"\e545"}.fa-person-falling:before{content:"\e546"}.fa-person-falling-burst:before{content:"\e547"}.fa-person-half-dress:before{content:"\e548"}.fa-person-harassing:before{content:"\e549"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-person-military-pointing:before{content:"\e54a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-person-military-to-person:before{content:"\e54c"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-person-pregnant:before{content:"\e31e"}.fa-person-rays:before{content:"\e54d"}.fa-person-rifle:before{content:"\e54e"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-person-shelter:before{content:"\e54f"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-person-through-window:before{content:"\e5a9"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-person-walking-luggage:before{content:"\e554"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-peseta-sign:before{content:"\e221"}.fa-peso-sign:before{content:"\e222"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-circle-check:before{content:"\e555"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-lock:before{content:"\e558"}.fa-plane-slash:before{content:"\e069"}.fa-plane-up:before{content:"\e22d"}.fa-plant-wilt:before{content:"\e5aa"}.fa-plate-wheat:before{content:"\e55a"}.fa-play:before{content:"\f04b"}.fa-plug:before{content:"\f1e6"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-plug-circle-check:before{content:"\e55c"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-plus-minus:before{content:"\e43c"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-puzzle-piece:before{content:"\f12e"}.fa-q:before{content:"\51"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\3f"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-r:before{content:"\52"}.fa-radiation:before{content:"\f7b9"}.fa-radio:before{content:"\f8d7"}.fa-rainbow:before{content:"\f75b"}.fa-ranking-star:before{content:"\e561"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-recycle:before{content:"\f1b8"}.fa-registered:before{content:"\f25d"}.fa-repeat:before{content:"\f363"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-republican:before{content:"\f75e"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-road-barrier:before{content:"\e562"}.fa-road-bridge:before{content:"\e563"}.fa-road-circle-check:before{content:"\e564"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-road-circle-xmark:before{content:"\e566"}.fa-road-lock:before{content:"\e567"}.fa-road-spikes:before{content:"\e568"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-route:before{content:"\f4d7"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-rug:before{content:"\e569"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-rupiah-sign:before{content:"\e23d"}.fa-s:before{content:"\53"}.fa-sack-dollar:before{content:"\f81d"}.fa-sack-xmark:before{content:"\e56a"}.fa-sailboat:before{content:"\e445"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-school:before{content:"\f549"}.fa-school-circle-check:before{content:"\e56b"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-school-flag:before{content:"\e56e"}.fa-school-lock:before{content:"\e56f"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-screwdriver:before{content:"\f54a"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-scroll:before{content:"\f70e"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-sd-card:before{content:"\f7c2"}.fa-section:before{content:"\e447"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-server:before{content:"\f233"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-arrow-turn-right:before,.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-sheet-plastic:before{content:"\e571"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-shield-cat:before{content:"\e572"}.fa-shield-dog:before{content:"\e573"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-shield-heart:before{content:"\e574"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-shoe-prints:before{content:"\f54b"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-shop-lock:before{content:"\e4a5"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-shower:before{content:"\f2cc"}.fa-shrimp:before{content:"\e448"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-sim-card:before{content:"\f7c4"}.fa-sink:before{content:"\e06d"}.fa-sitemap:before{content:"\f0e8"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-spa:before{content:"\f5bb"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-spray-can:before{content:"\f5bd"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-square:before{content:"\f0c8"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-square-full:before{content:"\f45c"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-square-nfi:before{content:"\e576"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-square-person-confined:before{content:"\e577"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-square-virus:before{content:"\e578"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-stairs:before{content:"\e289"}.fa-stamp:before{content:"\f5bf"}.fa-stapler:before{content:"\e5af"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-stethoscope:before{content:"\f0f1"}.fa-stop:before{content:"\f04d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-slash:before{content:"\e071"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stroopwafel:before{content:"\f551"}.fa-subscript:before{content:"\f12c"}.fa-suitcase:before{content:"\f0f2"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-superscript:before{content:"\f12b"}.fa-swatchbook:before{content:"\f5c3"}.fa-synagogue:before{content:"\f69b"}.fa-syringe:before{content:"\f48e"}.fa-t:before{content:"\54"}.fa-table:before{content:"\f0ce"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-tablet-button:before{content:"\f10a"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tarp:before{content:"\e57b"}.fa-tarp-droplet:before{content:"\e57c"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-tent:before{content:"\e57d"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tent-arrows-down:before{content:"\e581"}.fa-tents:before{content:"\e582"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-text-width:before{content:"\f035"}.fa-thermometer:before{content:"\f491"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-ticket:before{content:"\f145"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-timeline:before{content:"\e29c"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toilet-portable:before{content:"\e583"}.fa-toilets-portable:before{content:"\e584"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-torii-gate:before{content:"\f6a1"}.fa-tornado:before{content:"\f76f"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-tower-cell:before{content:"\e585"}.fa-tower-observation:before{content:"\e586"}.fa-tractor:before{content:"\f722"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-train-tram:before{content:"\e5b4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-tree-city:before{content:"\e587"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-trophy:before{content:"\f091"}.fa-trowel:before{content:"\e589"}.fa-trowel-bricks:before{content:"\e58a"}.fa-truck:before{content:"\f0d1"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-truck-droplet:before{content:"\e58c"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-truck-field:before{content:"\e58d"}.fa-truck-field-un:before{content:"\e58e"}.fa-truck-front:before{content:"\e2b7"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-truck-plane:before{content:"\e58f"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-u:before{content:"\55"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-universal-access:before{content:"\f29a"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-upload:before{content:"\f093"}.fa-user:before{content:"\f007"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-clock:before{content:"\f4fd"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-user-graduate:before{content:"\f501"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-user-injured:before{content:"\f728"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-user-lock:before{content:"\f502"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-between-lines:before{content:"\e591"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-users-line:before{content:"\e592"}.fa-users-rays:before{content:"\e593"}.fa-users-rectangle:before{content:"\e594"}.fa-users-slash:before{content:"\e073"}.fa-users-viewfinder:before{content:"\e595"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-v:before{content:"\56"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-vault:before{content:"\e2c5"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-vial:before{content:"\f492"}.fa-vial-circle-check:before{content:"\e596"}.fa-vial-virus:before{content:"\e597"}.fa-vials:before{content:"\f493"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-virus:before{content:"\e074"}.fa-virus-covid:before{content:"\e4a8"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-voicemail:before{content:"\f897"}.fa-volcano:before{content:"\f770"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-vr-cardboard:before{content:"\f729"}.fa-w:before{content:"\57"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-wallet:before{content:"\f555"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-wand-sparkles:before{content:"\f72b"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-wave-square:before{content:"\f83e"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-wheelchair:before{content:"\f193"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-wind:before{content:"\f72e"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-worm:before{content:"\e599"}.fa-wrench:before{content:"\f0ad"}.fa-x:before{content:"\58"}.fa-x-ray:before{content:"\f497"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-xmarks-lines:before{content:"\e59a"}.fa-y:before{content:"\59"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-z:before{content:"\5a"}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands";font-weight:400}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-alipay:before{content:"\f642"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-amilia:before{content:"\f36d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-artstation:before{content:"\f77a"}.fa-asymmetrik:before{content:"\f372"}.fa-atlassian:before{content:"\f77b"}.fa-audible:before{content:"\f373"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-bandcamp:before{content:"\f2d5"}.fa-battle-net:before{content:"\f835"}.fa-behance:before{content:"\f1b4"}.fa-bilibili:before{content:"\e3d9"}.fa-bimobject:before{content:"\f378"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bootstrap:before{content:"\f836"}.fa-bots:before{content:"\e340"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-buromobelexperte:before{content:"\f37f"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cmplid:before{content:"\e360"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-critical-role:before{content:"\f6c9"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dhl:before{content:"\f790"}.fa-diaspora:before{content:"\f791"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-elementor:before{content:"\f430"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-evernote:before{content:"\f839"}.fa-expeditedssl:before{content:"\f23e"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-figma:before{content:"\f799"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-fulcrum:before{content:"\f50b"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-gofore:before{content:"\f3a7"}.fa-golang:before{content:"\e40f"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-wallet:before{content:"\f1ee"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-gulp:before{content:"\f3ae"}.fa-hacker-news:before{content:"\f1d4"}.fa-hackerrank:before{content:"\f5f7"}.fa-hashnode:before{content:"\e499"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-hive:before{content:"\e07f"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hotjar:before{content:"\f3b1"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-ideal:before{content:"\e013"}.fa-imdb:before{content:"\f2d8"}.fa-instagram:before{content:"\f16d"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaggle:before{content:"\f5fa"}.fa-keybase:before{content:"\f4f5"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-leanpub:before{content:"\f212"}.fa-less:before{content:"\f41d"}.fa-line:before{content:"\f3c0"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-mailchimp:before{content:"\f59e"}.fa-mandalorian:before{content:"\f50f"}.fa-markdown:before{content:"\f60f"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medapps:before{content:"\f3c6"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-mendeley:before{content:"\f7b3"}.fa-meta:before{content:"\e49b"}.fa-microblog:before{content:"\e01a"}.fa-microsoft:before{content:"\f3ca"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-nfc-directional:before{content:"\e530"}.fa-nfc-symbol:before{content:"\e531"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-padlet:before{content:"\e4a0"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-palfed:before{content:"\f3d8"}.fa-patreon:before{content:"\f3d9"}.fa-paypal:before{content:"\f1ed"}.fa-perbyte:before{content:"\e083"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pix:before{content:"\e43a"}.fa-playstation:before{content:"\f3df"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-r-project:before{content:"\f4f7"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-redhat:before{content:"\f7bc"}.fa-renren:before{content:"\f18b"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-rev:before{content:"\f5b2"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rust:before{content:"\e07a"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-schlix:before{content:"\f3ea"}.fa-screenpal:before{content:"\e570"}.fa-scribd:before{content:"\f28a"}.fa-searchengin:before{content:"\f3eb"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-servicestack:before{content:"\f3ec"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopify:before{content:"\e057"}.fa-shopware:before{content:"\f5b5"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sith:before{content:"\f512"}.fa-sitrox:before{content:"\e44a"}.fa-sketch:before{content:"\f7c6"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-slideshare:before{content:"\f1e7"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-space-awesome:before{content:"\e5ac"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spotify:before{content:"\f1bc"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-symbol:before{content:"\f3f6"}.fa-sticker-mule:before{content:"\f3f7"}.fa-strava:before{content:"\f428"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-superpowers:before{content:"\f2dd"}.fa-supple:before{content:"\f3f9"}.fa-suse:before{content:"\f7d6"}.fa-swift:before{content:"\f8e1"}.fa-symfony:before{content:"\f83d"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-the-red-yeti:before{content:"\f69d"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-think-peaks:before{content:"\f731"}.fa-tiktok:before{content:"\e07b"}.fa-trade-federation:before{content:"\f513"}.fa-trello:before{content:"\f181"}.fa-tumblr:before{content:"\f173"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-uncharted:before{content:"\e084"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-vaadin:before{content:"\f408"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viber:before{content:"\f409"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-vuejs:before{content:"\f41f"}.fa-watchman-monitoring:before{content:"\e087"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whmcs:before{content:"\f40d"}.fa-wikipedia-w:before{content:"\f266"}.fa-windows:before{content:"\f17a"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-zhihu:before{content:"\f63f"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-family:"Font Awesome 6 Free";font-weight:400}:host,:root{--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-family:"Font Awesome 6 Free";font-weight:900}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
diff --git a/html/font-awesome/css/v4-shims.min.css b/html/font-awesome/css/v4-shims.min.css
index b2b65a4ea1947..4dba1a40d1ef2 100644
--- a/html/font-awesome/css/v4-shims.min.css
+++ b/html/font-awesome/css/v4-shims.min.css
@@ -1,5 +1,6 @@
/*!
- * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 6.1.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2022 Fonticons, Inc.
*/
-.fa.fa-glass:before{content:"\f000"}.fa.fa-meetup{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-star-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-file-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-pencil:before{content:"\f303"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-share-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart:before{content:"\f080"}.fa.fa-bar-chart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart-o:before{content:"\f080"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-lemon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-scissors:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-google-plus,.fa.fa-google-plus-square,.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f3fd"}.fa.fa-comment-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard,.fa.fa-paste{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paste:before{content:"\f328"}.fa.fa-lightbulb-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f381"}.fa.fa-cloud-upload:before{content:"\f382"}.fa.fa-bell-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f089"}.fa.fa-star-half-empty{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f089"}.fa.fa-star-half-full{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f089"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before{content:"\f127"}.fa.fa-shield:before{content:"\f3ed"}.fa.fa-calendar-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ticket:before{content:"\f3ff"}.fa.fa-minus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\f155"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\f156"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f15e"}.fa.fa-sort-amount-asc:before{content:"\f160"}.fa.fa-sort-amount-desc:before{content:"\f161"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f163"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-play,.fa.fa-youtube-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\f195"}.fa.fa-plus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-google,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle,.fa.fa-yahoo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-spoon:before{content:"\f2e5"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-envelope-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-deviantart,.fa.fa-soundcloud{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-ring{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-bouy:before{content:"\f1cd"}.fa.fa-life-buoy{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-buoy:before{content:"\f1cd"}.fa.fa-life-saver{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-saver:before{content:"\f1cd"}.fa.fa-support{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-sliders:before{content:"\f1de"}.fa.fa-futbol-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-angellist,.fa.fa-ioxhost,.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-meanpath{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-meanpath:before{content:"\f2b4"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before{content:"\f224"}.fa.fa-facebook-official{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-clone,.fa.fa-hourglass-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-chrome,.fa.fa-creative-commons,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-internet-explorer,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square,.fa.fa-opera,.fa.fa-safari,.fa.fa-tripadvisor,.fa.fa-wikipedia-w{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat,.fa.fa-snapchat-ghost,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-viadeo,.fa.fa-viadeo-square,.fa.fa-yoast{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-spotify,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 5 Brands";font-weight:400}
+.fa.fa-glass:before{content:"\f000"}.fa.fa-envelope-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-star-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-home:before{content:"\f015"}.fa.fa-file-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-list-alt:before{content:"\f022"}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-edit{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-edit:before{content:"\f044"}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-expand:before{content:"\f424"}.fa.fa-compress:before{content:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart-o:before,.fa.fa-bar-chart:before{content:"\e0e3"}.fa.fa-twitter-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-twitter-square:before{content:"\f081"}.fa.fa-facebook-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-square:before{content:"\f082"}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-github-square:before{content:"\f092"}.fa.fa-lemon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-globe:before{content:"\f57d"}.fa.fa-tasks:before{content:"\f828"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-cut:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-save{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-save:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-magic:before{content:"\e2ca"}.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pinterest-square:before{content:"\f0d3"}.fa.fa-google-plus-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-square:before{content:"\f0d4"}.fa.fa-google-plus{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f625"}.fa.fa-comment-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard:before{content:"\f0ea"}.fa.fa-lightbulb-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f0ed"}.fa.fa-cloud-upload:before{content:"\f0ee"}.fa.fa-bell-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f5c0"}.fa.fa-star-half-empty{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f5c0"}.fa.fa-star-half-full{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f5c0"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before,.fa.fa-unlink:before{content:"\f127"}.fa.fa-calendar-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-unlock-alt:before{content:"\f09c"}.fa.fa-minus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\24"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\e1bc"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f881"}.fa.fa-sort-amount-asc:before{content:"\f884"}.fa.fa-sort-amount-desc:before{content:"\f160"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f886"}.fa.fa-youtube-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-square:before{content:"\f431"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-xing-square:before{content:"\f169"}.fa.fa-youtube-play{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-tumblr-square:before{content:"\f174"}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo-square:before{content:"\f194"}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\e2bb"}.fa.fa-plus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-google,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-yahoo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-reddit-square:before{content:"\f1a2"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-behance-square:before{content:"\f1b5"}.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-steam-square:before{content:"\f1b7"}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-life-bouy:before,.fa.fa-life-buoy:before,.fa.fa-life-saver:before,.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-git-square:before{content:"\f1d2"}.fa.fa-git,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-futbol-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-lastfm-square:before{content:"\f203"}.fa.fa-angellist,.fa.fa-ioxhost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before,.fa.fa-transgender:before{content:"\f224"}.fa.fa-transgender-alt:before{content:"\f225"}.fa.fa-facebook-official{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-clone{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-creative-commons,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-odnoklassniki-square:before{content:"\f264"}.fa.fa-chrome,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-internet-explorer,.fa.fa-opera,.fa.fa-safari,.fa.fa-wikipedia-w{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-viadeo,.fa.fa-viadeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-viadeo-square:before{content:"\f2aa"}.fa.fa-snapchat,.fa.fa-snapchat-ghost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-ghost:before{content:"\f2ab"}.fa.fa-snapchat-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-square:before{content:"\f2ad"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-themeisle,.fa.fa-yoast{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-meetup,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 6 Brands";font-weight:400}
diff --git a/html/font-awesome/webfonts/fa-regular-400.eot b/html/font-awesome/webfonts/fa-regular-400.eot
deleted file mode 100644
index d62be2fad885f..0000000000000
Binary files a/html/font-awesome/webfonts/fa-regular-400.eot and /dev/null differ
diff --git a/html/font-awesome/webfonts/fa-regular-400.ttf b/html/font-awesome/webfonts/fa-regular-400.ttf
new file mode 100644
index 0000000000000..c5ac00957778d
Binary files /dev/null and b/html/font-awesome/webfonts/fa-regular-400.ttf differ
diff --git a/html/font-awesome/webfonts/fa-regular-400.woff b/html/font-awesome/webfonts/fa-regular-400.woff
deleted file mode 100644
index 43b1a9ae49db0..0000000000000
Binary files a/html/font-awesome/webfonts/fa-regular-400.woff and /dev/null differ
diff --git a/html/font-awesome/webfonts/fa-solid-900.eot b/html/font-awesome/webfonts/fa-solid-900.eot
deleted file mode 100644
index c77baa8d46ab4..0000000000000
Binary files a/html/font-awesome/webfonts/fa-solid-900.eot and /dev/null differ
diff --git a/html/font-awesome/webfonts/fa-solid-900.ttf b/html/font-awesome/webfonts/fa-solid-900.ttf
new file mode 100644
index 0000000000000..43ba1cc7d94f6
Binary files /dev/null and b/html/font-awesome/webfonts/fa-solid-900.ttf differ
diff --git a/html/font-awesome/webfonts/fa-solid-900.woff b/html/font-awesome/webfonts/fa-solid-900.woff
deleted file mode 100644
index 77c1786227f53..0000000000000
Binary files a/html/font-awesome/webfonts/fa-solid-900.woff and /dev/null differ
diff --git a/html/font-awesome/webfonts/fa-v4compatibility.ttf b/html/font-awesome/webfonts/fa-v4compatibility.ttf
new file mode 100644
index 0000000000000..243bc25bd5ee1
Binary files /dev/null and b/html/font-awesome/webfonts/fa-v4compatibility.ttf differ
diff --git a/icons/effects/steam.dmi b/icons/effects/steam.dmi
new file mode 100644
index 0000000000000..d79e58e2d5490
Binary files /dev/null and b/icons/effects/steam.dmi differ
diff --git a/icons/materials/composite.dmi b/icons/materials/composite.dmi
new file mode 100644
index 0000000000000..7bb2d4717887c
Binary files /dev/null and b/icons/materials/composite.dmi differ
diff --git a/icons/misc/colortest.dmi b/icons/misc/colortest.dmi
new file mode 100644
index 0000000000000..0f74685ebc24d
Binary files /dev/null and b/icons/misc/colortest.dmi differ
diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi
index 24a1c7f32a430..6ff20dec3cdba 100644
Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index 7a880ceb9ca3b..a2a698483d158 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
index 4e1328394514f..d9baab161a897 100644
Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index f9b6d4369ada4..042b80c858961 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/food/meat.dmi b/icons/obj/food/meat.dmi
index 6b4502f4695a8..b4262337788b2 100644
Binary files a/icons/obj/food/meat.dmi and b/icons/obj/food/meat.dmi differ
diff --git a/icons/obj/machines/kitchenmachines.dmi b/icons/obj/machines/kitchenmachines.dmi
new file mode 100644
index 0000000000000..32098601bf914
Binary files /dev/null and b/icons/obj/machines/kitchenmachines.dmi differ
diff --git a/icons/obj/machines/sheetifier.dmi b/icons/obj/machines/sheetifier.dmi
new file mode 100644
index 0000000000000..46d8b06babcd4
Binary files /dev/null and b/icons/obj/machines/sheetifier.dmi differ
diff --git a/icons/obj/stacks/minerals.dmi b/icons/obj/stacks/minerals.dmi
index fb4b99ef4fe14..7e86d7143c2a7 100644
Binary files a/icons/obj/stacks/minerals.dmi and b/icons/obj/stacks/minerals.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 3c0ac7c912e59..1797f6eef571c 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index a752f3bd3e614..97e8d5badf1c1 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/icons/turf/walls/materialwall.dmi b/icons/turf/walls/materialwall.dmi
index 1027effda9475..c81fd64c21b77 100644
Binary files a/icons/turf/walls/materialwall.dmi and b/icons/turf/walls/materialwall.dmi differ
diff --git a/interface/interface.dm b/interface/interface.dm
index 45073c32cdfae..2e6d20e7da7ee 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -264,6 +264,6 @@ Any-Mode: (hotkey doesn't need to be on)
else if(SSmapping.config.map_link)
if(alert("This will open the current map in your browser. Are you sure?",,"Yes","No")!="Yes")
return
- src << link("https://affectedarc07.github.io/SS13WebMap/BeeStation/[SSmapping.config.map_link]")
+ src << link("https://webmap.affectedarc07.co.uk/maps/bee/[SSmapping.config.map_link]")
else
to_chat(src, "The current map is either invalid or unavailable. Open an issue on the github. ")
diff --git a/sound/effects/meatslap.ogg b/sound/effects/meatslap.ogg
new file mode 100644
index 0000000000000..3d8ea7df1ac45
Binary files /dev/null and b/sound/effects/meatslap.ogg differ
diff --git a/sound/machines/grill/grillsizzle.ogg b/sound/machines/grill/grillsizzle.ogg
new file mode 100644
index 0000000000000..056ce45941c41
Binary files /dev/null and b/sound/machines/grill/grillsizzle.ogg differ
diff --git a/tgui/packages/tgui/interfaces/ColorMatrixEditor.js b/tgui/packages/tgui/interfaces/ColorMatrixEditor.js
new file mode 100644
index 0000000000000..4bf3883afc6ed
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ColorMatrixEditor.js
@@ -0,0 +1,68 @@
+import { useBackend } from '../backend';
+import { toFixed } from 'common/math';
+import { Box, Stack, Section, ByondUi, NumberInput, Button } from '../components';
+import { Window } from '../layouts';
+
+export const ColorMatrixEditor = (props, context) => {
+ const { act, data } = useBackend(context);
+ const { mapRef, currentColor } = data;
+ const [[rr, rg, rb, ra], [gr, gg, gb, ga], [br, bg, bb, ba], [ar, ag, ab, aa], [cr, cg, cb, ca]] = currentColor;
+ const prefixes = ['r', 'g', 'b', 'a', 'c'];
+ return (
+
+
+
+
+
+
+
+
+
+ {[0, 1, 2, 3].map((col, key) => (
+
+
+ {[0, 1, 2, 3, 4].map((row, key) => (
+
+
+ {`${prefixes[row]}${prefixes[col]}:`}
+
+ toFixed(value, 2)}
+ onDrag={(e, value) => {
+ let retColor = currentColor;
+ retColor[row * 4 + col] = value;
+ act('transition_color', { color: retColor });
+ }}
+ />
+
+ ))}
+
+
+ ))}
+
+
+
+
+
+ act('confirm')} />
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/GreyscaleModifyMenu.tsx b/tgui/packages/tgui/interfaces/GreyscaleModifyMenu.tsx
index 6eb4a28d9b149..1a90a844a4e68 100644
--- a/tgui/packages/tgui/interfaces/GreyscaleModifyMenu.tsx
+++ b/tgui/packages/tgui/interfaces/GreyscaleModifyMenu.tsx
@@ -263,45 +263,14 @@ export const GreyscaleModifyMenu = (props, context) => {
-
- {!!data.unlocked && (
-
- }
- tooltip="Continuously checks files for changes and reloads when necessary. WARNING: Very expensive"
- selected={data.monitoring_files}
- onClick={() => act('toggle_mass_refresh')}
- width={1.9}
- mr={-0.2}
- />
- act('refresh_file')}
- />
- act('save_dmi')}
- />
-
- )}
-
- act('apply')}
- />
- act('toggle_full_preview')}
- />
-
-
+ {!!data.unlocked && act('refresh_file')} />}
+ act('apply')} mx={1} />
+ act('toggle_full_preview')}
+ />
{!!data.refreshing && }
diff --git a/tgui/packages/tgui/interfaces/Vending.js b/tgui/packages/tgui/interfaces/Vending.js
deleted file mode 100644
index a1130b58e9ce6..0000000000000
--- a/tgui/packages/tgui/interfaces/Vending.js
+++ /dev/null
@@ -1,110 +0,0 @@
-import { classes } from 'common/react';
-import { useBackend } from '../backend';
-import { Box, Button, Section, Table } from '../components';
-import { Window } from '../layouts';
-
-const VendingRow = (props, context) => {
- const { act, data } = useBackend(context);
- const { product, productStock, custom } = props;
- const free =
- !data.onstation ||
- product.price === 0 ||
- (!product.premium && data.department_bitflag && data.user && data.department_bitflag & data.user.department_bitflag);
- return (
-
-
- {product.img ? (
-
- ) : (
-
- )}
-
- {product.name}
-
-
- {productStock} in stock
-
-
-
- {(custom && (
-
- act('dispense', {
- 'item': product.name,
- })
- }
- />
- )) || (
- data.user.cash))}
- content={free ? 'FREE' : product.price + ' cr'}
- onClick={() =>
- act('vend', {
- 'ref': product.ref,
- })
- }
- />
- )}
-
-
- );
-};
-
-export const Vending = (props, context) => {
- const { act, data } = useBackend(context);
- let inventory;
- let custom = false;
- if (data.vending_machine_input) {
- inventory = data.vending_machine_input;
- custom = true;
- } else if (data.extended_inventory) {
- inventory = [...data.product_records, ...data.coin_records, ...data.hidden_records];
- } else {
- inventory = [...data.product_records, ...data.coin_records];
- }
- return (
-
-
- {!!data.onstation && (
-
- {(data.user && (
-
- Welcome, {data.user.name} , {data.user.job || 'Unemployed'} !
-
- You have {data.user.cash} credits in possession .
-
- )) || (
-
- No registered ID card!
-
- Please contact your local HoP!
-
- )}
-
- )}
-
-
- {inventory.map((product) => (
-
- ))}
-
-
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/Vending.tsx b/tgui/packages/tgui/interfaces/Vending.tsx
new file mode 100644
index 0000000000000..360fdb84612d0
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Vending.tsx
@@ -0,0 +1,340 @@
+import { classes } from 'common/react';
+import { useBackend, useLocalState } from 'tgui/backend';
+import { Box, Button, Icon, LabeledList, NoticeBox, Section, Stack, Table } from '../components';
+import { Window } from '../layouts';
+
+type VendingData = {
+ onstation: boolean;
+ department: string;
+ product_records: ProductRecord[];
+ coin_records: CoinRecord[];
+ hidden_records: HiddenRecord[];
+ user: UserData;
+ stock: StockItem[];
+ extended_inventory: boolean;
+ access: boolean;
+ vending_machine_input: CustomInput[];
+ categories: Record;
+};
+
+type Category = {
+ icon: string;
+};
+
+type ProductRecord = {
+ path: string;
+ name: string;
+ price: number;
+ max_amount: number;
+ ref: string;
+ category: string;
+};
+
+type CoinRecord = ProductRecord & {
+ premium: boolean;
+};
+
+type HiddenRecord = ProductRecord & {
+ premium: boolean;
+};
+
+type UserData = {
+ name: string;
+ cash: number;
+ job: string;
+ department: string;
+};
+
+type StockItem = {
+ name: string;
+ amount: number;
+ colorable: boolean;
+};
+
+type CustomInput = {
+ name: string;
+ price: number;
+ img: string;
+};
+
+export const Vending = (props, context) => {
+ const { data } = useBackend(context);
+ const { onstation, product_records = [], coin_records = [], hidden_records = [], stock } = data;
+
+ const [selectedCategory, setSelectedCategory] = useLocalState(
+ context,
+ 'selectedCategory',
+ Object.keys(data.categories)[0]
+ );
+
+ let inventory: (ProductRecord | CustomInput)[];
+ let custom = false;
+ if (data.vending_machine_input) {
+ inventory = data.vending_machine_input;
+ custom = true;
+ } else {
+ inventory = [...product_records, ...coin_records];
+ if (data.extended_inventory) {
+ inventory = [...inventory, ...hidden_records];
+ }
+ }
+
+ inventory = inventory
+ // Just in case we still have undefined values in the list
+ .filter((item) => !!item);
+
+ const filteredCategories = Object.fromEntries(
+ Object.entries(data.categories).filter(([categoryName]) => {
+ return inventory.find((product) => {
+ if ('category' in product) {
+ return product.category === categoryName;
+ } else {
+ return false;
+ }
+ });
+ })
+ );
+ return (
+
+
+
+ {!!onstation && (
+
+
+
+ )}
+
+
+
+
+ {Object.keys(filteredCategories).length > 1 && (
+
+
+
+ )}
+
+
+
+ );
+};
+
+/** Displays user details if an ID is present and the user is on the station */
+const UserDetails = (props, context) => {
+ const { data } = useBackend(context);
+ const { user } = data;
+
+ if (!user) {
+ return No ID detected! Contact the Head of Personnel. ;
+ } else {
+ return (
+
+
+
+
+
+
+
+ {user.name}
+ {user.job || 'Unemployed'}
+
+
+
+
+ );
+ }
+};
+
+/** Displays products in a section, with user balance at top */
+const ProductDisplay = (
+ props: {
+ custom: boolean;
+ selectedCategory: string | null;
+ inventory: (ProductRecord | CustomInput)[];
+ },
+ context
+) => {
+ const { data } = useBackend(context);
+ const { custom, inventory, selectedCategory } = props;
+ const { stock, onstation, user } = data;
+ return (
+
+ {(user && user.cash) || 0} cr
+
+ )
+ }>
+
+ {inventory
+ .filter((product) => {
+ if ('category' in product) {
+ return product.category === selectedCategory;
+ } else {
+ return true;
+ }
+ })
+ .map((product) => (
+
+ ))}
+
+
+ );
+};
+
+/** An individual listing for an item.
+ * Uses a table layout - Labeledlist might be better,
+ * but you cannot use item icons as labels currently.
+ */
+const VendingRow = (props, context) => {
+ const { data } = useBackend(context);
+ const { custom, product, productStock } = props;
+ const { department, onstation, user } = data;
+ const free = !onstation || product.price === 0 || (!product.premium && department && user);
+
+ return (
+
+
+
+
+ {product.name.replace(/^\w/, (c) => c.toUpperCase())}
+ {!!productStock?.colorable && }
+
+
+
+
+
+
+
+ );
+};
+
+/** Displays the product image. Displays a default if there is none. */
+const ProductImage = (props) => {
+ const { product } = props;
+
+ return product.img ? (
+
+ ) : (
+
+ );
+};
+
+/** Displays a colored indicator for remaining stock */
+const ProductStock = (props) => {
+ const { custom, product, productStock } = props;
+
+ return (
+
+ {custom ? product.amount : productStock.amount} left
+
+ );
+};
+
+/** In the case of customizable items, ie: shoes,
+ * this displays a color wheel button that opens another window.
+ */
+const ProductColorSelect = (props, context) => {
+ const { act, data } = useBackend(context);
+ const { user, onstation, department } = data;
+ const { product, productStock } = props;
+ const free = !onstation || product.price === 0 || (!product.premium && department && user);
+
+ return (
+ user.cash && !free)}
+ onClick={() => act('select_colors', { ref: product.ref })}
+ />
+ );
+};
+
+/** The main button to purchase an item. */
+const ProductButton = (props, context) => {
+ const { act, data } = useBackend(context);
+ const { access, department, user, onstation } = data;
+ const { custom, free, product, productStock } = props;
+ const discount = (department === user?.department && !product.premium) || !data.onstation;
+ const redPrice = Math.round(product.price * 0);
+
+ return custom ? (
+ user.cash && !free)) && onstation)}
+ content={access ? 'FREE' : product.price + ' cr'}
+ onClick={() =>
+ act('dispense', {
+ 'item': product.name,
+ })
+ }
+ />
+ ) : (
+ user.cash && !free)) && onstation)}
+ content={discount ? 'FREE' : product.price + ' cr'}
+ onClick={() =>
+ act('vend', {
+ 'ref': product.ref,
+ })
+ }
+ />
+ );
+};
+
+const CATEGORY_COLORS = {
+ 'Contraband': 'red',
+ 'Premium': 'yellow',
+};
+
+const CategorySelector = (props: {
+ categories: Record;
+ selectedCategory: string;
+ onSelect: (category: string) => void;
+}) => {
+ const { categories, selectedCategory, onSelect } = props;
+
+ return (
+
+
+
+ {Object.entries(categories).map(([name, category]) => (
+ onSelect(name)}>
+ {name}
+
+ ))}
+
+
+
+ );
+};