diff --git a/_maps/RandomRuins/SpaceRuins/skelter.dmm b/_maps/RandomRuins/SpaceRuins/skelter.dmm
index f6e6584f10..f6e56a6348 100644
--- a/_maps/RandomRuins/SpaceRuins/skelter.dmm
+++ b/_maps/RandomRuins/SpaceRuins/skelter.dmm
@@ -1529,6 +1529,7 @@
icon_state = "warningline";
dir = 1
},
+/obj/item/paper/fluff/ruins/skelter/cloner,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/skelter/med)
"dJ" = (
@@ -2485,10 +2486,13 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/skelter/engine/powerstorage)
"fR" = (
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
-/obj/item/ammo_casing/c45,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/item/kitchen/knife/combat,
/turf/open/floor/plating,
/area/ruin/space/has_grav/skelter/engine/powerstorage)
"fS" = (
@@ -2826,10 +2830,12 @@
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/skelter/sec)
"gI" = (
-/obj/structure/rack,
-/obj/item/gun/ballistic/automatic/pistol/m1911,
-/turf/open/floor/plasteel/dark,
-/area/ruin/space/has_grav/skelter/sec)
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/item/ammo_casing/c10mm,
+/turf/open/floor/plating,
+/area/ruin/space/has_grav/skelter/engine/powerstorage)
"gJ" = (
/obj/machinery/power/terminal{
dir = 1
@@ -3285,17 +3291,10 @@
/turf/open/floor/plasteel/showroomfloor,
/area/ruin/space/has_grav/skelter/comms)
"hJ" = (
-/obj/effect/turf_decal/trimline/blue/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/item/ammo_casing/c45,
-/turf/open/floor/plasteel/showroomfloor,
-/area/ruin/space/has_grav/skelter/comms)
+/obj/structure/rack,
+/obj/item/ammo_box/magazine/m10mm,
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/has_grav/skelter/sec)
"hK" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
icon_state = "trimline_fill";
@@ -3843,19 +3842,10 @@
/turf/open/floor/plasteel/showroomfloor,
/area/ruin/space/has_grav/skelter/comms)
"iP" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag,
-/turf/open/floor/plasteel/showroomfloor,
-/area/ruin/space/has_grav/skelter/comms)
+/obj/structure/rack,
+/obj/item/gun/ballistic/automatic/pistol,
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/has_grav/skelter/sec)
"iQ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/mineral/titanium,
@@ -3934,17 +3924,15 @@
/turf/open/floor/plasteel/showroomfloor,
/area/ruin/space/has_grav/skelter/comms)
"iX" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
+/obj/effect/turf_decal/trimline/blue/line,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/blue{
- dir = 8
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/item/ammo_casing/c45,
+/obj/item/ammo_casing/c10mm,
/turf/open/floor/plasteel/showroomfloor,
/area/ruin/space/has_grav/skelter/comms)
"iY" = (
@@ -4149,16 +4137,39 @@
/turf/open/floor/carpet,
/area/ruin/space/has_grav/skelter/admin)
"jv" = (
-/obj/structure/rack,
-/obj/item/ammo_box/magazine/m45,
-/turf/open/floor/plasteel/dark,
-/area/ruin/space/has_grav/skelter/sec)
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/item/gun/ballistic/automatic/pistol/no_mag,
+/turf/open/floor/plasteel/showroomfloor,
+/area/ruin/space/has_grav/skelter/comms)
"jw" = (
/turf/open/space/basic,
/area/space/nearstation)
"jx" = (
/turf/open/space/basic,
/area/template_noop)
+"jy" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/item/ammo_casing/c10mm,
+/turf/open/floor/plasteel/showroomfloor,
+/area/ruin/space/has_grav/skelter/comms)
(1,1,1) = {"
ah
@@ -4479,7 +4490,7 @@ eW
cF
fN
gj
-jv
+hJ
gl
hw
hU
@@ -4539,7 +4550,7 @@ eX
fx
fN
gj
-gI
+iP
gl
hx
hx
@@ -4657,7 +4668,7 @@ dI
bI
fc
fA
-fR
+gI
go
gL
iC
@@ -4715,7 +4726,7 @@ bI
bI
bI
eA
-fd
+fR
fA
fA
fA
@@ -4991,10 +5002,10 @@ ju
gw
dO
hk
-hJ
+iX
ij
iF
-iP
+jv
iW
jh
jl
@@ -5025,7 +5036,7 @@ hK
ii
jm
jn
-iX
+jy
ii
jl
ah
diff --git a/_maps/map_files/LambdaStation/dorms.dmm b/_maps/map_files/LambdaStation/dorms.dmm
index e5003965ed..a38d2b9e1d 100644
--- a/_maps/map_files/LambdaStation/dorms.dmm
+++ b/_maps/map_files/LambdaStation/dorms.dmm
@@ -25,6 +25,9 @@
/obj/structure/closet,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
+"ae" = (
+/turf/open/floor/wood,
+/area/hydroponics/garden/monastery)
"af" = (
/obj/effect/landmark/carpspawn,
/turf/open/space/basic,
@@ -216,9 +219,6 @@
},
/turf/open/floor/plasteel,
/area/gateway)
-"ay" = (
-/turf/closed/wall/r_wall,
-/area/construction/mining/aux_base)
"az" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
@@ -386,16 +386,6 @@
"aT" = (
/turf/closed/wall/r_wall,
/area/chapel/main)
-"aU" = (
-/obj/effect/turf_decal/trimline/neutral/filled/line,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"aV" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -577,6 +567,13 @@
},
/turf/open/floor/plating,
/area/hydroponics/garden/abandoned)
+"br" = (
+/obj/structure/table,
+/obj/item/stack/sheet/metal/fifty,
+/obj/item/stack/sheet/metal/fifty,
+/obj/item/stack/sheet/glass/fifty,
+/turf/open/floor/plasteel,
+/area/construction/mining/aux_base)
"bu" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -600,6 +597,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"bv" = (
+/obj/structure/railing,
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"bw" = (
/obj/structure/cable{
icon_state = "2-8"
@@ -775,6 +776,15 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
+"bN" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
+ },
+/area/maintenance/central)
"bO" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 4
@@ -804,6 +814,15 @@
/obj/machinery/light,
/turf/open/floor/carpet,
/area/chapel/main)
+"bT" = (
+/obj/effect/turf_decal/trimline/neutral/filled/line{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hydroponics/garden/monastery)
"bU" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -926,6 +945,21 @@
/obj/item/clothing/mask/horsehead,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
+"cp" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/recreation)
"cq" = (
/turf/open/space,
/area/space)
@@ -1006,6 +1040,7 @@
dir = 4
},
/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/public/glass,
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
"cC" = (
@@ -1090,14 +1125,14 @@
icon_state = "L6";
layer = 2.04
},
-/mob/living/simple_animal/bot/medbot{
- auto_patrol = 1;
- name = "Dr. Heals"
- },
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=dorms9";
location = "dorms8"
},
+/mob/living/simple_animal/bot/medbot{
+ auto_patrol = 1;
+ name = "Dr. Heals"
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"cN" = (
@@ -1116,6 +1151,14 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
+"cO" = (
+/turf/closed/mineral{
+ baseturfs = /turf/open/floor/plating/asteroid;
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ name = "asteroid";
+ turf_type = /turf/open/floor/plating/asteroid
+ },
+/area/space)
"cP" = (
/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
@@ -1197,6 +1240,14 @@
},
/turf/open/floor/wood,
/area/crew_quarters/dorms)
+"db" = (
+/obj/effect/turf_decal/trimline/neutral/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/holopad,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/pool)
"dc" = (
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
@@ -1226,10 +1277,6 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"di" = (
-/obj/docking_port/stationary/public_mining_dock,
-/turf/open/floor/plating,
-/area/construction/mining/aux_base)
"dk" = (
/obj/machinery/door/airlock/public/glass{
name = "Public Minning Access"
@@ -1303,6 +1350,12 @@
},
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet)
+"ds" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/construction/mining/aux_base)
"dt" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -1362,6 +1415,10 @@
},
/turf/open/floor/wood,
/area/crew_quarters/dorms)
+"dB" = (
+/obj/structure/railing,
+/turf/open/floor/plating,
+/area/maintenance/central)
"dC" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -1426,13 +1483,6 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
-"dK" = (
-/obj/machinery/door/airlock/external{
- name = "Construction Zone"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plating,
-/area/construction/mining/aux_base)
"dM" = (
/obj/machinery/vending/autodrobe,
/turf/open/floor/wood,
@@ -1522,6 +1572,10 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3,
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
+"ea" = (
+/obj/machinery/light/floor,
+/turf/open/floor/wood,
+/area/hydroponics/garden/monastery)
"eb" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -1954,12 +2008,6 @@
/obj/machinery/airalarm/directional/west,
/turf/open/floor/carpet,
/area/chapel/office)
-"fn" = (
-/obj/machinery/computer/camera_advanced/base_construction{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"fo" = (
/obj/effect/turf_decal/vg_decals/department/sec,
/obj/effect/turf_decal/tile/neutral,
@@ -2178,10 +2226,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
-"fR" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1,
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"fS" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
@@ -2378,6 +2422,14 @@
},
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
+"go" = (
+/obj/machinery/camera/autoname,
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 8
+ },
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"gp" = (
/obj/effect/turf_decal/vg_decals/department/sci,
/obj/effect/turf_decal/tile/neutral,
@@ -2427,6 +2479,9 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{
dir = 4
},
+/obj/machinery/light{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/hydroponics/garden/monastery)
"gw" = (
@@ -2486,6 +2541,11 @@
"gI" = (
/turf/open/floor/plating,
/area/maintenance/bar)
+"gJ" = (
+/obj/structure/closet,
+/obj/structure/railing/corner,
+/turf/open/floor/plating,
+/area/maintenance/central)
"gK" = (
/obj/structure/table,
/obj/machinery/camera{
@@ -2509,6 +2569,14 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"gO" = (
+/obj/machinery/space_heater,
+/obj/structure/railing/corner{
+ icon_state = "railing_corner";
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/central)
"gP" = (
/obj/machinery/light/small{
dir = 8;
@@ -2560,14 +2628,6 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/crew_quarters/bar)
-"gV" = (
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/pipe_dispenser,
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"gX" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -2754,6 +2814,16 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
+"hv" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Aux Base Maintenance";
+ req_access_txt = "48"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/central)
"hw" = (
/obj/structure/chair/stool,
/obj/structure/cable{
@@ -2937,13 +3007,6 @@
icon_state = "wood-broken6"
},
/area/maintenance/bar)
-"hW" = (
-/obj/machinery/computer/shuttle/mining{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"hX" = (
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/bot,
@@ -2976,13 +3039,6 @@
/obj/effect/spawner/lootdrop/glowstick,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
-"ic" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"id" = (
/obj/structure/chair/sofa/corp/corner{
dir = 4
@@ -2996,35 +3052,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/cafeteria)
-"if" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 4
- },
-/obj/machinery/button/door{
- id = "aux_base_shutters";
- name = "Public Shutters Control";
- pixel_y = -24;
- req_one_access_txt = "32;47;48"
- },
-/obj/machinery/camera{
- c_tag = "Auxillary Base Construction";
- dir = 10
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
-"ig" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"ih" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/airlock/external{
@@ -3091,30 +3118,10 @@
},
/turf/open/floor/plasteel/grimy,
/area/chapel/office)
-"iq" = (
-/obj/machinery/computer/security/telescreen{
- desc = "Used for the Auxillary Mining Base.";
- dir = 1;
- name = "Auxillary Base Monitor";
- network = list("auxbase");
- pixel_y = -28
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"ir" = (
/obj/item/coin/silver,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
-"is" = (
-/obj/machinery/light,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"it" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
/obj/structure/cable{
@@ -3218,17 +3225,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
-"iH" = (
-/obj/machinery/power/apc{
- areastring = "/area/construction/mining/aux_base";
- name = "Auxillary Base Construction APC";
- pixel_y = -24
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"iI" = (
/obj/structure/table,
/obj/item/stack/sheet/plasteel{
@@ -3733,6 +3729,13 @@
},
/turf/open/floor/carpet,
/area/chapel/office)
+"jO" = (
+/obj/machinery/light/small{
+ dir = 8;
+ pixel_x = 5
+ },
+/turf/open/floor/plating,
+/area/maintenance/central)
"jP" = (
/obj/item/storage/bag/plants/portaseeder,
/obj/item/storage/bag/plants/portaseeder,
@@ -3860,14 +3863,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
-"kc" = (
-/obj/machinery/door/poddoor/shutters{
- id = "aux_base_shutters";
- name = "Auxillary Base Shutters"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"kd" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -3982,21 +3977,6 @@
/obj/item/organ/heart,
/turf/open/floor/carpet,
/area/chapel/office)
-"kp" = (
-/obj/machinery/door/airlock/engineering{
- name = "Auxillary Base Construction";
- req_one_access_txt = "32;47;48"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"kq" = (
/obj/effect/turf_decal/bot_white/left,
/obj/effect/turf_decal/tile/neutral{
@@ -4099,24 +4079,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/maintenance/central)
-"kC" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/machinery/button/door{
- id = "aux_base_shutters";
- name = "Public Shutters Control";
- pixel_y = 24;
- req_one_access_txt = "32;47;48"
- },
-/obj/effect/turf_decal/trimline/neutral/filled/line{
- dir = 6
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"kD" = (
/obj/effect/turf_decal/tile/green{
dir = 8
@@ -4141,24 +4103,6 @@
/obj/machinery/vending/snack/random,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness/recreation)
-"kK" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"kL" = (
/obj/structure/table,
/obj/item/extinguisher/mini,
@@ -4444,27 +4388,6 @@
},
/turf/open/floor/plasteel,
/area/hydroponics/garden/monastery)
-"lu" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"lv" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
@@ -4558,6 +4481,14 @@
icon_state = "wood-broken3"
},
/area/maintenance/bar)
+"lJ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/central)
"lK" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
dir = 4
@@ -4843,6 +4774,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"ms" = (
+/turf/open/floor/plating,
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
+ },
+/area/maintenance/central)
"mt" = (
/obj/structure/sign/poster/contraband/random{
pixel_x = -32
@@ -4858,6 +4795,13 @@
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
+"mv" = (
+/obj/machinery/computer/shuttle/mining,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/construction/mining/aux_base)
"mw" = (
/obj/structure/lattice/catwalk,
/obj/item/stack/cable_coil,
@@ -4925,6 +4869,10 @@
/obj/item/toy/cards/deck,
/turf/open/floor/wood,
/area/maintenance/bar)
+"mI" = (
+/obj/machinery/light/small,
+/turf/open/floor/plating,
+/area/maintenance/central)
"mK" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -5349,10 +5297,6 @@
},
/turf/open/floor/carpet,
/area/chapel/office)
-"nH" = (
-/obj/machinery/camera/autoname,
-/turf/open/floor/plasteel,
-/area/hydroponics/garden/monastery)
"nI" = (
/obj/machinery/door/airlock/maintenance{
req_one_access_txt = "12;5;39;6"
@@ -5648,6 +5592,13 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
+"oy" = (
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/central)
"oA" = (
/obj/structure/bodycontainer/morgue{
dir = 1
@@ -6183,6 +6134,13 @@
/obj/effect/turf_decal/tile/green,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"pS" = (
+/obj/effect/spawner/lootdrop/glowstick,
+/turf/open/floor/plating,
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
+ },
+/area/maintenance/central)
"pT" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -6579,6 +6537,9 @@
},
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
+"qO" = (
+/turf/open/transparent/openspace,
+/area/maintenance/central)
"qP" = (
/obj/effect/spawner/lootdrop/glowstick,
/turf/open/floor/plating,
@@ -6786,6 +6747,10 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone2)
+"rC" = (
+/obj/machinery/biogenerator,
+/turf/open/floor/wood,
+/area/hydroponics/garden/monastery)
"rD" = (
/obj/structure/lattice,
/turf/open/space/basic,
@@ -6815,6 +6780,9 @@
dir = 4;
layer = 3.2
},
+/obj/structure/curtain{
+ icon_state = "closed"
+ },
/turf/open/floor/mineral/titanium/blue,
/area/crew_quarters/dorms)
"rH" = (
@@ -7088,6 +7056,13 @@
},
/turf/open/floor/plasteel,
/area/hydroponics)
+"sn" = (
+/obj/structure/railing/corner{
+ icon_state = "railing_corner";
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/central)
"so" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -7103,6 +7078,16 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/cafeteria)
+"sq" = (
+/turf/closed/wall,
+/area/asteroid/nearstation)
+"sr" = (
+/obj/structure/railing/corner{
+ icon_state = "railing_corner";
+ dir = 4
+ },
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"ss" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 1
@@ -7556,6 +7541,14 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
+"tw" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/central)
"tx" = (
/obj/effect/turf_decal/plaque{
icon_state = "L13";
@@ -7807,13 +7800,6 @@
/obj/structure/pool/Lboard,
/turf/open/pool,
/area/crew_quarters/fitness/pool)
-"ui" = (
-/obj/machinery/light/floor,
-/obj/effect/turf_decal/trimline/neutral/filled/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hydroponics/garden/monastery)
"uj" = (
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
@@ -7974,6 +7960,10 @@
icon_state = "panelscorched"
},
/area/maintenance/department/crew_quarters/dorms)
+"uH" = (
+/obj/structure/railing/corner,
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"uI" = (
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating,
@@ -7985,6 +7975,9 @@
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 4
},
+/obj/machinery/light{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/hydroponics/garden/monastery)
"uK" = (
@@ -8680,6 +8673,9 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone2)
+"ww" = (
+/turf/closed/wall,
+/area/construction/mining/aux_base)
"wx" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/sink{
@@ -9100,6 +9096,10 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/main)
+"xN" = (
+/obj/machinery/seed_extractor,
+/turf/open/floor/wood,
+/area/hydroponics/garden/monastery)
"xO" = (
/obj/machinery/door/airlock/external{
name = "Solar Maintenance";
@@ -9862,9 +9862,6 @@
},
/turf/open/floor/plating,
/area/maintenance/central)
-"zG" = (
-/turf/closed/wall/r_wall,
-/area/asteroid/nearstation)
"zH" = (
/obj/machinery/vending/wallmed{
pixel_x = -28
@@ -10126,6 +10123,14 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
+"An" = (
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#c1caff"
+ },
+/obj/structure/railing/corner,
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"Ao" = (
/turf/closed/wall,
/area/tcommsat/chamber)
@@ -10172,6 +10177,13 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
+"Ax" = (
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#cee5d2"
+ },
+/turf/open/floor/wood,
+/area/hydroponics/garden/monastery)
"Ay" = (
/obj/machinery/vending/wardrobe/bar_wardrobe,
/turf/open/floor/wood,
@@ -10406,10 +10418,6 @@
"Be" = (
/turf/closed/wall,
/area/storage/tools)
-"Bf" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/hydroponics/garden/monastery)
"Bg" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -10593,9 +10601,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
-"BB" = (
-/turf/closed/wall/r_wall,
-/area/crew_quarters/dorms)
"BC" = (
/obj/structure/chair{
dir = 4
@@ -10606,6 +10611,9 @@
/obj/structure/dresser,
/turf/open/floor/wood,
/area/crew_quarters/dorms)
+"BE" = (
+/turf/open/transparent/openspace,
+/area/construction/mining/aux_base)
"BF" = (
/obj/effect/turf_decal/loading_area,
/turf/open/floor/plasteel,
@@ -10798,6 +10806,14 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
+"Ci" = (
+/obj/structure/closet/toolcloset,
+/obj/machinery/light/small{
+ dir = 8;
+ pixel_x = 5
+ },
+/turf/open/floor/plasteel,
+/area/construction/mining/aux_base)
"Ck" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/trimline/blue/filled/line{
@@ -11099,15 +11115,15 @@
/area/crew_quarters/kitchen)
"Da" = (
/obj/effect/decal/cleanable/dirt,
-/mob/living/simple_animal/hostile/lizard{
- name = "Wags-His-Tail";
- real_name = "Wags-His-Tail"
- },
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
+/mob/living/simple_animal/hostile/lizard{
+ name = "Wags-His-Tail";
+ real_name = "Wags-His-Tail"
+ },
/turf/open/floor/plating,
/area/janitor)
"Dc" = (
@@ -11256,6 +11272,10 @@
/obj/machinery/light,
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/cafeteria)
+"Dz" = (
+/obj/structure/railing/corner,
+/turf/open/floor/plating,
+/area/maintenance/central)
"DB" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -12018,6 +12038,14 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/main)
+"Fi" = (
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#c1caff"
+ },
+/obj/structure/flora/grass/jungle,
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"Fk" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -12100,6 +12128,13 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
+"Fw" = (
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/central)
"Fx" = (
/obj/structure/girder,
/obj/structure/grille,
@@ -12236,6 +12271,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"FP" = (
+/obj/machinery/computer/camera_advanced/base_construction,
+/turf/open/floor/plasteel,
+/area/construction/mining/aux_base)
"FQ" = (
/obj/item/storage/box/bodybags{
pixel_y = 5
@@ -13156,6 +13195,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/door/airlock/public/glass,
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
"Il" = (
@@ -13614,6 +13654,16 @@
},
/turf/open/floor/plasteel,
/area/janitor)
+"IY" = (
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/construction/mining/aux_base)
"IZ" = (
/obj/machinery/light{
dir = 4;
@@ -13705,6 +13755,11 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
+"Jn" = (
+/obj/structure/flora/tree/jungle/small,
+/obj/structure/railing,
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"Jo" = (
/obj/effect/turf_decal/trimline/neutral/filled/corner{
dir = 4
@@ -13764,7 +13819,6 @@
/turf/open/floor/carpet,
/area/chapel/main)
"Jz" = (
-/obj/structure/curtain,
/turf/open/floor/mineral/titanium/blue,
/area/crew_quarters/dorms)
"JA" = (
@@ -13947,6 +14001,13 @@
/obj/item/hand_labeler,
/turf/open/floor/plasteel,
/area/vacant_room/commissary)
+"JT" = (
+/obj/docking_port/stationary/public_mining_dock{
+ icon_state = "pinonfar";
+ dir = 2
+ },
+/turf/open/floor/plating,
+/area/construction/mining/aux_base)
"JU" = (
/obj/structure/chair/office/dark,
/turf/open/floor/carpet/blue,
@@ -14136,6 +14197,12 @@
},
/turf/open/floor/plating,
/area/maintenance/central)
+"Ky" = (
+/obj/machinery/door/airlock/external{
+ name = "Construction Zone"
+ },
+/turf/open/floor/plating,
+/area/construction/mining/aux_base)
"KB" = (
/obj/machinery/door/airlock/maintenance{
name = "Janitor Maintenance";
@@ -14353,6 +14420,13 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plasteel/white,
/area/crew_quarters/kitchen)
+"KX" = (
+/obj/structure/railing/corner{
+ icon_state = "railing_corner";
+ dir = 1
+ },
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"KZ" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -14392,6 +14466,13 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
+"Le" = (
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 5
+ },
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"Lf" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
dir = 8
@@ -14409,6 +14490,25 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
+"Lg" = (
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 8
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/hallway/secondary/construction";
+ dir = 1;
+ name = "Auxiliary Construction Zone APC";
+ pixel_y = 24
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/construction/mining/aux_base)
"Lh" = (
/obj/machinery/airalarm/directional/west,
/obj/machinery/seed_extractor,
@@ -14775,6 +14875,10 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/office)
+"Mb" = (
+/obj/structure/flora/grass/jungle,
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"Mc" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{
dir = 4
@@ -15371,6 +15475,17 @@
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
+"NG" = (
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 9
+ },
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
+"NH" = (
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/plating,
+/area/maintenance/solars/starboard/fore)
"NI" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
dir = 4
@@ -15937,6 +16052,11 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
/turf/open/floor/plasteel/chapel,
/area/chapel/main)
+"Pl" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/public/glass,
+/turf/open/floor/plasteel,
+/area/hallway/secondary/service)
"Pm" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{
dir = 6
@@ -16238,6 +16358,9 @@
dir = 8;
layer = 3.2
},
+/obj/structure/curtain{
+ icon_state = "closed"
+ },
/turf/open/floor/mineral/titanium/blue,
/area/crew_quarters/dorms)
"PY" = (
@@ -16328,6 +16451,15 @@
},
/turf/open/floor/plasteel/dark,
/area/gateway)
+"Qj" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating,
+/area/maintenance/central)
"Ql" = (
/obj/machinery/light/small/built,
/turf/open/floor/plating,
@@ -16389,11 +16521,6 @@
/obj/machinery/camera/autoname,
/turf/open/floor/plasteel/dark,
/area/chapel/main)
-"Qw" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plating,
-/area/hallway/secondary/construction)
"Qx" = (
/obj/structure/table,
/obj/item/reagent_containers/food/condiment/peppermill{
@@ -16457,9 +16584,6 @@
},
/turf/open/floor/carpet,
/area/crew_quarters/theatre)
-"QE" = (
-/turf/closed/wall/r_wall,
-/area/hydroponics/garden/monastery)
"QH" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/effect/turf_decal/tile/neutral,
@@ -16596,6 +16720,13 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
+"QT" = (
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 8
+ },
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"QU" = (
/turf/open/floor/wood,
/area/crew_quarters/bar)
@@ -16754,10 +16885,21 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
+"Rv" = (
+/obj/structure/flora/grass/jungle/b,
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"Rw" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/gateway)
+"Rx" = (
+/obj/structure/railing/corner{
+ icon_state = "railing_corner";
+ dir = 8
+ },
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"Ry" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 4
@@ -16784,6 +16926,13 @@
},
/turf/open/floor/plasteel,
/area/gateway)
+"RA" = (
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 4
+ },
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"RB" = (
/obj/machinery/atmospherics/pipe/layer_manifold{
dir = 4
@@ -17002,6 +17151,12 @@
/obj/machinery/camera/autoname,
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
+"Sa" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/construction/mining/aux_base)
"Sc" = (
/obj/machinery/cryopod{
dir = 8
@@ -17367,6 +17522,11 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
+"Tc" = (
+/obj/effect/turf_decal/bot,
+/obj/machinery/holopad,
+/turf/open/floor/plasteel,
+/area/hydroponics/garden/monastery)
"Td" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -17825,7 +17985,6 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/effect/turf_decal/vg_decals/numbers/two,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
"Ui" = (
@@ -17900,6 +18059,14 @@
},
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet)
+"Up" = (
+/obj/structure/table,
+/obj/item/pipe_dispenser,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/construction/mining/aux_base)
"Ur" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/obj/effect/turf_decal/tile/neutral,
@@ -18195,6 +18362,17 @@
/obj/structure/kitchenspike,
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/kitchen)
+"Vd" = (
+/obj/machinery/hydroponics/soil,
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
+"Vf" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plating,
+/area/maintenance/central)
"Vg" = (
/mob/living/simple_animal/hostile/retaliate/goat{
name = "Pete"
@@ -18408,6 +18586,15 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
+"VA" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
+ },
+/area/maintenance/central)
"VB" = (
/obj/structure/window/reinforced{
dir = 4
@@ -18458,8 +18645,8 @@
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
"VH" = (
-/mob/living/simple_animal/crab/Coffee,
/obj/machinery/camera/autoname,
+/mob/living/simple_animal/crab/Coffee,
/turf/open/floor/plating/beach/sand,
/area/crew_quarters/fitness/pool)
"VI" = (
@@ -18521,6 +18708,7 @@
pixel_y = 32
},
/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/public/glass,
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
"VR" = (
@@ -18608,10 +18796,6 @@
},
/turf/open/floor/wood,
/area/crew_quarters/dorms)
-"Wa" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/construction/mining/aux_base)
"Wb" = (
/obj/effect/landmark/start/mime,
/turf/open/floor/carpet,
@@ -19007,9 +19191,6 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
-"Xc" = (
-/turf/open/floor/plating/airless,
-/area/asteroid/nearstation)
"Xd" = (
/obj/effect/landmark/xeno_spawn,
/turf/open/floor/wood,
@@ -45997,7 +46178,7 @@ qo
qo
qo
qo
-qo
+sq
qo
qo
qo
@@ -46797,7 +46978,7 @@ Xh
qo
qo
qo
-qo
+sq
qo
qo
qo
@@ -47577,7 +47758,7 @@ qo
qo
qo
qo
-qo
+sq
UX
UX
UX
@@ -47817,7 +47998,7 @@ Xh
Xh
Xh
Xh
-qo
+sq
qo
qo
qo
@@ -48066,7 +48247,7 @@ qo
qo
qo
qo
-qo
+sq
qo
qo
qo
@@ -48609,7 +48790,7 @@ qo
qo
qo
qo
-qo
+sq
Xh
Xh
Xh
@@ -50186,7 +50367,7 @@ lO
Fo
Fo
pW
-qo
+sq
Xh
Xh
Xh
@@ -51709,7 +51890,7 @@ qo
FN
FN
qo
-qo
+sq
UX
UX
UX
@@ -53186,7 +53367,7 @@ fl
fl
fl
fl
-KN
+fl
Xx
Xx
Xx
@@ -53256,7 +53437,7 @@ qo
qo
qo
Xh
-Xc
+sq
qo
qo
qo
@@ -53443,7 +53624,7 @@ Gy
BU
gk
aM
-KN
+fl
Xx
Xx
Xx
@@ -53513,7 +53694,7 @@ qo
qo
qo
qo
-gx
+qo
qo
qo
qo
@@ -53700,7 +53881,7 @@ qS
ZG
Bs
Bs
-KN
+fl
Xx
Xx
Xx
@@ -53957,7 +54138,7 @@ ln
SA
Bs
Bs
-KN
+fl
Xx
Xx
Xx
@@ -54214,42 +54395,42 @@ PO
PO
PO
Bs
-KN
+fl
Xx
Xx
Xx
+cn
JV
JV
JV
JV
+cn
JV
JV
JV
JV
+cn
+JV
+JV
+JV
+cn
+JV
+JV
+cn
+JV
+JV
+JV
+cn
JV
JV
JV
JV
+cn
JV
JV
JV
JV
-JV
-JV
-JV
-JV
-JV
-JV
-JV
-JV
-JV
-JV
-JV
-JV
-JV
-JV
-JV
-JV
+cn
Xx
Xx
Xx
@@ -54471,11 +54652,11 @@ fl
fl
fl
rl
-KN
-KN
-KN
-KN
-QE
+fl
+fl
+fl
+fl
+cn
Iz
Iz
OR
@@ -54504,7 +54685,7 @@ Iz
Iz
OR
Iz
-Iz
+Rv
Iz
JV
Xx
@@ -54734,11 +54915,11 @@ Bs
PW
cn
Iz
+Mb
Iz
-Iz
-Iz
-Iz
-Iz
+Vd
+ae
+Vd
Iz
Iz
Iz
@@ -54748,6 +54929,7 @@ uM
Iz
Iz
Iz
+Mb
Iz
Iz
Iz
@@ -54755,11 +54937,10 @@ Iz
Iz
Iz
Iz
+uM
Iz
-Iz
-Iz
-Iz
-Iz
+Mb
+Rv
Iz
Iz
Iz
@@ -54989,20 +55170,20 @@ pK
pK
pK
Bs
-cn
+fN
PE
uM
Iz
+Vd
+ae
+Vd
+Iz
+Sd
Iz
Iz
Iz
Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
+Mb
Iz
Iz
Iz
@@ -55016,7 +55197,7 @@ Iz
Iz
Iz
Iz
-Iz
+Mb
Iz
uM
Yz
@@ -55250,12 +55431,9 @@ cn
Iz
Iz
Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Sd
+Vd
+ae
+Vd
Iz
Iz
Iz
@@ -55271,6 +55449,9 @@ Iz
Iz
Iz
Iz
+Rv
+Iz
+Iz
Iz
Iz
Sd
@@ -55282,9 +55463,9 @@ Xx
Xx
Xx
Xx
-BB
-BB
-BB
+Sz
+Sz
+Sz
sC
sC
AE
@@ -55504,25 +55685,26 @@ Bh
pK
Bs
cn
+rC
+ae
Iz
+Vd
+ae
+Vd
Iz
-Iz
-Iz
-Iz
-Iz
+cn
qn
Iz
Iz
Iz
Iz
Iz
-Iz
-Iz
Sd
Iz
Iz
Iz
Iz
+Mb
Iz
Iz
Iz
@@ -55533,13 +55715,12 @@ Iz
Iz
Iz
Iz
-Iz
-JV
+cn
Xx
Xx
Xx
Xx
-BB
+Sz
jf
rG
WM
@@ -55761,16 +55942,16 @@ lG
pK
Bs
cn
+xN
+ae
Iz
-Iz
-Iz
-Sd
-Iz
-Iz
+Vd
+ae
+Vd
Iz
pq
Iz
-Iz
+uM
Iz
Iz
pq
@@ -55796,7 +55977,7 @@ Xx
Xx
Xx
Xx
-BB
+Sz
KS
Jz
WM
@@ -55806,7 +55987,7 @@ eJ
qM
FA
FA
-FA
+db
FA
FA
FA
@@ -56018,14 +56199,11 @@ lZ
pK
Bs
cn
-PE
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
+Ax
+ae
+Iz
+Iz
+ae
Iz
Iz
Iz
@@ -56033,6 +56211,9 @@ Iz
Iz
Iz
Iz
+ae
+ae
+ae
Iz
Iz
uM
@@ -56051,9 +56232,9 @@ Sd
JV
Xx
Xx
-BB
-BB
-BB
+Sz
+Sz
+Sz
ke
Sz
WM
@@ -56275,40 +56456,40 @@ FC
pK
Bs
cn
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-uM
-Iz
-Iz
-Iz
-Iz
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
Sd
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
aE
JV
Xx
Xx
-BB
+Sz
IQ
zj
zj
@@ -56544,13 +56725,13 @@ Iz
Iz
Iz
Iz
+ae
+ae
+ae
Iz
Iz
-Iz
-Iz
-Iz
-Iz
-Iz
+ae
+ae
Iz
Iz
Iz
@@ -56562,10 +56743,10 @@ Iz
Iz
Iz
Iz
-JV
+cn
Xx
Xx
-BB
+Sz
fP
FM
yg
@@ -56798,6 +56979,7 @@ Iz
Iz
Iz
Iz
+Mb
Iz
Iz
Iz
@@ -56805,11 +56987,10 @@ Iz
Iz
Iz
Iz
-Iz
-Iz
-Iz
+ae
+ae
Sd
-Iz
+Rv
Iz
Iz
Iz
@@ -56822,7 +57003,7 @@ Yz
JV
Xx
Xx
-BB
+Sz
SX
zj
lo
@@ -57053,7 +57234,7 @@ Iz
Iz
Iz
Iz
-Iz
+Mb
Iz
Iz
Iz
@@ -57063,8 +57244,8 @@ uM
Iz
Iz
Iz
-pq
-Iz
+ea
+ae
Iz
Iz
Iz
@@ -57074,12 +57255,12 @@ Iz
Iz
Iz
Iz
-Iz
-Iz
+Mb
+Rv
JV
Xx
Xx
-BB
+Sz
kh
zj
lo
@@ -57318,13 +57499,13 @@ uM
Iz
Iz
Iz
+Mb
Iz
+ae
+ae
Iz
-Iz
-Iz
-Iz
-Iz
-Iz
+Mb
+Rv
Iz
Iz
Iz
@@ -57336,7 +57517,7 @@ Iz
JV
Xx
Xx
-BB
+Sz
zj
JZ
DJ
@@ -57562,12 +57743,23 @@ ZX
cn
Iz
Iz
-DN
+Fi
Iz
Iz
Iz
Iz
-DN
+An
+RA
+sr
+Iz
+Iz
+ga
+Iz
+Iz
+Iz
+Iz
+ae
+ae
Iz
Iz
Iz
@@ -57576,24 +57768,13 @@ ga
Iz
Iz
Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-ga
-Iz
-Iz
-Iz
-Iz
+Mb
Iz
Iz
JV
Xx
Xx
-BB
+Sz
BD
lc
Kt
@@ -57816,41 +57997,41 @@ pK
ra
OA
OA
-Vh
-Vh
-Vh
-Vh
-Vh
-Vh
+OA
+Tl
+Tl
+Tl
+Tl
+Tl
OA
OA
OA
dV
-Iz
-Iz
-Iz
-Bf
+Le
+RA
+RA
+cn
Iz
Iz
Iz
Iz
+ae
+ae
Iz
Iz
Iz
Iz
-Iz
-Iz
-Bf
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-JV
+cn
+RA
+RA
+RA
+RA
+RA
+RA
+cn
wq
wq
-BB
+Sz
Sz
Sz
nt
@@ -58083,25 +58264,25 @@ vf
PH
mK
wf
-ui
+mj
mj
mj
uJ
mj
lt
-ui
+mj
mj
CY
mj
mj
-ui
+mj
mj
mj
gv
mj
mj
mj
-ui
+mj
mj
iy
eB
@@ -58349,9 +58530,9 @@ gT
eE
eE
Ud
-Yh
-iV
eE
+iV
+Yh
eE
eE
gT
@@ -58600,18 +58781,18 @@ zB
zB
zB
hL
-zB
+bT
zB
zB
zB
zB
kN
-oe
+zB
hL
+oe
zB
zB
-zB
-zB
+bT
zB
zB
zB
@@ -58853,32 +59034,32 @@ PD
Ej
aA
OA
-qn
+go
+QT
+QT
+QT
+cn
Iz
Iz
Iz
Iz
Iz
-Iz
-Iz
-Yd
pq
+Yd
fK
Iz
Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-JV
+cn
+QT
+QT
+QT
+QT
+QT
+QT
+cn
wq
wq
-BB
+Sz
Sz
Sz
te
@@ -59114,6 +59295,8 @@ Iz
Iz
Iz
Iz
+OR
+Iz
Iz
Iz
Iz
@@ -59123,9 +59306,7 @@ Yd
fK
Iz
Iz
-Iz
-Iz
-Iz
+OR
Iz
Iz
Iz
@@ -59135,7 +59316,7 @@ Iz
JV
Xx
Xx
-BB
+Sz
BD
JB
Ab
@@ -59374,14 +59555,14 @@ Iz
pq
Iz
Iz
+Sd
+Rv
Iz
Yd
Yd
fK
Iz
Iz
-Iz
-Iz
pq
Iz
Sd
@@ -59392,7 +59573,7 @@ Iz
JV
Xx
Xx
-BB
+Sz
zj
FM
Lb
@@ -59630,26 +59811,26 @@ Iz
Iz
Iz
Iz
-Sd
+Iz
+Iz
+Iz
Iz
Yd
OX
jJ
Iz
-Iz
-Iz
Sd
Iz
Iz
Iz
Iz
-Iz
-Iz
+Rv
+Mb
Iz
JV
Xx
Xx
-BB
+Sz
SX
zj
DP
@@ -59885,10 +60066,12 @@ Iz
Iz
Iz
Iz
-Iz
-Iz
-Iz
-Iz
+Rv
+uH
+RA
+RA
+RA
+sr
Yd
Yd
Yd
@@ -59900,13 +60083,11 @@ Iz
Iz
Iz
Iz
-Iz
-Iz
Yz
JV
Xx
Xx
-BB
+Sz
kh
JZ
oC
@@ -60140,15 +60321,17 @@ vP
Tl
Iz
Iz
+Mb
Iz
Iz
-Iz
-Iz
-Iz
-Iz
-Yd
+bv
+aZ
+aZ
+aZ
+Le
pq
Yd
+Yd
Iz
Iz
Iz
@@ -60158,12 +60341,10 @@ Iz
Iz
Iz
Iz
-Iz
-Iz
-JV
+cn
Xx
Xx
-BB
+Sz
fP
zj
zj
@@ -60397,22 +60578,22 @@ vP
Tl
Iz
Iz
-Iz
+Mb
Iz
pq
-Iz
-Iz
-Bf
-Yd
+bv
+aZ
+aZ
+aZ
aZ
Yd
-Iz
-Iz
+Yd
+Yd
Iz
Iz
oF
Iz
-Iz
+Mb
Iz
Iz
uM
@@ -60420,7 +60601,7 @@ Iz
JV
Xx
Xx
-BB
+Sz
IQ
zj
zj
@@ -60657,14 +60838,14 @@ Iz
Iz
Iz
Iz
-Iz
-Yz
-Bf
-nH
+bv
+aZ
+aZ
+aZ
aZ
Yd
-Iz
-Iz
+Tc
+Yd
Iz
Iz
Sd
@@ -60677,8 +60858,8 @@ aE
JV
Xx
Xx
-BB
-BB
+Sz
+Sz
ke
Sz
Sz
@@ -60700,7 +60881,7 @@ Dk
VI
VI
VI
-VI
+cp
uC
VI
VI
@@ -60896,7 +61077,7 @@ KG
RN
YL
Rf
-oQ
+CA
yo
yo
Rk
@@ -60914,14 +61095,14 @@ Iz
Iz
Iz
Iz
-uM
-Iz
-Bf
-Yd
+Jn
+aZ
+aZ
+aZ
aZ
Yd
-Iz
-Iz
+Yd
+Yd
Iz
Iz
Iz
@@ -60935,7 +61116,7 @@ JV
Xx
Xx
Xx
-BB
+Sz
KS
Jz
Sz
@@ -61171,14 +61352,14 @@ Iz
Iz
Sd
Iz
-Iz
-Iz
-Iz
-Yd
+bv
+aZ
+aZ
+aZ
+NG
pq
Yd
-Iz
-Iz
+Yd
Iz
Iz
Iz
@@ -61188,11 +61369,11 @@ Iz
Iz
Iz
Iz
-JV
+cn
Xx
Xx
Xx
-BB
+Sz
yv
PX
Sz
@@ -61428,33 +61609,33 @@ Iz
Iz
Iz
Iz
+Rx
+QT
+QT
+QT
+KX
+Iz
+Iz
+Iz
+Rv
Iz
Iz
Iz
Iz
Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
-Iz
+Mb
Iz
Yz
JV
Xx
Xx
Xx
-BB
-BB
-BB
-BB
-zG
-BB
+Sz
+Sz
+Sz
+Sz
+sq
+Sz
Sz
Sz
kY
@@ -61693,7 +61874,7 @@ Sd
Iz
Iz
Iz
-Iz
+Rv
Iz
Iz
Iz
@@ -61709,9 +61890,9 @@ Xx
qo
qo
qo
-zG
+sq
uX
-BB
+Sz
yL
lE
lE
@@ -61966,7 +62147,7 @@ pW
pW
pW
qo
-zG
+sq
uX
Vi
fp
@@ -62197,7 +62378,7 @@ OA
Iz
Iz
Iz
-Iz
+Mb
DN
Pa
Iz
@@ -62223,7 +62404,7 @@ iT
xe
pW
qo
-zG
+sq
uX
Vi
It
@@ -62453,34 +62634,34 @@ vP
OA
fN
cn
-QE
-JV
-JV
-JV
-JV
+cn
JV
JV
JV
JV
+cn
JV
JV
JV
JV
+cn
JV
JV
JV
JV
+cn
JV
JV
JV
JV
+cn
Xx
pW
ir
po
pW
pW
-dw
+pW
uX
Vi
YC
@@ -62710,7 +62891,7 @@ Wj
OA
Pu
Bs
-KN
+fl
Xx
Xx
Xx
@@ -62737,9 +62918,9 @@ pY
Fo
YP
Fo
-dw
+pW
uX
-BB
+Sz
Sc
Sc
Sc
@@ -62966,10 +63147,10 @@ mg
bD
Go
TJ
-Bs
-KN
-Xx
-Xx
+gJ
+fl
+fl
+fl
Xx
Xx
Xx
@@ -62994,9 +63175,9 @@ pW
pW
pW
Fo
-dw
-dw
-BB
+pW
+pW
+Sz
Sz
Sz
Sz
@@ -63185,7 +63366,7 @@ qo
qo
qo
qo
-qo
+fl
fl
Bs
OA
@@ -63223,10 +63404,10 @@ hd
vP
OA
Yt
-ZX
-KN
-Xx
-Xx
+dB
+qO
+ms
+fl
Xx
Xx
Xx
@@ -63442,10 +63623,10 @@ qo
qo
qo
qo
-qo
fl
Bs
Bs
+mI
OA
oR
lk
@@ -63479,11 +63660,11 @@ He
hd
vP
OA
-Yt
+tw
+sn
+Fw
Bs
-KN
-Xx
-Xx
+fl
Xx
Xx
Xx
@@ -63696,12 +63877,12 @@ qo
FN
qo
qo
-qo
fl
fl
fl
fl
Bs
+Bs
tP
OA
PD
@@ -63737,10 +63918,10 @@ uc
vP
OA
Yt
-nN
-KN
-Xx
-Xx
+Dz
+oy
+Bs
+fl
Xx
Xx
Xx
@@ -63953,12 +64134,12 @@ qo
FN
FN
qo
-qo
fl
CH
JX
fl
Bs
+fl
OA
OA
Qr
@@ -63994,10 +64175,10 @@ hd
Fa
OA
Yt
-Bs
-KN
-Xx
-Xx
+dB
+qO
+fl
+fl
Xx
Xx
Xx
@@ -64210,13 +64391,13 @@ qo
FN
FN
qo
-qo
fl
fv
Li
rl
BW
-OA
+dB
+Wq
Wq
gp
jx
@@ -64251,9 +64432,9 @@ jH
vP
OA
Yt
-Bs
-KN
-Xx
+dB
+qO
+fl
Xx
Xx
Xx
@@ -64281,7 +64462,7 @@ qo
qo
qo
qo
-dw
+pW
Uk
rV
pW
@@ -64467,13 +64648,13 @@ qo
qo
FN
qo
-qo
fl
kL
DQ
fl
Bs
-OA
+dB
+Wq
Wq
fo
RR
@@ -64508,10 +64689,10 @@ MO
vP
OA
Yt
-cx
-KN
-KN
-KN
+gO
+fl
+fl
+fl
qo
qo
qo
@@ -64724,13 +64905,13 @@ FN
qo
FN
qo
-qo
fl
fl
fl
fl
Bs
-OA
+dB
+Wq
Wq
OG
mA
@@ -64981,12 +65162,12 @@ qo
FN
FN
qo
-qo
fl
um
um
fl
Bs
+fl
OA
OA
Bu
@@ -65027,7 +65208,7 @@ PI
PI
PI
PI
-PI
+lJ
PI
Of
oP
@@ -65238,13 +65419,13 @@ FN
FN
FN
qo
-qo
fl
Bs
kA
rl
BW
Bs
+Bs
OA
PD
lk
@@ -65495,12 +65676,12 @@ qo
qo
qo
qo
-qo
fl
fl
fl
fl
PW
+PW
Bs
OA
PD
@@ -65755,7 +65936,7 @@ qo
qo
qo
qo
-qo
+fl
fl
ZX
kA
@@ -66012,7 +66193,7 @@ qo
qo
qo
qo
-qo
+fl
fl
PW
Bs
@@ -66058,7 +66239,7 @@ Um
Rz
yr
gf
-Yt
+bN
fl
qo
qo
@@ -66260,19 +66441,19 @@ FN
qo
qo
qo
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
+FN
+qo
+qo
+qo
+qo
+FN
+qo
+qo
+qo
+fl
+Bs
+Bs
+fl
OA
oR
lk
@@ -66517,19 +66698,19 @@ FN
qo
qo
qo
-ay
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-dt
-fn
-hW
+FN
+qo
+qo
+qo
+qo
+FN
+qo
+qo
+qo
+fl
+Bs
+Bs
+fl
OA
cJ
ij
@@ -66773,21 +66954,21 @@ FN
qo
qo
qo
+FN
qo
-ay
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-dt
-fO
-Wa
-kc
+qo
+qo
+qo
+qo
+FN
+qo
+qo
+qo
+fl
+Bs
+Bs
+fl
+OA
PG
MJ
pg
@@ -67031,21 +67212,21 @@ qo
qo
qo
qo
-ay
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-dt
-fO
-ic
-kc
-aU
+qo
+FN
+FN
+qo
+FN
+qo
+qo
+qo
+qo
+fl
+Bs
+Bs
+fl
+OA
+PD
lk
pg
Gx
@@ -67287,22 +67468,22 @@ FN
qo
qo
qo
+FN
+FN
qo
-ay
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-dt
-LK
-if
+FN
+FN
+qo
+qo
+qo
+qo
+qo
+fl
+PW
+Bs
+fl
OA
-kC
+PD
lk
pg
rN
@@ -67544,23 +67725,23 @@ FN
qo
qo
qo
+FN
qo
-ay
-bb
-bb
-bb
-bb
-bF
-bb
-bb
-bb
-di
-dK
-fR
-ig
-kp
-kK
-lu
+qo
+qo
+qo
+FN
+qo
+qo
+qo
+qo
+fl
+Bs
+Bs
+fl
+OA
+PD
+Fd
pg
ID
OA
@@ -67801,22 +67982,22 @@ FN
FN
qo
qo
+FN
+FN
qo
-ay
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-dt
-fO
-iq
+qo
+qo
+FN
+qo
+qo
+qo
+qo
+fl
+fl
+Bs
+fl
OA
-mq
+PD
Fd
pg
ew
@@ -68058,20 +68239,20 @@ FN
qo
qo
qo
+FN
qo
-ay
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-dt
-gi
-is
+qo
+qo
+qo
+qo
+qo
+qo
+qo
+qo
+fl
+Bs
+mI
+fl
OA
ml
Fd
@@ -68105,7 +68286,7 @@ PD
MW
vP
OA
-qP
+pS
Bs
Bs
Bs
@@ -68314,21 +68495,21 @@ qo
qo
FN
qo
+FN
qo
qo
-ay
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-dt
-gj
-iH
+qo
+FN
+qo
+qo
+qo
+qo
+qo
+qo
+fl
+Bs
+PW
+fl
OA
PD
wh
@@ -68573,19 +68754,19 @@ FN
qo
qo
qo
-ay
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-bb
-dt
-gV
-iI
+qo
+qo
+FN
+FN
+qo
+FN
+qo
+qo
+qo
+fl
+Bs
+Bs
+fl
OA
TW
XN
@@ -68604,7 +68785,7 @@ Je
YX
uw
Tl
-Av
+Pl
Ik
OA
OA
@@ -68830,19 +69011,19 @@ qo
qo
qo
qo
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
-ay
+qo
+ct
+ct
+ct
+ct
+ct
+ct
+ct
+ct
+ct
+Bs
+Bs
+fl
OA
PD
Fd
@@ -68881,7 +69062,7 @@ fl
er
JX
rl
-BW
+VA
fl
qo
qo
@@ -69096,7 +69277,7 @@ fD
mh
Cu
bA
-fl
+ct
oE
tT
fq
@@ -69610,7 +69791,7 @@ Ew
du
vl
lA
-fl
+ct
Yt
fl
qo
@@ -69864,10 +70045,10 @@ hX
HB
HB
wc
-Qw
+HB
vl
YT
-fl
+ct
Yt
fl
qo
@@ -70381,7 +70562,7 @@ CO
FJ
ur
fg
-fl
+ct
Yt
fl
qo
@@ -70887,7 +71068,7 @@ YV
IB
PI
Fr
-oP
+Vf
fl
jS
fl
@@ -71153,8 +71334,8 @@ fl
fl
fl
fl
-fl
-fl
+Bs
+Bs
Yt
gw
gw
@@ -71394,7 +71575,7 @@ yM
zh
Dv
GQ
-Jg
+NH
Sx
UV
PI
@@ -71409,9 +71590,9 @@ gH
fl
qo
qo
-qo
-qo
fl
+fl
+Bs
jk
PI
oP
@@ -71667,13 +71848,13 @@ fl
qo
qo
qo
-qo
+fl
fl
Fz
-fl
+Bs
Yt
fl
-qo
+fl
fl
Yt
fl
@@ -71929,9 +72110,9 @@ fl
fl
fl
Yt
-fl
-fl
-fl
+Bs
+jO
+Bs
Yt
fl
fl
@@ -72188,7 +72369,7 @@ fl
fC
PI
PI
-PI
+Qj
gH
fl
qo
@@ -72445,7 +72626,7 @@ fl
fl
fl
fl
-fl
+Yt
fl
fl
qo
@@ -72700,10 +72881,10 @@ qo
qo
qo
qo
-qo
-qo
-qo
-qo
+fl
+Bs
+Yt
+fl
qo
qo
qo
@@ -72957,10 +73138,10 @@ qo
qo
qo
qo
-qo
-qo
-qo
-qo
+fl
+Bs
+Yt
+fl
qo
qo
qo
@@ -73214,9 +73395,9 @@ FN
qo
qo
qo
-qo
-qo
-qo
+fl
+Bs
+Yt
qo
qo
qo
@@ -73472,9 +73653,9 @@ FN
qo
FN
qo
-qo
-FN
-FN
+Bs
+Yt
+fl
qo
qo
qo
@@ -73729,9 +73910,9 @@ FN
FN
qo
FN
-qo
-FN
-FN
+Bs
+Yt
+fl
FN
qo
qo
@@ -73985,10 +74166,10 @@ qo
FN
qo
qo
-FN
qo
-FN
-FN
+Bs
+Yt
+fl
FN
qo
qo
@@ -74242,10 +74423,10 @@ FN
FN
qo
FN
-FN
-FN
-FN
qo
+Bs
+Yt
+fl
qo
qo
qo
@@ -74500,9 +74681,9 @@ qo
qo
qo
qo
-qo
-FN
-qo
+Bs
+Yt
+fl
qo
qo
qo
@@ -74756,9 +74937,9 @@ qo
FN
qo
FN
-qo
-qo
-qo
+fl
+Bs
+Yt
qo
FN
qo
@@ -75013,10 +75194,10 @@ qo
qo
qo
qo
-FN
-qo
-FN
-qo
+fl
+Bs
+Yt
+fl
FN
qo
FN
@@ -75270,10 +75451,10 @@ qo
FN
qo
qo
-FN
-qo
-qo
-qo
+fl
+Bs
+Yt
+fl
qo
qo
qo
@@ -75284,7 +75465,7 @@ qo
FN
qo
qo
-Xh
+cO
KN
DZ
KN
@@ -75525,23 +75706,23 @@ FN
qo
FN
qo
-qo
-qo
-FN
-FN
-FN
-qo
-FN
-qo
-qo
-qo
-qo
-FN
-qo
-FN
-qo
-qo
-Xh
+ww
+ww
+ww
+ww
+hv
+ww
+ww
+ww
+ww
+ww
+ww
+ww
+ww
+ww
+ww
+ww
+ww
UX
LU
UX
@@ -75782,23 +75963,23 @@ qo
FN
qo
FN
-FN
-qo
-qo
-qo
-FN
-FN
-FN
-qo
-qo
-qo
-qo
-qo
-qo
-FN
-qo
-Xh
-Xh
+ww
+BE
+BE
+BE
+ds
+Ci
+dt
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ww
Xh
LU
Xh
@@ -76039,25 +76220,25 @@ qo
qo
FN
FN
-qo
-qo
-qo
-FN
-qo
-qo
-qo
-qo
-qo
-FN
-qo
-qo
-FN
-qo
-qo
-Xh
-Xh
-Xh
+ww
+Lg
+IY
+IY
+Sa
+LK
+dt
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ww
Xh
+LU
Xh
Xh
qo
@@ -76296,25 +76477,25 @@ FN
qo
qo
qo
-qo
-qo
-qo
-qo
-qo
-qo
-FN
-qo
-qo
-qo
-qo
-FN
-qo
-qo
-qo
-Xh
-Xh
-Xh
+ww
+ww
+ww
+gj
+fO
+fO
+dt
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ww
Xh
+LU
Xh
Xh
qo
@@ -76555,23 +76736,23 @@ FN
qo
FN
qo
-FN
-qo
-qo
-qo
-qo
-qo
-FN
-qo
-qo
-qo
-FN
-qo
-qo
-Xh
-Xh
-Xh
+ww
+FP
+fO
+fO
+dt
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ww
Xh
+LU
Xh
Xh
qo
@@ -76812,23 +76993,23 @@ qo
qo
qo
FN
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-Xh
-Xh
-Xh
+ww
+mv
+fO
+fO
+Ky
+JT
+bb
+bb
+bb
+bF
+bb
+bb
+bb
+bb
+ww
Xh
+LU
Xh
Xh
qo
@@ -77069,23 +77250,23 @@ qo
qo
qo
FN
-FN
-qo
-FN
-qo
-FN
-qo
-qo
-qo
-FN
-FN
-qo
-qo
-qo
-Xh
-Xh
-Xh
+ww
+gi
+fO
+fO
+dt
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ww
Xh
+LU
Xh
Xh
qo
@@ -77326,26 +77507,26 @@ qo
qo
FN
qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-Xh
-Xh
-Xh
-Xh
-Xh
-Xh
-qo
+ww
+fO
+fO
+fO
+dt
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ww
+UX
+LU
+UX
+UX
+ww
qo
qo
qo
@@ -77583,23 +77764,23 @@ qo
qo
qo
qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-Xh
-Xh
-Xh
+ww
+br
+Up
+iI
+dt
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ww
Xh
+LU
Xh
Xh
qo
@@ -77840,21 +78021,21 @@ Xh
qo
qo
qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-qo
-Xh
-Xh
+ww
+ww
+ww
+ww
+ww
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ww
Xh
Xh
Xh
@@ -78101,17 +78282,17 @@ Xh
Xh
Xh
Xh
-Xh
-Xh
-Xh
-Xh
-Xh
-Xh
-Xh
-Xh
-Xh
-Xh
-Xh
+ww
+ww
+ww
+ww
+ww
+ww
+ww
+ww
+ww
+ww
+ww
Xh
Xh
Xh
diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm
index fdcc0fa7c1..a0d54edb91 100644
--- a/_maps/map_files/LambdaStation/lambda.dmm
+++ b/_maps/map_files/LambdaStation/lambda.dmm
@@ -11825,8 +11825,8 @@
dir = 8
},
/obj/effect/turf_decal/tile/neutral,
-/mob/living/simple_animal/hostile/retaliate/bat/secbat,
/obj/effect/turf_decal/loading_area/red,
+/mob/living/simple_animal/hostile/retaliate/bat/secbat,
/turf/open/floor/plasteel/dark,
/area/security/brig)
"avX" = (
@@ -21222,9 +21222,6 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
-"aMg" = (
-/turf/closed/wall/r_wall,
-/area/quartermaster/miningoffice)
"aMh" = (
/turf/closed/wall/r_wall,
/area/crew_quarters/heads/captain/private)
@@ -23448,11 +23445,14 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"aQy" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Mining Maintenance";
- req_access_txt = "48"
+/obj/machinery/door/airlock/engineering{
+ name = "Auxillary Base Construction";
+ req_one_access_txt = "32;47;48"
},
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
"aQz" = (
/turf/closed/wall,
@@ -23735,12 +23735,6 @@
"aRj" = (
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"aRk" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
"aRl" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -23752,10 +23746,6 @@
},
/turf/open/floor/plating,
/area/maintenance/fore)
-"aRm" = (
-/obj/structure/sign/warning/vacuum/external,
-/turf/closed/wall/r_wall,
-/area/maintenance/department/cargo)
"aRn" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -24108,12 +24098,6 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
-"aSm" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
"aSn" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -24128,15 +24112,6 @@
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating,
/area/maintenance/fore)
-"aSo" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
"aSp" = (
/obj/structure/lattice/catwalk,
/turf/open/space,
@@ -27268,6 +27243,9 @@
name = "Bridge";
req_access_txt = "19"
},
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/command)
"baa" = (
@@ -37337,6 +37315,9 @@
req_access_txt = "19"
},
/obj/machinery/door/firedoor,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/command)
"bAH" = (
@@ -37882,6 +37863,9 @@
dir = 4
},
/obj/effect/turf_decal/tile/neutral,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/command)
"bCA" = (
@@ -37896,6 +37880,9 @@
name = "Command Hallway";
req_access_txt = "19"
},
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/command)
"bCB" = (
@@ -46902,10 +46889,6 @@
},
/turf/open/floor/plating,
/area/maintenance/disposal)
-"cat" = (
-/obj/item/storage/toolbox/mechanical,
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
"cau" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -49432,15 +49415,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
-"chE" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 3;
- name = "3maintenance loot spawner"
- },
-/obj/item/storage/toolbox/emergency,
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
"chG" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -55016,8 +54990,9 @@
"cxw" = (
/obj/machinery/power/apc{
areastring = "/area/construction";
+ dir = 1;
name = "Construction Area APC";
- pixel_y = -24
+ pixel_y = 24
},
/obj/structure/cable{
icon_state = "0-4"
@@ -59865,6 +59840,9 @@
/area/medical/abandoned)
"cMq" = (
/obj/machinery/door/airlock/external,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/maintenance/central/secondary)
"cMr" = (
@@ -63507,13 +63485,6 @@
},
/turf/open/floor/plating/airless,
/area/engine/engineering)
-"dRD" = (
-/obj/machinery/status_display/ai{
- pixel_y = 32
- },
-/obj/machinery/vending/cigarette,
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
"dRM" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -64284,6 +64255,9 @@
},
/turf/open/floor/plasteel,
/area/engine/break_room)
+"eYV" = (
+/turf/open/floor/plasteel,
+/area/maintenance/department/cargo)
"eZq" = (
/obj/machinery/gravity_generator/main/station,
/obj/effect/turf_decal/bot_white,
@@ -64413,10 +64387,6 @@
/obj/structure/chair,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
-"fqq" = (
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
"fqL" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
@@ -64948,6 +64918,10 @@
},
/turf/open/floor/plasteel/grimy,
/area/tcommsat/computer)
+"gbW" = (
+/obj/structure/stairs/south,
+/turf/open/floor/plasteel,
+/area/maintenance/department/cargo)
"gcM" = (
/obj/effect/turf_decal/tile/red{
dir = 8
@@ -65849,11 +65823,9 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"hDs" = (
-/obj/structure/chair/comfy/brown{
- dir = 8
- },
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/plating,
+/area/maintenance/department/medical)
"hEj" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -65961,12 +65933,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
-"hTm" = (
-/obj/structure/chair/comfy/brown{
- dir = 4
- },
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
"hVb" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 1
@@ -66553,6 +66519,10 @@
},
/turf/open/space/basic,
/area/space/nearstation)
+"jjQ" = (
+/obj/effect/spawner/lootdrop/crate_spawner,
+/turf/open/floor/plating,
+/area/maintenance/department/medical)
"jld" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -67036,12 +67006,16 @@
/turf/open/floor/plating/airless,
/area/engine/atmos)
"kgv" = (
-/obj/structure/table,
-/obj/item/flashlight/lamp/green{
- pixel_y = 3
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 4
},
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 8
+ },
+/turf/open/floor/plasteel/stairs/old,
+/area/maintenance/department/medical)
"khi" = (
/obj/machinery/light{
dir = 4;
@@ -67431,10 +67405,6 @@
},
/turf/open/floor/plating,
/area/maintenance/port)
-"leD" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/carpet,
-/area/hallway/primary/aft)
"lfg" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
@@ -68436,15 +68406,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/closed/wall,
/area/maintenance/disposal/incinerator)
-"nab" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
"nek" = (
/obj/docking_port/stationary{
dir = 8;
@@ -69505,6 +69466,12 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
/turf/open/floor/plating,
/area/maintenance/aft)
+"peD" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/department/cargo)
"pgc" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
@@ -69944,13 +69911,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/white,
/area/medical/medbay/lobby)
-"pXR" = (
-/obj/machinery/status_display/evac{
- pixel_y = 32
- },
-/obj/machinery/vending/coffee,
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
"pXT" = (
/obj/machinery/light{
dir = 4
@@ -70170,8 +70130,11 @@
},
/area/maintenance/department/electrical)
"qIN" = (
-/turf/open/floor/carpet,
-/area/hallway/primary/aft)
+/turf/open/floor/plating,
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
+ },
+/area/maintenance/department/medical)
"qLB" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
/turf/closed/wall/r_wall,
@@ -70312,6 +70275,17 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
+"rcP" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/maintenance/department/medical)
"rcU" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{
dir = 4
@@ -70668,6 +70642,13 @@
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/foyer)
+"rMw" = (
+/obj/machinery/door/airlock/external,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/central/secondary)
"rNH" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/general/visible{
@@ -70949,10 +70930,12 @@
/turf/closed/wall,
/area/maintenance/starboard/aft)
"sHs" = (
-/obj/machinery/vending/snack/random,
-/obj/machinery/camera/autoname,
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/medical)
"sJs" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -71043,14 +71026,6 @@
},
/turf/open/space,
/area/solar/starboard/aft)
-"sYf" = (
-/obj/item/kirbyplants/random,
-/obj/machinery/light{
- dir = 4;
- light_color = "#e8eaff"
- },
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
"sYO" = (
/obj/structure/window/reinforced/spawner/north,
/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{
@@ -71125,12 +71100,17 @@
/turf/open/floor/carpet,
/area/hallway/secondary/entry)
"tcW" = (
-/obj/item/kirbyplants/random,
-/obj/machinery/light{
+/obj/structure/stairs/west,
+/obj/structure/railing{
+ icon_state = "railing";
+ dir = 4
+ },
+/obj/structure/railing{
+ icon_state = "railing";
dir = 8
},
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
+/turf/open/floor/plating,
+/area/maintenance/department/medical)
"tdt" = (
/obj/machinery/power/port_gen/pacman,
/turf/open/floor/plating,
@@ -71621,11 +71601,6 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
-"uaS" = (
-/obj/structure/table,
-/obj/item/reagent_containers/food/snacks/chips,
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
"ubl" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -71756,10 +71731,6 @@
/obj/item/flashlight/lamp,
/turf/open/floor/carpet/orange,
/area/crew_quarters/heads/chief/private)
-"uqr" = (
-/obj/machinery/holopad,
-/turf/open/floor/carpet,
-/area/hallway/primary/aft)
"urx" = (
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/rock/jungle,
@@ -71781,9 +71752,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
-"usZ" = (
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
"utp" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
@@ -71826,6 +71794,13 @@
},
/turf/open/floor/plasteel,
/area/engine/break_room)
+"uyX" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Aux Base Maintenance";
+ req_access_txt = "48"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/cargo)
"uBL" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -73132,6 +73107,9 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
+"xbr" = (
+/turf/closed/wall/r_wall,
+/area/space/nearstation)
"xfQ" = (
/obj/machinery/atmospherics/pipe/manifold/green/visible{
dir = 4
@@ -73527,10 +73505,6 @@
"ycq" = (
/turf/open/floor/engine/plasma,
/area/engine/atmos)
-"yeB" = (
-/obj/structure/table,
-/turf/open/floor/plasteel/grimy,
-/area/hallway/primary/aft)
"yfq" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -105141,7 +105115,7 @@ bpg
cDz
aSt
biL
-cMq
+rMw
biL
biL
biL
@@ -115949,7 +115923,7 @@ cVr
cVr
cVr
cVr
-cVt
+rcP
bDx
bDx
bDx
@@ -116464,12 +116438,12 @@ ctY
cxq
cza
cBF
-boU
-boU
-boU
-boU
-boU
-boU
+bDx
+bDx
+aaA
+bDx
+aaA
+aaA
boU
bZM
ccx
@@ -116721,13 +116695,13 @@ cuc
cxC
cVr
cBI
-boU
+bpw
+kgv
kgv
-hTm
tcW
-hTm
-yeB
-bIL
+bDx
+aaA
+boU
bZT
ccB
cgC
@@ -116978,13 +116952,13 @@ cud
cxD
cVr
cVt
+bqa
+bpw
+bpw
+bRI
+bDx
+aaA
boU
-pXR
-qIN
-qIN
-qIN
-usZ
-bIL
luG
cdM
hST
@@ -117235,13 +117209,13 @@ cue
cxE
cVr
cVt
-boU
+bpw
sHs
qIN
-uqr
-leD
-usZ
-fqq
+aaA
+aaA
+aaA
+boU
cgY
cWO
cAj
@@ -117492,13 +117466,13 @@ cVr
cVr
cVr
cVt
+bpw
+bpw
+bpw
+jjQ
+aaA
+aaA
boU
-dRD
-qIN
-qIN
-qIN
-usZ
-fqq
cgY
cWO
sNh
@@ -117749,13 +117723,13 @@ cuS
cxS
cVr
cBK
+bhg
+biZ
+hDs
+bDx
+aaA
+aaA
boU
-yeB
-hDs
-sYf
-hDs
-uaS
-bIL
mdh
cWO
cgK
@@ -118006,12 +117980,12 @@ cud
cxT
cVr
cVt
-boU
-boU
-boU
-boU
-boU
-boU
+bpw
+bDx
+bDx
+aaA
+aaA
+aaA
boU
bZX
cWO
@@ -118263,7 +118237,7 @@ cuc
cxC
cVr
cVt
-aaA
+bpw
aaA
aaA
aaA
@@ -118520,7 +118494,7 @@ ctY
cxU
cza
cBF
-aaA
+bpw
aaA
aaA
aaA
@@ -118779,7 +118753,7 @@ cVr
cVt
bDx
aaA
-aco
+aaA
aaA
aaA
boU
@@ -128253,7 +128227,7 @@ aOD
aPv
aPF
aMe
-cat
+aRj
aRj
aRj
aRj
@@ -128510,7 +128484,7 @@ aNX
aNa
aPG
aMe
-cQS
+aRj
aRj
aQz
aQz
@@ -128767,23 +128741,23 @@ aOa
aNa
aPH
aMe
-aRj
aQz
+uyX
aQz
aaA
-aaR
-aaR
-aaR
-aaR
-aaA
-aaA
-aaA
-aaA
-aaA
-aco
aaA
aaA
aaA
+aac
+aaa
+aaa
+aaa
+aaa
+aac
+aaa
+aaa
+aaa
+aaa
aab
bjw
bkJ
@@ -129024,25 +128998,25 @@ aNZ
aNa
cLS
aMe
-aRj
-lQP
+eYV
+eYV
+aQz
+aQz
+aQz
aQz
-aaR
-aaR
-aaR
-aaR
-aaR
aaA
-aaA
-aco
-aaA
-aaA
-aaA
-aaA
-cce
-aaA
-aaa
-aaa
+xbr
+aac
+aac
+aac
+aac
+xbr
+aac
+aac
+aac
+aac
+xbr
+aac
aac
aaa
aab
@@ -129281,24 +129255,24 @@ aNZ
aOO
aQp
aQy
-aRk
-aRj
+eYV
+eYV
+peD
+eYV
+gbW
aQz
-aaR
-aaR
-aaR
aaA
-aaR
-aaA
-aaA
-aaA
-aaA
-aab
-aab
-aab
aac
+aaa
+aaa
+aaa
+aab
+aab
+aab
+aab
aab
aaa
+aac
aaa
aac
aaa
@@ -129538,24 +129512,24 @@ aPy
aNa
aQq
aMe
-bIH
-aRj
aQz
-aaR
+aQz
+aQz
+aQz
+aQz
+aQz
aaA
-aaA
-aaA
-aaA
-aaA
-aaA
-aab
-aab
-aaa
-aaa
-aaa
aac
-aaa
-aaa
+aab
+aab
+aab
+aab
+aab
+aab
+aab
+aab
+aab
+aac
aaa
aac
aaa
@@ -129795,25 +129769,25 @@ aOb
aNa
aQq
aMe
-bIH
-aRj
-aQz
-aaR
-aaA
-aco
aaA
aaA
aaA
aaA
-aaa
-aaa
-aaa
-aaa
-aaa
+aaA
+aaA
+aaA
aac
aaa
aaa
aaa
+aab
+aab
+aab
+aab
+aab
+aaa
+aac
+aaa
aac
aaa
aab
@@ -130046,31 +130020,31 @@ aMd
aMd
aMd
aMd
-aMg
+aMe
aLo
aOE
aPw
aQr
aMe
-aRj
-cQS
-aQz
-aaR
aaA
aaA
aaA
aaA
+aaA
+aaA
+aaA
+aac
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aac
aab
-aab
-aaa
-aaa
-aaa
-aab
-aaa
-aac
-aac
-aac
-aac
aac
aac
aav
@@ -130303,31 +130277,31 @@ aav
aab
aab
aab
-aMg
-aMg
-aMg
-aMg
-aMg
-aMg
-aRj
-aRj
-aQA
-aaR
+aMe
+aMe
+aMe
+aMe
+aMe
+aMe
aaA
aaA
aaA
aaA
+aaA
+aaA
+aaA
+xbr
aaa
aaa
aaa
-aab
-aab
-aab
-aab
-aab
-aab
-aab
-aab
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+xbr
+aac
aac
aab
aab
@@ -130565,15 +130539,15 @@ aaA
aaA
aaA
aaA
-aQA
-chE
-aSm
-aQA
+aaA
+aaA
+aaA
+aaA
aaA
aaA
aab
aab
-aab
+aac
aaa
aaa
aaa
@@ -130582,8 +130556,8 @@ aab
aab
aab
aab
-aab
-aab
+aaa
+aac
aaa
aac
aaa
@@ -130822,25 +130796,25 @@ aab
aaA
aaA
aaA
-aQA
-aRm
-aSo
-aQA
+aaA
+aaA
+aaA
+aaA
aaA
aab
aaa
aaa
+aac
aaa
aaa
aaa
+aab
+aab
+aab
+aab
+aab
aaa
-aab
-aab
-aab
-aab
-aab
-aab
-aab
+aac
aaa
aac
aaa
@@ -131080,24 +131054,24 @@ aab
aab
aaA
aaA
-aQA
-aRj
-aQA
+aaA
+aaA
+aaA
aaA
aaa
aaa
aaa
+aac
aaa
aaa
aaa
aaa
-aab
-aab
-aab
-aab
-aab
-aab
-aab
+aaa
+aaa
+aaa
+aaa
+aaa
+aac
aaa
aac
aaa
@@ -131335,12 +131309,16 @@ aaa
aaa
aaa
aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aab
-aab
-aQA
-aRj
-aQA
-aab
+aaa
+aaa
+aaa
+aac
aaa
aaa
aaa
@@ -131348,13 +131326,9 @@ aaa
aaa
aaa
aaa
-aab
-aab
-aab
-aab
-aab
-aab
-aab
+aaa
+aaa
+aac
aaa
aac
aac
@@ -131593,10 +131567,6 @@ aaa
aaa
aaa
aaa
-aab
-aQA
-nab
-aQA
aaa
aaa
aaa
@@ -131605,14 +131575,18 @@ aaa
aaa
aaa
aaa
-aab
-aab
-aab
-aab
-aab
-aaa
-aaa
-aaa
+xbr
+aac
+aac
+aac
+aac
+xbr
+aac
+aac
+aac
+aac
+xbr
+aac
aac
aaa
aaa
@@ -131847,13 +131821,13 @@ aaa
aaa
aaa
aab
-aab
-aab
-aab
aaa
-aav
-acv
-aac
+aaa
+aaa
+aaa
+aab
+aab
+aab
aaa
aaa
aaa
@@ -132109,7 +132083,7 @@ aab
aab
aab
aaa
-aSp
+aaa
aaa
aab
aab
diff --git a/_maps/shuttles/emergency_nature.dmm b/_maps/shuttles/emergency_nature.dmm
new file mode 100644
index 0000000000..9639e37852
--- /dev/null
+++ b/_maps/shuttles/emergency_nature.dmm
@@ -0,0 +1,2040 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"as" = (
+/obj/structure/flora/ausbushes/lavendergrass,
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"au" = (
+/obj/structure/sink/puddle,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"ay" = (
+/obj/structure/flora/ausbushes/leafybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"aA" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 6
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"aJ" = (
+/obj/structure/flora/ausbushes/stalkybush,
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"bd" = (
+/obj/structure/flora/rock/pile/largejungle,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"bg" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/mechanical{
+ pixel_y = 8;
+ pixel_x = -2
+ },
+/obj/item/storage/toolbox/electrical,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bS" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/box/lights/mixed{
+ pixel_y = 9;
+ pixel_x = -5
+ },
+/obj/item/storage/box/matches{
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"cm" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"cL" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 3
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"cR" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 5
+ },
+/obj/structure/sign/warning/nosmoking{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"cZ" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/machinery/computer/emergency_shuttle,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"dj" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 3
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_y = -31
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"dP" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"dT" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/shuttle/escape)
+"eq" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/shuttle/escape)
+"ev" = (
+/obj/effect/turf_decal/trimline/green/filled/corner,
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"ex" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/obj/structure/flora/ausbushes/leafybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"eB" = (
+/obj/item/rack_parts,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"eS" = (
+/obj/effect/turf_decal/trimline/red/filled/end{
+ dir = 1
+ },
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"eY" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 9
+ },
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/emergency{
+ pixel_y = 3
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"fD" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/machinery/computer/security,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"fG" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/ausbushes/genericbush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"fJ" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/machinery/computer/communications,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"fT" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 10
+ },
+/obj/machinery/door/window/westleft{
+ name = "Infirmary"
+ },
+/turf/open/floor/plasteel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"gg" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 1
+ },
+/obj/structure/chair/comfy/shuttle,
+/obj/item/radio/intercom{
+ dir = 4;
+ name = "Station Intercom (General)";
+ pixel_y = 27
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"gj" = (
+/obj/machinery/door/airlock/maintenance_hatch,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"gl" = (
+/obj/structure/flora/junglebush/large,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"gu" = (
+/obj/structure/shuttle/engine/propulsion,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"gx" = (
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"gI" = (
+/obj/item/shovel,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"gM" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 5
+ },
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/donut_box,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"gR" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/machinery/hydroponics/soil,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"ht" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 9
+ },
+/obj/structure/chair/comfy/shuttle,
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/reagent_dispensers/peppertank{
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"hC" = (
+/obj/effect/turf_decal/trimline/red/filled/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 4
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"hJ" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 8
+ },
+/obj/structure/table/reinforced,
+/obj/item/storage/box/monkeycubes{
+ pixel_x = 6;
+ pixel_y = 5
+ },
+/obj/item/storage/box/monkeycubes{
+ pixel_x = -6;
+ pixel_y = 2
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"ib" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"it" = (
+/mob/living/carbon/monkey,
+/obj/structure/flora/grass/jungle/b{
+ icon_state = "bushb3"
+ },
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"iD" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 5
+ },
+/obj/structure/table/reinforced,
+/obj/item/restraints/handcuffs{
+ pixel_y = 3
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"iF" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/obj/structure/flora/ausbushes/brflowers,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"iO" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/space_heater,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"iV" = (
+/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"jO" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/box/stockparts{
+ pixel_y = 7
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"jX" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 9
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"jZ" = (
+/obj/effect/turf_decal/trimline/red/filled/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"ke" = (
+/obj/item/shovel/spade,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"ku" = (
+/obj/effect/turf_decal/trimline/blue/filled/corner{
+ dir = 4
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"lo" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/obj/structure/flora/ausbushes/leafybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"lH" = (
+/obj/structure/reagent_dispensers/fueltank,
+/obj/effect/turf_decal/stripes/end{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"lN" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/grille/broken,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/shuttle/escape)
+"lS" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 4
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"lT" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 8
+ },
+/obj/structure/table/reinforced,
+/obj/item/cigbutt{
+ pixel_x = 8
+ },
+/obj/machinery/recharger,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"lV" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 5
+ },
+/obj/structure/table/glass,
+/obj/item/reagent_containers/food/snacks/soup/monkeysdelight{
+ pixel_y = 4
+ },
+/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy{
+ pixel_y = 5;
+ pixel_x = 6
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"me" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 9
+ },
+/obj/structure/sign/warning/nosmoking{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"mq" = (
+/mob/living/carbon/monkey,
+/obj/machinery/light/floor,
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"mw" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 10
+ },
+/obj/item/reagent_containers/food/snacks/grown/banana,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"nA" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 9
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"nD" = (
+/obj/structure/flora/ausbushes/fernybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"nQ" = (
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"og" = (
+/obj/effect/turf_decal/trimline/blue/filled/corner{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"os" = (
+/obj/effect/turf_decal/trimline/green/filled/end{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/door/window/westleft{
+ name = "Nature pen"
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"oE" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 5
+ },
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid/regular,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"qD" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"rg" = (
+/obj/item/clothing/glasses/welding{
+ pixel_y = 8;
+ pixel_x = 3
+ },
+/obj/item/weldingtool/largetank{
+ pixel_x = -3
+ },
+/obj/structure/rack,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"rI" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"sm" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"su" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 6
+ },
+/obj/structure/table/optable,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"sF" = (
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/obj/item/storage/backpack/duffelbag/med/surgery{
+ pixel_y = 5
+ },
+/obj/structure/rack,
+/turf/open/floor/plasteel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"sN" = (
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"sV" = (
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/green/filled/corner,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"tL" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 8
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"uc" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 10
+ },
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"ui" = (
+/obj/structure/extinguisher_cabinet,
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"ur" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 8
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"uI" = (
+/obj/structure/flora/rock/jungle{
+ icon_state = "rock3"
+ },
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"vt" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 10
+ },
+/obj/structure/table/reinforced,
+/obj/item/restraints/handcuffs{
+ pixel_y = 7
+ },
+/obj/item/storage/fancy/donut_box,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"vx" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"vP" = (
+/obj/effect/turf_decal/trimline/red/filled/line,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"vW" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 6
+ },
+/obj/structure/table/reinforced,
+/obj/item/storage/box/handcuffs{
+ pixel_y = 5
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"wg" = (
+/obj/effect/turf_decal/trimline/green/filled/end{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/door/window/northleft,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"wX" = (
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/obj/machinery/light,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"xA" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/obj/structure/flora/ausbushes/fernybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"xZ" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 10
+ },
+/obj/structure/tank_dispenser/oxygen{
+ layer = 2.7;
+ pixel_x = -1;
+ pixel_y = 2
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"yt" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"yI" = (
+/obj/item/reagent_containers/food/snacks/grown/banana,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"yR" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 6
+ },
+/obj/machinery/suit_storage_unit/standard_unit,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"yZ" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 6
+ },
+/obj/structure/sign/poster/official/pda_ad{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"zf" = (
+/obj/structure/flora/ausbushes/pointybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"zr" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 10
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"zs" = (
+/obj/machinery/light/floor,
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"zD" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"zE" = (
+/obj/machinery/door/airlock/security{
+ name = "Brig";
+ req_access_txt = "63; 42"
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"Ai" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Aw" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 4
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/status_display/evac{
+ dir = 8;
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"AM" = (
+/obj/structure/flora/ausbushes/ywflowers,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Bm" = (
+/obj/machinery/door/airlock/command/glass{
+ name = "Cockpit";
+ req_access_txt = "19"
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"Bo" = (
+/obj/structure/flora/ausbushes/sunnybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Bt" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Bv" = (
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"BA" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 9
+ },
+/obj/structure/table/glass,
+/obj/item/defibrillator/loaded{
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"BG" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 10
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"BM" = (
+/obj/structure/flora/ausbushes/ppflowers,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Cb" = (
+/obj/structure/flora/rock/jungle{
+ icon_state = "bushc2"
+ },
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Co" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 1
+ },
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"CA" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 9
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"CE" = (
+/obj/structure/flora/tree/jungle/small,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"CQ" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/vending/cola/space_up,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Db" = (
+/obj/structure/sign/poster/official/help_others,
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"DD" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 9
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/mob/living/simple_animal/bot/medbot{
+ name = "\improper emergency medibot";
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/turf/open/floor/plasteel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"DQ" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"EI" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/vending/snack/green,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Fo" = (
+/obj/item/cultivator,
+/mob/living/simple_animal/hostile/lizard,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Fp" = (
+/obj/structure/flora/ausbushes/grassybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Gf" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"GO" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 8
+ },
+/obj/structure/table/glass,
+/obj/item/storage/box/monkeycubes{
+ pixel_y = 10;
+ pixel_x = 5
+ },
+/obj/item/reagent_containers/food/snacks/cube/monkey{
+ pixel_x = 5
+ },
+/obj/item/paicard{
+ pixel_x = -6;
+ pixel_y = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"GV" = (
+/obj/structure/shuttle/engine/huge,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"He" = (
+/obj/effect/turf_decal/trimline/blue/filled/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel{
+ icon_state = "floorscorched1"
+ },
+/area/shuttle/escape)
+"Hi" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/shuttle/escape)
+"Hq" = (
+/obj/structure/flora/rock/pile,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"HV" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Ia" = (
+/mob/living/carbon/monkey,
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Io" = (
+/obj/effect/turf_decal/trimline/green/filled/corner,
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Iw" = (
+/obj/item/reagent_containers/glass/bucket,
+/mob/living/simple_animal/hostile/retaliate/frog,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Iz" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/vomit,
+/turf/open/floor/plasteel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"IB" = (
+/obj/effect/decal/cleanable/oil,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Jw" = (
+/obj/structure/shuttle/engine/heater,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"JD" = (
+/obj/effect/turf_decal/trimline/blue/filled/end{
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/storage/firstaid/brute{
+ pixel_x = 4;
+ pixel_y = 2
+ },
+/obj/item/storage/firstaid/regular{
+ pixel_x = -3
+ },
+/turf/open/floor/plasteel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"JR" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
+/obj/machinery/suit_storage_unit/standard_unit,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"Ka" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Kv" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/sign/poster/contraband/tools{
+ pixel_y = 32
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Kx" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 3
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"KT" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 5
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Lm" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/structure/flora/ausbushes/pointybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"LG" = (
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/green/filled/corner,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"LO" = (
+/obj/structure/flora/rock/jungle{
+ icon_state = "grassa4"
+ },
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"LW" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"LY" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"MJ" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/obj/structure/flora/ausbushes/leafybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"MS" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 6
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Nu" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/item/hatchet,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Ob" = (
+/obj/effect/turf_decal/trimline/green/filled/end,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/door/window/southleft{
+ name = "Nature pen"
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"OS" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 3
+ },
+/obj/machinery/vending/coffee,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Ps" = (
+/obj/structure/flora/ausbushes/brflowers,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"PG" = (
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"PP" = (
+/obj/structure/flora/ausbushes/genericbush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"QC" = (
+/obj/structure/flora/ausbushes/lavendergrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"QM" = (
+/obj/item/bodypart,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/shuttle/escape)
+"QO" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"QZ" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/blue/filled/corner{
+ dir = 1
+ },
+/obj/structure/chair,
+/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{
+ pixel_x = 30
+ },
+/turf/open/floor/plasteel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"Ru" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/obj/machinery/vending/hydroseeds,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Sl" = (
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/obj/machinery/computer/operating{
+ dir = 1
+ },
+/turf/open/floor/plasteel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"Sr" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 6
+ },
+/obj/structure/table/glass,
+/obj/item/clothing/suit/monkeysuit{
+ pixel_y = 4;
+ pixel_x = -2
+ },
+/obj/item/clothing/mask/gas/monkeymask{
+ pixel_x = 5;
+ pixel_y = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"SS" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"ST" = (
+/obj/effect/turf_decal/weather/dirt,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Ti" = (
+/obj/structure/flora/rock/jungle{
+ icon_state = "busha3"
+ },
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Ts" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/machinery/hydroponics/soil,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"TH" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 5
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"TK" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 5
+ },
+/obj/item/hatchet,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"TT" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Um" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Uy" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/item/reagent_containers/food/snacks/grown/banana,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"UE" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 5
+ },
+/obj/machinery/vending/hydronutrients,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"UO" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 8
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Vu" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/mob/living/carbon/monkey,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Vv" = (
+/mob/living/carbon/monkey,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"VI" = (
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"VM" = (
+/obj/structure/flora/tree/jungle,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"VU" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"Wa" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Wr" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/obj/structure/flora/ausbushes/reedbush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Wz" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/recharge_station,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"WE" = (
+/turf/template_noop,
+/area/template_noop)
+"WH" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/ausbushes/sunnybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"WL" = (
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"Xm" = (
+/obj/structure/flora/rock,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"XK" = (
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"XY" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel{
+ dir = 1
+ },
+/area/shuttle/escape)
+"Ym" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/structure/flora/rock/pile,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Yp" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Yu" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"YH" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"YP" = (
+/obj/effect/turf_decal/trimline/green/filled/end{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/door/window/eastleft{
+ name = "Nature pen"
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"YW" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 3
+ },
+/obj/machinery/vending/wardrobe/hydro_wardrobe,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Zd" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 3
+ },
+/obj/machinery/light,
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"Zg" = (
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/escape)
+"Zl" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 5
+ },
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Zm" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 10
+ },
+/obj/structure/flora/ausbushes/fernybush,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"Zt" = (
+/obj/effect/turf_decal/trimline/green/filled/line,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"ZD" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+"ZL" = (
+/obj/machinery/hydroponics/soil,
+/obj/item/seeds/banana,
+/turf/open/floor/grass,
+/area/shuttle/escape)
+"ZT" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 8
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+VU
+SS
+Yu
+Yp
+Yu
+Yu
+Yu
+Yu
+Yu
+SS
+Yu
+SS
+Yu
+Yu
+Yu
+Yu
+Yu
+Yu
+VU
+WE
+WE
+WE
+"}
+(2,1,1) = {"
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+VU
+Yu
+nA
+UO
+yt
+ZT
+UO
+GO
+UO
+ZT
+yt
+UO
+zr
+Yu
+Yu
+lH
+eB
+lN
+bS
+Yu
+VU
+WE
+WE
+"}
+(3,1,1) = {"
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+VU
+Yu
+me
+Io
+Wa
+Wa
+Wa
+Wa
+ev
+Wa
+Wa
+Wa
+Wa
+Bv
+zr
+Yu
+Yu
+rg
+iV
+jO
+Jw
+gx
+gx
+GV
+"}
+(4,1,1) = {"
+WE
+WE
+VU
+VI
+VI
+VI
+VU
+Yu
+nA
+Io
+MS
+VI
+VI
+VI
+VI
+YP
+VI
+VI
+VI
+VI
+KT
+Bv
+zr
+Yu
+Yu
+eq
+bg
+Jw
+gx
+gx
+gx
+"}
+(5,1,1) = {"
+WE
+VU
+Yu
+jX
+tL
+vt
+Yu
+CA
+Io
+MS
+VI
+VI
+YH
+iF
+xA
+Gf
+lo
+Gf
+Zm
+VI
+VI
+KT
+Bv
+BG
+Yu
+Kv
+DQ
+Jw
+gx
+gx
+gx
+"}
+(6,1,1) = {"
+VU
+Yu
+ht
+jZ
+WL
+vP
+zE
+HV
+Zt
+VI
+VI
+Wr
+Vv
+Ti
+Fo
+PP
+Xm
+ZL
+LO
+mw
+VI
+VI
+HV
+Zd
+Yu
+IB
+iO
+Jw
+gu
+WE
+WE
+"}
+(7,1,1) = {"
+VI
+eS
+hC
+lS
+lS
+vW
+Yu
+Co
+Zt
+VI
+Ru
+zs
+Bt
+qD
+Bo
+aJ
+fG
+CE
+Vv
+zs
+uc
+VI
+HV
+Kx
+Yu
+dP
+dT
+Jw
+gu
+WE
+WE
+"}
+(8,1,1) = {"
+Yu
+Yu
+VI
+VI
+ui
+Yu
+Db
+Co
+Zt
+VI
+Ym
+XK
+au
+XK
+VM
+Hq
+QC
+XK
+BM
+Bt
+Ka
+VI
+HV
+YW
+Yu
+LY
+sm
+Jw
+gu
+WE
+WE
+"}
+(9,1,1) = {"
+VI
+eY
+hJ
+lT
+ur
+xZ
+Yu
+CQ
+Zt
+VI
+Ts
+WH
+XK
+XK
+Ps
+gl
+Bt
+it
+AM
+gI
+TT
+VI
+HV
+Zd
+Yu
+Um
+DQ
+Jw
+gx
+gx
+GV
+"}
+(10,1,1) = {"
+VI
+fD
+LW
+WL
+WL
+Zg
+Bm
+HV
+LG
+Ob
+Uy
+Xm
+Vv
+Fp
+qD
+zs
+XK
+XK
+PP
+Bt
+ST
+wg
+PG
+cL
+gj
+Um
+cm
+Jw
+gx
+gx
+gx
+"}
+(11,1,1) = {"
+VI
+cZ
+LW
+WL
+WL
+Zg
+VI
+EI
+Zt
+VI
+Lm
+as
+XK
+VM
+Iw
+au
+XK
+bd
+Bt
+XK
+Nu
+VI
+HV
+Zd
+Yu
+Um
+Hi
+Jw
+gx
+gx
+gx
+"}
+(12,1,1) = {"
+VI
+fJ
+LW
+WL
+WL
+Zg
+VI
+Co
+Zt
+VI
+Vu
+nD
+qD
+PP
+Bt
+yI
+QC
+Bt
+XK
+uI
+gR
+VI
+HV
+OS
+Yu
+Um
+Wz
+Jw
+gu
+WE
+WE
+"}
+(13,1,1) = {"
+VI
+gM
+ku
+WL
+WL
+wX
+Yu
+gg
+Zt
+VI
+UE
+zs
+zf
+ke
+zf
+ay
+XK
+ay
+AM
+mq
+ex
+VI
+HV
+dj
+Yu
+QM
+DQ
+Jw
+gu
+WE
+WE
+"}
+(14,1,1) = {"
+VU
+Yu
+iD
+og
+WL
+Zg
+ui
+Co
+Zt
+VI
+VI
+TK
+Cb
+Bt
+qD
+BM
+Bo
+Ia
+XK
+Ai
+VI
+VI
+HV
+Zd
+Yu
+zD
+vx
+Jw
+gu
+WE
+WE
+"}
+(15,1,1) = {"
+WE
+VU
+Yu
+oE
+JR
+yR
+Yu
+TH
+sN
+zr
+VI
+VI
+Zl
+QO
+MJ
+QO
+ib
+MJ
+Ai
+VI
+VI
+nA
+sV
+aA
+Yu
+DD
+fT
+Jw
+gx
+gx
+GV
+"}
+(16,1,1) = {"
+WE
+WE
+VU
+Yu
+Yu
+Yu
+VU
+Yu
+KT
+sN
+zr
+VI
+VI
+VI
+VI
+os
+VI
+VI
+VI
+VI
+nA
+sV
+MS
+Yu
+Yu
+XY
+sF
+Jw
+gx
+gx
+gx
+"}
+(17,1,1) = {"
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+VU
+Yu
+cR
+sN
+yt
+yt
+yt
+yt
+nQ
+yt
+yt
+yt
+yt
+sV
+yZ
+Yu
+Yu
+BA
+He
+Sl
+Jw
+gx
+gx
+gx
+"}
+(18,1,1) = {"
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+VU
+Yu
+lV
+rI
+ZD
+rI
+rI
+Aw
+rI
+rI
+ZD
+rI
+Sr
+Yu
+Yu
+JD
+QZ
+Iz
+su
+Yu
+VU
+WE
+WE
+"}
+(19,1,1) = {"
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+WE
+VU
+Yu
+VI
+VI
+VI
+VI
+Yu
+VI
+VI
+VI
+VI
+Yu
+Yu
+Yu
+Yu
+Yu
+Yu
+Yu
+VU
+WE
+WE
+WE
+"}
diff --git a/code/__DEFINES/_flags/obj_flags.dm b/code/__DEFINES/_flags/obj_flags.dm
index a936a5cef5..ce1e126f12 100644
--- a/code/__DEFINES/_flags/obj_flags.dm
+++ b/code/__DEFINES/_flags/obj_flags.dm
@@ -9,8 +9,11 @@
#define UNIQUE_RENAME (1<<6) //can you customize the description/name of the thing?
#define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI.
#define FROZEN (1<<8)
-#define SHOVABLE_ONTO (1<<9) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check.
-#define BLOCK_Z_FALL (1<<10)
+#define BLOCK_Z_OUT_DOWN (1<<9) // Should this object block z falling from loc?
+#define BLOCK_Z_OUT_UP (1<<10) // Should this object block z uprise from loc?
+#define BLOCK_Z_IN_DOWN (1<<11) // Should this object block z falling from above?
+#define BLOCK_Z_IN_UP (1<<12) // Should this object block z uprise from below?
+#define SHOVABLE_ONTO (1<<13) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check.
/// Integrity defines for clothing (not flags but close enough)
#define CLOTHING_PRISTINE 0 // We have no damage on the clothing
@@ -18,3 +21,6 @@
#define CLOTHING_SHREDDED 2 // The clothing is useless and cannot be equipped unless repaired first
// If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support
+
+/// Flags for the pod_flags var on /obj/structure/closet/supplypod
+#define FIRST_SOUNDS (1<<0) // If it shouldn't play sounds the first time it lands, used for reverse mode
diff --git a/code/__DEFINES/actionspeed_modifiers.dm b/code/__DEFINES/actionspeed_modifiers.dm
new file mode 100644
index 0000000000..40fbd3fe26
--- /dev/null
+++ b/code/__DEFINES/actionspeed_modifiers.dm
@@ -0,0 +1,2 @@
+//ids
+#define ACTIONSPEED_ID_SANITY "sanity_component"
diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index a3e5423753..1d47549685 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -63,6 +63,10 @@
#define CONTRACT_UPLINK_PAGE_CONTRACTS "CONTRACTS"
#define CONTRACT_UPLINK_PAGE_HUB "HUB"
+//Lingblood stuff
+#define LINGBLOOD_DETECTION_THRESHOLD 1
+#define LINGBLOOD_EXPLOSION_MULT 2
+#define LINGBLOOD_EXPLOSION_THRESHOLD (LINGBLOOD_DETECTION_THRESHOLD * LINGBLOOD_EXPLOSION_MULT) //Hey, important to note here: the explosion threshold is explicitly more than, rather than more than or equal to. This stops a single loud ability from triggering the explosion threshold.
///Heretics --
#define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic))
diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm
index bba5b5c5ed..ac5272057a 100644
--- a/code/__DEFINES/cargo.dm
+++ b/code/__DEFINES/cargo.dm
@@ -13,27 +13,43 @@
#define STYLE_GONDOLA 13
#define STYLE_SEETHROUGH 14
-#define POD_ICON_STATE 1
-#define POD_NAME 2
-#define POD_DESC 3
+#define POD_SHAPE 1
+#define POD_BASE 2
+#define POD_DOOR 3
+#define POD_DECAL 4
+#define POD_GLOW 5
+#define POD_RUBBLE_TYPE 6
+#define POD_NAME 7
+#define POD_DESC 8
-#define POD_STYLES list(\
- list("supplypod", "supply pod", "A Nanotrasen supply drop pod."),\
- list("bluespacepod", "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\
- list("centcompod", "\improper Centcom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to Centcom after delivery."),\
- list("syndiepod", "blood-red supply pod", "A dark, intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\
- list("squadpod", "\improper MK. II supply pod", "A Nanotrasen supply pod. This one has been marked the markings of some sort of elite strike team."),\
- list("cultpod", "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\
- list("missilepod", "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\
- list("smissilepod", "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\
- list("boxpod", "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\
- list("honkpod", "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\
- list("fruitpod", "\improper Orange", "An angry orange."),\
- list("", "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\
- list("gondolapod", "gondola", "The silent walker. This one seems to be part of a delivery agency."),\
- list("", "", "")\
-)
+#define RUBBLE_NONE 1
+#define RUBBLE_NORMAL 2
+#define RUBBLE_WIDE 3
+#define RUBBLE_THIN 4
+#define POD_SHAPE_NORML 1
+#define POD_SHAPE_OTHER 2
+
+#define SUPPLYPOD_X_OFFSET -16
+
+GLOBAL_LIST_EMPTY(supplypod_loading_bays)
+
+GLOBAL_LIST_INIT(podstyles, list(\
+ list(POD_SHAPE_NORML, "pod", TRUE, "default", "yellow", RUBBLE_NORMAL, "supply pod", "A Nanotrasen supply drop pod."),\
+ list(POD_SHAPE_NORML, "advpod", TRUE, "bluespace", "blue", RUBBLE_NORMAL, "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\
+ list(POD_SHAPE_NORML, "advpod", TRUE, "centcom", "blue", RUBBLE_NORMAL, "\improper CentCom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to CentCom after delivery."),\
+ list(POD_SHAPE_NORML, "darkpod", TRUE, "syndicate", "red", RUBBLE_NORMAL, "blood-red supply pod", "An intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\
+ list(POD_SHAPE_NORML, "darkpod", TRUE, "deathsquad", "blue", RUBBLE_NORMAL, "\improper Deathsquad drop pod", "A Nanotrasen drop pod. This one has been marked the markings of Nanotrasen's elite strike team."),\
+ list(POD_SHAPE_NORML, "pod", TRUE, "cultist", "red", RUBBLE_NORMAL, "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\
+ list(POD_SHAPE_OTHER, "missile", FALSE, FALSE, FALSE, RUBBLE_THIN, "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\
+ list(POD_SHAPE_OTHER, "smissile", FALSE, FALSE, FALSE, RUBBLE_THIN, "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\
+ list(POD_SHAPE_OTHER, "box", TRUE, FALSE, FALSE, RUBBLE_WIDE, "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\
+ list(POD_SHAPE_NORML, "clownpod", TRUE, "clown", "green", RUBBLE_NORMAL, "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\
+ list(POD_SHAPE_OTHER, "orange", TRUE, FALSE, FALSE, RUBBLE_NONE, "\improper Orange", "An angry orange."),\
+ list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\
+ list(POD_SHAPE_OTHER, "gondola", FALSE, FALSE, FALSE, RUBBLE_NONE, "gondola", "The silent walker. This one seems to be part of a delivery agency."),\
+ list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, FALSE, FALSE, "rl_click", "give_po")\
+))
#define PACK_GOODY_NONE 0
#define PACK_GOODY_PUBLIC 1 //can be bought by both privates and cargo
-#define PACK_GOODY_PRIVATE 2 //can be bought only by privates
\ No newline at end of file
+#define PACK_GOODY_PRIVATE 2 //can be bought only by privates
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 0bdf27452b..923355b340 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -106,5 +106,11 @@
//belly sound pref things
#define NORMIE_HEARCHECK 4
+//icon states for the default eyes and for a state for no eye
+#define DEFAULT_EYES_TYPE "normal"
+#define DEFAULT_LEFT_EYE_STATE "normal_left_eye"
+#define DEFAULT_RIGHT_EYE_STATE "normal_right_eye"
+#define DEFAULT_NO_EYE_STATE "no_eye"
+
//special species definitions
#define MINIMUM_MUTANT_COLOR "#202020" //this is how dark players mutant parts and skin can be
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index cf669b905a..7b214df421 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -85,7 +85,7 @@
#define COMSIG_ATOM_EMP_ACT "atom_emp_act"
///from base of atom/fire_act(): (exposed_temperature, exposed_volume)
#define COMSIG_ATOM_FIRE_ACT "atom_fire_act"
-///from base of atom/bullet_act(): (/obj/projectile, def_zone)
+///from base of atom/bullet_act(): (/obj/item/projectile, def_zone)
#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act"
///from base of atom/blob_act(): (/obj/structure/blob)
#define COMSIG_ATOM_BLOB_ACT "atom_blob_act"
@@ -381,6 +381,8 @@
#define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/effect/mine/proc/triggermine]:
// Uncovered information
#define COMPONENT_DEEPSCAN_UNCOVERED_INFORMATION 1
+///from [/obj/structure/closet/supplypod/proc/endlaunch]:
+#define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom"
// /obj/item/grenade signals
#define COMSIG_GRENADE_PRIME "grenade_prime" //called in /obj/item/gun/process_fire (user, target, params, zone_override)
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 66f741b2c7..21b66f5e37 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -44,7 +44,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isplatingturf(A) (istype(A, /turf/open/floor/plating))
-#define istransparentturf(A) (istype(A, /turf/open/transparent))
+#define istransparentturf(A) (istype(A, /turf/open/transparent)||istype(A, /turf/open/space/transparent))
//Mobs
#define isliving(A) (istype(A, /mob/living))
@@ -235,3 +235,5 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list(
#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob))
#define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs))
+
+#define isProbablyWallMounted(O) (O.pixel_x > 20 || O.pixel_x < -20 || O.pixel_y > 20 || O.pixel_y < -20)
diff --git a/code/__DEFINES/layers_planes.dm b/code/__DEFINES/layers_planes.dm
index 9188efacfd..8ab33689d3 100644
--- a/code/__DEFINES/layers_planes.dm
+++ b/code/__DEFINES/layers_planes.dm
@@ -37,7 +37,9 @@
#define FIELD_OF_VISION_VISUAL_RENDER_TARGET "FIELD_OF_VISION_VISUAL_PLANE"
#define CHAT_PLANE -1 //We don't want heard messages to be hidden by FoV.
-#define CHAT_LAYER 12.1 //Legacy, it doesn't matter that much because we are displayed above the game plane anyway.
+
+#define CHAT_LAYER 12.0001 // Do not insert layers between these two values
+#define CHAT_LAYER_MAX 12.9999
#define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals
#define BLACKNESS_PLANE_RENDER_TARGET "BLACKNESS_PLANE"
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 84eed5483a..aef77e7b57 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -40,6 +40,16 @@
#define PARALLAX_LOW 2
#define PARALLAX_DISABLE 3 //this option must be the highest number
+#define PIXEL_SCALING_AUTO 0
+#define PIXEL_SCALING_1X 1
+#define PIXEL_SCALING_1_2X 1.5
+#define PIXEL_SCALING_2X 2
+#define PIXEL_SCALING_3X 3
+
+#define SCALING_METHOD_NORMAL "normal"
+#define SCALING_METHOD_DISTORT "distort"
+#define SCALING_METHOD_BLUR "blur"
+
#define PARALLAX_DELAY_DEFAULT world.tick_lag
#define PARALLAX_DELAY_MED 1
#define PARALLAX_DELAY_LOW 2
diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm
index 80983b34be..a188bf8363 100644
--- a/code/__DEFINES/shuttles.dm
+++ b/code/__DEFINES/shuttles.dm
@@ -31,6 +31,11 @@
#define EARLY_LAUNCHED 2
#define ENDGAME_TRANSIT 3
+//positive value = cannot puchase
+#define SHUTTLEPURCHASE_PURCHASABLE 0 //station can buy a shuttle
+#define SHUTTLEPURCHASE_PURCHASED 1 //station has already bought a shuttle, so cannot
+#define SHUTTLEPURCHASE_FORCED 2 //station was given a new shuttle through events or other shenanigans
+
// Ripples, effects that signal a shuttle's arrival
#define SHUTTLE_RIPPLE_TIME 100
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 9deddd4b46..b405db83b0 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -124,6 +124,7 @@
#define FIRE_PRIORITY_ATMOS_ADJACENCY 300
#define FIRE_PRIORITY_STATPANEL 390
#define FIRE_PRIORITY_CHAT 400
+#define FIRE_PRIORITY_RUNECHAT 410
#define FIRE_PRIORITY_OVERLAYS 500
#define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost.
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index f054f163b5..80633148e9 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -219,6 +219,8 @@
#define TRAIT_MOBILITY_NOPICKUP "mobility_nopickup"
/// Disallow item use
#define TRAIT_MOBILITY_NOUSE "mobility_nouse"
+///Disallow resting/unresting
+#define TRAIT_MOBILITY_NOREST "mobility_norest"
#define TRAIT_SWIMMING "swimming" //only applied by /datum/element/swimming, for checking
@@ -311,6 +313,7 @@
#define CLOWNOP_TRAIT "clown-op"
#define MEGAFAUNA_TRAIT "megafauna"
#define DEATHSQUAD_TRAIT "deathsquad"
+#define SLIMEPUDDLE_TRAIT "slimepuddle"
/// This trait is added by the active directional block system.
#define ACTIVE_BLOCK_TRAIT "active_block"
/// This trait is added by the parry system.
diff --git a/code/__HELPERS/do_after.dm b/code/__HELPERS/do_after.dm
index 30d40f3867..c65cd80394 100644
--- a/code/__HELPERS/do_after.dm
+++ b/code/__HELPERS/do_after.dm
@@ -38,11 +38,11 @@
return FALSE
if((do_after_flags & DO_AFTER_REQUIRES_USER_ON_TURF) && !isturf(user.loc))
return FALSE
+ if(!(do_after_flags & DO_AFTER_NO_COEFFICIENT) && living_user)
+ delay *= living_user.cached_multiplicative_actions_slowdown
var/starttime = world.time
var/endtime = world.time + delay
var/obj/item/initially_held_item = mob_redirect?.get_active_held_item()
- if(!(do_after_flags & DO_AFTER_NO_COEFFICIENT) && living_user)
- delay *= living_user.do_after_coefficent()
var/atom/movable/AM_user = ismovable(user) && user
var/drifting = AM_user?.Process_Spacemove(NONE) && AM_user.inertia_dir
var/initial_dx = targetturf.x - userturf.x
@@ -245,7 +245,7 @@
if(holding)
holdingnull = 0 //Users hand started holding something, check to see if it's still holding that
- delay *= user.do_after_coefficent()
+ delay *= user.cached_multiplicative_actions_slowdown
var/datum/progressbar/progbar
if (progress)
@@ -300,10 +300,6 @@
LAZYREMOVE(user.do_afters, target)
LAZYREMOVE(target.targeted_by, user)
-/mob/proc/do_after_coefficent() // This gets added to the delay on a do_after, default 1
- . = 1
- return
-
/proc/do_after_mob(mob/user, var/list/targets, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks)
if(!user || !targets)
return 0
@@ -326,6 +322,8 @@
if(progress)
progbar = new(user, time, targets[1])
+ time *= user.cached_multiplicative_actions_slowdown
+
var/endtime = world.time + time
var/starttime = world.time
. = 1
diff --git a/code/__HELPERS/radiation.dm b/code/__HELPERS/radiation.dm
index 1570eededb..d527d0ac51 100644
--- a/code/__HELPERS/radiation.dm
+++ b/code/__HELPERS/radiation.dm
@@ -12,15 +12,17 @@
))
var/list/processing_list = list(location)
. = list()
- while(processing_list.len)
- var/atom/thing = processing_list[1]
- processing_list -= thing
+ var/i = 0
+ var/lim = 1
+ while(i < lim)
+ var/atom/thing = processing_list[++i]
if(ignored_things[thing.type])
continue
. += thing
if((thing.rad_flags & RAD_PROTECT_CONTENTS) || (SEND_SIGNAL(thing, COMSIG_ATOM_RAD_PROBE) & COMPONENT_BLOCK_RADIATION))
continue
processing_list += thing.contents
+ lim = processing_list.len
/proc/radiation_pulse(atom/source, intensity, range_modifier, log=FALSE, can_contaminate=TRUE)
if(!SSradiation.can_fire)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 92bd726641..794a495ae3 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -457,21 +457,23 @@ Turf and target are separate in case you want to teleport some distance from a t
/atom/proc/GetAllContents(var/T)
var/list/processing_list = list(src)
+ var/i = 0
+ var/lim = 1
if(T)
. = list()
- var/i = 0
- while(i < length(processing_list))
+ while(i < lim)
var/atom/A = processing_list[++i]
//Byond does not allow things to be in multiple contents, or double parent-child hierarchies, so only += is needed
//This is also why we don't need to check against assembled as we go along
processing_list += A.contents
+ lim = processing_list.len
if(istype(A,T))
. += A
else
- var/i = 0
- while(i < length(processing_list))
+ while(i < lim)
var/atom/A = processing_list[++i]
processing_list += A.contents
+ lim = processing_list.len
return processing_list
/atom/proc/GetAllContentsIgnoring(list/ignore_typecache)
@@ -480,10 +482,12 @@ Turf and target are separate in case you want to teleport some distance from a t
var/list/processing = list(src)
. = list()
var/i = 0
- while(i < length(processing))
+ var/lim = 1
+ while(i < lim)
var/atom/A = processing[++i]
if(!ignore_typecache[A.type])
processing += A.contents
+ lim = processing.len
. += A
diff --git a/code/__HELPERS/view.dm b/code/__HELPERS/view.dm
index 48e68be20f..1c92971802 100644
--- a/code/__HELPERS/view.dm
+++ b/code/__HELPERS/view.dm
@@ -2,7 +2,7 @@
var/viewX
var/viewY
if(isnum(view))
- var/totalviewrange = 1 + 2 * view
+ var/totalviewrange = (view < 0 ? -1 : 1) + 2 * view
viewX = totalviewrange
viewY = totalviewrange
else
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index ae0f5201f9..9d8da6c145 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -267,15 +267,17 @@ GLOBAL_LIST_INIT(redacted_strings, list("\[REDACTED\]", "\[CLASSIFIED\]", "\[ARC
GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt"))
+//LANGUAGE CHARACTER CUSTOMIZATION
GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles"))
-
GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc))
+//SPECIES BODYPART LISTS
//locked parts are those that your picked species requires to have
//unlocked parts are those that anyone can choose on customisation regardless
//parts not in unlocked, but in all, are thus locked
GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "body_markings" = "Body Markings", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns"))
GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
+
//parts in either of the above two lists that require a second option that allows them to be coloured
GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color"))
@@ -285,5 +287,42 @@ GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant
//body ids that have prosthetic sprites
GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon"))
+//FAMILY HEIRLOOM LIST
+//this works by using the first number for the species as a probability to choose one of the items in the following list for their family heirloom
+//if the probability fails, or the species simply isn't in the list, then it defaults to the next global list, which has its own list of items for each job
+//the first item in the list is for if your job isn't in that list
+
+//species-heirloom list (we categorise them by the species id var)
+GLOBAL_LIST_INIT(species_heirlooms, list(
+ "dwarf" = list(25, list(/obj/item/reagent_containers/food/drinks/dwarf_mug)), //example: 25% chance for dwarves to get a dwarf mug as their heirloom (normal container but has manly dorf icon)
+ "insect" = list(25, list(/obj/item/flashlight/lantern/heirloom_moth)),
+ "ipc" = list(25, list(/obj/item/stock_parts/cell/family)), //gives a broken powercell for flavor text!
+ "synthliz" = list(25, list(/obj/item/stock_parts/cell/family)), //they're also robots
+ "slimeperson" = list(25, list(/obj/item/toy/plush/slimeplushie)),
+ "lizard" = list(25, list(/obj/item/toy/plush/lizardplushie)),
+ ))
+
+//job-heirloom list
+GLOBAL_LIST_INIT(job_heirlooms, list(
+ "NO_JOB" = list(/obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20),
+ "Clown" = list(/obj/item/paint/anycolor, /obj/item/bikehorn/golden),
+ "Mime" = list(/obj/item/paint/anycolor, /obj/item/toy/dummy),
+ "Cook" = list(/obj/item/kitchen/knife/scimitar),
+ "Botanist" = list(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/storage/bag/plants, /obj/item/toy/plush/beeplushie),
+ "Medical Doctor" = list(/obj/item/healthanalyzer),
+ "Paramedic" = list(/obj/item/lighter), //..why?
+ "Station Engineer" = list(/obj/item/wirecutters/brass/family, /obj/item/crowbar/brass/family, /obj/item/screwdriver/brass/family, /obj/item/wrench/brass/family), //brass tools but without the tool speed modifier
+ "Atmospheric Technician" = list(/obj/item/extinguisher/mini/family),
+ "Lawyer" = list(/obj/item/storage/briefcase/lawyer/family),
+ "Janitor" = list(/obj/item/mop),
+ "Scientist" = list(/obj/item/toy/plush/slimeplushie),
+ "Assistant" = list(/obj/item/clothing/gloves/cut/family),
+ "Chaplain" = list(/obj/item/camera/spooky/family),
+ "Head of Personnel" = list(/obj/item/pinpointer/ian)
+ ))
+
//body ids that have non-gendered bodyparts
GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow", "cultgolem", "agent", "plasmaman", "clockgolem", "clothgolem"))
+
+//list of eye types, corresponding to a respective left and right icon state for the set of eyes
+GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "cyclops"))
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 706a5ed955..9abc37c7e4 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -43,5 +43,4 @@ GLOBAL_LIST_EMPTY(ai_status_displays)
GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects
GLOBAL_LIST_EMPTY(alert_consoles) // Station alert consoles, /obj/machinery/computer/station_alert
-//list of everyone playing rock paper scissors
-GLOBAL_LIST_EMPTY(rockpaperscissors_players)
+GLOBAL_LIST_EMPTY(rockpaperscissors_players) // List of everyone playing rock paper scissors
diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm
index 777ebb0718..2ecfe80ab5 100644
--- a/code/_onclick/hud/map_popups.dm
+++ b/code/_onclick/hud/map_popups.dm
@@ -1,30 +1,11 @@
-/client
- /**
- * Assoc list with all the active maps - when a screen obj is added to
- * a map, it's put in here as well.
- *
- * Format: list(
- Reverse Drop-off Location:
- {data.dropoff_turf ? data.dropoff_turf : 'None'}
-
- [Enable Reverse Mode for this feature]
- "+e+"
"
- if((EYECOLOR in pref_species.species_traits) && !(NOEYES in pref_species.species_traits))
- if(!use_skintones && !mutant_colors)
- dat += APPEARANCE_CATEGORY_COLUMN
- if(left_eye_color != right_eye_color)
- split_eye_colors = TRUE
- dat += "Heterochromia
"
- dat += "[split_eye_colors ? "Enabled" : "Disabled"]"
- if(!split_eye_colors)
- dat += "Eye Color
"
- dat += " Change"
+ if(!(NOEYES in pref_species.species_traits))
+ dat += "Eye Type
"
+ dat += "[eye_type]
"
+ if((EYECOLOR in pref_species.species_traits))
+ if(!use_skintones && !mutant_colors)
+ dat += APPEARANCE_CATEGORY_COLUMN
+ if(left_eye_color != right_eye_color)
+ split_eye_colors = TRUE
+ dat += "Heterochromia
"
+ dat += "[split_eye_colors ? "Enabled" : "Disabled"]"
+ if(!split_eye_colors)
+ dat += "Eye Color
"
+ dat += " Change"
+ dat += ""
+ else
+ dat += "Left Eye Color
"
+ dat += " Change"
+ dat += "Right Eye Color
"
+ dat += " Change
"
+ dat += ""
+ else if(use_skintones || mutant_colors)
dat += ""
- else
- dat += "Left Eye Color
"
- dat += " Change"
- dat += "Right Eye Color
"
- dat += " Change
"
- dat += ""
- else if(use_skintones || mutant_colors)
- dat += ""
dat += APPEARANCE_CATEGORY_COLUMN
dat += "Speech preferences
"
@@ -750,6 +761,20 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "HUD Button Flashes: [hud_toggle_flash ? "Enabled" : "Disabled"]
"
dat += "HUD Button Flash Color: Change
"
+/* CITADEL EDIT - We're using top menu instead
+ button_name = pixel_size
+ dat += "Pixel Scaling: [(button_name) ? "Pixel Perfect [button_name]x" : "Stretch to fit"]
"
+
+ switch(scaling_method)
+ if(SCALING_METHOD_NORMAL)
+ button_name = "Nearest Neighbor"
+ if(SCALING_METHOD_DISTORT)
+ button_name = "Point Sampling"
+ if(SCALING_METHOD_BLUR)
+ button_name = "Bilinear"
+ dat += "Scaling Method: [button_name]
"
+*/
+
if (CONFIG_GET(flag/maprotation) && CONFIG_GET(flag/tgstyle_maprotation))
var/p_map = preferred_map
if (!p_map)
@@ -1584,6 +1609,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_eyes)
right_eye_color = sanitize_hexcolor(new_eyes, 6)
+ if("eye_type")
+ var/new_eye_type = input(user, "Choose your character's eye type.", "Character Preference") as null|anything in GLOB.eye_types
+ if(new_eye_type)
+ eye_type = new_eye_type
+
if("toggle_split_eyes")
split_eye_colors = !split_eye_colors
right_eye_color = left_eye_color
@@ -1617,6 +1647,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(features["mcolor3"] == "#000000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
features["mcolor3"] = pref_species.default_color
+ //switch to the type of eyes the species uses
+ eye_type = pref_species.eye_type
+
if("custom_species")
var/new_species = reject_bad_name(input(user, "Choose your species subtype, if unique. This will show up on examinations and health scans. Do not abuse this:", "Character Preference", custom_species) as null|text)
if(new_species)
@@ -2227,7 +2260,32 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["has_womb"] = !features["has_womb"]
if("widescreenpref")
widescreenpref = !widescreenpref
- user.client.change_view(CONFIG_GET(string/default_view))
+ user.client.view_size.setDefault(getScreenSize(widescreenpref))
+
+ if("pixel_size")
+ switch(pixel_size)
+ if(PIXEL_SCALING_AUTO)
+ pixel_size = PIXEL_SCALING_1X
+ if(PIXEL_SCALING_1X)
+ pixel_size = PIXEL_SCALING_1_2X
+ if(PIXEL_SCALING_1_2X)
+ pixel_size = PIXEL_SCALING_2X
+ if(PIXEL_SCALING_2X)
+ pixel_size = PIXEL_SCALING_3X
+ if(PIXEL_SCALING_3X)
+ pixel_size = PIXEL_SCALING_AUTO
+ user.client.view_size.apply() //Let's winset() it so it actually works
+
+ if("scaling_method")
+ switch(scaling_method)
+ if(SCALING_METHOD_NORMAL)
+ scaling_method = SCALING_METHOD_DISTORT
+ if(SCALING_METHOD_DISTORT)
+ scaling_method = SCALING_METHOD_BLUR
+ if(SCALING_METHOD_BLUR)
+ scaling_method = SCALING_METHOD_NORMAL
+ user.client.view_size.setZoomMode()
+
if("autostand")
autostand = !autostand
if("auto_ooc")
@@ -2601,6 +2659,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.dna.features = features.Copy()
character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE)
+ character.dna.species.eye_type = eye_type
if(chosen_limb_id && (chosen_limb_id in character.dna.species.allowed_limb_ids))
character.dna.species.mutant_bodyparts["limbs_id"] = chosen_limb_id
character.dna.real_name = character.real_name
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index fb1178fd8e..ab30e48b67 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 36
+#define SAVEFILE_VERSION_MAX 37
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -204,10 +204,19 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(S["species"] == "lizard")
features["mam_snouts"] = features["snout"]
- if(current_version < 36)
+ if(current_version < 36) //introduction of heterochromia
left_eye_color = S["eye_color"]
right_eye_color = S["eye_color"]
+ if(current_version < 37) //introduction of chooseable eye types/sprites
+ if(S["species"] == "insect")
+ left_eye_color = "#000000"
+ right_eye_color = "#000000"
+ if(chosen_limb_id == "moth" || chosen_limb_id == "moth_not_greyscale") //these actually have slightly different eyes!
+ eye_type = "moth"
+ else
+ eye_type = "insect"
+
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
return
@@ -271,6 +280,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["parallax"] >> parallax
S["ambientocclusion"] >> ambientocclusion
S["auto_fit_viewport"] >> auto_fit_viewport
+ S["widescreenpref"] >> widescreenpref
+ S["pixel_size"] >> pixel_size
+ S["scaling_method"] >> scaling_method
S["hud_toggle_flash"] >> hud_toggle_flash
S["hud_toggle_color"] >> hud_toggle_color
S["menuoptions"] >> menuoptions
@@ -288,7 +300,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["arousable"] >> arousable
S["screenshake"] >> screenshake
S["damagescreenshake"] >> damagescreenshake
- S["widescreenpref"] >> widescreenpref
S["autostand"] >> autostand
S["cit_toggles"] >> cit_toggles
S["preferred_chaos"] >> preferred_chaos
@@ -324,6 +335,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null)
ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion))
auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport))
+ widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref))
+ pixel_size = sanitize_integer(pixel_size, PIXEL_SCALING_AUTO, PIXEL_SCALING_3X, initial(pixel_size))
+ scaling_method = sanitize_text(scaling_method, initial(scaling_method))
hud_toggle_flash = sanitize_integer(hud_toggle_flash, 0, 1, initial(hud_toggle_flash))
hud_toggle_color = sanitize_hexcolor(hud_toggle_color, 6, 1, initial(hud_toggle_color))
ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form))
@@ -337,7 +351,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
pda_skin = sanitize_inlist(pda_skin, GLOB.pda_reskins, PDA_SKIN_ALT)
screenshake = sanitize_integer(screenshake, 0, 800, initial(screenshake))
damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake))
- widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref))
autostand = sanitize_integer(autostand, 0, 1, initial(autostand))
cit_toggles = sanitize_integer(cit_toggles, 0, 16777215, initial(cit_toggles))
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
@@ -509,6 +522,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["age"] >> age
S["hair_color"] >> hair_color
S["facial_hair_color"] >> facial_hair_color
+ S["eye_type"] >> eye_type
S["left_eye_color"] >> left_eye_color
S["right_eye_color"] >> right_eye_color
S["use_custom_skin_tone"] >> use_custom_skin_tone
@@ -692,6 +706,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
hair_color = sanitize_hexcolor(hair_color, 6, FALSE)
facial_hair_color = sanitize_hexcolor(facial_hair_color, 6, FALSE)
+ eye_type = sanitize_inlist(eye_type, GLOB.eye_types, DEFAULT_EYES_TYPE)
left_eye_color = sanitize_hexcolor(left_eye_color, 6, FALSE)
right_eye_color = sanitize_hexcolor(right_eye_color, 6, FALSE)
@@ -822,6 +837,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["age"] , age)
WRITE_FILE(S["hair_color"] , hair_color)
WRITE_FILE(S["facial_hair_color"] , facial_hair_color)
+ WRITE_FILE(S["eye_type"] , eye_type)
WRITE_FILE(S["left_eye_color"] , left_eye_color)
WRITE_FILE(S["right_eye_color"] , right_eye_color)
WRITE_FILE(S["use_custom_skin_tone"] , use_custom_skin_tone)
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 3774ce575f..e19a0538fc 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -190,7 +190,7 @@
/obj/item/clothing/head/wig
name = "wig"
desc = "A bunch of hair without a head attached."
- icon = 'icons/mob/human_face.dmi' // default icon for all hairs
+ icon = 'icons/mob/hair.dmi' // default icon for all hairs
icon_state = "hair_vlong"
flags_inv = HIDEHAIR
color = "#000"
diff --git a/code/modules/events/shuttle_catastrophe b/code/modules/events/shuttle_catastrophe
new file mode 100644
index 0000000000..d948b39d3b
--- /dev/null
+++ b/code/modules/events/shuttle_catastrophe
@@ -0,0 +1,37 @@
+/datum/round_event_control/shuttle_catastrophe
+ name = "Shuttle Catastrophe"
+ typepath = /datum/round_event/shuttle_catastrophe
+ weight = 10
+ max_occurrences = 1
+
+/datum/round_event_control/shuttle_catastrophe/canSpawnEvent(players, gamemode)
+ if(SSshuttle.emergency.name == "Build your own shuttle kit")
+ return FALSE //don't undo manual player engineering, it also would unload people and ghost them, there's just a lot of problems
+ return ..()
+
+
+/datum/round_event/shuttle_catastrophe
+ var/datum/map_template/shuttle/new_shuttle
+
+/datum/round_event/shuttle_catastrophe/announce(fake)
+ var/cause = pick("was attacked by [syndicate_name()] Operatives", "mysteriously teleported away", "had its refuelling crew mutiny",
+ "was found with its engines stolen", "\[REDACTED\]", "flew into the sunset, and melted", "learned something from a very wise cow, and left on its own",
+ "had cloning devices on it", "had its shuttle inspector put the shuttle in reverse instead of park, causing the shuttle to crash into the hangar")
+
+ priority_announce("Your emergency shuttle [cause]. Your replacement shuttle will be the [new_shuttle.name] until further notice.", "CentCom Spacecraft Engineering")
+
+/datum/round_event/shuttle_catastrophe/setup()
+ var/list/valid_shuttle_templates = list()
+ for(var/shuttle_id in SSmapping.shuttle_templates)
+ var/datum/map_template/shuttle/template = SSmapping.shuttle_templates[shuttle_id]
+ if(template.can_be_bought && template.credit_cost < INFINITY) //if we could get it from the communications console, it's cool for us to get it here
+ valid_shuttle_templates += template
+ new_shuttle = pick(valid_shuttle_templates)
+
+/datum/round_event/shuttle_catastrophe/start()
+ SSshuttle.shuttle_purchased = SHUTTLEPURCHASE_FORCED
+ SSshuttle.unload_preview()
+ SSshuttle.load_template(new_shuttle)
+ SSshuttle.existing_shuttle = SSshuttle.emergency
+ SSshuttle.action_load(new_shuttle)
+ log_shuttle("Shuttle Catastrophe set a new shuttle, [new_shuttle.name].")
diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm
index 031642c875..aae39e28a4 100644
--- a/code/modules/events/stray_cargo.dm
+++ b/code/modules/events/stray_cargo.dm
@@ -55,7 +55,7 @@
crate.update_icon()
var/obj/structure/closet/supplypod/pod = make_pod()
crate.forceMove(pod)
- new /obj/effect/abstract/DPtarget(LZ, pod)
+ new /obj/effect/pod_landingzone(LZ, pod)
///Handles the creation of the pod, in case it needs to be modified beforehand
/datum/round_event/stray_cargo/proc/make_pod()
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index a3ee8c5228..140923c1ef 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -618,3 +618,9 @@
icon_state = "monkey_energy"
list_reagents = list(/datum/reagent/consumable/monkey_energy = 50)
foodtype = SUGAR | JUNKFOOD
+
+/obj/item/reagent_containers/food/drinks/dwarf_mug //dwarf family heirloom (just a cup that always has the manly dorf icon!)
+ name = "ale mug"
+ desc = "An old stained mug used for filling with dwarven ale."
+ icon_state = "manlydorfglass"
+ isGlass = FALSE //it's a wooden mug!
diff --git a/code/modules/holiday/halloween/bartholomew.dm b/code/modules/holiday/halloween/bartholomew.dm
index c9a4a946a3..117e03c357 100644
--- a/code/modules/holiday/halloween/bartholomew.dm
+++ b/code/modules/holiday/halloween/bartholomew.dm
@@ -130,9 +130,13 @@
/obj/item/reagent_containers/pill = 2,
/obj/item/clothing/shoes = 8,
/obj/item/clothing/head = 3,
- /obj/item/reagent_containers/food/snacks = 3,
+ /obj/item/reagent_containers/food/snacks = 5,
/obj/item/reagent_containers/syringe/dart = 2,
- /obj/item/reagent_containers/food/drinks/soda_cans = 5)
+ /obj/item/reagent_containers/food/drinks/soda_cans = 5,
+ /obj/item/reagent_containers/food/drinks/drinkingglass = 4,
+ /obj/item/reagent_containers/food/drinks = 6,
+ /obj/item/reagent_containers/food/snacks/grown/apple = 1,
+ /obj/item/reagent_containers/food/snacks/grown/banana = 2)
if(length >= 5)
return TRUE
//var/metalist = pickweight(GLOB.maintenance_loot)
diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm
index 573b04a296..16151c4191 100644
--- a/code/modules/holiday/halloween/jacqueen.dm
+++ b/code/modules/holiday/halloween/jacqueen.dm
@@ -48,8 +48,8 @@
var/progression = list() //Keep track of where people are in the story.
var/active = TRUE //Turn this to false to keep normal mob behavour
var/cached_z
- /// I'm busy chatting, don't move.
- var/busy_chatting = FALSE
+ /// I'm busy, don't move.
+ var/busy = FALSE
/mob/living/simple_animal/jacq/Initialize()
..()
@@ -68,11 +68,14 @@
playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25)
var/mob/living/simple_animal/jacq/Jacq = new src.type(loc)
Jacq.progression = progression
+ if(ckey) //transfer over any ghost posessions
+ Jacq.key = key
..()
/mob/living/simple_animal/jacq/death() //What is alive may never die
visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"")
playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25)
+ fully_heal(FALSE)
health = 25
poof()
@@ -81,9 +84,9 @@
say("Hello there [gender_check(M)]!")
return ..()
if(!ckey)
- busy_chatting = FALSE
+ stopmove()
chit_chat(M)
- busy_chatting = TRUE
+ canmove()
..()
/mob/living/simple_animal/jacq/attack_paw(mob/living/carbon/monkey/M)
@@ -91,11 +94,28 @@
say("Hello there [gender_check(M)]!")
return ..()
if(!ckey)
- busy_chatting = FALSE
+ stopmove()
chit_chat(M)
- busy_chatting = TRUE
+ canmove()
..()
+/mob/living/simple_animal/jacq/proc/canmove()
+ busy = FALSE
+ update_mobility()
+
+/mob/living/simple_animal/jacq/proc/stopmove()
+ if(ckey) //if someone is in her, don't disable her movement!
+ canmove()
+ return
+ busy = TRUE
+ update_mobility()
+
+/mob/living/simple_animal/jacq/proc/jacqrunes(message, mob/living/carbon/C) //Displays speechtext over Jacq for the user only.
+ var/atom/hearer = C
+ var/list/spans = list("spooky")
+ new /datum/chatmessage(message, src, hearer, spans)
+
+
/mob/living/simple_animal/jacq/proc/poof()
last_poof = world.realtime
var/datum/reagents/R = new/datum/reagents(100)//Hey, just in case.
@@ -104,7 +124,7 @@
s.set_up(R, 0, loc)
s.start()
visible_message("[src] disappears in a puff of smoke!")
- busy_chatting = TRUE
+ canmove()
health = 25
//Try to go to populated areas
@@ -120,7 +140,7 @@
continue
targets += H
- if(!targets)
+ if(!targets.len)
targets = GLOB.generic_event_spawns
for(var/i in 1 to 6) //Attempts a jump up to 6 times.
@@ -151,14 +171,16 @@
if(!progression["[C.real_name]"] || !(progression["[C.real_name]"] & JACQ_HELLO))
visible_message("[src] smiles ominously at [C], \"Well halo there [gender]! Ah'm Jacqueline, tae great Pumpqueen, great tae meet ye.\"")
+ jacqrunes("Well halo there [gender]! Ah'm Jacqueline, tae great Pumpqueen, great tae meet ye.", C)
sleep(20)
visible_message("[src] continues, \"Ah'm sure yae well stunned, but ah've got nae taem fer that. Ah'm after the candies around this station. If yae get mae enoof o the wee buggers, Ah'll give ye a treat, or if yae feeling bold, Ah ken trick ye instead.\" giving [C] a wide grin.")
+ jacqrunes("Ah'm sure yae well stunned, but ah've got nae taem fer that. Ah'm after the candies around this station. If yae get mae enoof o the wee buggers, Ah'll give ye a treat, or if yae feeling bold, Ah ken trick ye instead.", C)
if(!progression["[C.real_name]"])
progression["[C.real_name]"] = NONE //TO MAKE SURE THAT THE LIST ENTRY EXISTS.
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_HELLO
- var/choices = list("Trick", "Treat", "How do I get candies?")
+ var/choices = list("Trick", "Treat", "How do I get candies?", "Do I know you from somewhere?")
var/choice = input(C, "Trick or Treat?", "Trick or Treat?") in choices
switch(choice)
if("Trick")
@@ -168,14 +190,20 @@
if(check_candies(C))
treat(C, gender)
else
- visible_message("[src] raises an eyebrow, \"You've nae got any candies Ah want! They're the orange round ones, now bugger off an go get em first.\"")
+ visible_message("[src] raises aneyebrow, \"You've nae got any candies Ah want! They're the orange round ones, now bugger off an go get em first.\"")
+ jacqrunes("You've nae got any candies Ah want! They're the orange round ones, now bugger off an go get em first.", C)
return
if("How do I get candies?")
visible_message("[src] says, \"Gae find my familiar; Bartholomew. Ee's tendin the cauldron which ken bring oot t' magic energy in items scattered aroond. Knowing him, ee's probably gone tae somewhere with books.\"")
+ jacqrunes("Gae find my familiar; Bartholomew. Ee's tendin the cauldron which ken bring oot t' magic energy in items scattered aroond. Knowing him, ee's probably gone tae somewhere with books.", C)
return
+ if("Do I know you from somewhere?")
+ visible_message("[src] says, \"Aye ye micht dae, ah was kicking aboot round 'ere aboot a year ago when ah had a wee... altercation wit the witch academy n' ran oot here tae crash oan me sis's floor. Course she pushed me tae git it a' sorted oot lik', bit nae before ah hud a wee bit o' fun oan this station. Or maybe ye jest recognise me ma's prized pumpkin atop me nonce.\"")
+ jacqrunes("Aye ye micht dae, ah was kicking aboot round 'ere aboot a year ago when ah had a wee... altercation wit the witch academy n' ran oot here tae crash oan me sis's floor. Course she pushed me tae git it a' sorted oot lik', bit nae before ah hud a wee bit o' fun oan this station. Or maybe ye jest recognise me ma's prized pumpkin atop me nonce.", C)
/mob/living/simple_animal/jacq/proc/treat(mob/living/carbon/C, gender)
visible_message("[src] gives off a glowing smile, \"What ken Ah offer ye? I can magic up an object, a potion or a plushie fer ye.\"")
+ jacqrunes("What ken Ah offer ye? I can magic up an object, a potion or a plushie fer ye.", C)
var/choices_reward = list("Object - 3 candies", "Potion - 2 candies", "Jacqueline Tracker - 2 candies", "Plushie - 1 candy", "Can I get to know you instead?", "Become a pumpkinhead dullahan (perma) - 4 candies")
var/choice_reward = input(usr, "Trick or Treat?", "Trick or Treat?") in choices_reward
@@ -184,8 +212,10 @@
if("Become a pumpkinhead dullahan (perma) - 4 candies")
if(!take_candies(C, 4))
visible_message("[src] raises an eyebrown, \"It's 4 candies for that [gender]! Thems the rules!\"")
+ jacqrunes("It's 4 candies for that [gender]! Thems the rules!", C)
return
visible_message("[src] waves their arms around, \"Off comes your head, a pumpkin taking it's stead!\"")
+ jacqrunes("Off comes your head, a pumpkin taking it's stead!", C)
C.reagents.add_reagent(/datum/reagent/mutationtoxin/pumpkinhead, 5)
sleep(20)
poof()
@@ -194,6 +224,7 @@
if("Object - 3 candies")
if(!take_candies(C, 3))
visible_message("[src] raises an eyebrown, \"It's 3 candies per trinket [gender]! Thems the rules!\"")
+ jacqrunes("It's 3 candies per trinket [gender]! Thems the rules!", C)
return
var/new_obj = pick(subtypesof(/obj))
@@ -203,36 +234,43 @@
var/reward = new new_obj(C.loc)
C.put_in_hands(reward)
visible_message("[src] waves her hands, magicking up a [reward] from thin air, \"There ye are [gender], enjoy! \"")
+ jacqrunes("There ye are [gender], enjoy!", C)
sleep(20)
poof()
return
if("Potion - 2 candies")
if(!take_candies(C, 2))
visible_message("[src] raises an eyebrow, \"It's 2 candies per potion [gender]! Thems the rules!\"")
+ jacqrunes("It's 2 candies per potion [gender]! Thems the rules!", C)
return
var/reward = new /obj/item/reagent_containers/potion_container(C.loc)
C.put_in_hands(reward)
visible_message("[src] waves her hands, magicking up a [reward] from thin air, \"There ye are [gender], enjoy! \"")
+ jacqrunes("There ye are [gender], enjoy!", C)
sleep(20)
poof()
return
if("Plushie - 1 candy")
if(!take_candies(C, 1))
visible_message("[src] raises an eyebrow, \"It's 1 candy per plushie [gender]! Thems the rules!\"")
+ jacqrunes("It's 1 candy per plushie [gender]! Thems the rules!", C)
return
new /obj/item/toy/plush/random(C.loc)
visible_message("[src] waves her hands, magicking up a plushie from thin air, \"There ye are [gender], enjoy! \"")
+ jacqrunes("There ye are [gender], enjoy!", C)
sleep(20)
poof()
return
if("Jacqueline Tracker - 2 candies")
if(!take_candies(C, 2))
visible_message("[src] raises an eyebrow, \"It's 1 candy per plushie [gender]! Thems the rules!\"")
+ jacqrunes("It's 1 candy per plushie [gender]! Thems the rules!", C)
return
new /obj/item/pinpointer/jacq(C.loc)
visible_message("[src] waves her hands, magicking up a tracker from thin air, \"Feels weird to magic up a tracker fer meself but, here ye are [gender], enjoy! \"")
+ jacqrunes("Feels weird to magic up a tracker fer meself but, here ye are [gender], enjoy!", C)
sleep(20)
poof()
return
@@ -252,7 +290,7 @@
choices += "What is that on your head?"
if(!(progression["[C.real_name]"] & JACQ_EXPELL))
if(progression["[C.real_name]"] & JACQ_WITCH)
- choices += "So you got ex-spell-ed?"
+ choices += "What is it like being a witch?"
else
choices += "Are you a witch?"
@@ -270,47 +308,79 @@
//If you've nothing to ask
if(!LAZYLEN(choices))
visible_message("[src] sighs, \"Ah'm all questioned oot fer noo, [gender].\"")
+ jacqrunes("Ah'm all questioned oot fer noo, [gender]", C)
return
//Otherwise, lets go!
visible_message("[src] says, \"A question? Sure, it'll cost you a candy though!\"")
+ jacqrunes("A question? Sure, it'll cost you a candy though!", C)
choices += "Nevermind"
//Candies for chitchats
var/choice = input(C, "What do you want to ask?", "What do you want to ask?") in choices
if(!take_candies(C, 1))
visible_message("[src] raises an eyebrow, \"It's a candy per question [gender]! Thems the rules!\"")
+ jacqrunes("It's a candy per question [gender]! Thems the rules!", C)
return
//Talking
switch(choice)
if("Why do you want the candies?")
visible_message("[src] says, \"Ave ye tried them? They're full of all sorts of reagents. Ah'm after them so ah ken magic em up an hopefully find rare stuff fer me brews. Honestly it's a lot easier magicking up tatt fer ye lot than runnin aroond on me own like. I'd ask me familiars but most a my familiars are funny fellows 'n constantly bugger off on adventures when given simple objectives like; Go grab me a tea cake or watch over me cauldron. Ah mean, ye might run into Bartholomew my cat. Ee's supposed tae be tending my cauldron, but I've nae idea where ee's got tae.\"")
+ jacqrunes("Ave ye tried them? They're full of all sorts of reagents. Ah'm after them so ah ken magic em up an hopefully find rare stuff fer me brews. Honestly it's a lot easier magicking up tatt fer ye lot than runnin aroond on me own like. I'd ask me familiars but most a my familiars are funny fellows 'n constantly bugger off on adventures when given simple objectives like; Go grab me a tea cake or watch over me cauldron. Ah mean, ye might run into Bartholomew my cat. Ee's supposed tae be tending my cauldron, but I've nae idea where ee's got tae.", C)
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_CANDIES
sleep(30)
if("You really came all this way for candy?")
- visible_message("[src] l ooks tae the side sheepishly, \"Aye, well, tae be honest, Ah'm here tae see me sis, but dunnae let her knew that. She's an alchemist too like, but she dunnae use a caldron like mae, she buggered off like tae her posh ivory tower tae learn bloody chemistry instead!\" [src] scowls, \"She's tae black sheep o' the family too, so we dunnae see eye tae eye sometimes on alchemy. Ah mean, she puts moles in her brews! Ye dunnae put moles in yer brews! Yae threw your brews at tae wee bastards an blew em up!\" [src] sighs, \"But she's a heart o gold so.. Ah wanted tae see her an check up oon her, make sure she's okay.\"")
+ visible_message("[src] looks to the side sheepishly, \"Aye, well, tae be honest, Ah'm here tae see me sis, but dunnae let her knew that. She's an alchemist too like, but she dunnae use a caldron like mae, she buggered off like tae her posh ivory tower tae learn bloody chemistry instead!\" [src] scowls, \"She's tae black sheep o' the family too, so we dunnae see eye tae eye sometimes on alchemy. Ah mean, she puts moles in her brews! Ye dunnae put moles in yer brews! Yae threw your brews at tae wee bastards an blew em up!\" [src] sighs, \"But she's a heart o gold so.. Ah wanted tae see her an check up oon her, make sure she's okay.\"")
+ jacqrunes("Aye, well, tae be honest, Ah'm here tae see me sis, but dunnae let her knew that. She's an alchemist too like, but she dunnae use a caldron like mae, she buggered off like tae her posh ivory tower tae learn bloody chemistry instead", C)
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_FAR
- sleep(30)
+ sleep(10)
+ jacqrunes("She's tae black sheep o' the family too, so we dunnae see eye tae eye sometimes on alchemy. Ah mean, she puts moles in her brews! Ye dunnae put moles in yer brews! Yae threw your brews at tae wee bastards an blew em up!", C)
+ sleep(10)
+ jacqrunes("But she's a heart o gold so.. Ah wanted tae see her an check up oon her, make sure she's okay.", C)
+ sleep(10)
if("What is that on your head?")
- visible_message("[src] pats the pumpkin atop her head, \"This thing? This ain't nae ordinary pumpkin! Me Ma grew this monster ooer a year o love, dedication an hard work. Honestly it felt like she loved this thing more than any of us, which Ah knew ain't true an it's not like she was hartless or anything but.. well, we had a falling oot when Ah got back home with all me stuff in tow. An all she had done is sent me owl after owl over t' last year aboot this bloody pumpkin and ah had enough. So ah took it, an put it on me head. You know, as ye do. Ah am the great Pumpqueen after all, Ah deserve this.\"")
+ visible_message("[src] pats the pumpkin atop her head, \"This thing? This ain't nae ordinary pumpkin! Me Ma grew this monster ooer a year o love, dedication an hard work. Honestly I got bloody sick o'er harpin' on aboot it, all she had done is sent me owl after owl over aboot this bloody pumpkin since i left the nest and ah had enough after a ... mild altercation like. So I nabbed it last halloween. Caught bloody hell fer it ah did, course me sis talked to me ma and, well, simmered her doon. We've all but made up noo, but seein' as ah'm the great Pumpqueen after all, I cannae be seen withoot it like.\"")
+ jacqrunes("This thing? This ain't nae ordinary pumpkin! Me Ma grew this monster ooer a year o love, dedication an hard work. Honestly I got bloody sick o'er harpin' on aboot it, all she had done is sent me owl after owl over aboot this bloody pumpkin since i left the nest and ah had enough after a ... mild altercation like. So I nabbed it last halloween. Caught bloody hell fer it ah did, course me sis talked to me ma and, well, simmered her doon. We've all but made up noo, but seein' as ah'm the great Pumpqueen after all, I cannae be seen withoot it like.", C)
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_HEAD
sleep(30)
+ //Year 1 answer: for anyone who is interested!
+ /*This thing? This ain't nae ordinary pumpkin! Me Ma grew this monster ooer a year o love, dedication an hard work. Honestly it felt like she loved this thing more than any of us, which Ah knew ain't true an it's not like she was hartless or anything but.. well, we had a falling oot when Ah got back home with all me stuff in tow. An all she had done is sent me owl after owl over t' last year aboot this bloody pumpkin and ah had enough. So ah took it, an put it on me head. You know, as ye do. Ah am the great Pumpqueen after all, Ah deserve this.*/
+
if("Are you a witch?")
- visible_message("[src] grumbles, \"If ye must know, Ah got kicked oot of the witch academy fer being too much of a \"loose cannon\". A bloody loose cannon? Nae they were just pissed off Ah had the brass tae proclaim myself as the Pumpqueen! And also maybe the time Ah went and blew up one of the towers by trying tae make a huge batch of astrogen might've had something tae do with it. Ah mean it would've worked fine if the cauldrons weren't so shite and were actually upgraded by the faculty. So technically no, I'm not a witch.\"")
+ visible_message("[src] smirks, \"Weel, after getting kicked oot over a very minor explosion last year, ah wis able tae git back in 'n' finish me witching degree thanks tae me sis! 'twas bloody brutal finishing th' degree though, ah will tell ye, ye take a peek o'er at t' other witches all prim 'n' proper like 'n' it gets in yer heid, ye'r nae as guid. But ah bloody well ended up summoning Nar'Sie last year for the lot o' yous. Aye a'm a loose cannon - but ah get results.\" thumping her chest with pride as she finishes speaking.")
+ jacqrunes("Weel, after getting kicked oot over a very minor explosion last year, ah wis able tae git back in 'n' finish me witching degree thanks tae me sis! 'twas bloody brutal finishing th' degree though, ah will tell ye, ye take a peek o'er at t' other witches all prim 'n' proper like 'n' it gets in yer heid, ye'r nae as guid. But ah bloody well ended up summoning Nar'Sie last year for the lot o' yous. Aye a'm a loose cannon - but ah get results." , C)
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_WITCH
sleep(30)
- if("So you got ex-spell-ed?")
- visible_message("[src] Gives you a blank look at the pun, before continuing, \"Not quite, Ah know Ah ken get back into the academy, it's only an explosion, they happen all the time, but, tae be fair it's my fault that things came tae their explosive climax. You don't know what it's like when you're after a witch doctorate, everyone else is doing well, everyone's making new spells and the like, and I'm just good at making explosions really, or fireworks. So, Ah did something Ah knew was dangerous, because Ah had tae do something tae stand oot, but Ah know this life ain't fer me, Ah don't want tae be locked up in dusty towers, grinding reagent after reagent together, trying tae find new reactions, some of the wizards in there haven't left fer years. Ah want tae live, Ah want tae fly around on a broom, turn people into cats fer a day and disappear cackling! That's what got me into witchcraft!\" she throws her arms up in the arm, spinning the pumpkin upon her head slightly. She carefully spins it back to face you, giving oot a soft sigh, \"Ah know my mother's obsession with this dumb thing on my head is just her trying tae fill the void of me and my sis moving oot, and it really shouldn't be on my head. And Ah know that I'm really here tae get help from my sis.. She's the sensible one, and she gives good hugs.\"")
- sleep(30)
+ //Year 1 answer for anyone who is interested:
+ /* Are you a witch?
+ If ye must know, Ah got kicked oot of the witch academy fer being too much of a \"loose cannon\". A bloody loose cannon? Nae they were just pissed off Ah had the brass tae proclaim myself as the Pumpqueen! And also maybe the time Ah went and blew up one of the towers by trying tae make a huge batch of astrogen might've had something tae do with it. Ah mean it would've worked fine if the cauldrons weren't so shite and were actually upgraded by the faculty. So technically no, I'm not a witch.*/
+
+ if("What is it like being a witch?") //What is it like being a witch?
+
+ visible_message("[src] says, \"Tae be honest, ah dunnae. Ah mean ah have a piece o’ paper that implies that a’m, ‘n’ a few folk who seem keen in shoving me back in their magic tower, but I don’t know if that’s fer me really.\" she gives the back of her pumpkin a quick scratch as she continues \"What draws me tae witchcraft is the chaos, ah live tae see th’ utter madness that comes fae the spells ah cast ‘n’ th’ like, ‘n’ ah know you do tae, it’s why you’re ‘ere, aye? Ah kin conjure some utterly chaotic things, and ah love tae do it, just tae see what I’ll git! It’s why visiting here is so fun, ye wee lot scurrying about, getting me candies, hoping I’ll conjure up something utterly chaotic!\" she throws her arms up in the arm with a laugh, spinning the pumpkin upon her head slightly. She carefully spins it back to face you, \"But o’ course life ain’t that easy, ye can’t just go around being a pure agent o’ chaos, ‘n’ ah feel like the reality o’ the world be trying tae dull me, to shove me in a boring dusty auld room where ah spend t’ rest o’ me days researching some boggin’ magic till ah die. Ah want tae bloody well change t’ world, ah want to do something that leaves an impact, but ah dunnae want t’ kill people doing it.\" she gives out a soft sigh, \"Who knows, maybe I’ll bugger off ‘n’ make some pumkinmobiles or something daft like that.\" ")
+ jacqrunes("Tae be honest, ah dunnae. Ah mean ah have a piece o’ paper that implies that a’m, ‘n’ a few folk who seem keen in shoving me back in their magic tower, but I don’t know if that’s fer me really." , C)
+ sleep(10)
+ jacqrunes("What draws me tae witchcraft is the chaos, ah live tae see th’ utter madness that comes fae the spells ah cast ‘n’ th’ like, ‘n’ ah know you do tae, it’s why you’re ‘ere, aye? Ah kin conjure some utterly chaotic things, and ah love tae do it, just tae see what I’ll git! It’s why visiting here is so fun, ye wee lot scurrying about, getting me candies, hoping I’ll conjure up something utterly chaotic!" , C)
+ sleep(10)
+ jacqrunes("But o’ course life ain’t that easy, ye can’t just go around being a pure agent o’ chaos, ‘n’ ah feel like the reality o’ the world be trying tae dull me, to shove me in a boring dusty auld room where ah spend t’ rest o’ me days researching some boggin’ magic till ah die. Ah want tae bloody well change t’ world, ah want to do something that leaves an impact, but ah dunnae want t’ kill people doing it.", C)
+ sleep(10)
+ jacqrunes("Who knows, maybe I’ll bugger off ‘n’ make some pumkinmobiles or something daft like that.", C)
+ sleep(25)
visible_message("[src] says, \"Thanks [C], Ah guess Ah didn't realise Ah needed someone tae talk tae but, I'm glad ye spent all your candies talking tae me. Funny how things seem much worse in yer head.\"")
+ jacqrunes("Thanks [C], Ah guess Ah didn't realise Ah needed someone tae talk tae but, I'm glad ye spent all your candies talking tae me. Funny how things seem much worse in yer head." , C)
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_EXPELL
sleep(30)
+ //Year 1 answer for anyone who is interested:
+ /*"So you got ex-spell-ed?"
+ Gives you a blank look at the pun, before continuing, \"Not quite, Ah know Ah ken get back into the academy, it's only an explosion, they happen all the time, but, tae be fair it's my fault that things came tae their explosive climax. You don't know what it's like when you're after a witch doctorate, everyone else is doing well, everyone's making new spells and the like, and I'm just good at making explosions really, or fireworks. So, Ah did something Ah knew was dangerous, because Ah had tae do something tae stand oot, but Ah know this life ain't fer me, Ah don't want tae be locked up in dusty towers, grinding reagent after reagent together, trying tae find new reactions, some of the wizards in there haven't left fer years. Ah want tae live, Ah want tae fly around on a broom, turn people into cats fer a day and disappear cackling! That's what got me into witchcraft!\" she throws her arms up in the arm, spinning the pumpkin upon her head slightly. She carefully spins it back to face you, giving oot a soft sigh, \"Ah know my mother's obsession with this dumb thing on my head is just her trying tae fill the void of me and my sis moving oot, and it really shouldn't be on my head. And Ah know that I'm really here tae get help from my sis.. She's the sensible one, and she gives good hugs.
+ */
+
if("Can I take you out on a date?")
visible_message("[src] blushes, \"...You want tae ask me oot on a date? Me? After all that nonsense Ah just said? It seems a waste of a candy honestly.\"")
- //progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_DATE
+ jacqrunes("...You want tae ask me oot on a date? Me? After all that nonsense Ah just said? It seems a waste of a candy honestly." , C)
visible_message("[src] looks to the side, deep in thought.")
dating_start(C, gender)
@@ -328,15 +398,18 @@
switch(option)
if(1)
visible_message("[src] waves their arms around, \"Hocus pocus, making friends is now your focus!\"")
+ jacqrunes("Hocus pocus, making friends is now your focus!", C)
var/message = pick("make a tasty sandwich for", "compose a poem for", "aquire a nice outfit to give to", "strike up a conversation about pumpkins with", "write a letter and deliver it to", "give a nice hat to")
var/mob/living/L2 = pick(GLOB.player_list)
message += " [L2.name]."
to_chat(C, " You feel an overwhelming desire to [message]")
if(2)
visible_message("[src] waves their arms around, \"If only you had a better upbringing, your ears are now full of my singing!\"")
- C.client.tgui_panel?.play_music("https://puu.sh/ExBbv.mp4")
+ jacqrunes("If only you had a better upbringing, your ears are now full of my singing!", C)
+ C.client.tgui_panel?.play_music("https://katlin.dog/v/spooky.mp4")
if(3)
visible_message("[src] waves their arms around, \"You're cute little bumpkin, On your head is a pumpkin!\"")
+ jacqrunes("You're cute little bumpkin, On your head is a pumpkin!", C)
if(C.head)
var/obj/item/W = C.head
C.dropItemToGround(W, TRUE)
@@ -344,12 +417,15 @@
C.equip_to_slot(jaqc_latern, SLOT_HEAD, 1, 1)
if(4)
visible_message("[src] waves their arms around, \"In your body there's something amiss, you'll find it's a chem made by my sis!\"")
+ jacqrunes("In your body there's something amiss, you'll find it's a chem made by my sis!", C)
C.reagents.add_reagent(/datum/reagent/fermi/eigenstate, 30)
if(5)
visible_message("[src] waves their arms around, \"A new familiar for me, and you'll see it's thee!\"")
- C.reagents.add_reagent("secretcatchem", 30)
+ jacqrunes("A new familiar for me, and you'll see it's thee!", C)
+ C.reagents.add_reagent(/datum/reagent/fermi/secretcatchem, 30)
if(6)
visible_message("[src] waves their arms around, \"While you may not be a ghost, for this sheet you'll always be it's host.\"")
+ jacqrunes("While you may not be a ghost, for this sheet you'll always be it's host.", C)
var/mob/living/carbon/human/H = C
if(H.wear_suit)
var/obj/item/W = H.wear_suit
@@ -370,22 +446,30 @@
message_admins("[C2]/[C2.key] has agreed to go on a date with [C] as Jacqueline.")
log_game("HALLOWEEN: [C2]/[C2.key] has agreed to go on a date with [C] as Jacqueline")
to_chat(src, "You are Jacqueline the great pumpqueen, witch Extraordinaire! You're a very Scottish lass with a kind heart, but also a little crazy. You also blew up the wizarding school and you're suspended for a while, so you visited the station before heading home. On your head lies the prize pumpkin of your Mother's pumpkin patch. You're currently on a date with [C] and well, I didn't think anyone would get this far. Please be good so I can do events like this in the future. ")
- return
+ canmove()
+ return TRUE
else
candies =- C2
visible_message("[src] looks to the side, \"Look, Ah like ye but, Ah don't think Ah can right now. If ye can't tell, the stations covered in volatile candies, I've a few other laddies and lassies running after me treats, and tae top it all off, I've the gods breathing down me neck, watching every treat Ah make fer the lot of yous.\" she sighs, \"But that's not a no, right? That's.. just a nae right noo.\"")
+ jacqrunes("Look, Ah like ye but, Ah don't think Ah can right now. If ye can't tell, the stations covered in volatile candies, I've a few other laddies and lassies running after me treats, and tae top it all off, I've the gods breathing down me neck, watching every treat Ah make fer the lot of yous.", C)
sleep(20)
+ jacqrunes("But that's not a no, right? That's.. just a nae right noo.", C)
visible_message("[src] takes off the pumpkin on her head, a rich blush on her cheeks. She leans over planting a kiss upon your forehead quickly befere popping the pumpkin back on her head.")
- sleep(10)
+ sleep(20)
visible_message("[src] waves their arms around, \"There, that aught tae be worth a candy.\"")
+ jacqrunes("There, that aught tae be worth a candy.", C)
sleep(20)
poof()
/mob/living/simple_animal/jacq/update_mobility()
. = ..()
- if(busy_chatting)
+ if(busy)
DISABLE_BITFIELD(., MOBILITY_MOVE)
- mobility_flags = .
+ else
+ ENABLE_BITFIELD(., MOBILITY_MOVE)
+ mobility_flags = .
+
+
/obj/item/clothing/head/hardhat/pumpkinhead/jaqc
name = "Jacq o' latern"
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index d6022c1345..aa8a7b60c2 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -285,7 +285,7 @@
else
plant_overlay.icon_state = myseed.icon_harvest
else
- var/t_growthstate = min(round((age / myseed.maturation) * myseed.growthstages), myseed.growthstages)
+ var/t_growthstate = clamp(round((age / myseed.maturation) * myseed.growthstages), 1, myseed.growthstages)
plant_overlay.icon_state = "[myseed.icon_grow][t_growthstate]"
add_overlay(plant_overlay)
diff --git a/code/modules/keybindings/keybind/movement.dm b/code/modules/keybindings/keybind/movement.dm
index 176e6b9fb8..cc5798710c 100644
--- a/code/modules/keybindings/keybind/movement.dm
+++ b/code/modules/keybindings/keybind/movement.dm
@@ -154,7 +154,7 @@
/datum/keybinding/living/toggle_sprint/down(client/user)
var/mob/living/L = user.mob
- L.default_toggle_sprint(TRUE)
+ L.default_toggle_sprint()
return TRUE
/datum/keybinding/mob/toggle_move_intent
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index c69e990033..30a933db39 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -11,8 +11,8 @@
/obj/item/survivalcapsule
name = "bluespace shelter capsule"
desc = "An emergency shelter stored within a pocket of bluespace."
- icon_state = "capsule"
icon = 'icons/obj/mining.dmi'
+ icon_state = "capsule"
w_class = WEIGHT_CLASS_TINY
var/template_id = "shelter_alpha"
var/datum/map_template/shelter/template
@@ -72,9 +72,10 @@
/obj/item/survivalcapsule/luxury
name = "luxury bluespace shelter capsule"
desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace."
+ icon_state = "capsule-lux"
template_id = "shelter_beta"
-/obj/item/survivalcapsule/luxuryelite
+/obj/item/survivalcapsule/luxury/elitebar
name = "luxury elite bar capsule"
desc = "A luxury bar in a capsule. Bartender required and not included."
template_id = "shelter_charlie"
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 2cbb965ef5..ec6a430c0c 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -42,7 +42,7 @@
new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
- new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1000),
+ new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining/conscript, 1000),
new /datum/data/mining_equipment("1000 Point Transfer Card", /obj/item/card/mining_point_card/mp1000, 1000),
new /datum/data/mining_equipment("1500 Point Transfer Card", /obj/item/card/mining_point_card/mp1500, 1500),
new /datum/data/mining_equipment("2000 Point Transfer Card", /obj/item/card/mining_point_card/mp2000, 2000),
@@ -55,7 +55,7 @@
new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
new /datum/data/mining_equipment("Ice hiking boots", /obj/item/clothing/shoes/winterboots/ice_boots, 2500),
new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
- new /datum/data/mining_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxuryelite, 10000),
+ new /datum/data/mining_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxury/elitebar, 10000),
new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800),
new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
@@ -70,9 +70,10 @@
new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
- new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 3000),
+ new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining/cloned, 3000),
new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000),
- new /datum/data/mining_equipment("Kinetic Glaive", /obj/item/kinetic_crusher/glaive, 2250),
+ new /datum/data/mining_equipment("Kinetic Glaive Kit", /obj/item/storage/backpack/duffelbag/mining/glaivekit, 2250),
+ new /datum/data/mining_equipment("Survival Dagger", /obj/item/kitchen/knife/combat/survival/knuckledagger, 550),
)
/datum/data/mining_equipment
@@ -222,7 +223,7 @@
new /obj/item/extinguisher/mini(drop_location)
new /obj/item/kinetic_crusher(drop_location)
if("Mining Conscription Kit")
- new /obj/item/storage/backpack/duffelbag/mining_conscript(drop_location)
+ new /obj/item/storage/backpack/duffelbag/mining/conscript(drop_location)
SSblackbox.record_feedback("tally", "mining_voucher_redeemed", 1, selection)
qdel(voucher)
@@ -328,11 +329,11 @@
to_chat(user, "You upgrade [I] with mining access.")
qdel(src)
-/obj/item/storage/backpack/duffelbag/mining_conscript
+/obj/item/storage/backpack/duffelbag/mining/conscript
name = "mining conscription kit"
desc = "A kit containing everything a crewmember needs to support a shaft miner in the field."
-/obj/item/storage/backpack/duffelbag/mining_conscript/PopulateContents()
+/obj/item/storage/backpack/duffelbag/mining/conscript/PopulateContents()
new /obj/item/pickaxe/mini(src)
new /obj/item/clothing/glasses/meson(src)
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
@@ -347,11 +348,11 @@
//CITADEL ADDITIONS BELOW
-/obj/item/storage/backpack/duffelbag/mining_cloned
+/obj/item/storage/backpack/duffelbag/mining/cloned
name = "mining replacement kit"
- desc = "A large bag that has advance tools and a spare jumpsuit, boots, and gloves for a newly cloned miner to get back in the field. Even has a new ID!"
+ desc = "A large bag that has advanced tools and a spare jumpsuit, boots, and gloves for a newly cloned miner to get back in the field. Even has a new ID!"
-/obj/item/storage/backpack/duffelbag/mining_cloned/PopulateContents()
+/obj/item/storage/backpack/duffelbag/mining/cloned/PopulateContents()
new /obj/item/pickaxe/mini(src)
new /obj/item/clothing/under/rank/cargo/miner/lavaland(src)
new /obj/item/clothing/shoes/workboots/mining(src)
@@ -369,6 +370,12 @@
new /obj/item/storage/bag/ore(src)
new /obj/item/clothing/glasses/meson/prescription(src)
+/obj/item/storage/backpack/duffelbag/mining/glaivekit
+
+/obj/item/storage/backpack/duffelbag/mining/glaivekit/PopulateContents()
+ new /obj/item/kinetic_crusher/glaive(src)
+ new /obj/item/kitchen/knife/combat/survival/knuckledagger(src)
+
/obj/machinery/mineral/equipment_vendor/proc/RedeemSVoucher(obj/item/suit_voucher/voucher, mob/redeemer)
var/items = list( "Exo-suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "exo"),
"SEVA suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "seva"))
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index c3c0787aa8..2e1ffe718f 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -26,7 +26,8 @@
features = random_features(pref_species?.id, gender)
age = rand(AGE_MIN,AGE_MAX)
-/datum/preferences/proc/update_preview_icon(equip_job = TRUE)
+/datum/preferences/proc/update_preview_icon(current_tab)
+ var/equip_job = (current_tab != 2)
// Determine what job is marked as 'High' priority, and dress them up as such.
var/datum/job/previewJob = get_highest_job()
@@ -45,9 +46,13 @@
mannequin.add_overlay(mutable_appearance('modular_citadel/icons/ui/backgrounds.dmi', bgstate, layer = SPACE_LAYER))
copy_to(mannequin, initial_spawn = TRUE)
- if(previewJob && equip_job)
- mannequin.job = previewJob.title
- previewJob.equip(mannequin, TRUE, preference_source = parent)
+ if(current_tab == 3)
+ //give it its loadout if not on the appearance tab
+ SSjob.equip_loadout(parent.mob, mannequin, FALSE, bypass_prereqs = TRUE, can_drop = FALSE)
+ else
+ if(previewJob && equip_job)
+ mannequin.job = previewJob.title
+ previewJob.equip(mannequin, TRUE, preference_source = parent)
COMPILE_OVERLAYS(mannequin)
parent.show_character_previews(new /mutable_appearance(mannequin))
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
index a07fdaa5d3..23b1f87bd2 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
@@ -2,7 +2,7 @@
// Facial Hair Definitions //
/////////////////////////////
/datum/sprite_accessory/facial_hair
- icon = 'icons/mob/human_face.dmi'
+ icon = 'icons/mob/hair.dmi'
gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P)
// please make sure they're sorted alphabetically and categorized
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
index 8e4e6ad617..55ab18c20c 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
@@ -2,7 +2,7 @@
// Hair Definitions //
//////////////////////
/datum/sprite_accessory/hair
- icon = 'icons/mob/human_face.dmi' // default icon for all hairs
+ icon = 'icons/mob/hair.dmi' // default icon for all hairs
// please make sure they're sorted alphabetically and, where needed, categorized
// try to capitalize the names please~
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index e1d078c632..0c57c13e3f 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -408,7 +408,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(mind.current.key && mind.current.key[1] != "@") //makes sure we don't accidentally kick any clients
to_chat(usr, "Another consciousness is in your body...It is resisting you.")
return
- client.change_view(CONFIG_GET(string/default_view))
+ client.view_size.setDefault(getScreenSize(client.prefs.widescreenpref))//Let's reset so people can't become allseeing gods
transfer_ckey(mind.current, FALSE)
SStgui.on_transfer(src, mind.current) // Transfer NanoUIs.
mind.current.client.init_verbs()
@@ -568,15 +568,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set desc = "Change your view range."
var/max_view = client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT
- if(client.view == CONFIG_GET(string/default_view))
+ if(client.view_size.getView() == client.view_size.default)
var/list/views = list()
for(var/i in 7 to max_view)
views |= i
- var/new_view = input("Choose your new view", "Modify view range", 7) as null|anything in views
+ var/new_view = input("Choose your new view", "Modify view range", 0) as null|anything in views
if(new_view)
- client.change_view(clamp(new_view, 7, max_view))
+ client.view_size.setTo(clamp(new_view, 7, max_view) - 7)
else
- client.change_view(CONFIG_GET(string/default_view))
+ client.view_size.resetToDefault()
/mob/dead/observer/verb/add_view_range(input as num)
set name = "Add View Range"
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 1706763f6b..11b133f5e7 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -979,30 +979,15 @@
O.held_index = r_arm_index_next //2, 4, 6, 8...
hand_bodyparts += O
-/mob/living/carbon/do_after_coefficent()
- . = ..()
- var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) //Currently, only carbons or higher use mood, move this once that changes.
- if(mood)
- switch(mood.sanity) //Alters do_after delay based on how sane you are
- if(SANITY_INSANE to SANITY_DISTURBED)
- . *= 1.25
- if(SANITY_NEUTRAL to SANITY_GREAT)
- . *= 0.90
-
- for(var/i in status_effects)
- var/datum/status_effect/S = i
- . *= S.interact_speed_modifier()
-
-
/mob/living/carbon/proc/create_internal_organs()
for(var/X in internal_organs)
var/obj/item/organ/I = X
I.Insert(src)
-/mob/living/carbon/proc/update_disabled_bodyparts()
+/mob/living/carbon/proc/update_disabled_bodyparts(silent = FALSE)
for(var/B in bodyparts)
var/obj/item/bodypart/BP = B
- BP.update_disabled()
+ BP.update_disabled(silent)
/mob/living/carbon/vv_get_dropdown()
. = ..()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 389787df67..904753f9b1 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1046,7 +1046,8 @@
return
var/stambufferinfluence = (bufferedstam*(100/stambuffer))*0.2 //CIT CHANGE - makes stamina buffer influence movedelay
if(!HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN)) //if we want to ignore slowdown from damage, but not from equipment
- var/health_deficiency = ((maxHealth + stambufferinfluence) - health + (getStaminaLoss()*0.75))//CIT CHANGE - reduces the impact of staminaloss and makes stamina buffer influence it
+ var/scaling = maxHealth / 100
+ var/health_deficiency = (((maxHealth / scaling) + stambufferinfluence) - (health / scaling) + (getStaminaLoss()*0.75))//CIT CHANGE - reduces the impact of staminaloss and makes stamina buffer influence it
if(health_deficiency >= 40)
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, (health_deficiency-39) / 75)
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying, TRUE, (health_deficiency-39) / 25)
@@ -1057,11 +1058,6 @@
remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown)
remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying)
-
-/mob/living/carbon/human/do_after_coefficent()
- . = ..()
- . *= physiology.do_after_speed
-
/mob/living/carbon/human/is_bleeding()
if(NOBLOOD in dna.species.species_traits || bleedsuppress)
return FALSE
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index bcb658eab8..5ced11e35a 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -101,3 +101,8 @@
if(dna.species.space_move(src))
return TRUE
return ..()
+
+/mob/living/carbon/human/CanPass(atom/movable/mover, turf/target)
+ if(dna.species.species_pass_check())
+ return TRUE
+ return ..()
diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm
index fd0df0bde9..22c197f7de 100644
--- a/code/modules/mob/living/carbon/human/physiology.dm
+++ b/code/modules/mob/living/carbon/human/physiology.dm
@@ -23,8 +23,6 @@
var/hunger_mod = 1 //% of hunger rate taken per tick.
- var/do_after_speed = 1 //Speed mod for do_after. Lower is better. If temporarily adjusting, please only modify using *= and /=, so you don't interrupt other calculations.
-
/// footstep type override for both shoeless and not footstep sounds.
var/footstep_type
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 9eade70c6b..e68984738a 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -117,6 +117,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
//the ids you can use for your species, if empty, it means default only and not changeable
var/list/allowed_limb_ids
+ //the type of eyes this species has
+ var/eye_type = "normal"
+
///////////
// PROCS //
///////////
@@ -510,7 +513,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/mutable_appearance/hair_overlay = mutable_appearance(layer = -HAIR_LAYER)
if(!hair_hidden && !H.getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain
if(!(NOBLOOD in species_traits))
- hair_overlay.icon = 'icons/mob/human_face.dmi'
+ hair_overlay.icon = 'icons/mob/hair.dmi'
hair_overlay.icon_state = "debrained"
else if(H.hair_style && (HAIR in species_traits))
@@ -569,7 +572,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(HD && !(HAS_TRAIT(H, TRAIT_HUSK)))
// lipstick
if(H.lip_style && (LIPS in species_traits))
- var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[H.lip_style]", -BODY_LAYER)
+ var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/lips.dmi', "lips_[H.lip_style]", -BODY_LAYER)
lip_overlay.color = H.lip_color
if(OFFSET_LIPS in H.dna.species.offset_features)
@@ -582,10 +585,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(!(NOEYES in species_traits))
var/has_eyes = H.getorganslot(ORGAN_SLOT_EYES)
if(!has_eyes)
- standing += mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER)
+ standing += mutable_appearance('icons/mob/eyes.dmi', "eyes_missing", -BODY_LAYER)
else
- var/mutable_appearance/left_eye = mutable_appearance('icons/mob/human_face.dmi', "left_eye", -BODY_LAYER)
- var/mutable_appearance/right_eye = mutable_appearance('icons/mob/human_face.dmi', "right_eye", -BODY_LAYER)
+ var/left_state = DEFAULT_LEFT_EYE_STATE
+ var/right_state = DEFAULT_RIGHT_EYE_STATE
+ if(eye_type in GLOB.eye_types)
+ left_state = eye_type + "_left_eye"
+ right_state = eye_type + "_right_eye"
+ var/mutable_appearance/left_eye = mutable_appearance('icons/mob/eyes.dmi', left_state, -BODY_LAYER)
+ var/mutable_appearance/right_eye = mutable_appearance('icons/mob/eyes.dmi', right_state, -BODY_LAYER)
if((EYECOLOR in species_traits) && has_eyes)
left_eye.color = "#" + H.left_eye_color
right_eye.color = "#" + H.right_eye_color
@@ -1937,6 +1945,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(HAS_BONE in species_traits)
. |= BIO_JUST_BONE
+//a check for if you should render any overlays or not
+/datum/species/proc/should_render(mob/living/carbon/human/H)
+ return TRUE
+
+//a check for if you want to forcibly make CanPass return TRUE for the mob with this species
+/datum/species/proc/species_pass_check()
+ return FALSE
+
/////////////
//BREATHING//
/////////////
diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
index 16b371c772..6eccde61a9 100644
--- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
@@ -21,3 +21,5 @@
species_type = "insect"
allowed_limb_ids = list("insect","apid","moth","moth_not_greyscale")
+
+ eye_type = "insect"
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index a2c3248c6a..6193172f06 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -16,7 +16,8 @@
exotic_blood_color = "BLOOD_COLOR_SLIME"
damage_overlay_type = ""
var/datum/action/innate/regenerate_limbs/regenerate_limbs
- var/datum/action/innate/slime_change/slime_change //CIT CHANGE
+ var/datum/action/innate/slime_change/slime_change
+ var/datum/action/innate/slime_puddle/slime_puddle
liked_food = TOXIC | MEAT
disliked_food = null
toxic_food = ANTITOXIC
@@ -35,12 +36,15 @@
desc = "A slimey membranous mass from a slime person"
icon_state = "brain-slime"
-
/datum/species/jelly/on_species_loss(mob/living/carbon/C)
+ if(slime_puddle && slime_puddle.is_puddle)
+ slime_puddle.Activate()
if(regenerate_limbs)
regenerate_limbs.Remove(C)
- if(slime_change) //CIT CHANGE
- slime_change.Remove(C) //CIT CHANGE
+ if(slime_change)
+ slime_change.Remove(C)
+ if(slime_puddle)
+ slime_puddle.Remove(C)
C.faction -= "slime"
..()
C.faction -= "slime"
@@ -50,8 +54,10 @@
if(ishuman(C))
regenerate_limbs = new
regenerate_limbs.Grant(C)
- slime_change = new //CIT CHANGE
- slime_change.Grant(C) //CIT CHANGE
+ slime_change = new
+ slime_change.Grant(C)
+ slime_puddle = new
+ slime_puddle.Grant(C)
C.faction |= "slime"
/datum/species/jelly/handle_body(mob/living/carbon/human/H)
@@ -59,6 +65,18 @@
//update blood color to body color
exotic_blood_color = "#" + H.dna.features["mcolor"]
+/datum/species/jelly/should_render()
+ if(slime_puddle && slime_puddle.is_puddle)
+ return FALSE
+ else
+ return ..()
+
+/datum/species/jelly/species_pass_check()
+ if(slime_puddle && slime_puddle.is_puddle)
+ return TRUE
+ else
+ return ..()
+
/datum/species/jelly/spec_life(mob/living/carbon/human/H)
if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for blooduskers
return
@@ -670,6 +688,88 @@
else
return
+/datum/action/innate/slime_puddle
+ name = "Puddle Transformation"
+ check_flags = AB_CHECK_CONSCIOUS
+ button_icon_state = "slimepuddle"
+ icon_icon = 'icons/mob/actions/actions_slime.dmi'
+ background_icon_state = "bg_alien"
+ required_mobility_flags = MOBILITY_STAND
+ var/is_puddle = FALSE
+ var/in_transformation_duration = 12
+ var/out_transformation_duration = 7
+ var/puddle_into_effect = /obj/effect/temp_visual/slime_puddle
+ var/puddle_from_effect = /obj/effect/temp_visual/slime_puddle/reverse
+ var/puddle_icon = 'icons/mob/mob.dmi'
+ var/puddle_state = "puddle"
+ var/tracked_overlay
+ var/datum/component/squeak/squeak
+ var/transforming = FALSE
+ var/last_use
+
+/datum/action/innate/slime_puddle/IsAvailable()
+ if(!transforming)
+ return ..()
+ else
+ return FALSE
+
+/datum/action/innate/slime_puddle/Activate()
+ if(isjellyperson(owner) && IsAvailable())
+ transforming = TRUE
+ UpdateButtonIcon()
+ var/mob/living/carbon/human/H = owner
+ var/mutcolor = "#" + H.dna.features["mcolor"]
+ if(!is_puddle)
+ if(CHECK_MOBILITY(H, MOBILITY_USE))
+ is_puddle = TRUE
+ owner.cut_overlays()
+ var/obj/effect/puddle_effect = new puddle_into_effect(get_turf(owner), owner.dir)
+ puddle_effect.color = mutcolor
+ H.Stun(in_transformation_duration, ignore_canstun = TRUE)
+ ADD_TRAIT(H, TRAIT_PARALYSIS_L_ARM, SLIMEPUDDLE_TRAIT)
+ ADD_TRAIT(H, TRAIT_PARALYSIS_R_ARM, SLIMEPUDDLE_TRAIT)
+ ADD_TRAIT(H, TRAIT_MOBILITY_NOPICKUP, SLIMEPUDDLE_TRAIT)
+ ADD_TRAIT(H, TRAIT_MOBILITY_NOUSE, SLIMEPUDDLE_TRAIT)
+ ADD_TRAIT(H, TRAIT_SPRINT_LOCKED, SLIMEPUDDLE_TRAIT)
+ ADD_TRAIT(H, TRAIT_COMBAT_MODE_LOCKED, SLIMEPUDDLE_TRAIT)
+ ADD_TRAIT(H, TRAIT_MOBILITY_NOREST, SLIMEPUDDLE_TRAIT)
+ H.add_movespeed_modifier(/datum/movespeed_modifier/slime_puddle)
+ H.update_disabled_bodyparts(silent = TRUE)
+ H.layer -= 1 //go one layer down so people go over you
+ ENABLE_BITFIELD(H.pass_flags, PASSMOB)
+ squeak = H.AddComponent(/datum/component/squeak, custom_sounds = list('sound/effects/blobattack.ogg'))
+ sleep(in_transformation_duration)
+ var/mutable_appearance/puddle_overlay = mutable_appearance(icon = puddle_icon, icon_state = puddle_state)
+ puddle_overlay.color = mutcolor
+ tracked_overlay = puddle_overlay
+ owner.add_overlay(puddle_overlay)
+ transforming = FALSE
+ UpdateButtonIcon()
+ else
+ owner.cut_overlay(tracked_overlay)
+ var/obj/effect/puddle_effect = new puddle_from_effect(get_turf(owner), owner.dir)
+ puddle_effect.color = mutcolor
+ H.Stun(out_transformation_duration, ignore_canstun = TRUE)
+ sleep(out_transformation_duration)
+ REMOVE_TRAIT(H, TRAIT_PARALYSIS_L_ARM, SLIMEPUDDLE_TRAIT)
+ REMOVE_TRAIT(H, TRAIT_PARALYSIS_R_ARM, SLIMEPUDDLE_TRAIT)
+ REMOVE_TRAIT(H, TRAIT_MOBILITY_NOPICKUP, SLIMEPUDDLE_TRAIT)
+ REMOVE_TRAIT(H, TRAIT_MOBILITY_NOUSE, SLIMEPUDDLE_TRAIT)
+ REMOVE_TRAIT(H, TRAIT_SPRINT_LOCKED, SLIMEPUDDLE_TRAIT)
+ REMOVE_TRAIT(H, TRAIT_COMBAT_MODE_LOCKED, SLIMEPUDDLE_TRAIT)
+ REMOVE_TRAIT(H, TRAIT_MOBILITY_NOREST, SLIMEPUDDLE_TRAIT)
+ H.update_disabled_bodyparts(silent = TRUE)
+ H.remove_movespeed_modifier(/datum/movespeed_modifier/slime_puddle)
+ H.layer += 1 //go one layer back above!
+ DISABLE_BITFIELD(H.pass_flags, PASSMOB)
+ is_puddle = FALSE
+ if(squeak)
+ squeak.RemoveComponent()
+ owner.regenerate_icons()
+ transforming = FALSE
+ UpdateButtonIcon()
+ else
+ to_chat(owner, "You need to be standing up to do this!") //just assume they're a slime because it's such a weird edgecase to have it and not be one (it shouldn't even be possible)
///////////////////////////////////LUMINESCENTS//////////////////////////////////////////
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 8489ab0aac..7d7d420128 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -50,19 +50,21 @@ There are several things that need to be remembered:
//HAIR OVERLAY
/mob/living/carbon/human/update_hair()
- dna.species.handle_hair(src)
+ if(dna.species.should_render())
+ dna.species.handle_hair(src)
//used when putting/removing clothes that hide certain mutant body parts to just update those and not update the whole body.
/mob/living/carbon/human/proc/update_mutant_bodyparts()
- dna.species.handle_mutant_bodyparts(src)
-
+ if(dna.species.should_render())
+ dna.species.handle_mutant_bodyparts(src)
/mob/living/carbon/human/update_body(update_genitals = FALSE)
- remove_overlay(BODY_LAYER)
- dna.species.handle_body(src)
- ..()
- if(update_genitals)
- update_genitals()
+ if(dna.species.should_render())
+ remove_overlay(BODY_LAYER)
+ dna.species.handle_body(src)
+ ..()
+ if(update_genitals)
+ update_genitals()
/mob/living/carbon/human/update_fire()
..((fire_stacks > 3) ? "Standing" : "Generic_mob_burning")
@@ -71,381 +73,385 @@ There are several things that need to be remembered:
/* --------------------------------------- */
//For legacy support.
/mob/living/carbon/human/regenerate_icons()
-
- if(!..())
- icon_render_key = null //invalidate bodyparts cache
- update_body(TRUE)
- update_hair()
- update_inv_w_uniform()
- update_inv_wear_id()
- update_inv_gloves()
- update_inv_glasses()
- update_inv_ears()
- update_inv_shoes()
- update_inv_s_store()
- update_inv_wear_mask()
- update_inv_head()
- update_inv_belt()
- update_inv_back()
- update_inv_wear_suit()
- update_inv_pockets()
- update_inv_neck()
- update_transform()
- //mutations
- update_mutations_overlay()
- //damage overlays
- update_damage_overlays()
+ if(dna.species.should_render())
+ if(!..())
+ icon_render_key = null //invalidate bodyparts cache
+ update_body(TRUE)
+ update_hair()
+ update_inv_w_uniform()
+ update_inv_wear_id()
+ update_inv_gloves()
+ update_inv_glasses()
+ update_inv_ears()
+ update_inv_shoes()
+ update_inv_s_store()
+ update_inv_wear_mask()
+ update_inv_head()
+ update_inv_belt()
+ update_inv_back()
+ update_inv_wear_suit()
+ update_inv_pockets()
+ update_inv_neck()
+ update_transform()
+ //mutations
+ update_mutations_overlay()
+ //damage overlays
+ update_damage_overlays()
/* --------------------------------------- */
//vvvvvv UPDATE_INV PROCS vvvvvv
/mob/living/carbon/human/update_inv_w_uniform()
- remove_overlay(UNIFORM_LAYER)
+ if(dna.species.should_render())
+ remove_overlay(UNIFORM_LAYER)
- if(client && hud_used)
- var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM]
- inv.update_icon()
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM]
+ inv.update_icon()
- if(istype(w_uniform, /obj/item/clothing/under))
- var/obj/item/clothing/under/U = w_uniform
- U.screen_loc = ui_iclothing
- if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown)
- client.screen += w_uniform
- update_observer_view(w_uniform,1)
+ if(istype(w_uniform, /obj/item/clothing/under))
+ var/obj/item/clothing/under/U = w_uniform
+ U.screen_loc = ui_iclothing
+ if(client && hud_used && hud_used.hud_shown)
+ if(hud_used.inventory_shown)
+ client.screen += w_uniform
+ update_observer_view(w_uniform,1)
- if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT))
- return
+ if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT))
+ return
- var/target_overlay = U.icon_state
- if(U.adjusted == ALT_STYLE)
- target_overlay = "[target_overlay]_d"
+ var/target_overlay = U.icon_state
+ if(U.adjusted == ALT_STYLE)
+ target_overlay = "[target_overlay]_d"
- var/alt_worn = U.mob_overlay_icon || 'icons/mob/clothing/uniform.dmi'
- var/variant_flag = NONE
+ var/alt_worn = U.mob_overlay_icon || 'icons/mob/clothing/uniform.dmi'
+ var/variant_flag = NONE
- if((DIGITIGRADE in dna.species.species_traits) && U.mutantrace_variation & STYLE_DIGITIGRADE && !(U.mutantrace_variation & STYLE_NO_ANTHRO_ICON))
- alt_worn = U.anthro_mob_worn_overlay || 'icons/mob/clothing/uniform_digi.dmi'
- variant_flag |= STYLE_DIGITIGRADE
+ if((DIGITIGRADE in dna.species.species_traits) && U.mutantrace_variation & STYLE_DIGITIGRADE && !(U.mutantrace_variation & STYLE_NO_ANTHRO_ICON))
+ alt_worn = U.anthro_mob_worn_overlay || 'icons/mob/clothing/uniform_digi.dmi'
+ variant_flag |= STYLE_DIGITIGRADE
- var/mask
- if(dna.species.mutant_bodyparts["taur"])
- var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]]
- var/clip_flag = U.mutantrace_variation & T?.hide_legs
- if(clip_flag)
- variant_flag |= clip_flag
- mask = T.alpha_mask_state
+ var/mask
+ if(dna.species.mutant_bodyparts["taur"])
+ var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]]
+ var/clip_flag = U.mutantrace_variation & T?.hide_legs
+ if(clip_flag)
+ variant_flag |= clip_flag
+ mask = T.alpha_mask_state
- var/mutable_appearance/uniform_overlay
+ var/mutable_appearance/uniform_overlay
- var/gendered = (dna?.species.sexes && dna.features["body_model"] == FEMALE) ? U.fitted : NO_FEMALE_UNIFORM
- uniform_overlay = U.build_worn_icon( UNIFORM_LAYER, alt_worn, FALSE, gendered, target_overlay, variant_flag, FALSE, mask)
+ var/gendered = (dna?.species.sexes && dna.features["body_model"] == FEMALE) ? U.fitted : NO_FEMALE_UNIFORM
+ uniform_overlay = U.build_worn_icon( UNIFORM_LAYER, alt_worn, FALSE, gendered, target_overlay, variant_flag, FALSE, mask)
- if(OFFSET_UNIFORM in dna.species.offset_features)
- uniform_overlay.pixel_x += dna.species.offset_features[OFFSET_UNIFORM][1]
- uniform_overlay.pixel_y += dna.species.offset_features[OFFSET_UNIFORM][2]
- overlays_standing[UNIFORM_LAYER] = uniform_overlay
-
- apply_overlay(UNIFORM_LAYER)
- update_mutant_bodyparts()
+ if(OFFSET_UNIFORM in dna.species.offset_features)
+ uniform_overlay.pixel_x += dna.species.offset_features[OFFSET_UNIFORM][1]
+ uniform_overlay.pixel_y += dna.species.offset_features[OFFSET_UNIFORM][2]
+ overlays_standing[UNIFORM_LAYER] = uniform_overlay
+ apply_overlay(UNIFORM_LAYER)
+ update_mutant_bodyparts()
/mob/living/carbon/human/update_inv_wear_id()
- remove_overlay(ID_LAYER)
+ if(dna.species.should_render())
+ remove_overlay(ID_LAYER)
- if(client && hud_used)
- var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID]
- inv.update_icon()
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID]
+ inv.update_icon()
- var/mutable_appearance/id_overlay = overlays_standing[ID_LAYER]
+ var/mutable_appearance/id_overlay = overlays_standing[ID_LAYER]
- if(wear_id)
- wear_id.screen_loc = ui_id
- if(client && hud_used && hud_used.hud_shown)
- client.screen += wear_id
- update_observer_view(wear_id)
+ if(wear_id)
+ wear_id.screen_loc = ui_id
+ if(client && hud_used && hud_used.hud_shown)
+ client.screen += wear_id
+ update_observer_view(wear_id)
- //TODO: add an icon file for ID slot stuff, so it's less snowflakey
- id_overlay = wear_id.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', override_state = wear_id.item_state)
- if(OFFSET_ID in dna.species.offset_features)
- id_overlay.pixel_x += dna.species.offset_features[OFFSET_ID][1]
- id_overlay.pixel_y += dna.species.offset_features[OFFSET_ID][2]
- overlays_standing[ID_LAYER] = id_overlay
- apply_overlay(ID_LAYER)
+ //TODO: add an icon file for ID slot stuff, so it's less snowflakey
+ id_overlay = wear_id.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', override_state = wear_id.item_state)
+ if(OFFSET_ID in dna.species.offset_features)
+ id_overlay.pixel_x += dna.species.offset_features[OFFSET_ID][1]
+ id_overlay.pixel_y += dna.species.offset_features[OFFSET_ID][2]
+ overlays_standing[ID_LAYER] = id_overlay
+ apply_overlay(ID_LAYER)
/mob/living/carbon/human/update_inv_gloves()
- remove_overlay(GLOVES_LAYER)
+ if(dna.species.should_render())
+ remove_overlay(GLOVES_LAYER)
- if(client && hud_used && hud_used.inv_slots[SLOT_GLOVES])
- var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES]
- inv.update_icon()
+ if(client && hud_used && hud_used.inv_slots[SLOT_GLOVES])
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES]
+ inv.update_icon()
- if(!gloves && bloody_hands)
- var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER, color = blood_DNA_to_color())
- if(get_num_arms(FALSE) < 2)
- if(has_left_hand(FALSE))
- bloody_overlay.icon_state = "bloodyhands_left"
- else if(has_right_hand(FALSE))
- bloody_overlay.icon_state = "bloodyhands_right"
+ if(!gloves && bloody_hands)
+ var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER, color = blood_DNA_to_color())
+ if(get_num_arms(FALSE) < 2)
+ if(has_left_hand(FALSE))
+ bloody_overlay.icon_state = "bloodyhands_left"
+ else if(has_right_hand(FALSE))
+ bloody_overlay.icon_state = "bloodyhands_right"
- overlays_standing[GLOVES_LAYER] = bloody_overlay
+ overlays_standing[GLOVES_LAYER] = bloody_overlay
- var/mutable_appearance/gloves_overlay = overlays_standing[GLOVES_LAYER]
- if(gloves)
- gloves.screen_loc = ui_gloves
- if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown)
- client.screen += gloves
- update_observer_view(gloves,1)
- overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/clothing/hands.dmi')
- gloves_overlay = overlays_standing[GLOVES_LAYER]
- if(OFFSET_GLOVES in dna.species.offset_features)
- gloves_overlay.pixel_x += dna.species.offset_features[OFFSET_GLOVES][1]
- gloves_overlay.pixel_y += dna.species.offset_features[OFFSET_GLOVES][2]
- overlays_standing[GLOVES_LAYER] = gloves_overlay
- apply_overlay(GLOVES_LAYER)
+ var/mutable_appearance/gloves_overlay = overlays_standing[GLOVES_LAYER]
+ if(gloves)
+ gloves.screen_loc = ui_gloves
+ if(client && hud_used && hud_used.hud_shown)
+ if(hud_used.inventory_shown)
+ client.screen += gloves
+ update_observer_view(gloves,1)
+ overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/clothing/hands.dmi')
+ gloves_overlay = overlays_standing[GLOVES_LAYER]
+ if(OFFSET_GLOVES in dna.species.offset_features)
+ gloves_overlay.pixel_x += dna.species.offset_features[OFFSET_GLOVES][1]
+ gloves_overlay.pixel_y += dna.species.offset_features[OFFSET_GLOVES][2]
+ overlays_standing[GLOVES_LAYER] = gloves_overlay
+ apply_overlay(GLOVES_LAYER)
/mob/living/carbon/human/update_inv_glasses()
- remove_overlay(GLASSES_LAYER)
+ if(dna.species.should_render())
+ remove_overlay(GLASSES_LAYER)
- if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated
- return
-
- if(client && hud_used)
- var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES]
- inv.update_icon()
-
- if(glasses)
- glasses.screen_loc = ui_glasses //...draw the item in the inventory screen
- if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown) //if the inventory is open ...
- client.screen += glasses //Either way, add the item to the HUD
- update_observer_view(glasses,1)
- if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES)))
- overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/clothing/eyes.dmi', override_state = glasses.icon_state)
- var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER]
- if(glasses_overlay)
- if(OFFSET_GLASSES in dna.species.offset_features)
- glasses_overlay.pixel_x += dna.species.offset_features[OFFSET_GLASSES][1]
- glasses_overlay.pixel_y += dna.species.offset_features[OFFSET_GLASSES][2]
- overlays_standing[GLASSES_LAYER] = glasses_overlay
- apply_overlay(GLASSES_LAYER)
-
-
-/mob/living/carbon/human/update_inv_ears()
- remove_overlay(EARS_LAYER)
-
- if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated
- return
-
- if(client && hud_used)
- var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS]
- inv.update_icon()
-
- if(ears)
- ears.screen_loc = ui_ears //move the item to the appropriate screen loc
- if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown) //if the inventory is open
- client.screen += ears //add it to the client's screen
- update_observer_view(ears,1)
-
- overlays_standing[EARS_LAYER] = ears.build_worn_icon(default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi')
- var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER]
- if(OFFSET_EARS in dna.species.offset_features)
- ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1]
- ears_overlay.pixel_y += dna.species.offset_features[OFFSET_EARS][2]
- overlays_standing[EARS_LAYER] = ears_overlay
- apply_overlay(EARS_LAYER)
-
-
-/mob/living/carbon/human/update_inv_shoes()
- remove_overlay(SHOES_LAYER)
-
- if(get_num_legs(FALSE) <2)
- return
-
- if(client && hud_used)
- var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES]
- inv.update_icon()
-
- if(dna.species.mutant_bodyparts["taur"])
- var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]]
- if(T?.hide_legs) //If only they actually made shoes unwearable. Please don't making cosmetics, guys.
+ if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated
return
- if(shoes)
- var/obj/item/clothing/shoes/S = shoes
- shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc
- if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown) //if the inventory is open
- client.screen += shoes //add it to client's screen
- update_observer_view(shoes,1)
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES]
+ inv.update_icon()
- var/alt_icon = S.mob_overlay_icon || 'icons/mob/clothing/feet.dmi'
- var/variation_flag = NONE
- if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE && !(S.mutantrace_variation & STYLE_NO_ANTHRO_ICON))
- alt_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/feet_digi.dmi'
- variation_flag |= STYLE_DIGITIGRADE
+ if(glasses)
+ glasses.screen_loc = ui_glasses //...draw the item in the inventory screen
+ if(client && hud_used && hud_used.hud_shown)
+ if(hud_used.inventory_shown) //if the inventory is open ...
+ client.screen += glasses //Either way, add the item to the HUD
+ update_observer_view(glasses,1)
+ if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES)))
+ overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/clothing/eyes.dmi', override_state = glasses.icon_state)
+ var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER]
+ if(glasses_overlay)
+ if(OFFSET_GLASSES in dna.species.offset_features)
+ glasses_overlay.pixel_x += dna.species.offset_features[OFFSET_GLASSES][1]
+ glasses_overlay.pixel_y += dna.species.offset_features[OFFSET_GLASSES][2]
+ overlays_standing[GLASSES_LAYER] = glasses_overlay
+ apply_overlay(GLASSES_LAYER)
- overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(SHOES_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, S.icon_state, variation_flag, FALSE)
- var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER]
- if(OFFSET_SHOES in dna.species.offset_features)
- shoes_overlay.pixel_x += dna.species.offset_features[OFFSET_SHOES][1]
- shoes_overlay.pixel_y += dna.species.offset_features[OFFSET_SHOES][2]
- overlays_standing[SHOES_LAYER] = shoes_overlay
- apply_overlay(SHOES_LAYER)
+/mob/living/carbon/human/update_inv_ears()
+ if(dna.species.should_render())
+ remove_overlay(EARS_LAYER)
-/mob/living/carbon/human/update_inv_s_store()
- remove_overlay(SUIT_STORE_LAYER)
+ if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated
+ return
- if(client && hud_used)
- var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE]
- inv.update_icon()
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS]
+ inv.update_icon()
- if(s_store)
- s_store.screen_loc = ui_sstore1
- if(client && hud_used && hud_used.hud_shown)
- client.screen += s_store
- update_observer_view(s_store)
- var/t_state = s_store.item_state
- if(!t_state)
- t_state = s_store.icon_state
- overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.mob_overlay_icon) ? s_store.mob_overlay_icon : 'icons/mob/clothing/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER)
- var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_STORE_LAYER]
- if(OFFSET_S_STORE in dna.species.offset_features)
- s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1]
- s_store_overlay.pixel_y += dna.species.offset_features[OFFSET_S_STORE][2]
- overlays_standing[SUIT_STORE_LAYER] = s_store_overlay
- apply_overlay(SUIT_STORE_LAYER)
+ if(ears)
+ ears.screen_loc = ui_ears //move the item to the appropriate screen loc
+ if(client && hud_used && hud_used.hud_shown)
+ if(hud_used.inventory_shown) //if the inventory is open
+ client.screen += ears //add it to the client's screen
+ update_observer_view(ears,1)
+ overlays_standing[EARS_LAYER] = ears.build_worn_icon(default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi')
+ var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER]
+ if(OFFSET_EARS in dna.species.offset_features)
+ ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1]
+ ears_overlay.pixel_y += dna.species.offset_features[OFFSET_EARS][2]
+ overlays_standing[EARS_LAYER] = ears_overlay
+ apply_overlay(EARS_LAYER)
-/mob/living/carbon/human/update_inv_head()
- remove_overlay(HEAD_LAYER)
+/mob/living/carbon/human/update_inv_shoes()
+ if(dna.species.should_render())
+ remove_overlay(SHOES_LAYER)
- if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated
- return
+ if(get_num_legs(FALSE) <2)
+ return
- if(client && hud_used)
- var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD]
- inv.update_icon()
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES]
+ inv.update_icon()
- if(head)
- head.screen_loc = ui_head
- if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown)
- client.screen += head
- update_observer_view(head,1)
- remove_overlay(HEAD_LAYER)
- var/obj/item/clothing/head/H = head
- var/alt_icon = H.mob_overlay_icon || 'icons/mob/clothing/head.dmi'
- var/muzzled = FALSE
- var/variation_flag = NONE
- if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None")
- muzzled = TRUE
- else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None")
- muzzled = TRUE
- if(muzzled && H.mutantrace_variation & STYLE_MUZZLE && !(H.mutantrace_variation & STYLE_NO_ANTHRO_ICON))
- alt_icon = H.anthro_mob_worn_overlay || 'icons/mob/clothing/head_muzzled.dmi'
- variation_flag |= STYLE_MUZZLE
-
- overlays_standing[HEAD_LAYER] = H.build_worn_icon(HEAD_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, H.icon_state, variation_flag, FALSE)
- var/mutable_appearance/head_overlay = overlays_standing[HEAD_LAYER]
-
- if(OFFSET_HEAD in dna.species.offset_features)
- head_overlay.pixel_x += dna.species.offset_features[OFFSET_HEAD][1]
- head_overlay.pixel_y += dna.species.offset_features[OFFSET_HEAD][2]
- overlays_standing[HEAD_LAYER] = head_overlay
- apply_overlay(HEAD_LAYER)
- update_mutant_bodyparts()
-
-/mob/living/carbon/human/update_inv_belt()
- remove_overlay(BELT_LAYER)
-
- if(client && hud_used)
- var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT]
- inv.update_icon()
-
- if(belt)
- belt.screen_loc = ui_belt
- if(client && hud_used && hud_used.hud_shown)
- client.screen += belt
- update_observer_view(belt)
-
- overlays_standing[BELT_LAYER] = belt.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = 'icons/mob/clothing/belt.dmi')
- var/mutable_appearance/belt_overlay = overlays_standing[BELT_LAYER]
- if(OFFSET_BELT in dna.species.offset_features)
- belt_overlay.pixel_x += dna.species.offset_features[OFFSET_BELT][1]
- belt_overlay.pixel_y += dna.species.offset_features[OFFSET_BELT][2]
- overlays_standing[BELT_LAYER] = belt_overlay
- apply_overlay(BELT_LAYER)
-
-
-/mob/living/carbon/human/update_inv_wear_suit()
- remove_overlay(SUIT_LAYER)
-
- if(client && hud_used)
- var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT]
- inv.update_icon()
-
- if(wear_suit)
- var/obj/item/clothing/suit/S = wear_suit
- wear_suit.screen_loc = ui_oclothing
- if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown)
- client.screen += wear_suit
- update_observer_view(wear_suit,1)
-
- var/worn_icon = wear_suit.mob_overlay_icon || 'icons/mob/clothing/suit.dmi'
- var/worn_state = wear_suit.icon_state
- var/center = FALSE
- var/dimension_x = 32
- var/dimension_y = 32
- var/variation_flag = NONE
- var/datum/sprite_accessory/taur/T
if(dna.species.mutant_bodyparts["taur"])
- T = GLOB.taur_list[dna.features["taur"]]
+ var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]]
+ if(T?.hide_legs) //If only they actually made shoes unwearable. Please don't making cosmetics, guys.
+ return
- if(S.mutantrace_variation)
+ if(shoes)
+ var/obj/item/clothing/shoes/S = shoes
+ shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc
+ if(client && hud_used && hud_used.hud_shown)
+ if(hud_used.inventory_shown) //if the inventory is open
+ client.screen += shoes //add it to client's screen
+ update_observer_view(shoes,1)
- if(T?.taur_mode)
- var/init_worn_icon = worn_icon
- variation_flag |= S.mutantrace_variation & T.taur_mode || S.mutantrace_variation & T.alt_taur_mode
- switch(variation_flag)
- if(STYLE_HOOF_TAURIC)
- worn_icon = 'icons/mob/clothing/taur_hooved.dmi'
- if(STYLE_SNEK_TAURIC)
- worn_icon = 'icons/mob/clothing/taur_naga.dmi'
- if(STYLE_PAW_TAURIC)
- worn_icon = 'icons/mob/clothing/taur_canine.dmi'
- if(worn_icon != init_worn_icon) //worn icon sprite was changed, taur offsets will have to be applied.
- if(S.taur_mob_worn_overlay) //not going to make several new variables for all taur types. Nope.
- var/static/list/icon_to_state = list('icons/mob/clothing/taur_hooved.dmi' = "_hooved", 'icons/mob/clothing/taur_naga.dmi' = "_naga", 'icons/mob/clothing/taur_canine.dmi' = "_paws")
- worn_state += icon_to_state[worn_icon]
- worn_icon = S.taur_mob_worn_overlay
- center = T.center
- dimension_x = T.dimension_x
- dimension_y = T.dimension_y
-
- else if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE && !(S.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) //not a taur, but digitigrade legs.
- worn_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/suit_digi.dmi'
+ var/alt_icon = S.mob_overlay_icon || 'icons/mob/clothing/feet.dmi'
+ var/variation_flag = NONE
+ if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE && !(S.mutantrace_variation & STYLE_NO_ANTHRO_ICON))
+ alt_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/feet_digi.dmi'
variation_flag |= STYLE_DIGITIGRADE
- overlays_standing[SUIT_LAYER] = S.build_worn_icon(SUIT_LAYER, worn_icon, FALSE, NO_FEMALE_UNIFORM, worn_state, variation_flag, FALSE)
- var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER]
- if(OFFSET_SUIT in dna.species.offset_features)
- suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1]
- suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2]
- if(center)
- suit_overlay = center_image(suit_overlay, dimension_x, dimension_y)
- overlays_standing[SUIT_LAYER] = suit_overlay
- update_hair()
- update_mutant_bodyparts()
+ overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(SHOES_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, S.icon_state, variation_flag, FALSE)
+ var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER]
+ if(OFFSET_SHOES in dna.species.offset_features)
+ shoes_overlay.pixel_x += dna.species.offset_features[OFFSET_SHOES][1]
+ shoes_overlay.pixel_y += dna.species.offset_features[OFFSET_SHOES][2]
+ overlays_standing[SHOES_LAYER] = shoes_overlay
+ apply_overlay(SHOES_LAYER)
- apply_overlay(SUIT_LAYER)
+/mob/living/carbon/human/update_inv_s_store()
+ if(dna.species.should_render())
+ remove_overlay(SUIT_STORE_LAYER)
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE]
+ inv.update_icon()
+
+ if(s_store)
+ s_store.screen_loc = ui_sstore1
+ if(client && hud_used && hud_used.hud_shown)
+ client.screen += s_store
+ update_observer_view(s_store)
+ var/t_state = s_store.item_state
+ if(!t_state)
+ t_state = s_store.icon_state
+ overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.mob_overlay_icon) ? s_store.mob_overlay_icon : 'icons/mob/clothing/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER)
+ var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_STORE_LAYER]
+ if(OFFSET_S_STORE in dna.species.offset_features)
+ s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1]
+ s_store_overlay.pixel_y += dna.species.offset_features[OFFSET_S_STORE][2]
+ overlays_standing[SUIT_STORE_LAYER] = s_store_overlay
+ apply_overlay(SUIT_STORE_LAYER)
+
+/mob/living/carbon/human/update_inv_head()
+ if(dna.species.should_render())
+ remove_overlay(HEAD_LAYER)
+
+ if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated
+ return
+
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD]
+ inv.update_icon()
+
+ if(head)
+ head.screen_loc = ui_head
+ if(client && hud_used && hud_used.hud_shown)
+ if(hud_used.inventory_shown)
+ client.screen += head
+ update_observer_view(head,1)
+ remove_overlay(HEAD_LAYER)
+ var/obj/item/clothing/head/H = head
+ var/alt_icon = H.mob_overlay_icon || 'icons/mob/clothing/head.dmi'
+ var/muzzled = FALSE
+ var/variation_flag = NONE
+ if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None")
+ muzzled = TRUE
+ else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None")
+ muzzled = TRUE
+ if(muzzled && H.mutantrace_variation & STYLE_MUZZLE && !(H.mutantrace_variation & STYLE_NO_ANTHRO_ICON))
+ alt_icon = H.anthro_mob_worn_overlay || 'icons/mob/clothing/head_muzzled.dmi'
+ variation_flag |= STYLE_MUZZLE
+
+ overlays_standing[HEAD_LAYER] = H.build_worn_icon(HEAD_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, H.icon_state, variation_flag, FALSE)
+ var/mutable_appearance/head_overlay = overlays_standing[HEAD_LAYER]
+
+ if(OFFSET_HEAD in dna.species.offset_features)
+ head_overlay.pixel_x += dna.species.offset_features[OFFSET_HEAD][1]
+ head_overlay.pixel_y += dna.species.offset_features[OFFSET_HEAD][2]
+ overlays_standing[HEAD_LAYER] = head_overlay
+ apply_overlay(HEAD_LAYER)
+ update_mutant_bodyparts()
+
+/mob/living/carbon/human/update_inv_belt()
+ if(dna.species.should_render())
+ remove_overlay(BELT_LAYER)
+
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT]
+ inv.update_icon()
+
+ if(belt)
+ belt.screen_loc = ui_belt
+ if(client && hud_used && hud_used.hud_shown)
+ client.screen += belt
+ update_observer_view(belt)
+
+ overlays_standing[BELT_LAYER] = belt.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = 'icons/mob/clothing/belt.dmi')
+ var/mutable_appearance/belt_overlay = overlays_standing[BELT_LAYER]
+ if(OFFSET_BELT in dna.species.offset_features)
+ belt_overlay.pixel_x += dna.species.offset_features[OFFSET_BELT][1]
+ belt_overlay.pixel_y += dna.species.offset_features[OFFSET_BELT][2]
+ overlays_standing[BELT_LAYER] = belt_overlay
+ apply_overlay(BELT_LAYER)
+
+/mob/living/carbon/human/update_inv_wear_suit()
+ if(dna.species.should_render())
+ remove_overlay(SUIT_LAYER)
+
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT]
+ inv.update_icon()
+
+ if(wear_suit)
+ var/obj/item/clothing/suit/S = wear_suit
+ wear_suit.screen_loc = ui_oclothing
+ if(client && hud_used && hud_used.hud_shown)
+ if(hud_used.inventory_shown)
+ client.screen += wear_suit
+ update_observer_view(wear_suit,1)
+
+ var/worn_icon = wear_suit.mob_overlay_icon || 'icons/mob/clothing/suit.dmi'
+ var/worn_state = wear_suit.icon_state
+ var/center = FALSE
+ var/dimension_x = 32
+ var/dimension_y = 32
+ var/variation_flag = NONE
+ var/datum/sprite_accessory/taur/T
+ if(dna.species.mutant_bodyparts["taur"])
+ T = GLOB.taur_list[dna.features["taur"]]
+
+ if(S.mutantrace_variation)
+
+ if(T?.taur_mode)
+ var/init_worn_icon = worn_icon
+ variation_flag |= S.mutantrace_variation & T.taur_mode || S.mutantrace_variation & T.alt_taur_mode
+ switch(variation_flag)
+ if(STYLE_HOOF_TAURIC)
+ worn_icon = 'icons/mob/clothing/taur_hooved.dmi'
+ if(STYLE_SNEK_TAURIC)
+ worn_icon = 'icons/mob/clothing/taur_naga.dmi'
+ if(STYLE_PAW_TAURIC)
+ worn_icon = 'icons/mob/clothing/taur_canine.dmi'
+ if(worn_icon != init_worn_icon) //worn icon sprite was changed, taur offsets will have to be applied.
+ if(S.taur_mob_worn_overlay) //not going to make several new variables for all taur types. Nope.
+ var/static/list/icon_to_state = list('icons/mob/clothing/taur_hooved.dmi' = "_hooved", 'icons/mob/clothing/taur_naga.dmi' = "_naga", 'icons/mob/clothing/taur_canine.dmi' = "_paws")
+ worn_state += icon_to_state[worn_icon]
+ worn_icon = S.taur_mob_worn_overlay
+ center = T.center
+ dimension_x = T.dimension_x
+ dimension_y = T.dimension_y
+
+ else if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE && !(S.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) //not a taur, but digitigrade legs.
+ worn_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/suit_digi.dmi'
+ variation_flag |= STYLE_DIGITIGRADE
+
+ overlays_standing[SUIT_LAYER] = S.build_worn_icon(SUIT_LAYER, worn_icon, FALSE, NO_FEMALE_UNIFORM, worn_state, variation_flag, FALSE)
+ var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER]
+ if(OFFSET_SUIT in dna.species.offset_features)
+ suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1]
+ suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2]
+ if(center)
+ suit_overlay = center_image(suit_overlay, dimension_x, dimension_y)
+ overlays_standing[SUIT_LAYER] = suit_overlay
+ update_hair()
+ update_mutant_bodyparts()
+
+ apply_overlay(SUIT_LAYER)
/mob/living/carbon/human/update_inv_pockets()
if(client && hud_used)
@@ -471,55 +477,57 @@ There are several things that need to be remembered:
/mob/living/carbon/human/update_inv_wear_mask()
- remove_overlay(FACEMASK_LAYER)
-
- if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated
- return
-
- if(client && hud_used)
- var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK]
- inv.update_icon()
-
- if(wear_mask)
- wear_mask.screen_loc = ui_mask
- if(client && hud_used && hud_used.hud_shown)
- if(hud_used.inventory_shown)
- client.screen += wear_mask
- update_observer_view(wear_mask,1)
- var/obj/item/clothing/mask/M = wear_mask
+ if(dna.species.should_render())
remove_overlay(FACEMASK_LAYER)
- var/alt_icon = M.mob_overlay_icon || 'icons/mob/clothing/mask.dmi'
- var/muzzled = FALSE
- var/variation_flag = NONE
- if(head && (head.flags_inv & HIDEMASK))
+
+ if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated
return
- if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None")
- muzzled = TRUE
- else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None")
- muzzled = TRUE
- if(muzzled && M.mutantrace_variation & STYLE_MUZZLE && !(M.mutantrace_variation & STYLE_NO_ANTHRO_ICON))
- alt_icon = M.anthro_mob_worn_overlay || 'icons/mob/clothing/mask_muzzled.dmi'
- variation_flag |= STYLE_MUZZLE
- var/mutable_appearance/mask_overlay = M.build_worn_icon(FACEMASK_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, wear_mask.icon_state, variation_flag, FALSE)
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK]
+ inv.update_icon()
- if(OFFSET_FACEMASK in dna.species.offset_features)
- mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1]
- mask_overlay.pixel_y += dna.species.offset_features[OFFSET_FACEMASK][2]
- overlays_standing[FACEMASK_LAYER] = mask_overlay
- apply_overlay(FACEMASK_LAYER)
- update_mutant_bodyparts() //e.g. upgate needed because mask now hides lizard snout
+ if(wear_mask)
+ wear_mask.screen_loc = ui_mask
+ if(client && hud_used && hud_used.hud_shown)
+ if(hud_used.inventory_shown)
+ client.screen += wear_mask
+ update_observer_view(wear_mask,1)
+ var/obj/item/clothing/mask/M = wear_mask
+ remove_overlay(FACEMASK_LAYER)
+ var/alt_icon = M.mob_overlay_icon || 'icons/mob/clothing/mask.dmi'
+ var/muzzled = FALSE
+ var/variation_flag = NONE
+ if(head && (head.flags_inv & HIDEMASK))
+ return
+ if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None")
+ muzzled = TRUE
+ else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None")
+ muzzled = TRUE
+ if(muzzled && M.mutantrace_variation & STYLE_MUZZLE && !(M.mutantrace_variation & STYLE_NO_ANTHRO_ICON))
+ alt_icon = M.anthro_mob_worn_overlay || 'icons/mob/clothing/mask_muzzled.dmi'
+ variation_flag |= STYLE_MUZZLE
+
+ var/mutable_appearance/mask_overlay = M.build_worn_icon(FACEMASK_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, wear_mask.icon_state, variation_flag, FALSE)
+
+ if(OFFSET_FACEMASK in dna.species.offset_features)
+ mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1]
+ mask_overlay.pixel_y += dna.species.offset_features[OFFSET_FACEMASK][2]
+ overlays_standing[FACEMASK_LAYER] = mask_overlay
+ apply_overlay(FACEMASK_LAYER)
+ update_mutant_bodyparts() //e.g. upgate needed because mask now hides lizard snout
/mob/living/carbon/human/update_inv_back()
- ..()
- var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER]
- if(back_overlay)
- remove_overlay(BACK_LAYER)
- if(OFFSET_BACK in dna.species.offset_features)
- back_overlay.pixel_x += dna.species.offset_features[OFFSET_BACK][1]
- back_overlay.pixel_y += dna.species.offset_features[OFFSET_BACK][2]
- overlays_standing[BACK_LAYER] = back_overlay
- apply_overlay(BACK_LAYER)
+ if(dna.species.should_render())
+ ..()
+ var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER]
+ if(back_overlay)
+ remove_overlay(BACK_LAYER)
+ if(OFFSET_BACK in dna.species.offset_features)
+ back_overlay.pixel_x += dna.species.offset_features[OFFSET_BACK][1]
+ back_overlay.pixel_y += dna.species.offset_features[OFFSET_BACK][2]
+ overlays_standing[BACK_LAYER] = back_overlay
+ apply_overlay(BACK_LAYER)
/proc/wear_alpha_masked_version(state, icon, layer, female, alpha_mask)
var/mask = "-[alpha_mask]"
@@ -710,8 +718,6 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if
..()
update_hair()
-
-
/mob/living/carbon/human/proc/update_observer_view(obj/item/I, inventory)
if(observers && observers.len)
for(var/M in observers)
@@ -729,15 +735,17 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if
// Only renders the head of the human
/mob/living/carbon/human/proc/update_body_parts_head_only()
- if (!dna)
+ if(!dna)
return
- if (!dna.species)
+ if(!dna.species)
+ return
+
+ if(dna.species.should_render())
return
var/obj/item/bodypart/HD = get_bodypart("head")
-
- if (!istype(HD))
+ if(!istype(HD))
return
HD.update_limb()
@@ -748,7 +756,7 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if
if(HD && !(HAS_TRAIT(src, TRAIT_HUSK)))
// lipstick
if(lip_style && (LIPS in dna.species.species_traits))
- var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[lip_style]", -BODY_LAYER)
+ var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/lips.dmi', "lips_[lip_style]", -BODY_LAYER)
lip_overlay.color = lip_color
if(OFFSET_LIPS in dna.species.offset_features)
lip_overlay.pixel_x += dna.species.offset_features[OFFSET_LIPS][1]
@@ -759,10 +767,17 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if
if(!(NOEYES in dna.species.species_traits))
var/has_eyes = getorganslot(ORGAN_SLOT_EYES)
if(!has_eyes)
- add_overlay(mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER))
+ add_overlay(mutable_appearance('icons/mob/eyes.dmi', "eyes_missing", -BODY_LAYER))
else
- var/mutable_appearance/left_eye = mutable_appearance('icons/mob/human_face.dmi', "left_eye", -BODY_LAYER)
- var/mutable_appearance/right_eye = mutable_appearance('icons/mob/human_face.dmi', "right_eye", -BODY_LAYER)
+ var/left_state = DEFAULT_LEFT_EYE_STATE
+ var/right_state = DEFAULT_RIGHT_EYE_STATE
+ if(dna.species)
+ var/eye_type = dna.species.eye_type
+ if(GLOB.eye_types[eye_type])
+ left_state = eye_type + "_left_eye"
+ right_state = eye_type + "_right_eye"
+ var/mutable_appearance/left_eye = mutable_appearance('icons/mob/eyes.dmi', left_state, -BODY_LAYER)
+ var/mutable_appearance/right_eye = mutable_appearance('icons/mob/eyes.dmi', right_state, -BODY_LAYER)
if((EYECOLOR in dna.species.species_traits) && has_eyes)
left_eye.color = "#" + left_eye_color
right_eye.color = "#" + right_eye_color
diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm
index 1e00815f24..bfe04c8622 100644
--- a/code/modules/mob/living/carbon/monkey/update_icons.dm
+++ b/code/modules/mob/living/carbon/monkey/update_icons.dm
@@ -34,7 +34,7 @@
hair_hidden = 1
if(!hair_hidden)
if(!getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain
- overlays_standing[HAIR_LAYER] = mutable_appearance('icons/mob/human_face.dmi', "debrained", -HAIR_LAYER)
+ overlays_standing[HAIR_LAYER] = mutable_appearance('icons/mob/human_parts.dmi', "debrained", -HAIR_LAYER)
apply_overlay(HAIR_LAYER)
diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm
index 2493509e16..8e8b94463b 100644
--- a/code/modules/mob/living/living_active_block.dm
+++ b/code/modules/mob/living/living_active_block.dm
@@ -231,6 +231,7 @@
active_block_do_stamina_damage(owner, object, stamina_cost, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return)
block_return[BLOCK_RETURN_ACTIVE_BLOCK_DAMAGE_MITIGATED] = damage - final_damage
block_return[BLOCK_RETURN_SET_DAMAGE_TO] = final_damage
+ block_return[BLOCK_RETURN_MITIGATION_PERCENT] = clamp(1 - (final_damage / damage), 0, 1)
. = BLOCK_SHOULD_CHANGE_DAMAGE
if((final_damage <= 0) || (damage <= 0))
. |= BLOCK_SUCCESS //full block
diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
index 654a979445..92de711c27 100644
--- a/code/modules/mob/living/living_mobility.dm
+++ b/code/modules/mob/living/living_mobility.dm
@@ -5,12 +5,15 @@
RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOMOVE), .proc/update_mobility)
RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOPICKUP), .proc/update_mobility)
RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOUSE), .proc/update_mobility)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOREST), .proc/update_mobility)
//Stuff like mobility flag updates, resting updates, etc.
//Force-set resting variable, without needing to resist/etc.
/mob/living/proc/set_resting(new_resting, silent = FALSE, updating = TRUE)
if(new_resting != resting)
+ if(resting && HAS_TRAIT(src, TRAIT_MOBILITY_NOREST)) //forcibly block resting from all sources - BE CAREFUL WITH THIS TRAIT
+ return
resting = new_resting
if(!silent)
to_chat(src, "You are now [resting? "resting" : "getting up"].")
@@ -87,7 +90,7 @@
var/canstand_involuntary = conscious && !stat_softcrit && !knockdown && !chokehold && !paralyze && (ignore_legs || has_legs) && !(buckled && buckled.buckle_lying) && !(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
var/canstand = canstand_involuntary && !resting
- var/should_be_lying = !canstand
+ var/should_be_lying = !canstand && !HAS_TRAIT(src, TRAIT_MOBILITY_NOREST)
if(buckled)
if(buckled.buckle_lying != -1)
should_be_lying = buckled.buckle_lying
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 954e968bd7..ae045dbd26 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -22,7 +22,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
icon_state = "magicbase"
icon_living = "magicbase"
icon_dead = "magicbase"
- speed = 0
+ speed = -0.5
blood_volume = 0
a_intent = INTENT_HARM
stop_automated_movement = 1
@@ -511,7 +511,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
var/used_message = "All the cards seem to be blank now."
var/failure_message = "..And draw a card! It's...blank? Maybe you should try again later."
var/ling_failure = "The deck refuses to respond to a souless creature such as you."
- var/list/possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
+ var/list/possible_guardians = list("Assassin", "Chaos", "Gravitokinetic", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
var/random = TRUE
var/allowmultiple = FALSE
var/allowling = TRUE
@@ -559,6 +559,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
if("Chaos")
pickedtype = /mob/living/simple_animal/hostile/guardian/fire
+ if("Gravitokinetic")
+ pickedtype = /mob/living/simple_animal/hostile/guardian/gravitokinetic
+
if("Standard")
pickedtype = /mob/living/simple_animal/hostile/guardian/punch
@@ -615,10 +618,10 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
random = FALSE
/obj/item/guardiancreator/choose/dextrous
- possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
+ possible_guardians = list("Assassin", "Chaos", "Gravitokinetic", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
/obj/item/guardiancreator/choose/wizard
- possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard")
+ possible_guardians = list("Assassin", "Chaos", "Gravitokinetic", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard")
allowmultiple = TRUE
/obj/item/guardiancreator/tech
@@ -634,7 +637,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
ling_failure = "The holoparasites recoil in horror. They want nothing to do with a creature like you."
/obj/item/guardiancreator/tech/choose/traitor
- possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
+ possible_guardians = list("Assassin", "Chaos", "Gravitokinetic", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
allowling = FALSE
/obj/item/guardiancreator/tech/choose/traitor/check_uplink_validity()
@@ -644,10 +647,10 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
random = FALSE
/obj/item/guardiancreator/tech/choose/dextrous
- possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
+ possible_guardians = list("Assassin", "Chaos", "Gravitokinetic", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
/obj/item/guardiancreator/tech/choose/nukie // lacks support and protector as encouraging nukies to play turtle isnt fun and dextrous is epic
- possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Ranged", "Standard")
+ possible_guardians = list("Assassin", "Chaos", "Gravitokinetic", "Charger", "Dextrous", "Explosive", "Lightning", "Ranged", "Standard")
/obj/item/guardiancreator/tech/choose/nukie/check_uplink_validity()
return !used
@@ -666,6 +669,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
Explosive: High damage resist and medium power attack that may explosively teleport targets. Can turn any object, including objects too large to pick up, into a bomb, dealing explosive damage to the next person to touch it. The object will return to normal after the trap is triggered or after a delay.
+ Gravitokinetic: Attacks will apply crushing gravity to the target. Can target the ground as well to slow targets advancing on you, but this will affect the user.
+
Lightning: Attacks apply lightning chains to targets. Has a lightning chain to the user. Lightning chains shock everything near them, doing constant damage.
Protector: Causes you to teleport to it when out of range, unlike other parasites. Has two modes; Combat, where it does and takes medium damage, and Protection, where it does and takes almost no damage but moves slightly slower.
@@ -695,6 +700,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
Explosive: High damage resist and medium power attack that may explosively teleport targets. Can turn any object, including objects too large to pick up, into a bomb, dealing explosive damage to the next person to touch it. The object will return to normal after the trap is triggered or after a delay.
+ Gravitokinetic: Attacks will apply crushing gravity to the target. Can target the ground as well to slow targets advancing on you, but this will affect the user.
+
Lightning: Attacks apply lightning chains to targets. Has a lightning chain to the user. Lightning chains shock everything near them, doing constant damage.
Protector: Causes you to teleport to it when out of range, unlike other parasites. Has two modes; Combat, where it does and takes medium damage, and Protection, where it does and takes almost no damage but moves slightly slower.
@@ -720,6 +727,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
Explosive: High damage resist and medium power attack that may explosively teleport targets. Can turn any object, including objects too large to pick up, into a bomb, dealing explosive damage to the next person to touch it. The object will return to normal after the trap is triggered or after a delay.
+ Gravitokinetic: Attacks will apply crushing gravity to the target. Can target the ground as well to slow targets advancing on you, but this will affect the user.
+
Lightning: Attacks apply lightning chains to targets. Has a lightning chain to the user. Lightning chains shock everything near them, doing constant damage.
Ranged: Has two modes. Ranged; which fires a constant stream of weak, armor-ignoring projectiles. Scout; Cannot attack, but can move through walls and is quite hard to see. Can lay surveillance snares, which alert it when crossed, in either mode.
diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
index 3bc079f6d5..b5bb91d34f 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
@@ -1,5 +1,7 @@
//Assassin
/mob/living/simple_animal/hostile/guardian/assassin
+ melee_damage_lower = 15
+ melee_damage_upper = 15
attack_verb_continuous = "slashes"
attack_verb_simple = "slash"
attack_sound = 'sound/weapons/bladeslice.ogg'
diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
index 0b4952aa9e..9060350df4 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
@@ -1,8 +1,11 @@
//Charger
/mob/living/simple_animal/hostile/guardian/charger
+ melee_damage_lower = 15
+ melee_damage_upper = 15
ranged = 1 //technically
ranged_message = "charges"
ranged_cooldown_time = 20
+ speed = -1
damage_coeff = list(BRUTE = 0.2, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5)
playstyle_string = "As a charger type you do medium damage, take half damage, have near immunity to brute damage, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding."
magic_fluff_string = "..And draw the Hunter, an alien master of rapid assault."
diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
index b9037ff4a4..39a7bfaebd 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
@@ -1,5 +1,7 @@
//Bomb
/mob/living/simple_animal/hostile/guardian/bomb
+ melee_damage_lower = 15
+ melee_damage_upper = 15
damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 0.6, CLONE = 0.6, STAMINA = 0, OXY = 0.6)
playstyle_string = "As an explosive type, you have moderate close combat abilities, take half damage, may explosively teleport targets on attack, and are capable of converting nearby items and objects into disguised bombs via alt click."
magic_fluff_string = "..And draw the Scientist, master of explosive death."
diff --git a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm
new file mode 100644
index 0000000000..34948d3e0c
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm
@@ -0,0 +1,73 @@
+//gravitokinetic
+/mob/living/simple_animal/hostile/guardian/gravitokinetic
+ melee_damage_lower = 15
+ melee_damage_upper = 15
+ damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75)
+ playstyle_string = "As a gravitokinetic type, you can alt click to make the gravity on the ground stronger, and punching applies this effect to a target."
+ magic_fluff_string = "..And draw the Singularity, an anomalous force of terror."
+ tech_fluff_string = "Boot sequence complete. Gravitokinetic modules loaded. Holoparasite swarm online."
+ carp_fluff_string = "CARP CARP CARP! Caught one! It's a gravitokinetic carp! Now do you understand the gravity of the situation?"
+ var/list/gravito_targets = list()
+ var/gravity_power_range = 10 //how close the stand must stay to the target to keep the heavy gravity
+
+///Removes gravity from affected mobs upon guardian death to prevent permanent effects
+/mob/living/simple_animal/hostile/guardian/gravitokinetic/death()
+ . = ..()
+ for(var/i in gravito_targets)
+ remove_gravity(i)
+
+/mob/living/simple_animal/hostile/guardian/gravitokinetic/AttackingTarget()
+ . = ..()
+ if(isliving(target) && target != src && target != summoner)
+ to_chat(src, "Your punch has applied heavy gravity to [target]!")
+ add_gravity(target, 5)
+ to_chat(target, "Everything feels really heavy!")
+
+/mob/living/simple_animal/hostile/guardian/gravitokinetic/AltClickOn(atom/A)
+ if(isopenturf(A) && is_deployed() && stat != DEAD && in_range(src, A) && !incapacitated())
+ var/turf/T = A
+ if(isspaceturf(T))
+ to_chat(src, "You cannot add gravity to space!")
+ return
+ visible_message("[src] slams their fist into the [T]!", "You modify the gravity of the [T].")
+ do_attack_animation(T)
+ add_gravity(T, 3)
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/guardian/gravitokinetic/Recall(forced)
+ . = ..()
+ to_chat(src, "You have released your gravitokinetic powers!")
+ for(var/i in gravito_targets)
+ remove_gravity(i)
+
+/mob/living/simple_animal/hostile/guardian/gravitokinetic/Manifest(forced)
+ . = ..()
+ //just make sure to reapply a gravity immunity wherever you summon. it can be overridden but not by you at least
+ summoner.AddElement(/datum/element/forced_gravity, 1)
+ AddElement(/datum/element/forced_gravity, 1)
+
+/mob/living/simple_animal/hostile/guardian/gravitokinetic/Moved(oldLoc, dir)
+ . = ..()
+ for(var/i in gravito_targets)
+ if(get_dist(src, i) > gravity_power_range)
+ remove_gravity(i)
+
+/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/add_gravity(atom/A, new_gravity = 3)
+ if(gravito_targets[A])
+ return
+ A.AddElement(/datum/element/forced_gravity, new_gravity)
+ gravito_targets[A] = new_gravity
+ RegisterSignal(A, COMSIG_MOVABLE_MOVED, .proc/__distance_check)
+ playsound(src, 'sound/effects/gravhit.ogg', 100, TRUE)
+
+/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/remove_gravity(atom/target)
+ if(isnull(gravito_targets[target]))
+ return
+ UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
+ target.RemoveElement(/datum/element/forced_gravity, gravito_targets[target])
+ gravito_targets -= target
+
+/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/__distance_check(atom/movable/AM, OldLoc, Dir, Forced)
+ if(get_dist(src, AM) > gravity_power_range)
+ remove_gravity(AM)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm
index cf6bd3cdb5..99272a6d3f 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm
@@ -1,5 +1,7 @@
//Protector
/mob/living/simple_animal/hostile/guardian/protector
+ melee_damage_lower = 15
+ melee_damage_upper = 15
range = 15 //worse for it due to how it leashes
damage_coeff = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.4, CLONE = 0.4, STAMINA = 0, OXY = 0.4)
playstyle_string = "As a protector type you cause your summoner to leash to you instead of you leashing to them and have two modes; Combat Mode, where you do and take medium damage, and Protection Mode, where you do and take almost no damage, but move slightly slower."
@@ -31,9 +33,10 @@
cooldown = world.time + 10
if(toggle)
cut_overlays()
- melee_damage_lower = 15
- melee_damage_upper = 15
- speed = 0
+ add_overlay(cooloverlay) //readd the guardian's colors
+ melee_damage_lower = initial(melee_damage_lower)
+ melee_damage_upper = initial(melee_damage_upper)
+ speed = initial(speed)
damage_coeff = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.4, CLONE = 0.4, STAMINA = 0, OXY = 0.4)
to_chat(src, "You switch to combat mode.")
toggle = FALSE
diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm
index eee3eb0cdb..b51552acd2 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/support.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm
@@ -4,6 +4,8 @@
friendly_verb_continuous = "heals"
friendly_verb_simple = "heal"
damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
+ melee_damage_lower = 15
+ melee_damage_upper = 15
playstyle_string = "As a support type, you have 30% damage reduction and may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent object or mob will warp them to your bluespace beacon after a short delay."
magic_fluff_string = "..And draw the CMO, a potent force of life... and death."
carp_fluff_string = "CARP CARP CARP! You caught a support carp. It's a kleptocarp!"
@@ -43,15 +45,15 @@
if(src.loc == summoner)
if(toggle)
a_intent = INTENT_HARM
- speed = 0
+ speed = initial(speed)
damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
- melee_damage_lower = 15
- melee_damage_upper = 15
+ melee_damage_lower = initial(melee_damage_lower)
+ melee_damage_upper = initial(melee_damage_upper)
to_chat(src, "You switch to combat mode.")
toggle = FALSE
else
a_intent = INTENT_HELP
- speed = 1
+ speed = initial(speed)
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
melee_damage_lower = 0
melee_damage_upper = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 186fe36a10..37eb9b7f67 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -52,6 +52,19 @@
var/lose_patience_timer_id //id for a timer to call LoseTarget(), used to stop mobs fixating on a target they can't reach
var/lose_patience_timeout = 300 //30 seconds by default, so there's no major changes to AI behaviour, beyond actually bailing if stuck forever
+ ///When a target is found, will the mob attempt to charge at it's target?
+ var/charger = FALSE
+ ///Tracks if the target is actively charging.
+ var/charge_state = FALSE
+ ///In a charge, how many tiles will the charger travel?
+ var/charge_distance = 3
+ ///How often can the charging mob actually charge? Effects the cooldown between charges.
+ var/charge_frequency = 6 SECONDS
+ ///If the mob is charging, how long will it stun it's target on success, and itself on failure?
+ var/knockdown_time = 3 SECONDS
+ ///Declares a cooldown for potential charges right off the bat.
+ COOLDOWN_DECLARE(charge_cooldown)
+
/mob/living/simple_animal/hostile/Initialize()
. = ..()
@@ -292,6 +305,9 @@
if(ranged) //We ranged? Shoot at em
if(!target.Adjacent(targets_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown
OpenFire(target)
+ if(charger && (target_distance > minimum_distance) && (target_distance <= charge_distance))//Attempt to close the distance with a charge.
+ enter_charge(target)
+ return TRUE
if(!Process_Spacemove()) //Drifting
walk(src,0)
return 1
@@ -599,3 +615,64 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega
. += M
else if (M.loc.type in hostile_machines)
. += M.loc
+
+
+/**
+ * Proc that handles a charge attack windup for a mob.
+ */
+/mob/living/simple_animal/hostile/proc/enter_charge(var/atom/target)
+ if((mobility_flags & (MOBILITY_MOVE | MOBILITY_STAND)) != (MOBILITY_MOVE | MOBILITY_STAND) || charge_state)
+ return FALSE
+
+ if(!(COOLDOWN_FINISHED(src, charge_cooldown)) || !has_gravity() || !target.has_gravity())
+ return FALSE
+ Shake(15, 15, 1 SECONDS)
+ addtimer(CALLBACK(src, .proc/handle_charge_target, target), 1.5 SECONDS, TIMER_STOPPABLE)
+
+/**
+ * Proc that throws the mob at the target after the windup.
+ */
+/mob/living/simple_animal/hostile/proc/handle_charge_target(var/atom/target)
+ charge_state = TRUE
+ throw_at(target, charge_distance, 1, src, FALSE, TRUE, callback = CALLBACK(src, .proc/charge_end))
+ COOLDOWN_START(src, charge_cooldown, charge_frequency)
+ return TRUE
+
+/**
+ * Proc that handles a charge attack after it's concluded.
+ */
+/mob/living/simple_animal/hostile/proc/charge_end()
+ charge_state = FALSE
+
+/**
+ * Proc that handles the charge impact of the charging mob.
+ */
+/mob/living/simple_animal/hostile/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ if(!charge_state)
+ return ..()
+
+ if(hit_atom)
+ if(isliving(hit_atom))
+ var/mob/living/L = hit_atom
+ var/blocked = FALSE
+ if(ishuman(hit_atom))
+ var/mob/living/carbon/human/H = hit_atom
+ var/list/return_list = list()
+ if(H.mob_run_block(src, 0, "the [name]", ATTACK_TYPE_TACKLE, 0, src, null, return_list) & BLOCK_SUCCESS)
+ blocked = TRUE
+ if(!blocked)
+ blocked = return_list[BLOCK_RETURN_MITIGATION_PERCENT]
+ if(!blocked)
+ L.visible_message("[src] charges on [L]!", "[src] charges into you!")
+ L.Knockdown(knockdown_time)
+ else
+ Stun((knockdown_time * 2), 1, 1)
+ charge_end()
+ else if(hit_atom.density && !hit_atom.CanPass(src))
+ visible_message("[src] smashes into [hit_atom]!")
+ Stun((knockdown_time * 2), 1, 1)
+
+ if(charge_state)
+ charge_state = FALSE
+ update_icons()
+ update_mobility()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobsterosity.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobsterosity.dm
new file mode 100644
index 0000000000..140042024d
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobsterosity.dm
@@ -0,0 +1,42 @@
+/**
+ * Lobstrosities, the poster boy of charging AI mobs. Drops crab meat and bones.
+ * Outside of charging, it's intended behavior is that it is generally slow moving, but makes up for that with a knockdown attack to score additional hits.
+ */
+/mob/living/simple_animal/hostile/asteroid/lobstrosity
+ name = "arctic lobstrosity"
+ desc = "A marvel of evolution gone wrong, the frosty ice produces underground lakes where these ill tempered seafood gather. Beware its charge."
+ icon = 'icons/mob/icemoon/icemoon_monsters.dmi'
+ icon_state = "arctic_lobstrosity"
+ icon_living = "arctic_lobstrosity"
+ icon_dead = "arctic_lobstrosity_dead"
+ mob_biotypes = MOB_ORGANIC|MOB_BEAST
+ mouse_opacity = MOUSE_OPACITY_ICON
+ friendly_verb_continuous = "chitters at"
+ friendly_verb_simple = "chits at"
+ speak_emote = list("chitters")
+ speed = 3
+ move_to_delay = 20
+ maxHealth = 150
+ health = 150
+ obj_damage = 15
+ melee_damage_lower = 15
+ melee_damage_upper = 19
+ attack_verb_continuous = "snips"
+ attack_verb_simple = "snip"
+ attack_sound = 'sound/weapons/bite.ogg'
+ weather_immunities = list("snow")
+ vision_range = 5
+ aggro_vision_range = 7
+ charger = TRUE
+ charge_distance = 4
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/crab = 2, /obj/item/stack/sheet/bone = 2)
+ robust_searching = TRUE
+ footstep_type = FOOTSTEP_MOB_CLAW
+ gold_core_spawnable = HOSTILE_SPAWN
+
+/mob/living/simple_animal/hostile/asteroid/lobstrosity/lava
+ name = "tropical lobstrosity"
+ desc = "A marvel of evolution gone wrong, the sulfur lakes of lavaland have given them a vibrant, red hued shell. Beware its charge."
+ icon_state = "lobstrosity"
+ icon_living = "lobstrosity"
+ icon_dead = "lobstrosity_dead"
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm
index 2c94739180..f6ab2a1a9e 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm
@@ -59,12 +59,12 @@
/mob/living/simple_animal/hostile/retaliate/ghost/proc/give_hair()
if(ghost_hair_style != null)
- ghost_hair = mutable_appearance('icons/mob/human_face.dmi', "hair_[ghost_hair_style]", -HAIR_LAYER)
+ ghost_hair = mutable_appearance('icons/mob/hair.dmi', "hair_[ghost_hair_style]", -HAIR_LAYER)
ghost_hair.alpha = 200
ghost_hair.color = ghost_hair_color
add_overlay(ghost_hair)
if(ghost_facial_hair_style != null)
- ghost_facial_hair = mutable_appearance('icons/mob/human_face.dmi', "facial_[ghost_facial_hair_style]", -HAIR_LAYER)
+ ghost_facial_hair = mutable_appearance('icons/mob/hair.dmi', "facial_[ghost_facial_hair_style]", -HAIR_LAYER)
ghost_facial_hair.alpha = 200
ghost_facial_hair.color = ghost_facial_hair_color
add_overlay(ghost_facial_hair)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index b192182c71..5fa6a0c22d 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -6,6 +6,7 @@
gender = PLURAL //placeholder
///How much blud it has for bloodsucking
blood_volume = 550
+ rad_flags = RAD_NO_CONTAMINATE
status_flags = CANPUSH
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 0d4afd0915..2ed0bfa9d2 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -39,8 +39,7 @@
update_client_colour()
update_mouse_pointer()
if(client)
- client.change_view(CONFIG_GET(string/default_view)) // Resets the client.view in case it was changed.
-
+ client.view_size?.resetToDefault()
if(client.player_details && istype(client.player_details))
if(client.player_details.player_actions.len)
for(var/datum/action/A in client.player_details.player_actions)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index e1a4ac6118..ab2556abb5 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -39,6 +39,7 @@
. = ..()
update_config_movespeed()
update_movespeed(TRUE)
+ initialize_actionspeed()
hook_vr("mob_new",list(src))
/mob/GenerateTag()
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 03a3ab1001..8c6b722140 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -58,6 +58,13 @@
var/list/movespeed_mod_immunities //Lazy list, see mob_movespeed.dm
/// The calculated mob speed slowdown based on the modifiers list
var/cached_multiplicative_slowdown
+ /// List of action speed modifiers applying to this mob
+ var/list/actionspeed_modification //Lazy list, see mob_movespeed.dm
+ /// List of action speed modifiers ignored by this mob. List -> List (id) -> List (sources)
+ var/list/actionspeed_mod_immunities //Lazy list, see mob_movespeed.dm
+ /// The calculated mob action speed slowdown based on the modifiers list
+ var/cached_multiplicative_actions_slowdown
+
/////////////////
var/name_archive //For admin things like possession
diff --git a/code/modules/movespeed/modifiers/innate.dm b/code/modules/movespeed/modifiers/innate.dm
index a0357ddf0f..946d93e96b 100644
--- a/code/modules/movespeed/modifiers/innate.dm
+++ b/code/modules/movespeed/modifiers/innate.dm
@@ -18,3 +18,7 @@
blacklisted_movetypes = (FLOATING|CRAWLING)
variable = TRUE
flags = IGNORE_NOSLOW
+
+/datum/movespeed_modifier/slime_puddle
+ multiplicative_slowdown = 2
+ flags = IGNORE_NOSLOW
diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm
index 0e553ced35..25b5cfb51b 100644
--- a/code/modules/paperwork/ticketmachine.dm
+++ b/code/modules/paperwork/ticketmachine.dm
@@ -160,8 +160,7 @@
/obj/machinery/ticket_machine/proc/reset_cooldown()
ready = TRUE
-/obj/machinery/ticket_machine/attack_hand(mob/living/carbon/user)
- . = ..()
+/obj/machinery/ticket_machine/on_attack_hand(mob/living/carbon/user)
INVOKE_ASYNC(src, .proc/attempt_ticket, user)
/obj/machinery/ticket_machine/proc/attempt_ticket(mob/living/carbon/user)
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index fe05365dd9..a4daeb6a33 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -407,3 +407,10 @@
/obj/item/stock_parts/cell/toymagburst
name = "toy mag burst rifle power supply"
maxcharge = 4000
+
+/obj/item/stock_parts/cell/family
+ name = "broken power cell"
+ desc = "An old faulty power cell. You can see your family name faintly etched onto it."
+ maxcharge = 100
+ self_recharge = -5 //it loses power over time instead of gaining
+ rating = 1
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 50dae7d6bb..6961ec54bb 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -364,7 +364,7 @@
icon_state_on = "protoemitter_+a"
can_buckle = TRUE
buckle_lying = FALSE
- var/view_range = 12
+ var/view_range = 4.5
var/datum/action/innate/protoemitter/firing/auto
//BUCKLE HOOKS
@@ -379,7 +379,7 @@
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 0
if(buckled_mob.client)
- buckled_mob.client.change_view(CONFIG_GET(string/default_view))
+ buckled_mob.client.view_size.resetToDefault()
auto.Remove(buckled_mob)
. = ..()
@@ -395,7 +395,7 @@
M.pixel_y = 14
layer = 4.1
if(M.client)
- M.client.change_view(view_range)
+ M.client.view_size.setTo(view_range)
if(!auto)
auto = new()
auto.Grant(M, src)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 8cddd5d02f..1369115b0d 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -134,7 +134,7 @@
/obj/item/gun/equipped(mob/living/user, slot)
. = ..()
if(zoomed && user.get_active_held_item() != src)
- zoom(user, FALSE) //we can only stay zoomed in if it's in our hands //yeah and we only unzoom if we're actually zoomed using the gun!!
+ zoom(user, user.dir, FALSE) //we can only stay zoomed in if it's in our hands //yeah and we only unzoom if we're actually zoomed using the gun!!
//called after the gun has successfully fired its chambered ammo.
/obj/item/gun/proc/process_chamber(mob/living/user)
@@ -439,7 +439,7 @@
/obj/item/gun/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/toggle_scope_zoom))
- zoom(user)
+ zoom(user, user.dir)
else if(istype(action, alight))
toggle_gunlight()
@@ -554,14 +554,19 @@
. = ..()
if(!.)
var/obj/item/gun/G = target
- G.zoom(owner, FALSE)
+ G.zoom(owner, owner.dir)
/datum/action/item_action/toggle_scope_zoom/Remove(mob/living/L)
var/obj/item/gun/G = target
- G.zoom(L, FALSE)
+ G.zoom(L, L.dir)
return ..()
-/obj/item/gun/proc/zoom(mob/living/user, forced_zoom)
+/obj/item/gun/proc/rotate(atom/thing, old_dir, new_dir)
+ if(ismob(thing))
+ var/mob/lad = thing
+ lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir)
+
+/obj/item/gun/proc/zoom(mob/living/user, direct, forced_zoom)
if(!(user?.client))
return
@@ -573,25 +578,11 @@
zoomed = !zoomed
if(zoomed)
- var/_x = 0
- var/_y = 0
- switch(user.dir)
- if(NORTH)
- _y = zoom_amt
- if(EAST)
- _x = zoom_amt
- if(SOUTH)
- _y = -zoom_amt
- if(WEST)
- _x = -zoom_amt
-
- user.client.change_view(zoom_out_amt)
- user.client.pixel_x = world.icon_size*_x
- user.client.pixel_y = world.icon_size*_y
+ RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, .proc/rotate)
+ user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, direct)
else
- user.client.change_view(CONFIG_GET(string/default_view))
- user.client.pixel_x = 0
- user.client.pixel_y = 0
+ UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE)
+ user.client.view_size.zoomIn()
/obj/item/gun/handle_atom_del(atom/A)
if(A == chambered)
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 9210e66f22..00e59d09f8 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -374,7 +374,7 @@
inaccuracy_modifier = 0.5
zoomable = TRUE
zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you.
- zoom_out_amt = 13
+ zoom_out_amt = 5
slot_flags = ITEM_SLOT_BACK
automatic_burst_overlay = FALSE
actions_types = list()
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index a26f05d553..0026a612e0 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -85,9 +85,14 @@
. += "[get_ammo(0,0)] of those are live rounds."
/obj/item/gun/ballistic/revolver/syndicate
+ obj_flags = UNIQUE_RENAME
unique_reskin = list("Default" = "revolver",
"Silver" = "russianrevolver",
- "Robust" = "revolvercit")
+ "Robust" = "revolvercit",
+ "Bulky" = "revolverhakita",
+ "Polished" = "revolvertoriate",
+ "Soulless" = "revolveroldflip",
+ "Soul" = "revolverold")
/obj/item/gun/ballistic/revolver/detective
name = "\improper .38 Mars Special"
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index 5e250d44e2..9d9f6aeb83 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -69,7 +69,8 @@
//ZOOMING
var/zoom_current_view_increase = 0
- var/zoom_target_view_increase = 10
+ ///The radius you want to zoom by
+ var/zoom_target_view_increase = 9.5
var/zooming = FALSE
var/zoom_lock = ZOOM_LOCK_OFF
var/zooming_angle
@@ -133,7 +134,7 @@
if(zoom_lock == ZOOM_LOCK_OFF)
return
zooming = TRUE
- current_user.client.change_view(world.view + zoom_target_view_increase)
+ current_user.client.view_size.setTo(zoom_target_view_increase)
zoom_current_view_increase = zoom_target_view_increase
/obj/item/gun/energy/beam_rifle/proc/stop_zooming(mob/user)
@@ -146,9 +147,8 @@
user = current_user
if(!user || !user.client)
return FALSE
- animate(user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW)
+ user.client.view_size.zoomIn()
zoom_current_view_increase = 0
- user.client.change_view(CONFIG_GET(string/default_view))
zooming_angle = 0
current_zoom_x = 0
current_zoom_y = 0
diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm
index df417ad734..b3737a8388 100644
--- a/code/modules/projectiles/projectile/special/rocket.dm
+++ b/code/modules/projectiles/projectile/special/rocket.dm
@@ -73,4 +73,4 @@
explosion(target, 0, 1, 1, 2)
return BULLET_ACT_HIT
//if(istype(target, /turf/closed) || ismecha(target))
- new /obj/item/broken_missile(get_turf(src), 1)
\ No newline at end of file
+ new /obj/item/broken_missile(get_turf(src), 1)
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 86464aceea..070d5cb269 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -484,12 +484,12 @@
return FALSE
var/list/D = holder.get_data("blood")
if(D && D["changeling_loudness"])
- return (D["changeling_loudness"] >= 4 ? D["changeling_loudness"] : FALSE)
+ return (D["changeling_loudness"] >= LINGBLOOD_DETECTION_THRESHOLD ? D["changeling_loudness"] : FALSE)
else
return FALSE
/datum/chemical_reaction/reagent_explosion/lingblood/on_reaction(datum/reagents/holder, multiplier, specialreact)
- if(specialreact >= 10)
+ if(specialreact > LINGBLOOD_EXPLOSION_THRESHOLD)
return ..()
else
return FALSE
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index ed43576a61..cbfbbe2a36 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -335,15 +335,11 @@ datum/status_effect/rebreathing/tick()
duration = 600
/datum/status_effect/timecookie/on_apply()
- if(ishuman(owner))
- var/mob/living/carbon/human/H
- H.physiology.do_after_speed *= 0.95
+ owner.add_actionspeed_modifier(/datum/actionspeed_modifier/timecookie)
return ..()
/datum/status_effect/timecookie/on_remove()
- if(ishuman(owner))
- var/mob/living/carbon/human/H
- H.physiology.do_after_speed /= 0.95
+ owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/timecookie)
return ..()
/datum/status_effect/lovecookie
diff --git a/code/modules/ruins/spaceruin_code/caravanambush.dm b/code/modules/ruins/spaceruin_code/caravanambush.dm
index a7d89f3324..740850524c 100644
--- a/code/modules/ruins/spaceruin_code/caravanambush.dm
+++ b/code/modules/ruins/spaceruin_code/caravanambush.dm
@@ -68,7 +68,7 @@
lock_override = NONE
shuttlePortId = "caravantrade1_custom"
jumpto_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1, "caravantrade1_ambush" = 1)
- view_range = 14
+ view_range = 6.5
x_offset = -5
y_offset = -5
designate_time = 100
@@ -92,7 +92,7 @@
lock_override = NONE
shuttlePortId = "caravanpirate_custom"
jumpto_ports = list("caravanpirate_ambush" = 1)
- view_range = 14
+ view_range = 6.5
x_offset = 3
y_offset = -6
@@ -116,7 +116,7 @@
lock_override = NONE
shuttlePortId = "caravansyndicate1_custom"
jumpto_ports = list("caravansyndicate1_ambush" = 1, "caravansyndicate1_listeningpost" = 1)
- view_range = 7
+ view_range = 0
x_offset = 2
y_offset = 0
@@ -140,7 +140,7 @@
lock_override = NONE
shuttlePortId = "caravansyndicate2_custom"
jumpto_ports = list("caravansyndicate2_ambush" = 1, "caravansyndicate1_listeningpost" = 1)
- view_range = 7
+ view_range = 0
x_offset = 0
y_offset = 2
@@ -164,6 +164,6 @@
lock_override = NONE
shuttlePortId = "caravansyndicate3_custom"
jumpto_ports = list("caravansyndicate3_ambush" = 1, "caravansyndicate3_listeningpost" = 1)
- view_range = 10
+ view_range = 2.5
x_offset = -1
y_offset = -3
diff --git a/code/modules/ruins/spaceruin_code/skelter.dm b/code/modules/ruins/spaceruin_code/skelter.dm
new file mode 100644
index 0000000000..526277cf56
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/skelter.dm
@@ -0,0 +1,4 @@
+/////////// skelter items
+
+/obj/item/paper/fluff/ruins/skelter/cloner
+ info = "You may be wondering why your pay has been cut, but rest assured - it's because we're investing in YOU! Should you meet your untimely demise, this machine can bring you back to life with as little as your brain! It also means death is no longer an acceptable excuse for neglecting your duties, so get back to work!
\n
\n-HQ"
diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm
index 195e87720c..21a9c6c5d7 100644
--- a/code/modules/shuttle/navigation_computer.dm
+++ b/code/modules/shuttle/navigation_computer.dm
@@ -2,6 +2,7 @@
name = "navigation computer"
desc = "Used to designate a precise transit location for a spacecraft."
jump_action = null
+ should_supress_view_changes = FALSE
var/datum/action/innate/shuttledocker_rotate/rotate_action = new
var/datum/action/innate/shuttledocker_place/place_action = new
var/shuttleId = ""
@@ -10,7 +11,7 @@
var/list/jumpto_ports = list() //hashset of ports to jump to and ignore for collision purposes
var/obj/docking_port/stationary/my_port //the custom docking port placed by this console
var/obj/docking_port/mobile/shuttle_port //the mobile docking port of the connected shuttle
- var/view_range = 7
+ var/view_range = 0
var/x_offset = 0
var/y_offset = 0
var/list/whitelist_turfs = list(/turf/open/space, /turf/open/floor/plating, /turf/open/lava)
@@ -88,7 +89,7 @@
to_add += SSshuttle.hidden_shuttle_turf_images
user.client.images += to_add
- user.client.change_view(view_range)
+ user.client.view_size.setTo(view_range)
/obj/machinery/computer/camera_advanced/shuttle_docker/remove_eye_control(mob/living/user)
..()
@@ -101,7 +102,7 @@
to_remove += SSshuttle.hidden_shuttle_turf_images
user.client.images -= to_remove
- user.client.change_view(CONFIG_GET(string/default_view))
+ user.client.view_size.resetToDefault()
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/placeLandingSpot()
if(designating_target_loc || !current_user)
diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm
index bdbdc08c6f..794f2bcd44 100644
--- a/code/modules/shuttle/syndicate.dm
+++ b/code/modules/shuttle/syndicate.dm
@@ -60,7 +60,7 @@
lock_override = CAMERA_LOCK_STATION
shuttlePortId = "syndicate_custom"
jumpto_ports = list("syndicate_ne" = 1, "syndicate_nw" = 1, "syndicate_n" = 1, "syndicate_se" = 1, "syndicate_sw" = 1, "syndicate_s" = 1)
- view_range = 13
+ view_range = 5.5
x_offset = -7
y_offset = -1
space_turfs_only = FALSE
diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm
index f25fe30f36..66146edea1 100644
--- a/code/modules/shuttle/white_ship.dm
+++ b/code/modules/shuttle/white_ship.dm
@@ -25,7 +25,7 @@
lock_override = NONE
shuttlePortId = "whiteship_custom"
jumpto_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1)
- view_range = 18
+ view_range = 10
x_offset = -6
y_offset = -10
designate_time = 100
@@ -36,7 +36,7 @@
shuttleId = "whiteship_pod"
shuttlePortId = "whiteship_pod_custom"
jumpto_ports = list("whiteship_pod_home" = 1)
- view_range = 7
+ view_range = 0
x_offset = -2
y_offset = 0
designate_time = 0
diff --git a/code/modules/spells/spell_types/devil_boons.dm b/code/modules/spells/spell_types/devil_boons.dm
index 8ba106d77b..cf11466d19 100644
--- a/code/modules/spells/spell_types/devil_boons.dm
+++ b/code/modules/spells/spell_types/devil_boons.dm
@@ -43,7 +43,7 @@
for(var/mob/C in targets)
if(!C.client)
continue
- C.client.change_view(input("Select view range:", "Range", 4) in ranges)
+ C.client.view_size.setTo((input("Select view range:", "Range", 4) in ranges) - 7)
/obj/effect/proc_holder/spell/targeted/summon_friend
name = "Summon Friend"
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 54ab6bf887..b4c0b1db4e 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -488,12 +488,12 @@
//Checks disabled status thresholds
//Checks disabled status thresholds
-/obj/item/bodypart/proc/update_disabled()
+/obj/item/bodypart/proc/update_disabled(silent = FALSE)
if(!owner)
return
- set_disabled(is_disabled())
+ set_disabled(is_disabled(silent), silent)
-/obj/item/bodypart/proc/is_disabled()
+/obj/item/bodypart/proc/is_disabled(silent = FALSE)
if(!owner)
return
if(HAS_TRAIT(owner, TRAIT_PARALYSIS))
@@ -505,7 +505,7 @@
if(can_dismember() && !HAS_TRAIT(owner, TRAIT_NODISMEMBER))
. = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled
if(get_damage(TRUE) >= max_damage * (HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE) ? 0.6 : 1)) //Easy limb disable disables the limb at 40% health instead of 0%
- if(!last_maxed)
+ if(!last_maxed && !silent)
owner.emote("scream")
last_maxed = TRUE
if(!is_organic_limb(FALSE) || stamina_dam >= max_damage)
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index d47794e896..8c283f5ebc 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -161,7 +161,7 @@
debrain_overlay.icon = 'icons/mob/animal_parts.dmi'
debrain_overlay.icon_state = "debrained_larva"
else if(!(NOBLOOD in species_flags_list))
- debrain_overlay.icon = 'icons/mob/human_face.dmi'
+ debrain_overlay.icon = 'icons/mob/human_parts.dmi'
debrain_overlay.icon_state = "debrained"
. += debrain_overlay
else
@@ -175,21 +175,31 @@
// lipstick
if(lip_style)
- var/image/lips_overlay = image('icons/mob/human_face.dmi', "lips_[lip_style]", -BODY_LAYER, SOUTH)
+ var/image/lips_overlay = image('icons/mob/lips.dmi', "lips_[lip_style]", -BODY_LAYER, SOUTH)
lips_overlay.color = lip_color
. += lips_overlay
// eyes
if(eyes)
- var/image/left_eye = image('icons/mob/human_face.dmi', "left_eye", -BODY_LAYER, SOUTH)
- var/image/right_eye = image('icons/mob/human_face.dmi', "right_eye", -BODY_LAYER, SOUTH)
- if(eyes.left_eye_color && eyes.right_eye_color)
- left_eye.color = "#" + eyes.left_eye_color
- right_eye.color = "#" + eyes.right_eye_color
- . += left_eye
- . += right_eye
+ var/left_state = DEFAULT_LEFT_EYE_STATE
+ var/right_state = DEFAULT_RIGHT_EYE_STATE
+ if(owner && owner.dna.species)
+ var/eye_type = owner.dna.species.eye_type
+ if(GLOB.eye_types[eye_type])
+ left_state = eye_type + "_left_eye"
+ right_state = eye_type + "_right_eye"
+ if(left_state != DEFAULT_NO_EYE_STATE)
+ var/image/left_eye = image('icons/mob/hair.dmi', left_state, -BODY_LAYER, SOUTH)
+ if(eyes.left_eye_color)
+ left_eye.color = "#" + eyes.left_eye_color
+ . += left_eye
+ if(right_state != DEFAULT_NO_EYE_STATE)
+ var/image/right_eye = image('icons/mob/hair.dmi', right_state, -BODY_LAYER, SOUTH)
+ if(eyes.right_eye_color)
+ right_eye.color = "#" + eyes.right_eye_color
+ . += right_eye
else
- var/eyes_overlay = image('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER, SOUTH)
+ var/eyes_overlay = image('icons/mob/hair.dmi', "eyes_missing", -BODY_LAYER, SOUTH)
. += eyes_overlay
/obj/item/bodypart/head/monkey
diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm
index 5a887ee6b7..86288564ae 100644
--- a/code/modules/surgery/bodyparts/parts.dm
+++ b/code/modules/surgery/bodyparts/parts.dm
@@ -75,11 +75,11 @@
return BODYPART_DISABLED_PARALYSIS
return ..()
-/obj/item/bodypart/l_arm/set_disabled(new_disabled)
+/obj/item/bodypart/l_arm/set_disabled(new_disabled, silent = FALSE)
. = ..()
if(!.)
return
- if(owner.stat < UNCONSCIOUS)
+ if(owner.stat < UNCONSCIOUS && !silent)
switch(disabled)
if(BODYPART_DISABLED_DAMAGE)
owner.emote("scream")
@@ -136,11 +136,11 @@
return BODYPART_DISABLED_PARALYSIS
return ..()
-/obj/item/bodypart/r_arm/set_disabled(new_disabled)
+/obj/item/bodypart/r_arm/set_disabled(new_disabled, silent = FALSE)
. = ..()
if(!.)
return
- if(owner.stat < UNCONSCIOUS)
+ if(owner.stat < UNCONSCIOUS && !silent)
switch(disabled)
if(BODYPART_DISABLED_DAMAGE)
owner.emote("scream")
@@ -196,16 +196,17 @@
return BODYPART_DISABLED_PARALYSIS
return ..()
-/obj/item/bodypart/l_leg/set_disabled(new_disabled)
+/obj/item/bodypart/l_leg/set_disabled(new_disabled, silent = FALSE)
. = ..()
if(!. || owner.stat >= UNCONSCIOUS)
return
- switch(disabled)
- if(BODYPART_DISABLED_DAMAGE)
- owner.emote("scream")
- to_chat(owner, "Your [name] is too damaged to function!")
- if(BODYPART_DISABLED_PARALYSIS)
- to_chat(owner, "You can't feel your [name]!")
+ if(!silent)
+ switch(disabled)
+ if(BODYPART_DISABLED_DAMAGE)
+ owner.emote("scream")
+ to_chat(owner, "Your [name] is too damaged to function!")
+ if(BODYPART_DISABLED_PARALYSIS)
+ to_chat(owner, "You can't feel your [name]!")
/obj/item/bodypart/l_leg/digitigrade
name = "left digitigrade leg"
@@ -253,16 +254,17 @@
return BODYPART_DISABLED_PARALYSIS
return ..()
-/obj/item/bodypart/r_leg/set_disabled(new_disabled)
+/obj/item/bodypart/r_leg/set_disabled(new_disabled, silent = FALSE)
. = ..()
if(!. || owner.stat >= UNCONSCIOUS)
return
- switch(disabled)
- if(BODYPART_DISABLED_DAMAGE)
- owner.emote("scream")
- to_chat(owner, "Your [name] is too damaged to function!")
- if(BODYPART_DISABLED_PARALYSIS)
- to_chat(owner, "You can't feel your [name]!")
+ if(!silent)
+ switch(disabled)
+ if(BODYPART_DISABLED_DAMAGE)
+ owner.emote("scream")
+ to_chat(owner, "Your [name] is too damaged to function!")
+ if(BODYPART_DISABLED_PARALYSIS)
+ to_chat(owner, "You can't feel your [name]!")
/obj/item/bodypart/r_leg/digitigrade
name = "right digitigrade leg"
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index efceefc131..b4c58b31ed 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -248,7 +248,7 @@
/obj/item/organ/eyes/robotic/glow/Initialize()
. = ..()
- mob_overlay = image('icons/mob/human_face.dmi', "eyes_glow_gs")
+ mob_overlay = image('icons/mob/eyes.dmi', "eyes_glow_gs")
/obj/item/organ/eyes/robotic/glow/Destroy()
terminate_effects()
diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html
index 3cab68da6a..60bd358031 100644
--- a/code/modules/tooltip/tooltip.html
+++ b/code/modules/tooltip/tooltip.html
@@ -120,12 +120,17 @@
window.location = 'byond://winset?id='+tooltip.control+';anchor1=0,0;size=999x999';
//Get the real icon size according to the client view
+ //FYI, this bit is even more borrowed from goon, our widescreen broke tooltips so I took a look at how they do it
+ //To improve our code. Thanks gooncoders, very cool
var mapWidth = map['view-size'].x,
mapHeight = map['view-size'].y,
- tilesShown = tooltip.client_view_h
- realIconSize = mapHeight / tilesShown,
- resizeRatio = realIconSize / tooltip.tileSize,
- //Calculate letterboxing offsets
+ tilesShownX = tooltip.client_view_w
+ tilesShownY = tooltip.client_view_h
+ realIconSizeX = mapWidth / tilesShownX,
+ realIconSizeY = mapHeight / tilesShownY,
+ resizeRatioX = realIconSizeX / tooltip.tileSize,
+ resizeRatioY = realIconSizeY / tooltip.tileSize,
+ //Calculate letterboxing offsets
leftOffset = (map.size.x - mapWidth) / 2,
topOffset = (map.size.y - mapHeight) / 2;
@@ -168,7 +173,7 @@
if ((iconX + westOffset) !== enteredX) { //Cursor entered on the offset tile
left = left + (westOffset < 0 ? 1 : -1);
}
- leftOffset = leftOffset + (westOffset * resizeRatio);
+ leftOffset = leftOffset + (westOffset * resizeRatioX);
}
}
@@ -179,13 +184,13 @@
if (northOffset !== 0) {
if ((iconY + northOffset) === enteredY) { //Cursor entered on the original tile
top--;
- topOffset = topOffset - ((tooltip.tileSize + northOffset) * resizeRatio);
+ topOffset = topOffset - ((tooltip.tileSize + northOffset) * resizeRatioY);
} else { //Cursor entered on the offset tile
if (northOffset < 0) { //Offset southwards
- topOffset = topOffset - ((tooltip.tileSize + northOffset) * resizeRatio);
+ topOffset = topOffset - ((tooltip.tileSize + northOffset) * resizeRatioY);
} else { //Offset northwards
top--;
- topOffset = topOffset - (northOffset * resizeRatio);
+ topOffset = topOffset - (northOffset * resizeRatioY);
}
}
}
@@ -198,12 +203,12 @@
}
//Clamp values
- left = (left < 0 ? 0 : (left > tilesShown ? tilesShown : left));
- top = (top < 0 ? 0 : (top > tilesShown ? tilesShown : top));
+ left = (left < 0 ? 0 : (left > tilesShownX ? tilesShownX : left));
+ top = (top < 0 ? 0 : (top > tilesShownY ? tilesShownY : top));
//Calculate where on the screen the popup should appear (below the hovered tile)
- var posX = Math.round(((left - 1) * realIconSize) + leftOffset + tooltip.padding); //-1 to position at the left of the target tile
- var posY = Math.round(((tilesShown - top + 1) * realIconSize) + topOffset + tooltip.padding); //+1 to position at the bottom of the target tile
+ var posX = Math.round(((left - 1) * realIconSizeX) + leftOffset + tooltip.padding); //-1 to position at the left of the target tile
+ var posY = Math.round(((tilesShownY - top + 1) * realIconSizeY) + topOffset + tooltip.padding); //+1 to position at the bottom of the target tile
//alert(mapWidth+' | '+mapHeight+' | '+tilesShown+' | '+realIconSize+' | '+leftOffset+' | '+topOffset+' | '+left+' | '+top+' | '+posX+' | '+posY); //DEBUG
@@ -221,7 +226,7 @@
docHeight = $wrap.outerHeight();
if (posY + docHeight > map.size.y) { //Is the bottom edge below the window? Snap it up if so
- posY = (posY - docHeight) - realIconSize - tooltip.padding;
+ posY = (posY - docHeight) - realIconSizeY - tooltip.padding;
}
//Actually size, move and show the tooltip box
diff --git a/code/modules/uplink/uplink_items/uplink_implants.dm b/code/modules/uplink/uplink_items/uplink_implants.dm
index bb4e0c7960..4839c96a2d 100644
--- a/code/modules/uplink/uplink_items/uplink_implants.dm
+++ b/code/modules/uplink/uplink_items/uplink_implants.dm
@@ -31,7 +31,7 @@
/datum/uplink_item/implants/warp
name = "Warp Implant"
- desc = "An implant injected into the body and later activated at the user's will. It will inject eigenstasium which saves the user's location and teleports them there after five seconds. Lasts only fifteen times."
+ desc = "An implant injected into the body and later activated at the user's will. Allows the user to teleport to where they were 10 seconds ago. Has a 10 second cooldown."
item = /obj/item/storage/box/syndie_kit/imp_warp
cost = 6
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 8923e9107d..a0ae58a44d 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -342,21 +342,23 @@
to_chat(src, "You can't do that so fast, slow down.")
return
- var/list/choices
+ DelayNextAction(CLICK_CD_MELEE, flush = TRUE)
+
+ var/list/lickable = list()
for(var/mob/living/L in view(1))
if(L != src && (!L.ckey || L.client?.prefs.vore_flags & LICKABLE) && Adjacent(L))
- LAZYADD(choices, L)
+ LAZYADD(lickable, L)
+ for(var/mob/living/listed in lickable)
+ lickable[listed] = new /mutable_appearance(listed)
- if(!choices)
+ if(!lickable)
return
- var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices
+ var/mob/living/tasted = show_radial_menu(src, src, lickable, radius = 40, require_near = TRUE)
if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.vore_flags & LICKABLE)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
return
- DelayNextAction(CLICK_CD_MELEE)
-
visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!")
/mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace)
diff --git a/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm
index 9cb46d011d..6e3951e60a 100644
--- a/code/modules/vore/eating/vorepanel.dm
+++ b/code/modules/vore/eating/vorepanel.dm
@@ -661,7 +661,7 @@
if(href_list["saveprefs"])
if(!(user.client?.prefs))
return FALSE
- if(!user.client.prefs.save_character())
+ if(!user.copy_to_prefs_vr() || !user.client.prefs.save_character())
to_chat(user, "Belly Preferences not saved!")
log_admin("Could not save vore prefs on USER: [user].")
else
diff --git a/html/changelog.html b/html/changelog.html
index 0de57ebe79..8a1401744e 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -324,272 +324,11 @@
12 September 2020
+ 01 October 2020
BlueWildrose updated:
-
- DeltaFire15 updated:
-
-
- Putnam3145 updated:
-
-
- Sonic121x updated:
-
-
- TheObserver-sys updated:
-
-
- Trilbyspaceclone updated:
-
-
- Tupinambis updated:
-
-
- lolman360 updated:
-
-
- zeroisthebiggay updated:
-
-
-
- 11 September 2020
- Putnam3145 updated:
-
-
-
- 09 September 2020
- Putnam3145 updated:
-
-
- timothyteakettle updated:
-
-
-
- 08 September 2020
- Ghommie updated:
-
-
- KeRSedChaplain updated:
-
-
- silicons updated:
-
-
-
- 07 September 2020
- DeltaFire15 updated:
-
-
- Putnam for debugging ammo loading! Thx!! updated:
-
-
-
- 06 September 2020
- Putnam3145 updated:
-
-
- lolman360, NecromancerAnne updated:
-
-
- raspy-on-osu updated:
-
-
-
- 05 September 2020
- Bhijn updated:
-
-
- Putnam3145 updated:
-
-
- raspy-on-osu updated:
-
-
-
- 04 September 2020
- timothyteakettle updated:
-
-
-
- 03 September 2020
- Ghommie updated:
-
-
-
- 02 September 2020
- Putnam3145 updated:
-
-
- Tupinambis updated:
-
-
- raspy-on-osu updated:
-
-
- timothyteakettle updated:
-
-
-
- 01 September 2020
- BlueWildrose updated:
-
-
-
- 31 August 2020
- Arturlang updated:
-
-
- Chiirno updated:
-
-
- Couls, ported by NecromancerAnne updated:
-
-
- DeltaFire15 updated:
-
-
- Detective-Google updated:
-
-
- EmeraldSundisk updated:
-
-
- ForrestWick updated:
-
-
- Ghommie updated:
-
-
- LetterN updated:
-
-
- Lynxless updated:
-
-
- Putnam3145 updated:
-
-
- Sonic121x updated:
-
-
- kappa-sama updated:
-
-
- lolman360 updated:
-
-
- raspy-on-osu updated:
-
-
- silicons updated:
-
-
- timothyteakettle updated:
-
-
- zeroisthebiggay updated:
-
-
30 August 2020
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 99ffc455c3..553556d59e 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -27504,11 +27504,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: ratvar gf is complete
2020-10-04:
DeltaFire15:
- - bugfix: Synths / IPCs are no longer wound immune.
- - bugfix: Husked IPCs / Synths should now be rendered correctly.
- - bugfix: Falling vendors now squish synths / IPCs' limbs again.
- - bugfix: Synths and IPCs now do not have some fun roundstart oversights anymore.
- - bugfix: Regenerate_limbs now works for carbons with the ROBOTIC_LIMBS trait.
- bugfix: Pacifists no longer counterattack on parries if that attack would be harmful.
- tweak: Heretic sacrifices now husk with the reason of burn, and deal some additional
damage.
diff --git a/html/changelogs/AutoChangeLog-pr-13252.yml b/html/changelogs/AutoChangeLog-pr-13252.yml
new file mode 100644
index 0000000000..5de40bb80b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13252.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - tweak: "looking at loadout equips loadout items on your preview image instead of job items"
diff --git a/html/changelogs/AutoChangeLog-pr-13405.yml b/html/changelogs/AutoChangeLog-pr-13405.yml
new file mode 100644
index 0000000000..176e886b0d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13405.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - tweak: "the warp implant now actually warps you back 10 seconds. leaves a trail, though. now unlimited us."
diff --git a/html/changelogs/AutoChangeLog-pr-13444.yml b/html/changelogs/AutoChangeLog-pr-13444.yml
new file mode 100644
index 0000000000..d24babda2e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13444.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - tweak: "you can now get a family heirlooms based off your species instead of job"
diff --git a/html/changelogs/AutoChangeLog-pr-13472.yml b/html/changelogs/AutoChangeLog-pr-13472.yml
new file mode 100644
index 0000000000..8e8d043de6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13472.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - rscadd: "roundstart slimes can turn into puddles now"
diff --git a/html/changelogs/AutoChangeLog-pr-13496.yml b/html/changelogs/AutoChangeLog-pr-13496.yml
new file mode 100644
index 0000000000..30308efaff
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13496.yml
@@ -0,0 +1,4 @@
+author: "Detective-Google"
+delete-after: True
+changes:
+ - rscadd: "explosions now get broadcasted to deadchat."
diff --git a/html/changelogs/AutoChangeLog-pr-13498.yml b/html/changelogs/AutoChangeLog-pr-13498.yml
new file mode 100644
index 0000000000..f956ee4b07
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13498.yml
@@ -0,0 +1,5 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - tweak: "Changeling loudness is now determined as an average of all their abilities, rather than the sum"
+ - tweak: "To compensate for this, blood tests now require a loudness value of 1 or higher to detect ling blood. Additionally, blood test explosions are now triggered only when the loudness value is higher than 2."
diff --git a/html/changelogs/AutoChangeLog-pr-13500.yml b/html/changelogs/AutoChangeLog-pr-13500.yml
new file mode 100644
index 0000000000..7ba1eb64f3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13500.yml
@@ -0,0 +1,5 @@
+author: "LetterN"
+delete-after: True
+changes:
+ - rscadd: "2 more ways to get up from z1"
+ - tweak: "tweaked the z2 garden to be less blank"
diff --git a/html/changelogs/AutoChangeLog-pr-13501.yml b/html/changelogs/AutoChangeLog-pr-13501.yml
new file mode 100644
index 0000000000..dcdd868e37
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13501.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - bugfix: "Holofirelocks work now."
diff --git a/html/changelogs/AutoChangeLog-pr-13503.yml b/html/changelogs/AutoChangeLog-pr-13503.yml
new file mode 100644
index 0000000000..c68eaf44f0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13503.yml
@@ -0,0 +1,5 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - rscadd: "Survival daggers! A slightly more expensive survival knife that comes with a brighter flashlight. On the blade."
+ - tweak: "Luxury pod capsules look different from normal capsules."
diff --git a/html/changelogs/AutoChangeLog-pr-13504.yml b/html/changelogs/AutoChangeLog-pr-13504.yml
new file mode 100644
index 0000000000..7f59b120b6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13504.yml
@@ -0,0 +1,6 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - rscadd: "gravitokinetic stands from tg"
+ - balance: "buffs stands overall"
+ - bugfix: "protector stands no longer become tposing invisible apes sometimes"
diff --git a/html/changelogs/AutoChangeLog-pr-13509.yml b/html/changelogs/AutoChangeLog-pr-13509.yml
new file mode 100644
index 0000000000..e666a6b2a4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13509.yml
@@ -0,0 +1,6 @@
+author: "EmeraldSundisk"
+delete-after: True
+changes:
+ - balance: "The \"Skelter ruin\" now has stechkins as opposed to M1911s"
+ - tweak: "Skelter's decorative bullet casings replaced to factor in the change in caliber"
+ - rscadd: "Skelter now has a combat knife and fluff note"
diff --git a/html/changelogs/AutoChangeLog-pr-13511.yml b/html/changelogs/AutoChangeLog-pr-13511.yml
new file mode 100644
index 0000000000..e819d8752d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13511.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - imageadd: "The Syndicate appear to be issuing new revolver variants."
diff --git a/html/changelogs/AutoChangeLog-pr-13512.yml b/html/changelogs/AutoChangeLog-pr-13512.yml
new file mode 100644
index 0000000000..f96f13a156
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13512.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - bugfix: "Cryogenics now screams on common again when your fuckbuddy heads out."
diff --git a/html/changelogs/AutoChangeLog-pr-13513.yml b/html/changelogs/AutoChangeLog-pr-13513.yml
new file mode 100644
index 0000000000..0cff979e8c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13513.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - rscadd: "you can now pick your eye sprites from customization"
diff --git a/html/changelogs/AutoChangeLog-pr-13514.yml b/html/changelogs/AutoChangeLog-pr-13514.yml
new file mode 100644
index 0000000000..bd1605fb96
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13514.yml
@@ -0,0 +1,4 @@
+author: "Thalpy"
+delete-after: True
+changes:
+ - bugfix: "fixes some bugs in jacqs code from edits to the codebase"
diff --git a/html/changelogs/AutoChangeLog-pr-13516.yml b/html/changelogs/AutoChangeLog-pr-13516.yml
new file mode 100644
index 0000000000..30e22f4f48
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13516.yml
@@ -0,0 +1,4 @@
+author: "yorii"
+delete-after: True
+changes:
+ - bugfix: "fixed botany rounding error that caused grass and other plants to misbehave"
diff --git a/html/changelogs/AutoChangeLog-pr-13517.yml b/html/changelogs/AutoChangeLog-pr-13517.yml
new file mode 100644
index 0000000000..8f29517058
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13517.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - bugfix: "simple mobs are now immune to radioactive contamination"
diff --git a/html/changelogs/AutoChangeLog-pr-13519.yml b/html/changelogs/AutoChangeLog-pr-13519.yml
new file mode 100644
index 0000000000..0c4978a7d8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13519.yml
@@ -0,0 +1,4 @@
+author: "Detective-Google"
+delete-after: True
+changes:
+ - rscadd: "Lick radial"
diff --git a/html/changelogs/AutoChangeLog-pr-13523.yml b/html/changelogs/AutoChangeLog-pr-13523.yml
new file mode 100644
index 0000000000..ac2019bb88
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13523.yml
@@ -0,0 +1,4 @@
+author: "Detective-Google"
+delete-after: True
+changes:
+ - bugfix: "arcade carpets now actually work"
diff --git a/html/changelogs/AutoChangeLog-pr-13526.yml b/html/changelogs/AutoChangeLog-pr-13526.yml
new file mode 100644
index 0000000000..104b76bd94
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13526.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - bugfix: "vore prefs save now"
diff --git a/html/changelogs/AutoChangeLog-pr-13539.yml b/html/changelogs/AutoChangeLog-pr-13539.yml
new file mode 100644
index 0000000000..a1f3df4fd0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13539.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - rscdel: "removes two debug messages left in from my prior eye customization pr"
diff --git a/icons/mob/actions/actions_slime.dmi b/icons/mob/actions/actions_slime.dmi
index acf7a31c6e..59840650a5 100644
Binary files a/icons/mob/actions/actions_slime.dmi and b/icons/mob/actions/actions_slime.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
new file mode 100644
index 0000000000..be25096615
Binary files /dev/null and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/hair.dmi b/icons/mob/hair.dmi
new file mode 100644
index 0000000000..6dfa78fcff
Binary files /dev/null and b/icons/mob/hair.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 1e67d7baba..563dd6665c 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index 60978d55a2..173995e6c4 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index 794074bfe4..814ac9a396 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/icemoon/icemoon_monsters.dmi b/icons/mob/icemoon/icemoon_monsters.dmi
index 4f0b5df64a..02b39cc3c7 100644
Binary files a/icons/mob/icemoon/icemoon_monsters.dmi and b/icons/mob/icemoon/icemoon_monsters.dmi differ
diff --git a/icons/mob/inhands/weapons/hammers_lefthand.dmi b/icons/mob/inhands/weapons/hammers_lefthand.dmi
index b753a1f181..2027ee4205 100644
Binary files a/icons/mob/inhands/weapons/hammers_lefthand.dmi and b/icons/mob/inhands/weapons/hammers_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/hammers_righthand.dmi b/icons/mob/inhands/weapons/hammers_righthand.dmi
index 7650f6c760..7871911d4e 100644
Binary files a/icons/mob/inhands/weapons/hammers_righthand.dmi and b/icons/mob/inhands/weapons/hammers_righthand.dmi differ
diff --git a/icons/mob/lips.dmi b/icons/mob/lips.dmi
new file mode 100644
index 0000000000..4c00ac324a
Binary files /dev/null and b/icons/mob/lips.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 23f0e2cc13..10b733bae4 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 5a9e1e54b6..34f9867ee9 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 00670916db..939ee0e009 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index cb67f0d6f9..8cdff2214b 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 400c5bdfa0..ad0b74829f 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/supplypods.dmi b/icons/obj/supplypods.dmi
index d21da6d53a..68674c4006 100644
Binary files a/icons/obj/supplypods.dmi and b/icons/obj/supplypods.dmi differ
diff --git a/icons/obj/supplypods_32x32.dmi b/icons/obj/supplypods_32x32.dmi
new file mode 100644
index 0000000000..855132f649
Binary files /dev/null and b/icons/obj/supplypods_32x32.dmi differ
diff --git a/icons/radials/taperecorder.dmi b/icons/radials/taperecorder.dmi
new file mode 100644
index 0000000000..6230ab1363
Binary files /dev/null and b/icons/radials/taperecorder.dmi differ
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index f375fea88f..700449e86f 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -167,6 +167,7 @@ h1.alert, h2.alert {color: #000000;}
.clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.singing {font-family: "Trebuchet MS", cursive, sans-serif; font-style: italic;}
.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
+.spooky {color: #FF9100;}
.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;}
@keyframes velvet {
0% { color: #400020; }
diff --git a/tgstation.dme b/tgstation.dme
index 23f262d7a5..c27d68e7bc 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -22,6 +22,7 @@
#include "code\__DEFINES\_protect.dm"
#include "code\__DEFINES\_tick.dm"
#include "code\__DEFINES\access.dm"
+#include "code\__DEFINES\actionspeed_modifiers.dm"
#include "code\__DEFINES\admin.dm"
#include "code\__DEFINES\antagonists.dm"
#include "code\__DEFINES\atmospherics.dm"
@@ -338,6 +339,7 @@
#include "code\controllers\subsystem\radiation.dm"
#include "code\controllers\subsystem\radio.dm"
#include "code\controllers\subsystem\research.dm"
+#include "code\controllers\subsystem\runechat.dm"
#include "code\controllers\subsystem\server_maint.dm"
#include "code\controllers\subsystem\shuttle.dm"
#include "code\controllers\subsystem\sounds.dm"
@@ -410,6 +412,7 @@
#include "code\datums\spawners_menu.dm"
#include "code\datums\tgs_event_handler.dm"
#include "code\datums\verbs.dm"
+#include "code\datums\view.dm"
#include "code\datums\weakrefs.dm"
#include "code\datums\world_topic.dm"
#include "code\datums\actions\beam_rifle.dm"
@@ -1347,6 +1350,10 @@
#include "code\game\turfs\simulated\wall\reinf_walls.dm"
#include "code\game\turfs\space\space.dm"
#include "code\game\turfs\space\transit.dm"
+#include "code\modules\actionspeed\_actionspeed_modifier.dm"
+#include "code\modules\actionspeed\modifiers\base.dm"
+#include "code\modules\actionspeed\modifiers\mood.dm"
+#include "code\modules\actionspeed\modifiers\status_effects.dm"
#include "code\modules\admin\admin.dm"
#include "code\modules\admin\admin_investigate.dm"
#include "code\modules\admin\admin_ranks.dm"
@@ -2677,6 +2684,7 @@
#include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\fire.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\gravitokinetic.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\protector.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm"
@@ -2745,6 +2753,7 @@
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_demon.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_whelp.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\lobsterosity.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\polarbear.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\wolf.dm"
@@ -3289,6 +3298,7 @@
#include "code\modules\ruins\spaceruin_code\miracle.dm"
#include "code\modules\ruins\spaceruin_code\oldstation.dm"
#include "code\modules\ruins\spaceruin_code\originalcontent.dm"
+#include "code\modules\ruins\spaceruin_code\skelter.dm"
#include "code\modules\ruins\spaceruin_code\spacehotel.dm"
#include "code\modules\ruins\spaceruin_code\TheDerelict.dm"
#include "code\modules\ruins\spaceruin_code\whiteshipruin_box.dm"
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
index d84adf597f..cab5491cee 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
@@ -892,6 +892,10 @@ em {
font-style: italic;
}
+.spooky {
+ color: #FF9100;
+}
+
.hypnophrase {
color: #202020;
font-weight: bold;
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
index 2700ec01c1..5ba2930bcc 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
@@ -938,6 +938,10 @@ h1.alert, h2.alert {
font-style: italic;
}
+.spooky {
+ color: #FF9100;
+}
+
.hypnophrase {
color: #0d0d0d;
font-weight: bold;
diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher.js b/tgui/packages/tgui/interfaces/CentcomPodLauncher.js
index 05982b2fbf..a0d507e154 100644
--- a/tgui/packages/tgui/interfaces/CentcomPodLauncher.js
+++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher.js
@@ -1,518 +1,1135 @@
+import { toFixed } from 'common/math';
+import { classes } from 'common/react';
+import { storage } from 'common/storage';
import { multiline } from 'common/string';
-import { Fragment } from 'inferno';
-import { useBackend } from '../backend';
-import { Button, LabeledList, NoticeBox, Section } from '../components';
+import { createUuid } from 'common/uuid';
+import { Component } from 'inferno';
+import { useBackend, useLocalState } from '../backend';
+import { Box, Button, ByondUi, Divider, Flex, Fragment, Input, Knob, LabeledControls, NumberInput, Section } from '../components';
import { Window } from '../layouts';
-export const CentcomPodLauncher = () => {
+const pod_grey = {
+ color: 'grey',
+};
+
+const useCompact = context => {
+ const [compact, setCompact] = useLocalState(context, 'compact', false);
+ const toggleCompact = () => setCompact(!compact);
+ return [compact, toggleCompact];
+};
+
+export const CentcomPodLauncher = (props, context) => {
+ const [compact] = useCompact(context);
return (
+ blueprint pod and edit vars directly
+
+
+ NOTE: Custom sounds from outside the base game files will not save! :(
+
+
/gi,"\n").replace(/<\/?[a-z0-9-_]+[^>]*>/gi,"").replace(/&(nbsp|amp|quot|lt|gt|apos);/g,(function(e,n){return t[n]})).replace(/?([0-9]+);/gi,(function(e,t){var n=parseInt(t,10);return String.fromCharCode(n)})).replace(/?([0-9a-f]+);/gi,(function(e,t){var n=parseInt(t,16);return String.fromCharCode(n)}))};t.buildQueryString=function(e){return Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")}},function(e,t,n){"use strict";var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,n){"use strict";var r=n(53),o=n(66),i=n(18),a=n(12),c=n(72),u=[].push,s=function(e){var t=1==e,n=2==e,s=3==e,l=4==e,f=6==e,d=5==e||f;return function(p,h,g,v){for(var m,y,b=i(p),x=o(b),w=r(h,g,3),_=a(x.length),E=0,k=v||c,S=t?k(p,_):n?k(p,0):undefined;_>E;E++)if((d||E in x)&&(y=w(m=x[E],E,b),e))if(t)S[E]=y;else if(y)switch(e){case 3:return!0;case 5:return m;case 6:return E;case 2:u.call(S,m)}else if(l)return!1;return f?-1:s||l?l:S}};e.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6)}},function(e,t,n){"use strict";t.__esModule=!0,t.useSelector=t.useDispatch=t.createAction=t.combineReducers=t.applyMiddleware=t.createStore=void 0;n(0);var r=n(35);function o(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return i(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return i(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);nu||n!=n?l*Infinity:l*n}},function(e,t,n){"use strict";var r=n(7).isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&r(e)}},function(e,t,n){"use strict";var r=n(7),o=n(62).trim,i=n(92),a=r.parseFloat,c=1/a(i+"-0")!=-Infinity;e.exports=c?function(e){var t=o(String(e)),n=a(t);return 0===n&&"-"==t.charAt(0)?-0:n}:a},function(e,t,n){"use strict";var r=n(36);e.exports=function(e){if("number"!=typeof e&&"Number"!=r(e))throw TypeError("Incorrect invocation");return+e}},function(e,t,n){"use strict";var r=n(9),o=n(5),i=n(71),a=n(115),c=n(82),u=n(18),s=n(66),l=Object.assign,f=Object.defineProperty;e.exports=!l||o((function(){if(r&&1!==l({b:1},l(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol();return e[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(e){t[e]=e})),7!=l({},e)[n]||"abcdefghijklmnopqrst"!=i(l({},t)).join("")}))?function(e,t){for(var n=u(e),o=arguments.length,l=1,f=a.f,d=c.f;o>l;)for(var p,h=s(arguments[l++]),g=f?i(h).concat(f(h)):i(h),v=g.length,m=0;v>m;)p=g[m++],r&&!d.call(h,p)||(n[p]=h[p]);return n}:l},function(e,t,n){"use strict";var r=n(121),o=n(85);e.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},function(e,t,n){"use strict";var r=n(7);e.exports=function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},function(e,t,n){"use strict";var r=n(37);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},function(e,t,n){"use strict";t.__esModule=!0,t._CI=Ae,t._HI=B,t._M=Te,t._MCCC=Le,t._ME=Ie,t._MFCC=Ve,t._MP=Ce,t._MR=ye,t.__render=je,t.createComponentVNode=function(e,t,n,r,o){var a=new T(1,null,null,e=function(e,t){if(12&e)return e;if(t.prototype&&t.prototype.render)return 4;if(t.render)return 32776;return 8}(e,t),r,function(e,t,n){var r=(32768&e?t.render:t).defaultProps;if(i(r))return n;if(i(n))return l(r,null);return N(n,r)}(e,t,n),function(e,t,n){if(4&e)return n;var r=(32768&e?t.render:t).defaultHooks;if(i(r))return n;if(i(n))return r;return N(n,r)}(e,t,o),t);k.createVNode&&k.createVNode(a);return a},t.createFragment=M,t.createPortal=function(e,t){var n=B(e);return O(1024,1024,null,n,0,null,n.key,t)},t.createRef=function(){return{current:null}},t.createRenderer=function(e){return function(t,n,r,o){e||(e=t),Fe(n,e,r,o)}},t.createTextVNode=I,t.createVNode=O,t.directClone=L,t.findDOMfromVNode=b,t.forwardRef=function(e){return{render:e}},t.getFlagsForElementVnode=function(e){switch(e){case"svg":return 32;case"input":return 64;case"select":return 256;case"textarea":return 128;case"$F":return 8192;default:return 1}},t.linkEvent=function(e,t){if(c(t))return{data:e,event:t};return null},t.normalizeProps=function(e){var t=e.props;if(t){var n=e.flags;481&n&&(void 0!==t.children&&i(e.children)&&P(e,t.children),void 0!==t.className&&(e.className=t.className||null,t.className=undefined)),void 0!==t.key&&(e.key=t.key,t.key=undefined),void 0!==t.ref&&(e.ref=8&n?l(e.ref,t.ref):t.ref,t.ref=undefined)}return e},t.render=Fe,t.rerender=He,t.version=t.options=t.Fragment=t.EMPTY_OBJ=t.Component=void 0;var r=Array.isArray;function o(e){var t=typeof e;return"string"===t||"number"===t}function i(e){return null==e}function a(e){return null===e||!1===e||!0===e||void 0===e}function c(e){return"function"==typeof e}function u(e){return"string"==typeof e}function s(e){return null===e}function l(e,t){var n={};if(e)for(var r in e)n[r]=e[r];if(t)for(var o in t)n[o]=t[o];return n}function f(e){return!s(e)&&"object"==typeof e}var d={};t.EMPTY_OBJ=d;function p(e){return e.substr(2).toLowerCase()}function h(e,t){e.appendChild(t)}function g(e,t,n){s(n)?h(e,t):e.insertBefore(t,n)}function v(e,t){e.removeChild(t)}function m(e){for(var t=0;t
\n":"'+(n?e:Y(e,!0))+"
\n"},t.blockquote=function(e){return""+(n?e:Y(e,!0))+"\n"+e+"
\n"},t.html=function(e){return e},t.heading=function(e,t,n,r){return this.options.headerIds?"
\n":"
\n"},t.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+""+r+">\n"},t.listitem=function(e){return"\n\n"+e+"\n"+t+"
\n"},t.tablerow=function(e){return"\n"+e+" \n"},t.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+""+n+">\n"},t.strong=function(e){return""+e+""},t.em=function(e){return""+e+""},t.codespan=function(e){return""+e+""},t.br=function(){return this.options.xhtml?"
":"
"},t.del=function(e){return""+e+""},t.link=function(e,t,n){if(null===(e=z(this.options.sanitize,this.options.baseUrl,e)))return n;var r='"+n+""},t.image=function(e,t,n){if(null===(e=z(this.options.sanitize,this.options.baseUrl,e)))return n;var r='":">"},t.text=function(e){return e},e}(),$=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,n){return""+n},t.image=function(e,t,n){return""+n},t.br=function(){return""},e}(),H=function(){function e(){this.seen={}}return e.prototype.slug=function(e){var t=e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t)){var n=t;do{this.seen[n]++,t=n+"-"+this.seen[n]}while(this.seen.hasOwnProperty(t))}return this.seen[t]=0,t},e}(),W=r.defaults,q=w.unescape,G=function(){function e(e){this.options=e||W,this.options.renderer=this.options.renderer||new U,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new $,this.slugger=new H}e.parse=function(t,n){return new e(n).parse(t)};var t=e.prototype;return t.parse=function(e,t){void 0===t&&(t=!0);var n,r,o,i,a,c,u,s,l,f,d,p,h,g,v,m,y,b,x="",w=e.length;for(n=0;n
"+Q(u.message+"",!0)+"";throw u}}return ne.options=ne.setOptions=function(e){return X(ne.defaults,e),ee(ne.defaults),ne},ne.getDefaults=J,ne.defaults=te,ne.use=function(e){var t=X({},e);if(e.renderer&&function(){var n=ne.defaults.renderer||new U,r=function(t){var r=n[t];n[t]=function(){for(var o=arguments.length,i=new Array(o),a=0;a
'+(n?e:Y(e,!0))+"\n":""+(n?e:Y(e,!0))+"\n"},t.blockquote=function(e){return"\n"+e+"\n"},t.html=function(e){return e},t.heading=function(e,t,n,r){return this.options.headerIds?"
"+e+"
\n"},t.table=function(e,t){return t&&(t=""+t+""),""+e+""},t.br=function(){return this.options.xhtml?""+Q(u.message+"",!0)+"";throw u}}return ne.options=ne.setOptions=function(e){return X(ne.defaults,e),ee(ne.defaults),ne},ne.getDefaults=J,ne.defaults=te,ne.use=function(e){var t=X({},e);if(e.renderer&&function(){var n=ne.defaults.renderer||new U,r=function(t){var r=n[t];n[t]=function(){for(var o=arguments.length,i=new Array(o),a=0;a
'+(n?e:Y(e,!0))+"\n":""+(n?e:Y(e,!0))+"\n"},t.blockquote=function(e){return"\n"+e+"\n"},t.html=function(e){return e},t.heading=function(e,t,n,r){return this.options.headerIds?"
"+e+"
\n"},t.table=function(e,t){return t&&(t=""+t+""),""+e+""},t.br=function(){return this.options.xhtml?""+Q(u.message+"",!0)+"";throw u}}return ne.options=ne.setOptions=function(e){return X(ne.defaults,e),ee(ne.defaults),ne},ne.getDefaults=J,ne.defaults=te,ne.use=function(e){var t=X({},e);if(e.renderer&&function(){var n=ne.defaults.renderer||new U,r=function(t){var r=n[t];n[t]=function(){for(var o=arguments.length,i=new Array(o),a=0;a