diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm
index 6893a41517..1ea3f19c62 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm
@@ -167,7 +167,7 @@
/area/ruin/unpowered/xenonest)
"aM" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
"aQ" = (
@@ -260,7 +260,7 @@
/obj/structure/stone_tile/cracked{
dir = 1
},
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/indestructible/boss/air,
/area/ruin/unpowered/xenonest)
"be" = (
@@ -381,7 +381,7 @@
/obj/structure/stone_tile{
dir = 1
},
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/indestructible/boss/air,
/area/ruin/unpowered/xenonest)
"bs" = (
@@ -439,7 +439,7 @@
/obj/structure/stone_tile{
dir = 8
},
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/indestructible/boss/air,
/area/ruin/unpowered/xenonest)
"by" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
index 945ea515c7..fec70b215e 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
@@ -279,6 +279,7 @@
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
+
(1,1,1) = {"
a
a
diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
index f1a3005ce1..9c273f4d75 100644
--- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
+++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
@@ -1288,7 +1288,7 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/derelictoutpost/cargobay)
"cV" = (
-/obj/effect/decal/cleanable/xenoblood/xsplatter,
+/obj/effect/decal/cleanable/blood/splatter/xeno,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/derelictoutpost/cargobay)
"cW" = (
@@ -1525,7 +1525,7 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/derelictoutpost/cargobay)
"dq" = (
-/obj/effect/decal/cleanable/xenoblood/xsplatter,
+/obj/effect/decal/cleanable/blood/splatter/xeno,
/obj/structure/alien/weeds{
color = "#4BAE56";
desc = "A thick gelatinous surface covers the floor. Someone get the golashes.";
diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm
index 29bd7d0526..2f08d9a29e 100644
--- a/_maps/RandomZLevels/Academy.dmm
+++ b/_maps/RandomZLevels/Academy.dmm
@@ -3830,7 +3830,7 @@
/turf/open/floor/engine/cult,
/area/awaymission/academy/academycellar)
"kY" = (
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/engine/cult,
/area/awaymission/academy/academycellar)
"kZ" = (
diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm
index a25808d933..d50480c381 100644
--- a/_maps/RandomZLevels/caves.dmm
+++ b/_maps/RandomZLevels/caves.dmm
@@ -873,7 +873,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/plating{
initial_gas_mix = "n2=23;o2=14"
},
@@ -945,7 +945,7 @@
/area/awaymission/caves/research)
"cN" = (
/obj/machinery/door/window/eastleft,
-/obj/effect/decal/cleanable/xenoblood/xgibs,
+/obj/effect/decal/cleanable/blood/gibs/xeno,
/turf/open/floor/plating{
initial_gas_mix = "n2=23;o2=14"
},
@@ -1015,7 +1015,7 @@
},
/area/awaymission/caves/BMP_asteroid/level_two)
"cV" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs,
+/obj/effect/decal/cleanable/blood/gibs/xeno,
/turf/open/floor/plating{
initial_gas_mix = "n2=23;o2=14"
},
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index 7edc7b4518..c251a338a5 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -5597,8 +5597,8 @@
},
/area/awaymission/moonoutpost19/arrivals)
"kK" = (
-/obj/effect/decal/cleanable/xenoblood,
-/obj/effect/decal/cleanable/xenoblood/xgibs,
+/obj/effect/decal/cleanable/blood/xeno,
+/obj/effect/decal/cleanable/blood/gibs/xeno,
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
@@ -5608,7 +5608,7 @@
},
/area/awaymission/moonoutpost19/arrivals)
"kL" = (
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/effect/decal/remains/xeno{
desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated."
},
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 9c944ee1b7..125da46b81 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -34753,12 +34753,7 @@
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"bCO" = (
-/obj/structure/table,
-/obj/item/storage/box/bodybags{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/rxglasses,
+/obj/machinery/bloodbankgen,
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"bCP" = (
@@ -36538,6 +36533,11 @@
"bGR" = (
/obj/structure/table,
/obj/item/hand_labeler,
+/obj/item/storage/box/rxglasses,
+/obj/item/storage/box/bodybags{
+ pixel_x = 3;
+ pixel_y = 3
+ },
/obj/item/gun/syringe,
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index b0f513e41d..79b7561ebb 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -89232,7 +89232,7 @@
/area/maintenance/port)
"cTz" = (
/obj/effect/decal/remains/xeno,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/circuit/green,
/area/science/xenobiology)
"cTA" = (
@@ -93013,10 +93013,10 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cZK" = (
-/obj/item/twohanded/required/kirbyplants/random,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/obj/machinery/bloodbankgen,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cZL" = (
@@ -127842,8 +127842,7 @@
icon_state = "airlock_control_standby";
id = "chapelgun";
name = "Mass Driver Controller";
- pixel_x = -24;
- pixel_y = 0
+ pixel_x = -24
},
/turf/open/floor/plasteel/dark,
/area/chapel/office)
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 43c8b1155b..522d9801ca 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -56605,11 +56605,6 @@
/turf/open/floor/plasteel/dark,
/area/medical/sleeper)
"cfK" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -2;
- pixel_y = 4
- },
/obj/machinery/light_switch{
pixel_x = 11;
pixel_y = 23
@@ -56624,6 +56619,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/bloodbankgen,
/turf/open/floor/plasteel/dark,
/area/medical/sleeper)
"cfL" = (
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index 24a5cd834a..a87c17836c 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -30073,10 +30073,8 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone3)
"bbs" = (
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-21"
- },
/obj/effect/turf_decal/tile/blue,
+/obj/machinery/bloodbankgen,
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone3)
"bbt" = (
@@ -43077,7 +43075,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"vsf" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs,
+/obj/effect/decal/cleanable/blood/gibs/xeno,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 386ab45c6b..698eb6cd5a 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -24138,8 +24138,7 @@
dir = 8
},
/obj/machinery/keycard_auth{
- pixel_x = -23;
- pixel_y = 0
+ pixel_x = -23
},
/turf/open/floor/plasteel,
/area/quartermaster/qm)
@@ -31872,14 +31871,11 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-21";
- pixel_y = 3
- },
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/bloodbankgen,
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"bwG" = (
diff --git a/_maps/shuttles/arrival_box.dmm b/_maps/shuttles/arrival_box.dmm
index 4c63ce80b4..07644e5291 100644
--- a/_maps/shuttles/arrival_box.dmm
+++ b/_maps/shuttles/arrival_box.dmm
@@ -9,6 +9,7 @@
/obj/machinery/door/airlock/titanium{
name = "Arrivals Shuttle Airlock"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/arrival)
"d" = (
@@ -150,17 +151,21 @@
},
/turf/open/floor/plating/airless,
/area/shuttle/arrival)
+"B" = (
+/obj/machinery/porta_turret/centcom_shuttle,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/arrival)
"S" = (
/turf/open/floor/mineral/titanium,
/area/shuttle/arrival)
(1,1,1) = {"
a
-b
+B
o
d
d
-b
+B
a
"}
(2,1,1) = {"
diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm
index 4f883436a6..62e30ef335 100644
--- a/_maps/shuttles/arrival_delta.dmm
+++ b/_maps/shuttles/arrival_delta.dmm
@@ -165,6 +165,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
+/obj/structure/fans/tiny,
/turf/open/floor/plasteel/white,
/area/shuttle/arrival)
"o" = (
@@ -449,6 +450,10 @@
},
/turf/open/floor/plasteel,
/area/shuttle/arrival)
+"T" = (
+/obj/machinery/porta_turret/centcom_shuttle,
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/arrival)
"U" = (
/obj/machinery/computer{
dir = 1;
@@ -480,7 +485,7 @@
(1,1,1) = {"
a
-d
+T
f
g
n
@@ -632,7 +637,7 @@ a
"}
(9,1,1) = {"
a
-d
+T
f
g
n
diff --git a/_maps/shuttles/arrival_omega.dmm b/_maps/shuttles/arrival_omega.dmm
index c4eeecbecf..f580149163 100644
--- a/_maps/shuttles/arrival_omega.dmm
+++ b/_maps/shuttles/arrival_omega.dmm
@@ -87,6 +87,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 9
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/arrival)
"k" = (
diff --git a/_maps/shuttles/arrival_pubby.dmm b/_maps/shuttles/arrival_pubby.dmm
index c8e6427add..9932e9f3e8 100644
--- a/_maps/shuttles/arrival_pubby.dmm
+++ b/_maps/shuttles/arrival_pubby.dmm
@@ -9,6 +9,7 @@
/obj/machinery/door/airlock/titanium{
name = "Arrivals Shuttle Airlock"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/arrival)
"d" = (
@@ -139,16 +140,20 @@
},
/turf/open/floor/plating/airless,
/area/shuttle/arrival)
+"w" = (
+/obj/machinery/porta_turret/centcom_shuttle,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/arrival)
"C" = (
/turf/open/floor/mineral/titanium,
/area/shuttle/arrival)
(1,1,1) = {"
a
-b
+w
m
m
-b
+w
a
"}
(2,1,1) = {"
diff --git a/_maps/shuttles/emergency_airless.dmm b/_maps/shuttles/emergency_airless.dmm
index b69a11ee7b..47ef968c28 100644
--- a/_maps/shuttles/emergency_airless.dmm
+++ b/_maps/shuttles/emergency_airless.dmm
@@ -28,7 +28,7 @@
/turf/closed/wall,
/area/shuttle/escape)
"f" = (
-/turf/open/floor/plating/airless,
+/turf/open/floor/plating,
/area/shuttle/escape)
"g" = (
/obj/docking_port/mobile/emergency/shuttle_build{
@@ -39,32 +39,45 @@
preferred_direction = 2;
width = 30
},
-/turf/open/floor/plating/airless,
+/obj/machinery/door/airlock,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"h" = (
+/obj/machinery/computer/emergency_shuttle{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"K" = (
+/obj/machinery/door/airlock,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
/area/shuttle/escape)
(1,1,1) = {"
a
c
e
-f
-f
-f
-f
-f
-f
-f
-f
+e
+e
+e
+e
+e
+e
+K
+e
g
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
+e
+e
+e
+e
+e
+K
+e
+K
+e
+e
e
e
a
@@ -128,7 +141,7 @@ f
f
f
f
-f
+e
a
a
a
@@ -192,8 +205,8 @@ f
f
e
e
-f
-f
+e
+e
e
e
"}
@@ -257,7 +270,7 @@ f
f
f
f
-f
+e
"}
(8,1,1) = {"
c
@@ -288,7 +301,7 @@ f
f
f
f
-f
+e
"}
(9,1,1) = {"
b
@@ -318,8 +331,8 @@ f
f
f
f
-f
-f
+h
+e
"}
(10,1,1) = {"
b
@@ -350,7 +363,7 @@ f
f
f
f
-f
+e
"}
(11,1,1) = {"
c
@@ -381,7 +394,7 @@ f
f
f
f
-f
+e
"}
(12,1,1) = {"
b
@@ -412,7 +425,7 @@ f
f
f
f
-f
+e
"}
(13,1,1) = {"
b
@@ -471,8 +484,8 @@ f
f
e
e
-f
-f
+e
+e
e
e
"}
@@ -531,7 +544,7 @@ f
f
f
f
-f
+e
a
a
a
@@ -573,25 +586,25 @@ a
a
c
e
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
-f
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
e
e
a
diff --git a/_maps/shuttles/emergency_asteroid.dmm b/_maps/shuttles/emergency_asteroid.dmm
index 7687241791..1d76177190 100644
--- a/_maps/shuttles/emergency_asteroid.dmm
+++ b/_maps/shuttles/emergency_asteroid.dmm
@@ -2,6 +2,13 @@
"aa" = (
/turf/template_noop,
/area/template_noop)
+"ab" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
"ac" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/escape)
@@ -16,17 +23,7 @@
},
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
-"ah" = (
-/obj/effect/spawner/structure/window/shuttle,
-/turf/open/floor/plating,
-/area/shuttle/escape)
-"ai" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
- },
-/turf/open/floor/mineral/titanium,
-/area/shuttle/escape)
-"aj" = (
+"af" = (
/obj/machinery/door/airlock/titanium{
name = "Emergency Shuttle Airlock"
},
@@ -37,8 +34,13 @@
name = "Asteroid emergency shuttle";
width = 28
},
+/obj/structure/fans/tiny,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
+"ah" = (
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
"al" = (
/obj/machinery/door/airlock/titanium{
name = "Emergency Shuttle Airlock";
@@ -618,7 +620,7 @@ aa
aa
"}
(12,1,1) = {"
-ai
+ab
at
at
at
@@ -708,7 +710,7 @@ aa
aa
"}
(18,1,1) = {"
-aj
+af
at
at
at
diff --git a/_maps/shuttles/emergency_backup.dmm b/_maps/shuttles/emergency_backup.dmm
index 6b59c17ec1..d7aedbb2f5 100644
--- a/_maps/shuttles/emergency_backup.dmm
+++ b/_maps/shuttles/emergency_backup.dmm
@@ -5,9 +5,10 @@
},
/turf/open/floor/mineral/titanium,
/area/shuttle/escape/backup)
-"c" = (
+"b" = (
/obj/machinery/door/airlock/titanium,
/obj/docking_port/mobile/emergency/backup,
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape/backup)
"f" = (
@@ -55,7 +56,7 @@
(1,1,1) = {"
m
m
-c
+b
m
m
m
diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm
index 544e8891a4..7c14d9ebd0 100644
--- a/_maps/shuttles/emergency_bar.dmm
+++ b/_maps/shuttles/emergency_bar.dmm
@@ -10,15 +10,8 @@
/turf/open/floor/plating,
/area/shuttle/escape)
"ad" = (
-/obj/structure/table,
-/obj/machinery/chem_dispenser/drinks/beer{
- dir = 8
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/space/basic,
/area/shuttle/escape)
"ae" = (
/turf/closed/wall/mineral/titanium/nodiagonal,
@@ -45,19 +38,10 @@
pixel_x = -4;
pixel_y = 6
},
+/obj/item/reagent_containers/food/drinks/bottle/whiskey,
+/obj/item/storage/box/drinkingglasses,
/turf/open/floor/carpet,
/area/shuttle/escape)
-"aj" = (
-/obj/structure/table,
-/obj/machinery/chem_dispenser/drinks{
- dir = 8
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/escape)
"ak" = (
/obj/structure/extinguisher_cabinet{
pixel_y = 30
@@ -88,12 +72,6 @@
},
/turf/open/floor/carpet,
/area/shuttle/escape)
-"ap" = (
-/obj/machinery/computer/security{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/shuttle/escape)
"aq" = (
/obj/machinery/computer/crew{
dir = 4
@@ -122,17 +100,53 @@
pixel_x = 6;
pixel_y = -24
},
-/obj/structure/table/wood/poker,
-/obj/item/storage/box/drinkingglasses,
-/obj/item/reagent_containers/food/drinks/bottle/whiskey,
/obj/machinery/light,
/turf/open/floor/carpet,
/area/shuttle/escape)
"au" = (
-/obj/machinery/computer/communications{
- dir = 8
+/obj/structure/table,
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"av" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock";
+ req_access_txt = "2"
},
-/turf/open/floor/carpet,
+/obj/structure/fans/tiny,
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"aw" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ name = "The Emergency Escape Bar"
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
+"ax" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
+"ay" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel/freezer,
/area/shuttle/escape)
"az" = (
/obj/machinery/door/airlock/public/glass{
@@ -145,6 +159,12 @@
/obj/machinery/status_display/evac,
/turf/closed/wall/mineral/titanium,
/area/shuttle/escape)
+"aB" = (
+/obj/machinery/computer/security{
+ dir = 8
+ },
+/turf/open/floor/carpet,
+/area/shuttle/escape)
"aC" = (
/obj/structure/chair/comfy/shuttle,
/turf/open/floor/mineral/plastitanium/red/brig,
@@ -183,10 +203,10 @@
/turf/open/floor/plasteel/grimy,
/area/shuttle/escape)
"aG" = (
-/obj/structure/chair/stool{
- can_buckle = 1
+/obj/machinery/computer/communications{
+ dir = 8
},
-/turf/open/floor/plasteel/grimy,
+/turf/open/floor/carpet,
/area/shuttle/escape)
"aH" = (
/obj/machinery/flasher{
@@ -220,11 +240,10 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"aK" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock";
- req_access_txt = "2"
+/obj/structure/chair/stool{
+ can_buckle = 1
},
-/turf/open/floor/mineral/plastitanium/red/brig,
+/turf/open/floor/plasteel/grimy,
/area/shuttle/escape)
"aL" = (
/obj/structure/extinguisher_cabinet{
@@ -267,6 +286,12 @@
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
+"aQ" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/escape)
"aR" = (
/obj/structure/table/wood/bar{
boot_dir = 8
@@ -278,6 +303,15 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"aS" = (
+/obj/structure/table/wood/bar,
+/obj/item/instrument/guitar,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
+"aT" = (
/obj/structure/extinguisher_cabinet{
pixel_x = 27
},
@@ -290,19 +324,6 @@
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
-"aT" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
- },
-/obj/docking_port/mobile/emergency{
- name = "The Emergency Escape Bar"
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/escape)
"aU" = (
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
@@ -311,6 +332,17 @@
/mob/living/simple_animal/hostile/alien/maid/barmaid,
/turf/open/floor/plasteel,
/area/shuttle/escape)
+"aV" = (
+/obj/structure/table,
+/obj/machinery/chem_dispenser/drinks/beer{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
"aW" = (
/obj/structure/chair/wood/normal,
/turf/open/floor/plasteel/grimy,
@@ -341,6 +373,17 @@
/obj/effect/spawner/lootdrop/gambling,
/turf/open/floor/plasteel/grimy,
/area/shuttle/escape)
+"bb" = (
+/obj/structure/table,
+/obj/machinery/chem_dispenser/drinks{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
"bc" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-21";
@@ -369,10 +412,29 @@
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
-"bg" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
+"bf" = (
+/obj/structure/table,
+/obj/item/storage/box/drinkingglasses,
+/obj/item/reagent_containers/food/drinks/shaker,
+/obj/item/storage/fancy/cigarettes/cigars/havana,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
},
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
+"bg" = (
+/obj/item/twohanded/required/kirbyplants{
+ icon_state = "plant-10"
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
+"bh" = (
+/obj/machinery/vending/cigarette,
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
@@ -382,13 +444,24 @@
"bi" = (
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
+"bj" = (
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/escape)
"bk" = (
-/obj/machinery/vending/cigarette,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
+/obj/machinery/sleeper{
+ dir = 8
},
-/turf/open/floor/plasteel,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"bl" = (
+/obj/machinery/sleeper{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"bm" = (
/obj/machinery/door/airlock{
@@ -402,10 +475,13 @@
/turf/closed/wall/mineral/titanium,
/area/shuttle/escape)
"bo" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
+/obj/structure/table,
+/obj/item/storage/firstaid/fire,
+/obj/item/storage/firstaid/brute{
+ pixel_x = 4;
+ pixel_y = 4
},
-/turf/open/floor/plasteel/freezer,
+/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"bp" = (
/turf/open/floor/plasteel/freezer,
@@ -417,10 +493,8 @@
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"br" = (
-/obj/machinery/sleeper{
- dir = 8
- },
-/turf/open/floor/mineral/titanium,
+/obj/machinery/computer/card,
+/turf/open/floor/carpet,
/area/shuttle/escape)
"bs" = (
/obj/machinery/door/airlock{
@@ -442,7 +516,6 @@
/area/shuttle/escape)
"bw" = (
/obj/structure/table/optable,
-/obj/item/surgical_drapes,
/obj/machinery/light/small{
brightness = 3;
dir = 8
@@ -465,15 +538,12 @@
},
/turf/open/floor/plasteel/freezer,
/area/shuttle/escape)
-"bz" = (
-/obj/structure/table,
-/obj/item/circular_saw,
-/obj/item/hemostat,
-/obj/item/retractor,
-/obj/item/scalpel,
-/obj/item/surgicaldrill,
-/obj/item/cautery,
-/turf/open/floor/mineral/titanium,
+"bA" = (
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/bar,
+/turf/open/floor/plasteel,
/area/shuttle/escape)
"bC" = (
/obj/structure/window/reinforced{
@@ -486,10 +556,6 @@
/obj/structure/shuttle/engine/propulsion,
/turf/open/floor/plating/airless,
/area/shuttle/escape)
-"bF" = (
-/obj/effect/spawner/structure/window/shuttle,
-/turf/open/floor/plasteel/freezer,
-/area/shuttle/escape)
"bG" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-21";
@@ -505,15 +571,6 @@
"bH" = (
/turf/open/floor/plasteel/grimy,
/area/shuttle/escape)
-"bI" = (
-/obj/structure/table/wood/bar,
-/obj/item/instrument/guitar,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/escape)
"bJ" = (
/obj/structure/table/wood/bar,
/obj/item/storage/fancy/donut_box,
@@ -535,17 +592,6 @@
},
/turf/open/floor/plasteel/grimy,
/area/shuttle/escape)
-"bN" = (
-/obj/structure/table,
-/obj/item/storage/box/drinkingglasses,
-/obj/item/reagent_containers/food/drinks/shaker,
-/obj/item/storage/fancy/cigarettes/cigars/havana,
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/escape)
"bO" = (
/obj/structure/table/wood/bar,
/obj/item/folder/red,
@@ -584,25 +630,6 @@
},
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
-"bT" = (
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-10"
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/escape)
-"bU" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/fire,
-/obj/item/storage/firstaid/brute{
- pixel_x = 4;
- pixel_y = 4
- },
-/turf/open/floor/mineral/titanium,
-/area/shuttle/escape)
"bV" = (
/obj/structure/table/wood/bar{
boot_dir = 8
@@ -616,12 +643,6 @@
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
-"bW" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/escape)
"bX" = (
/obj/machinery/light{
dir = 8
@@ -658,15 +679,6 @@
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
-"cb" = (
-/obj/machinery/sleeper{
- dir = 8
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/mineral/titanium,
-/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -676,17 +688,17 @@ aa
ab
ab
ab
-aK
+av
ab
-aT
+aw
ab
ac
ac
ac
ab
-bg
+ax
ab
-bo
+ay
ab
ab
ab
@@ -703,11 +715,11 @@ aH
aL
ab
bY
-bH
-aZ
-bc
-aZ
-bH
+bA
+bA
+bA
+bA
+bA
bZ
ab
bp
@@ -727,11 +739,11 @@ aI
aM
ab
aE
-aW
-ba
-bL
-bO
-bQ
+bH
+aZ
+bc
+aZ
+bH
bR
ab
bp
@@ -752,9 +764,9 @@ aM
ab
aE
aW
-bJ
-bM
-bP
+ba
+bL
+bO
bQ
aE
ab
@@ -775,11 +787,11 @@ aJ
ac
ae
aE
-bH
-bK
-bH
-bK
-bH
+aW
+bJ
+bM
+bP
+bQ
aE
aA
bp
@@ -799,11 +811,11 @@ aE
aE
bX
aE
-aE
-aE
-aE
-aE
-aE
+bH
+bK
+bH
+bK
+bH
aE
bm
bp
@@ -814,10 +826,34 @@ bE
"}
(7,1,1) = {"
ac
-ag
+br
an
an
az
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+ae
+ae
+ab
+ab
+bC
+bE
+"}
+(8,1,1) = {"
+ad
+ag
+an
+an
+ab
aE
aE
aN
@@ -830,13 +866,13 @@ aN
aE
ca
ae
-ab
-ab
-ab
+bw
+bi
+au
bC
bE
"}
-(8,1,1) = {"
+(9,1,1) = {"
ac
ai
ao
@@ -855,16 +891,16 @@ aN
aE
bn
bi
-bw
-bz
+bi
+bi
bC
bE
"}
-(9,1,1) = {"
+(10,1,1) = {"
ab
ae
-ap
-au
+aB
+aG
ab
aF
bH
@@ -884,32 +920,32 @@ bS
bC
bE
"}
-(10,1,1) = {"
-aa
-ab
-ab
-ab
-ab
-aG
-bW
-bI
-aS
-ad
-aY
-aj
-bN
-be
-bT
-bk
-bF
-br
-cb
-bU
-ab
-ab
-"}
(11,1,1) = {"
aa
+ab
+ab
+ab
+ab
+aK
+aQ
+aS
+aT
+aV
+aY
+bb
+bf
+be
+bg
+bh
+bj
+bk
+bl
+bo
+ab
+ab
+"}
+(12,1,1) = {"
+aa
aa
aa
aa
diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm
index 940d655f43..43a6a85bf7 100644
--- a/_maps/shuttles/emergency_birdboat.dmm
+++ b/_maps/shuttles/emergency_birdboat.dmm
@@ -112,6 +112,11 @@
/obj/machinery/light,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
+"w" = (
+/obj/machinery/door/airlock/titanium,
+/obj/structure/fans/tiny,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
"x" = (
/obj/structure/table,
/obj/machinery/recharger{
@@ -197,6 +202,7 @@
width = 14;
name = "Birdboat emergency escape shuttle"
},
+/obj/structure/fans/tiny,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"L" = (
@@ -574,7 +580,7 @@ p
u
b
b
-G
+w
K
b
b
diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm
index 19c1bf7720..349e1130f8 100644
--- a/_maps/shuttles/emergency_box.dmm
+++ b/_maps/shuttles/emergency_box.dmm
@@ -2,6 +2,14 @@
"aa" = (
/turf/template_noop,
/area/template_noop)
+"ab" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock";
+ req_access_txt = "2"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
"ac" = (
/obj/effect/spawner/structure/window/shuttle,
/turf/open/floor/plating,
@@ -37,6 +45,23 @@
/obj/item/storage/firstaid/fire,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
+"aj" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ name = "Box emergency shuttle"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"ak" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
"al" = (
/obj/machinery/computer/atmos_alert{
dir = 4
@@ -171,13 +196,6 @@
},
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
-"aI" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock";
- req_access_txt = "2"
- },
-/turf/open/floor/mineral/plastitanium/red/brig,
-/area/shuttle/escape)
"aJ" = (
/obj/structure/chair/comfy/shuttle{
dir = 1
@@ -192,15 +210,6 @@
/obj/structure/table,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
-"aP" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
- },
-/obj/docking_port/mobile/emergency{
- name = "Box emergency shuttle"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"aQ" = (
/obj/structure/extinguisher_cabinet{
pixel_x = -5;
@@ -235,12 +244,6 @@
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
-"aV" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"aW" = (
/obj/structure/extinguisher_cabinet{
pixel_y = -30
@@ -362,10 +365,19 @@
"ga" = (
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
+"gJ" = (
+/obj/structure/table/optable,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
"XC" = (
/obj/structure/closet/emcloset,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
+"ZQ" = (
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/obj/structure/table,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -375,17 +387,17 @@ aa
ad
ad
ad
-aI
+ab
ad
-aP
+aj
ad
ac
ac
ac
ad
-aV
+ak
ad
-aV
+ak
ad
ad
ad
@@ -531,7 +543,7 @@ aC
ac
XC
bs
-XC
+gJ
bi
bk
"}
@@ -555,7 +567,7 @@ aC
aZ
ga
ga
-ga
+ZQ
bi
bk
"}
diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm
index 47ad888f11..23de211226 100644
--- a/_maps/shuttles/emergency_cere.dmm
+++ b/_maps/shuttles/emergency_cere.dmm
@@ -507,6 +507,35 @@
/obj/item/book/manual/wiki/security_space_law,
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
+"aW" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Airlock";
+ req_access_txt = "2"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aX" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ dheight = 0;
+ dwidth = 15;
+ height = 20;
+ name = "Cere emergency shuttle";
+ width = 42
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aY" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
"aZ" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -639,13 +668,6 @@
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
-"bv" = (
-/obj/machinery/door/airlock/shuttle{
- name = "Emergency Shuttle Airlock";
- req_access_txt = "2"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"bw" = (
/obj/structure/chair/comfy/shuttle{
dir = 1
@@ -696,19 +718,6 @@
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
-"bE" = (
-/obj/machinery/door/airlock/shuttle{
- name = "Emergency Shuttle Airlock"
- },
-/obj/docking_port/mobile/emergency{
- dheight = 0;
- dwidth = 15;
- height = 20;
- name = "Cere emergency shuttle";
- width = 42
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"bF" = (
/obj/structure/closet/crate/bin,
/obj/effect/turf_decal/tile/neutral{
@@ -936,12 +945,6 @@
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
-"bY" = (
-/obj/machinery/door/airlock/shuttle{
- name = "Emergency Shuttle Airlock"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"bZ" = (
/obj/structure/extinguisher_cabinet{
pixel_x = -28
@@ -1291,26 +1294,17 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/circular_saw,
-/obj/item/scalpel{
- pixel_y = 12
- },
-/obj/item/hemostat,
-/obj/item/surgicaldrill,
-/obj/item/cautery{
- pixel_x = 4
- },
-/obj/item/retractor,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
+/obj/item/storage/backpack/duffelbag/med/surgery,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"cG" = (
@@ -1361,15 +1355,13 @@
/obj/item/clothing/suit/apron/surgical,
/obj/item/clothing/gloves/color/latex,
/obj/item/clothing/mask/surgical,
-/obj/item/surgical_drapes,
-/obj/item/razor,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
/obj/effect/turf_decal/tile/blue{
dir = 8
},
@@ -1762,17 +1754,17 @@ ab
ab
ab
ab
-bv
+aW
ab
-bE
+aX
ab
aa
aa
aa
ab
-bY
+aY
ab
-bY
+aY
ab
aa
aa
diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm
index d2329af155..666746ad20 100644
--- a/_maps/shuttles/emergency_clown.dmm
+++ b/_maps/shuttles/emergency_clown.dmm
@@ -117,6 +117,23 @@
},
/turf/open/floor/mineral/bananium,
/area/shuttle/escape)
+"aw" = (
+/obj/machinery/door/airlock/bananium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ name = "Snappop(tm)!"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"ax" = (
+/obj/machinery/door/airlock/bananium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
"ay" = (
/obj/structure/table,
/obj/item/storage/firstaid/fire,
@@ -137,6 +154,8 @@
/obj/machinery/door/airlock/bananium/glass{
name = "Emergency Shuttle Greentext"
},
+/obj/structure/fans/tiny,
+/obj/structure/barricade/wooden/crude,
/turf/open/floor/bluespace,
/area/shuttle/escape)
"aC" = (
@@ -170,15 +189,6 @@
/obj/item/toy/sword,
/turf/open/floor/mineral/bananium,
/area/shuttle/escape)
-"aI" = (
-/obj/machinery/door/airlock/bananium{
- name = "Emergency Shuttle Airlock"
- },
-/obj/docking_port/mobile/emergency{
- name = "Snappop(tm)!"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"aJ" = (
/obj/item/toy/snappop/phoenix,
/obj/machinery/light/small{
@@ -233,12 +243,6 @@
},
/turf/open/floor/mineral/bananium,
/area/shuttle/escape)
-"aQ" = (
-/obj/machinery/door/airlock/bananium{
- name = "Emergency Shuttle Airlock"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"aR" = (
/obj/item/toy/snappop/phoenix,
/obj/machinery/light/small,
@@ -338,6 +342,11 @@
/obj/structure/shuttle/engine/propulsion,
/turf/open/floor/plating/airless,
/area/shuttle/escape)
+"bL" = (
+/obj/item/toy/snappop/phoenix,
+/obj/item/pneumatic_cannon/pie/selfcharge,
+/turf/open/floor/bluespace,
+/area/shuttle/escape)
"Zf" = (
/obj/structure/closet/emcloset,
/obj/item/toy/sword,
@@ -354,15 +363,15 @@ ab
ab
ab
ab
-aI
+aw
ab
ac
ac
ac
ab
-aQ
+ax
ab
-aQ
+ax
ab
ab
ab
@@ -467,7 +476,7 @@ bg
(6,1,1) = {"
ac
ag
-ak
+bL
aq
ab
av
diff --git a/_maps/shuttles/emergency_cramped.dmm b/_maps/shuttles/emergency_cramped.dmm
index 863b5bd088..08ac96bf69 100644
--- a/_maps/shuttles/emergency_cramped.dmm
+++ b/_maps/shuttles/emergency_cramped.dmm
@@ -11,6 +11,7 @@
name = "Emergency Shuttle Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"d" = (
@@ -64,6 +65,7 @@
name = "Secure Transport Vessel 5";
width = 14
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"l" = (
@@ -97,6 +99,7 @@
/obj/machinery/door/airlock/titanium{
name = "Emergency Shuttle Airlock"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"r" = (
diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm
index 471232a295..564115443d 100644
--- a/_maps/shuttles/emergency_delta.dmm
+++ b/_maps/shuttles/emergency_delta.dmm
@@ -147,7 +147,6 @@
/area/shuttle/escape)
"al" = (
/obj/structure/table/optable,
-/obj/item/surgical_drapes,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
@@ -157,18 +156,7 @@
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"am" = (
-/obj/item/scalpel{
- pixel_y = 12
- },
-/obj/item/circular_saw,
-/obj/item/retractor{
- pixel_x = 4
- },
-/obj/item/hemostat{
- pixel_x = -4
- },
-/obj/item/clothing/gloves/color/latex,
-/obj/item/clothing/mask/surgical,
+/obj/item/storage/backpack/duffelbag/med/surgery,
/obj/structure/table/reinforced,
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -176,8 +164,6 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/obj/item/surgicaldrill,
-/obj/item/cautery,
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"an" = (
@@ -490,6 +476,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/structure/fans/tiny,
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"aP" = (
@@ -562,6 +549,7 @@
preferred_direction = 2;
port_direction = 4
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"aX" = (
@@ -796,6 +784,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/structure/fans/tiny,
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"bw" = (
@@ -908,6 +897,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/structure/fans/tiny,
/turf/open/floor/plasteel,
/area/shuttle/escape)
"bM" = (
diff --git a/_maps/shuttles/emergency_discoinferno.dmm b/_maps/shuttles/emergency_discoinferno.dmm
index 025a7cf743..e142208e12 100644
--- a/_maps/shuttles/emergency_discoinferno.dmm
+++ b/_maps/shuttles/emergency_discoinferno.dmm
@@ -83,6 +83,7 @@
/obj/machinery/door/airlock/gold{
req_access_txt = "19"
},
+/obj/structure/fans/tiny,
/turf/open/floor/mineral/gold,
/area/shuttle/escape)
"q" = (
@@ -110,6 +111,7 @@
heat_proof = 1;
resistance_flags = 2
},
+/obj/structure/fans/tiny,
/turf/open/floor/mineral/plasma,
/area/shuttle/escape)
"v" = (
@@ -118,6 +120,7 @@
/area/shuttle/escape)
"w" = (
/obj/machinery/door/airlock/gold,
+/obj/structure/fans/tiny,
/turf/open/floor/wood,
/area/shuttle/escape)
"x" = (
@@ -220,6 +223,11 @@
"O" = (
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/shuttle/escape)
+"P" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel/elevatorshaft,
+/area/shuttle/escape)
(1,1,1) = {"
a
@@ -262,7 +270,7 @@ r
r
r
q
-c
+P
x
C
I
@@ -274,7 +282,7 @@ b
b
h
m
-c
+P
r
r
r
@@ -286,7 +294,7 @@ r
r
r
r
-c
+P
x
D
D
@@ -298,7 +306,7 @@ c
d
i
i
-c
+P
r
r
r
@@ -310,7 +318,7 @@ j
r
r
r
-c
+P
x
x
x
@@ -322,7 +330,7 @@ c
e
j
j
-c
+P
r
r
s
@@ -334,7 +342,7 @@ j
s
r
r
-c
+P
y
E
y
@@ -346,7 +354,7 @@ c
f
j
n
-c
+P
r
j
j
@@ -358,7 +366,7 @@ t
j
j
r
-c
+P
z
F
J
@@ -382,7 +390,7 @@ j
s
r
r
-c
+P
y
G
y
@@ -394,7 +402,7 @@ c
g
k
k
-c
+P
r
r
r
@@ -406,7 +414,7 @@ j
r
r
r
-c
+P
x
x
x
@@ -418,7 +426,7 @@ b
b
l
o
-c
+P
r
r
r
@@ -430,7 +438,7 @@ r
r
r
r
-c
+P
A
x
K
@@ -454,7 +462,7 @@ r
r
r
q
-c
+P
B
H
L
diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency_goon.dmm
index 8e254729e8..be7408793c 100644
--- a/_maps/shuttles/emergency_goon.dmm
+++ b/_maps/shuttles/emergency_goon.dmm
@@ -28,6 +28,7 @@
/obj/machinery/door/airlock/titanium{
name = "Emergency Shuttle Airlock"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"h" = (
@@ -41,6 +42,7 @@
name = "NES Port";
width = 19
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"l" = (
@@ -67,9 +69,7 @@
/turf/open/floor/plating,
/area/shuttle/escape)
"q" = (
-/obj/machinery/sleeper{
- dir = 4
- },
+/obj/machinery/sleeper,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"r" = (
@@ -93,11 +93,6 @@
},
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
-"v" = (
-/obj/structure/table,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/mineral/titanium/white,
-/area/shuttle/escape)
"w" = (
/obj/machinery/door/airlock/public/glass{
name = "Emergency Shuttle Infirmary"
@@ -186,12 +181,18 @@
/obj/structure/window/reinforced,
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
+"P" = (
+/obj/structure/table/optable,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
"Q" = (
/obj/machinery/light,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"R" = (
/obj/machinery/light/small,
+/obj/structure/table,
+/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"S" = (
@@ -272,8 +273,8 @@ X
c
d
q
-v
-q
+n
+P
d
H
H
@@ -284,7 +285,7 @@ Y
(4,1,1) = {"
d
l
-n
+q
n
R
d
diff --git a/_maps/shuttles/emergency_gorilla.dmm b/_maps/shuttles/emergency_gorilla.dmm
new file mode 100644
index 0000000000..abfcea8257
--- /dev/null
+++ b/_maps/shuttles/emergency_gorilla.dmm
@@ -0,0 +1,630 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/turf/template_noop,
+/area/template_noop)
+"ab" = (
+/turf/closed/wall/rust,
+/area/shuttle/escape)
+"ac" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/turf/open/floor/plasteel/elevatorshaft,
+/area/shuttle/escape)
+"ad" = (
+/turf/closed/wall,
+/area/shuttle/escape)
+"ae" = (
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"af" = (
+/obj/machinery/computer/emergency_shuttle,
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"ag" = (
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"ah" = (
+/obj/machinery/computer/atmos_alert{
+ dir = 4
+ },
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"ai" = (
+/obj/structure/chair/office/dark,
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"aj" = (
+/obj/structure/chair/comfy/brown{
+ dir = 1
+ },
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"ak" = (
+/obj/item/chair,
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"al" = (
+/obj/machinery/computer/security{
+ dir = 8
+ },
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"am" = (
+/obj/machinery/computer/crew{
+ dir = 4
+ },
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"an" = (
+/obj/machinery/light,
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"ao" = (
+/obj/machinery/computer/communications{
+ dir = 8
+ },
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"ap" = (
+/obj/machinery/status_display/evac,
+/turf/closed/wall/rust,
+/area/shuttle/escape)
+"aq" = (
+/obj/machinery/door/airlock/gold{
+ req_access_txt = "19"
+ },
+/turf/open/floor/holofloor/wood,
+/area/shuttle/escape)
+"ar" = (
+/obj/structure/urinal{
+ pixel_y = 31
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"as" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"at" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"au" = (
+/obj/machinery/deepfryer,
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"av" = (
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"aw" = (
+/obj/structure/closet/crate/freezer/blood,
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/escape)
+"ax" = (
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"ay" = (
+/obj/machinery/flasher{
+ id = "shuttle_flasher";
+ pixel_x = -24;
+ pixel_y = 6
+ },
+/obj/machinery/button/flasher{
+ id = "shuttle_flasher";
+ pixel_x = -24;
+ pixel_y = -6
+ },
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"az" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"aA" = (
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"aB" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Emergency Shuttle Brig";
+ req_access_txt = "2"
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"aC" = (
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/escape)
+"aD" = (
+/obj/structure/closet,
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/escape)
+"aE" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Emergency Shuttle Airlock";
+ req_access_txt = "2"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aF" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"aG" = (
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/escape)
+"aH" = (
+/obj/structure/noticeboard,
+/turf/closed/wall/rust,
+/area/shuttle/escape)
+"aI" = (
+/obj/docking_port/mobile/emergency{
+ height = 15;
+ name = "Gorilla Emergency Shuttle"
+ },
+/obj/machinery/door/airlock/security/glass{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aJ" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -5;
+ pixel_y = 30
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aK" = (
+/obj/structure/closet/crate/trashcart,
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"aL" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"aM" = (
+/obj/structure/reagent_dispensers/keg/mead,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aN" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aO" = (
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"aP" = (
+/obj/structure/fluff/broken_flooring,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aQ" = (
+/obj/structure/closet/crate/freezer,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aR" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"aS" = (
+/obj/effect/decal/cleanable/vomit/old,
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"aT" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"aU" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/escape)
+"aV" = (
+/obj/effect/decal/cleanable/blood/innards,
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/escape)
+"aW" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aX" = (
+/obj/structure/closet/crate/freezer/surplus_limbs,
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/escape)
+"aY" = (
+/obj/effect/decal/cleanable/oil,
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/escape)
+"aZ" = (
+/obj/structure/closet/crate/freezer,
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/escape)
+"ba" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"bb" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bc" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = -30
+ },
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"bd" = (
+/obj/structure/closet/toolcloset,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"be" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/structure/chair/sofa/right,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bf" = (
+/obj/structure/chair/sofa,
+/mob/living/simple_animal/hostile/gorilla,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bg" = (
+/obj/structure/chair/sofa,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bh" = (
+/obj/structure/chair/sofa,
+/mob/living/simple_animal/hostile/gorilla,
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"bi" = (
+/obj/structure/chair/sofa/left,
+/mob/living/simple_animal/hostile/gorilla,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bj" = (
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bk" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Emergency Shuttle Brig";
+ req_access_txt = "2"
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bl" = (
+/mob/living/simple_animal/hostile/gorilla,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bm" = (
+/obj/effect/decal/cleanable/blood/gibs/limb,
+/mob/living/simple_animal/hostile/gorilla,
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"bn" = (
+/obj/structure/reagent_dispensers/keg/semen,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bo" = (
+/obj/structure/closet/crate/freezer/surplus_limbs,
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"bp" = (
+/obj/structure/closet/crate/freezer/surplus_limbs,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bq" = (
+/mob/living/simple_animal/hostile/gorilla,
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"br" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"bs" = (
+/obj/structure/shuttle/engine/heater,
+/obj/structure/window/plasma/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"bt" = (
+/turf/template_noop,
+/area/space)
+"bu" = (
+/obj/structure/shuttle/engine/propulsion,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+aE
+ab
+aI
+ab
+at
+at
+at
+ab
+bb
+ab
+bb
+ab
+ad
+ad
+bt
+"}
+(2,1,1) = {"
+aa
+ad
+ab
+ad
+ab
+ar
+ay
+aA
+aH
+ax
+aN
+aR
+aW
+aR
+ba
+av
+ad
+ax
+ax
+bo
+ab
+ab
+"}
+(3,1,1) = {"
+ab
+ab
+ah
+am
+ap
+as
+az
+aF
+ab
+aJ
+av
+aS
+av
+ax
+av
+bc
+ab
+bd
+bj
+bp
+bs
+bu
+"}
+(4,1,1) = {"
+ac
+ae
+ai
+ae
+ab
+as
+aA
+aF
+ad
+aK
+av
+aP
+av
+av
+ax
+ab
+ad
+ab
+bk
+ab
+bs
+bu
+"}
+(5,1,1) = {"
+ac
+ae
+ae
+ak
+ab
+at
+aB
+at
+ab
+aL
+av
+aT
+aT
+aT
+aT
+ac
+ac
+be
+aN
+bl
+bs
+bu
+"}
+(6,1,1) = {"
+ac
+af
+aj
+an
+ad
+au
+av
+av
+av
+av
+aO
+ab
+ab
+ad
+ab
+ad
+ad
+bf
+bl
+bq
+bs
+bu
+"}
+(7,1,1) = {"
+ac
+ae
+ae
+ae
+aq
+av
+ax
+av
+av
+aM
+aP
+aU
+aC
+aX
+aD
+ad
+ad
+bg
+bm
+bn
+bs
+bu
+"}
+(8,1,1) = {"
+ac
+ag
+ak
+ae
+ab
+ab
+ad
+ad
+ab
+ad
+ab
+ab
+aC
+aY
+aX
+ad
+ad
+bh
+aP
+bq
+bs
+bu
+"}
+(9,1,1) = {"
+ab
+ad
+al
+ao
+ab
+aw
+aC
+ax
+aG
+aC
+aD
+aC
+ax
+aZ
+ax
+ac
+ac
+bg
+bl
+br
+bs
+bu
+"}
+(10,1,1) = {"
+aa
+ad
+ab
+ad
+ab
+ax
+aD
+aG
+aD
+aC
+aQ
+aV
+aC
+aX
+aD
+ad
+ab
+bi
+bn
+bl
+ab
+ab
+"}
+(11,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ad
+ab
+ab
+ad
+ab
+ad
+ab
+ad
+ad
+ab
+ad
+ab
+ab
+ad
+ad
+aa
+"}
diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm
index 1fd515fb76..2834f0c93f 100644
--- a/_maps/shuttles/emergency_luxury.dmm
+++ b/_maps/shuttles/emergency_luxury.dmm
@@ -3,94 +3,90 @@
/turf/template_noop,
/area/template_noop)
"ab" = (
-/turf/closed/indestructible/riveted/uranium,
+/obj/structure/table/wood/fancy,
+/obj/item/toy/cards/deck,
+/turf/open/floor/carpet/red,
/area/shuttle/escape/luxury)
"ac" = (
-/obj/machinery/door/airlock/external,
-/turf/open/floor/wood{
- icon_state = "wood-broken2"
- },
+/turf/closed/wall/mineral/gold,
/area/shuttle/escape/luxury)
"ad" = (
/obj/machinery/door/airlock/gold,
-/obj/effect/forcefield/luxury_shuttle{
- name = "Ticket Booth"
- },
-/turf/open/floor/mineral/gold,
+/obj/structure/fans/tiny,
+/turf/open/floor/carpet/red,
/area/shuttle/escape/luxury)
"ae" = (
/obj/docking_port/mobile/emergency{
dir = 2;
dwidth = 5;
height = 14;
+ movement_force = list("KNOCKDOWN" = 3, "THROW" = 0);
name = "Luxury emergency shuttle";
width = 25
},
/obj/machinery/door/airlock/gold,
-/obj/effect/forcefield/luxury_shuttle{
- name = "Ticket Booth"
- },
-/turf/open/floor/mineral/gold,
+/obj/structure/fans/tiny,
+/turf/open/floor/carpet/red,
/area/shuttle/escape/luxury)
"af" = (
-/turf/open/floor/wood{
- icon_state = "wood-broken3"
- },
+/turf/open/floor/carpet/red,
/area/shuttle/escape/luxury)
"ag" = (
-/turf/open/floor/wood,
+/obj/machinery/light{
+ dir = 4;
+ light_range = 8
+ },
+/turf/open/floor/carpet/red,
/area/shuttle/escape/luxury)
"ah" = (
-/turf/open/floor/wood{
- icon_state = "wood-broken"
- },
+/turf/open/floor/plasteel/white,
/area/shuttle/escape/luxury)
"ai" = (
-/turf/open/floor/wood{
- icon_state = "wood-broken5"
+/obj/structure/chair/comfy{
+ dir = 8
},
+/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape/luxury)
"aj" = (
-/turf/open/floor/mineral/gold,
+/obj/machinery/door/airlock/gold/glass{
+ name = "shuttle brig";
+ req_access_txt = "2"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape/luxury)
"ak" = (
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-10"
- },
-/turf/open/floor/mineral/gold,
-/area/shuttle/escape/luxury)
-"al" = (
-/obj/structure/mirror{
- pixel_y = 32
- },
-/turf/open/floor/mineral/gold,
-/area/shuttle/escape/luxury)
-"am" = (
-/turf/open/floor/wood{
- icon_state = "wood-broken7"
- },
-/area/shuttle/escape/luxury)
-"an" = (
-/obj/machinery/light/small,
-/turf/open/floor/wood{
- icon_state = "wood-broken2"
- },
-/area/shuttle/escape/luxury)
-"ao" = (
-/obj/machinery/light/small,
-/turf/open/floor/wood{
- icon_state = "wood-broken6"
- },
-/area/shuttle/escape/luxury)
-"ap" = (
-/obj/structure/toilet{
+/obj/structure/chair/comfy{
dir = 4
},
-/turf/open/floor/mineral/gold,
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape/luxury)
+"al" = (
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape/luxury)
+"am" = (
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape/luxury)
+"an" = (
+/turf/open/floor/carpet/royalblack,
+/area/shuttle/escape/luxury)
+"ao" = (
+/obj/structure/chair/comfy,
+/turf/open/floor/carpet/royalblack,
+/area/shuttle/escape/luxury)
+"ap" = (
+/obj/machinery/light{
+ dir = 4;
+ light_range = 8
+ },
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aq" = (
-/obj/machinery/door/airlock/gold,
-/turf/open/floor/mineral/gold,
+/obj/machinery/light{
+ dir = 4;
+ light_range = 8
+ },
+/turf/open/floor/plasteel/white,
/area/shuttle/escape/luxury)
"ar" = (
/obj/structure/shuttle/engine/propulsion{
@@ -108,647 +104,768 @@
/turf/open/floor/plating/airless,
/area/shuttle/escape/luxury)
"at" = (
-/turf/open/floor/carpet,
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/snacks/meatballspaghetti,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"au" = (
-/obj/structure/chair/comfy,
-/turf/open/floor/carpet,
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/snacks/notasandwich,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"av" = (
-/obj/structure/chair/comfy{
- dir = 4
- },
-/turf/open/floor/mineral/gold,
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/snacks/pastatomato,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aw" = (
-/obj/machinery/computer/communications{
- dir = 8
- },
-/turf/open/floor/mineral/gold,
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/snacks/kebab/tofu,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"ax" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/meatballspaghetti,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/honkdae,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"ay" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/notasandwich,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/enchiladas,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"az" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/pastatomato,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/candiedapple,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aA" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/kebab/tofu,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/burger/baconburger,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aB" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/honkdae,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/benedict,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aC" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/enchiladas,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/cakeslice/chocolate,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aD" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/candiedapple,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/chowmein,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aE" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/burger/baconburger,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/dulcedebatataslice,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aF" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/benedict,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/salad/validsalad,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aG" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/cakeslice/chocolate,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/carneburrito,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aH" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/chowmein,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/chawanmushi,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aI" = (
-/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/dulcedebatataslice,
-/turf/open/floor/carpet,
+/obj/structure/mirror{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/white,
/area/shuttle/escape/luxury)
"aJ" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/salad/validsalad,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/melonfruitbowl,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aK" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/carneburrito,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/khachapuri,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aL" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/chawanmushi,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/grilledcheese,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aM" = (
-/obj/machinery/computer/emergency_shuttle{
- dir = 8
- },
-/turf/open/floor/mineral/gold,
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/snacks/jelliedtoast/cherry,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aN" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/melonfruitbowl,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/honeybun,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aO" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/khachapuri,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/eggplantparm,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aP" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/grilledcheese,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/copypasta,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aQ" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/jelliedtoast/cherry,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/bearsteak,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aR" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/honeybun,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/boiledspaghetti,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aS" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/eggplantparm,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/cherrycupcake,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aT" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/copypasta,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/customizable/pizza,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aU" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/bearsteak,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/hotdog,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aV" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/boiledspaghetti,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/pie/grapetart,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aW" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/cherrycupcake,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/burger/superbite,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aX" = (
/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/customizable/pizza,
-/turf/open/floor/carpet,
+/obj/item/reagent_containers/food/snacks/cakeslice/slimecake,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
"aY" = (
-/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/hotdog,
-/turf/open/floor/carpet,
+/obj/structure/chair/comfy{
+ dir = 4
+ },
+/turf/open/floor/carpet/royalblue,
/area/shuttle/escape/luxury)
"aZ" = (
-/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/pie/grapetart,
-/turf/open/floor/carpet,
-/area/shuttle/escape/luxury)
-"ba" = (
-/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/burger/superbite,
-/turf/open/floor/carpet,
-/area/shuttle/escape/luxury)
-"bb" = (
-/obj/structure/table/wood/fancy,
-/obj/item/reagent_containers/food/snacks/cakeslice/slimecake,
-/turf/open/floor/carpet,
-/area/shuttle/escape/luxury)
-"bc" = (
-/obj/machinery/computer/station_alert{
+/obj/machinery/computer/communications{
dir = 8
},
-/turf/open/floor/mineral/gold,
+/turf/open/floor/carpet/royalblue,
/area/shuttle/escape/luxury)
-"bd" = (
+"ba" = (
/obj/structure/chair/comfy{
dir = 1
},
-/turf/open/floor/carpet,
+/turf/open/floor/carpet/royalblack,
/area/shuttle/escape/luxury)
-"be" = (
-/obj/machinery/computer/crew{
+"bb" = (
+/obj/machinery/computer/emergency_shuttle{
dir = 8
},
-/turf/open/floor/mineral/gold,
+/turf/open/floor/carpet/royalblue,
/area/shuttle/escape/luxury)
-"bf" = (
+"bc" = (
/obj/machinery/sleeper{
dir = 4
},
-/turf/open/floor/mineral/gold,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bd" = (
+/obj/machinery/computer/station_alert{
+ dir = 8
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape/luxury)
+"be" = (
+/turf/open/floor/wood,
+/area/shuttle/escape/luxury)
+"bf" = (
+/obj/machinery/computer/crew{
+ dir = 8
+ },
+/turf/open/floor/carpet/royalblue,
/area/shuttle/escape/luxury)
"bg" = (
/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-21";
- pixel_x = -3;
- pixel_y = 3
+ icon_state = "plant-10"
},
-/turf/open/floor/mineral/gold,
+/turf/open/floor/carpet/red,
/area/shuttle/escape/luxury)
"bh" = (
/turf/open/floor/plating/beach/coastline_b,
/area/shuttle/escape/luxury)
"bi" = (
-/obj/machinery/light,
-/turf/open/floor/mineral/gold,
+/obj/machinery/door/airlock/gold/glass{
+ req_access_txt = "19"
+ },
+/turf/open/floor/carpet/royalblue,
/area/shuttle/escape/luxury)
"bj" = (
-/obj/machinery/light{
- dir = 8
+/obj/item/twohanded/required/kirbyplants{
+ icon_state = "plant-21";
+ pixel_x = -3;
+ pixel_y = 3
},
-/turf/open/floor/mineral/gold,
+/turf/open/floor/wood,
/area/shuttle/escape/luxury)
"bk" = (
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/mineral/gold,
-/area/shuttle/escape/luxury)
-"bl" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-10"
},
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/mineral/gold,
+/turf/open/floor/carpet/royalblue,
/area/shuttle/escape/luxury)
-"bp" = (
+"bl" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
},
/obj/machinery/light,
-/turf/open/floor/mineral/gold,
+/turf/open/floor/wood,
+/area/shuttle/escape/luxury)
+"bm" = (
+/obj/structure/chair/comfy,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bn" = (
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/drinks/bottle/wine,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bo" = (
+/obj/structure/chair/comfy{
+ dir = 1
+ },
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bp" = (
+/obj/item/toy/cards/deck/cas/black,
+/obj/structure/table/wood/fancy,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bq" = (
+/obj/structure/table/wood/fancy,
+/obj/item/toy/cards/deck/cas,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"br" = (
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/drinks/bottle/whiskey,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bs" = (
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/drinks/bottle/grappa,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bt" = (
+/obj/structure/table/optable,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bu" = (
+/obj/machinery/door/airlock/gold/glass,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bv" = (
+/obj/structure/table/plasmaglass,
+/obj/item/storage/firstaid/brute,
+/obj/item/storage/firstaid/fire,
+/obj/item/storage/firstaid/toxin,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bw" = (
+/obj/structure/table/plasmaglass,
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bx" = (
+/obj/machinery/door/airlock/gold,
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape/luxury)
+"by" = (
+/obj/structure/toilet{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape/luxury)
+"bz" = (
+/obj/machinery/shower{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape/luxury)
+"bA" = (
+/obj/structure/bed,
+/turf/open/floor/wood,
+/area/shuttle/escape/luxury)
+"bC" = (
+/obj/machinery/vending/coffee,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bD" = (
+/obj/machinery/vending/boozeomat/all_access,
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bE" = (
+/obj/machinery/light{
+ dir = 1;
+ light_range = 8
+ },
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bF" = (
+/obj/machinery/light{
+ dir = 4;
+ light_range = 8
+ },
+/obj/item/twohanded/required/kirbyplants{
+ icon_state = "plant-10"
+ },
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/luxury)
+"bG" = (
+/obj/machinery/light{
+ light_range = 8
+ },
+/turf/open/floor/plating/beach/coastline_b,
+/area/shuttle/escape/luxury)
+"bH" = (
+/obj/machinery/light{
+ dir = 1;
+ light_range = 8
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape/luxury)
+"bI" = (
+/obj/machinery/light{
+ light_range = 8
+ },
+/turf/open/floor/carpet/royalblue,
+/area/shuttle/escape/luxury)
+"Uj" = (
+/obj/machinery/door/airlock/gold/glass{
+ name = "shuttle brig";
+ req_access_txt = "2"
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape/luxury)
(1,1,1) = {"
-aa
-ab
-ab
-ab
-ab
+ac
+ac
+ac
+ac
+ac
ar
ar
ar
ar
-ab
-ab
-ab
-ab
+ac
+ac
+ac
+ac
aa
"}
(2,1,1) = {"
-ab
-ab
-am
-ab
-ab
+ac
+bz
+ah
+by
+ac
as
as
as
as
-ab
-bf
-bf
-ab
-ab
+ac
+bc
+bc
+ac
+ac
"}
(3,1,1) = {"
-ab
+ac
+aI
+ah
+aq
+ac
+ac
+ac
+ac
+ac
+ac
af
-ag
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aj
-aj
-ab
-ab
+af
+bv
+ac
"}
(4,1,1) = {"
-ab
-ag
+ac
+ac
+bx
+ac
+ac
an
-ab
-bl
-aj
-aj
-aj
-aj
-bj
-aj
-aj
-ak
-ab
+an
+an
+an
+bu
+af
+af
+bt
+ac
"}
(5,1,1) = {"
-ab
-ag
-ag
-ab
-aj
-at
-at
-at
-at
-aj
-aj
-aj
-aj
-ab
-"}
-(6,1,1) = {"
-ab
-ag
-ag
-ab
-aj
-au
-ax
-aN
-bd
-aj
-aj
-bg
-bp
-ab
-"}
-(7,1,1) = {"
-ab
-ah
-ag
-ab
-aj
-au
-ay
-aO
-bd
-aj
-aj
-bh
-bh
-ab
-"}
-(8,1,1) = {"
-ab
-ag
-ag
-ab
-aj
-au
-az
-aP
-bd
-aj
-aj
-bh
-bh
-ab
-"}
-(9,1,1) = {"
-ab
-ag
-ag
-ab
-aj
-au
-aA
-aQ
-bd
-aj
-aj
-bh
-bh
-ab
-"}
-(10,1,1) = {"
-ab
-ai
-ao
-ab
-aj
-au
-aB
-aR
-bd
-aj
-aj
-bh
-bh
-ab
-"}
-(11,1,1) = {"
-ab
-ag
-ag
-ab
-aj
-au
-aC
-aS
-bd
-aj
-aj
-bh
-bh
-ab
-"}
-(12,1,1) = {"
ac
+af
+af
+af
+bg
+ao
+at
+aJ
+ba
+bu
ag
af
-ab
-aj
-au
-aD
-aT
-bd
-aj
-aj
-bh
-bh
-ab
+bw
+ac
"}
-(13,1,1) = {"
-ab
-ab
-ab
-ab
-aj
-au
-aE
-aU
-bd
-aj
-aj
-bh
-bh
-ab
-"}
-(14,1,1) = {"
-ad
-aj
-aj
-bj
-aj
-au
-aF
-aV
-bd
-aj
-aj
-bh
-bh
-ab
-"}
-(15,1,1) = {"
-ab
-aj
-aj
-aj
-aj
-au
-aG
-aW
-bd
-aj
-aj
-bh
-bh
-ab
-"}
-(16,1,1) = {"
-ab
-aj
-aj
-aj
-aj
-au
-aH
-aX
-bd
-aj
-aj
-bh
-bh
-ab
-"}
-(17,1,1) = {"
-ab
-aj
-aj
-aj
-aj
-au
-aI
-aY
-bd
-aj
-aj
-bh
-bh
-ab
-"}
-(18,1,1) = {"
-ab
-aj
-aj
-aj
-aj
-au
-aJ
-aZ
-bd
-aj
-aj
-bh
-bh
-ab
-"}
-(19,1,1) = {"
-ab
-aj
-aj
-aj
-aj
+(6,1,1) = {"
+ac
+bE
+af
+af
+af
+ao
au
aK
ba
-bd
-aj
-aj
+ac
+ac
+ac
+ac
+ac
+"}
+(7,1,1) = {"
+ac
+af
+af
+af
+af
+ao
+av
+aL
+ba
+af
+be
+bj
+bj
+ac
+"}
+(8,1,1) = {"
+ac
+bm
+bn
+bo
+af
+ao
+aw
+aM
+ba
+af
+be
bh
bh
+ac
+"}
+(9,1,1) = {"
+ac
+bm
ab
+bo
+af
+ao
+ax
+aN
+ba
+af
+bA
+bh
+bh
+ac
+"}
+(10,1,1) = {"
+ac
+bm
+br
+bo
+af
+ao
+ay
+aO
+ba
+af
+bA
+bh
+bh
+ac
+"}
+(11,1,1) = {"
+ac
+bE
+af
+af
+af
+ao
+az
+aP
+ba
+af
+bA
+bh
+bG
+ac
+"}
+(12,1,1) = {"
+ad
+af
+af
+af
+af
+ao
+aA
+aQ
+ba
+af
+bA
+bh
+bh
+ac
+"}
+(13,1,1) = {"
+ac
+bg
+af
+af
+af
+ao
+aB
+aR
+ba
+af
+bA
+bh
+bh
+ac
+"}
+(14,1,1) = {"
+ad
+af
+af
+af
+af
+ao
+aC
+aS
+ba
+af
+bA
+bh
+bh
+ac
+"}
+(15,1,1) = {"
+ac
+bE
+af
+af
+af
+ao
+aD
+aT
+ba
+af
+bA
+bh
+bG
+ac
+"}
+(16,1,1) = {"
+ac
+bm
+bs
+bo
+af
+ao
+aE
+aU
+ba
+af
+bA
+bh
+bh
+ac
+"}
+(17,1,1) = {"
+ac
+bm
+bp
+bo
+af
+ao
+aF
+aV
+ba
+af
+bA
+bh
+bh
+ac
+"}
+(18,1,1) = {"
+ac
+bm
+bq
+bo
+af
+ao
+aG
+aW
+ba
+af
+bA
+bh
+bh
+ac
+"}
+(19,1,1) = {"
+ac
+bE
+af
+af
+af
+ao
+aH
+aX
+ba
+af
+be
+bh
+bh
+ac
"}
(20,1,1) = {"
ae
-aj
-aj
-bk
-aj
-au
-aL
-bb
-bd
-aj
-aj
-bg
-bp
-ab
+af
+af
+af
+bF
+an
+an
+ap
+an
+af
+be
+bj
+bl
+ac
"}
(21,1,1) = {"
-ab
-ab
-ab
-ab
-aj
-at
-at
-at
-at
-aj
-aj
-aj
-aj
-ab
+ac
+ac
+ac
+ac
+ac
+af
+af
+ac
+ac
+ac
+ac
+ac
+ac
+ac
"}
(22,1,1) = {"
-ab
+aj
+al
ak
-ap
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-ab
+ak
+ac
+af
+af
+bi
+am
+am
+am
+am
+am
+ac
"}
(23,1,1) = {"
-ab
-aj
-bi
-ab
-aj
-av
-av
-av
-av
-aj
-aj
-aj
-aj
-ab
+ac
+bH
+al
+al
+Uj
+af
+af
+ac
+aY
+aY
+aY
+aY
+bI
+ac
"}
(24,1,1) = {"
-ab
-al
-aj
-aq
+ac
+ai
+ai
+ai
+ac
+bC
+bD
+ac
+aZ
+bb
+bd
+bf
bk
-aw
-aM
-bc
-be
-bk
-aj
-aj
-ak
-ab
+ac
"}
(25,1,1) = {"
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
"}
diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm
index 0a357d2308..8df487714e 100644
--- a/_maps/shuttles/emergency_meta.dmm
+++ b/_maps/shuttles/emergency_meta.dmm
@@ -2,6 +2,13 @@
"aa" = (
/turf/template_noop,
/area/template_noop)
+"ab" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
"ac" = (
/obj/effect/spawner/structure/window/shuttle,
/turf/open/floor/plating,
@@ -9,17 +16,7 @@
"ad" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/escape)
-"af" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/escape)
-"ag" = (
-/obj/structure/sign/warning/nosmoking,
-/turf/closed/wall/mineral/titanium,
-/area/shuttle/escape)
-"ah" = (
+"ae" = (
/obj/machinery/door/airlock/titanium{
name = "Emergency Shuttle Airlock"
},
@@ -30,8 +27,21 @@
name = "Meta emergency shuttle";
width = 25
},
+/obj/structure/fans/tiny,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
+"af" = (
+/obj/machinery/door/airlock/external{
+ name = "Emergency Recovery Airlock"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
+"ag" = (
+/obj/structure/sign/warning/nosmoking,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
"al" = (
/obj/structure/table,
/obj/item/phone{
@@ -513,7 +523,6 @@
/area/shuttle/escape)
"bz" = (
/obj/structure/table/optable,
-/obj/item/surgical_drapes,
/obj/machinery/light{
dir = 8
},
@@ -576,25 +585,12 @@
/area/shuttle/escape)
"bH" = (
/obj/structure/table,
-/obj/item/scalpel{
- pixel_y = 12
- },
-/obj/item/circular_saw,
-/obj/item/retractor{
- pixel_x = 4
- },
-/obj/item/hemostat{
- pixel_x = -4
- },
-/obj/item/clothing/gloves/color/latex,
-/obj/item/clothing/mask/surgical,
+/obj/item/storage/backpack/duffelbag/med/surgery,
/obj/item/radio/intercom{
dir = 2;
name = "Station Intercom (General)";
pixel_x = -27
},
-/obj/item/surgicaldrill,
-/obj/item/cautery,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"bI" = (
@@ -939,7 +935,7 @@ be
cc
be
be
-bf
+af
"}
(6,1,1) = {"
ac
@@ -955,7 +951,7 @@ bf
bT
be
be
-bf
+af
"}
(7,1,1) = {"
ac
@@ -1038,7 +1034,7 @@ bF
ac
"}
(12,1,1) = {"
-af
+ab
LY
LY
aE
@@ -1070,7 +1066,7 @@ ad
ad
"}
(14,1,1) = {"
-af
+ab
LY
LY
aE
@@ -1166,7 +1162,7 @@ bM
ad
"}
(20,1,1) = {"
-ah
+ae
LY
LY
aE
@@ -1198,7 +1194,7 @@ bO
ac
"}
(22,1,1) = {"
-af
+ab
LY
LY
LY
diff --git a/_maps/shuttles/emergency_mini.dmm b/_maps/shuttles/emergency_mini.dmm
index 1be681e5b3..5e1157062a 100644
--- a/_maps/shuttles/emergency_mini.dmm
+++ b/_maps/shuttles/emergency_mini.dmm
@@ -113,6 +113,21 @@
/obj/machinery/door/airlock/titanium{
name = "Emergency Shuttle Airlock"
},
+/obj/structure/fans/tiny,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"v" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ dir = 8;
+ dwidth = 8;
+ height = 9;
+ name = "Mini emergency shuttle";
+ width = 21
+ },
+/obj/structure/fans/tiny,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"x" = (
@@ -145,19 +160,6 @@
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
-"B" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
- },
-/obj/docking_port/mobile/emergency{
- dir = 8;
- dwidth = 8;
- height = 9;
- name = "Mini emergency shuttle";
- width = 21
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/escape)
"D" = (
/obj/structure/table,
/obj/item/storage/firstaid/fire,
@@ -453,7 +455,7 @@ b
n
b
b
-B
+v
b
b
b
diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm
index 80046340e8..8adbd6f392 100644
--- a/_maps/shuttles/emergency_narnar.dmm
+++ b/_maps/shuttles/emergency_narnar.dmm
@@ -6,7 +6,8 @@
/turf/closed/wall/mineral/cult,
/area/shuttle/escape)
"c" = (
-/obj/effect/forcefield/cult,
+/obj/machinery/door/airlock/cult/friendly,
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"d" = (
@@ -125,6 +126,10 @@
/area/shuttle/escape)
"x" = (
/obj/machinery/door/airlock/cult/friendly,
+/obj/docking_port/mobile/emergency{
+ name = "shuttle 667"
+ },
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"y" = (
@@ -156,13 +161,6 @@
/obj/effect/decal/remains/human,
/turf/open/floor/plasteel/cult,
/area/shuttle/escape)
-"E" = (
-/obj/machinery/door/airlock/cult/friendly,
-/obj/docking_port/mobile/emergency{
- name = "shuttle 667"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"F" = (
/obj/effect/decal/cleanable/blood/gibs/down,
/turf/open/floor/plasteel/cult,
@@ -262,6 +260,10 @@
/obj/structure/shuttle/engine/propulsion,
/turf/open/floor/plating/airless,
/area/shuttle/escape)
+"W" = (
+/obj/effect/spawner/structure/window/plastitanium,
+/turf/open/floor/plating,
+/area/shuttle/escape)
(1,1,1) = {"
a
@@ -271,17 +273,17 @@ a
b
b
b
-x
-b
-E
-b
-c
-c
c
b
x
b
-x
+W
+W
+W
+b
+c
+b
+c
b
b
b
@@ -336,7 +338,7 @@ U
V
"}
(4,1,1) = {"
-c
+W
d
i
n
@@ -360,7 +362,7 @@ U
V
"}
(5,1,1) = {"
-c
+W
e
j
o
@@ -384,7 +386,7 @@ U
V
"}
(6,1,1) = {"
-c
+W
f
j
j
@@ -408,7 +410,7 @@ U
V
"}
(7,1,1) = {"
-c
+W
e
j
j
@@ -424,7 +426,7 @@ j
j
K
L
-c
+W
t
j
t
@@ -432,7 +434,7 @@ U
V
"}
(8,1,1) = {"
-c
+W
g
k
k
@@ -472,7 +474,7 @@ A
j
j
j
-c
+W
j
j
j
@@ -496,7 +498,7 @@ j
j
j
M
-c
+W
P
Q
P
@@ -509,21 +511,21 @@ a
a
a
b
-c
+W
b
-c
+W
b
b
b
-c
-c
-c
+W
+W
+W
b
b
b
-c
+W
b
-c
+W
b
a
"}
diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm
index 1601c97020..bd99f35bb5 100644
--- a/_maps/shuttles/emergency_omega.dmm
+++ b/_maps/shuttles/emergency_omega.dmm
@@ -185,6 +185,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
+/obj/structure/fans/tiny,
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"ar" = (
@@ -287,6 +288,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/structure/fans/tiny,
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"az" = (
@@ -509,6 +511,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
+/obj/structure/fans/tiny,
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"aQ" = (
@@ -782,41 +785,27 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"bn" = (
-/obj/item/scalpel{
- pixel_y = 12
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
},
-/obj/item/circular_saw,
-/obj/item/retractor{
- pixel_x = 4
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
},
-/obj/item/hemostat{
- pixel_x = -4
- },
-/obj/item/clothing/gloves/color/latex,
-/obj/item/clothing/mask/surgical,
/obj/structure/table/reinforced,
/obj/structure/extinguisher_cabinet{
pixel_x = -24
},
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/item/cautery,
-/obj/item/surgicaldrill,
+/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"bo" = (
/obj/structure/table/optable,
-/obj/item/surgical_drapes,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"bp" = (
diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm
index dc58ecf201..7b4bcc71f5 100644
--- a/_maps/shuttles/emergency_pubby.dmm
+++ b/_maps/shuttles/emergency_pubby.dmm
@@ -58,6 +58,29 @@
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
+"am" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"an" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ dir = 8;
+ dwidth = 27;
+ height = 8;
+ name = "PubbyStation emergency shuttle";
+ port_direction = 4;
+ preferred_direction = 1;
+ width = 46
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
"ap" = (
/obj/structure/chair/comfy,
/obj/machinery/computer/security/telescreen/entertainment{
@@ -133,12 +156,6 @@
"ax" = (
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
-"ay" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"az" = (
/obj/structure/chair/comfy{
dir = 1
@@ -440,14 +457,12 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"aZ" = (
-/obj/structure/table/glass,
+/obj/machinery/sleeper,
/obj/machinery/light{
dir = 1
},
-/obj/item/storage/firstaid/regular,
/obj/structure/window/reinforced{
- dir = 4;
- layer = 2.9
+ dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -487,13 +502,18 @@
/turf/open/floor/plasteel/cafeteria,
/area/shuttle/escape)
"be" = (
-/obj/structure/chair/comfy/shuttle,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
+/obj/structure/table,
+/obj/item/storage/firstaid,
+/obj/item/storage/firstaid/fire{
+ pixel_x = -3;
+ pixel_y = 3
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"bf" = (
@@ -509,30 +529,12 @@
/turf/open/floor/plating,
/area/shuttle/escape)
"bh" = (
-/obj/structure/window/reinforced,
-/obj/structure/table/glass,
-/obj/item/defibrillator/loaded,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/turf/open/floor/plasteel/white,
-/area/shuttle/escape)
-"bi" = (
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/table/glass,
-/obj/item/storage/firstaid/regular,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"bj" = (
@@ -551,11 +553,8 @@
/turf/open/floor/plating,
/area/shuttle/escape)
"bn" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
+/obj/structure/reagent_dispensers/fueltank,
/obj/machinery/light,
-/obj/item/storage/toolbox/mechanical,
/turf/open/floor/plating,
/area/shuttle/escape)
"bo" = (
@@ -675,21 +674,6 @@
},
/turf/open/floor/plating,
/area/shuttle/escape)
-"bL" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
- },
-/obj/docking_port/mobile/emergency{
- dir = 8;
- dwidth = 27;
- height = 8;
- name = "PubbyStation emergency shuttle";
- port_direction = 4;
- preferred_direction = 1;
- width = 46
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"bO" = (
/obj/machinery/door/airlock/public/glass{
name = "Cockpit";
@@ -710,6 +694,21 @@
},
/turf/open/floor/plating,
/area/shuttle/escape)
+"sI" = (
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/obj/structure/table,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
"xt" = (
/obj/structure/window/reinforced{
dir = 8;
@@ -717,6 +716,17 @@
},
/turf/open/floor/plating,
/area/shuttle/escape)
+"Jw" = (
+/obj/structure/window/reinforced,
+/obj/structure/table/optable,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/escape)
"Uu" = (
/obj/structure/window/reinforced{
dir = 4
@@ -804,9 +814,9 @@ aX
bb
be
bh
+Jw
+bg
bl
-bg
-bg
ab
aa
bs
@@ -851,8 +861,8 @@ ab
aZ
bb
bb
-bi
-bl
+bh
+sI
bg
bn
ab
@@ -1071,17 +1081,17 @@ ab
ab
ab
ab
-ay
+am
ab
-ay
+am
ab
ab
aa
ab
ab
-bL
+an
ab
-ay
+am
ab
ac
ab
diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm
index 294b2e8c40..37517668e4 100644
--- a/_maps/shuttles/emergency_raven.dmm
+++ b/_maps/shuttles/emergency_raven.dmm
@@ -149,9 +149,6 @@
/area/shuttle/escape)
"as" = (
/obj/structure/table/optable,
-/obj/item/surgical_drapes,
-/obj/item/clothing/gloves/color/latex,
-/obj/item/clothing/mask/surgical,
/obj/effect/turf_decal/tile/purple{
dir = 1
},
@@ -228,18 +225,13 @@
/area/shuttle/escape)
"aB" = (
/obj/structure/table/reinforced,
-/obj/item/scalpel,
-/obj/item/circular_saw,
-/obj/item/retractor,
-/obj/item/hemostat,
+/obj/item/storage/backpack/duffelbag/med/surgery,
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/purple{
dir = 8
},
-/obj/item/surgicaldrill,
-/obj/item/cautery,
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"aC" = (
@@ -427,6 +419,22 @@
"aW" = (
/turf/open/floor/mineral/plastitanium/red,
/area/shuttle/escape)
+"aX" = (
+/obj/machinery/door/airlock/hatch,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aY" = (
+/obj/docking_port/mobile/emergency{
+ dwidth = 14;
+ height = 18;
+ name = "CentCom Raven Battlecruiser";
+ width = 32
+ },
+/obj/machinery/door/airlock/hatch,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
"aZ" = (
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
@@ -761,16 +769,6 @@
},
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
-"bE" = (
-/obj/docking_port/mobile/emergency{
- dwidth = 14;
- height = 18;
- name = "CentCom Raven Battlecruiser";
- width = 32
- },
-/obj/machinery/door/airlock/hatch,
-/turf/open/floor/plating,
-/area/shuttle/escape)
"bF" = (
/obj/effect/turf_decal/tile/green{
dir = 1
@@ -1331,10 +1329,6 @@
"eP" = (
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/shuttle/escape)
-"UQ" = (
-/obj/machinery/door/airlock/hatch,
-/turf/open/floor/plating,
-/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -1349,17 +1343,17 @@ bJ
cs
bJ
bJ
-UQ
+aX
cs
-bE
+aY
bJ
bJ
cs
ad
aa
-UQ
+aX
bJ
-UQ
+aX
cs
bJ
cs
@@ -1893,7 +1887,7 @@ bJ
bJ
bJ
cs
-cs
+en
ad
ad
ad
@@ -1909,7 +1903,7 @@ ab
bJ
bJ
cs
-cs
+en
ad
ad
ad
diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency_russiafightpit.dmm
index abc40aa523..65fc7e30a2 100644
--- a/_maps/shuttles/emergency_russiafightpit.dmm
+++ b/_maps/shuttles/emergency_russiafightpit.dmm
@@ -235,6 +235,7 @@
name = "Emergency Shuttle Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"aP" = (
@@ -282,6 +283,7 @@
/obj/machinery/door/airlock/security/glass{
name = "Emergency Shuttle Airlock"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"aX" = (
@@ -375,7 +377,9 @@
/turf/open/floor/mineral/plastitanium/red,
/area/shuttle/escape)
"bk" = (
-/obj/structure/kitchenspike,
+/obj/machinery/light/small{
+ dir = 4
+ },
/turf/open/floor/mineral/plastitanium,
/area/shuttle/escape)
"bl" = (
@@ -420,6 +424,7 @@
/obj/machinery/door/airlock/security/glass{
name = "Emergency Shuttle Airlock"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"bs" = (
@@ -460,13 +465,10 @@
/turf/open/floor/plating,
/area/shuttle/escape)
"bz" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
-/turf/open/floor/plating,
+/turf/open/floor/mineral/plastitanium,
/area/shuttle/escape)
"bA" = (
-/obj/structure/closet/emcloset,
+/obj/machinery/sleeper,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/shuttle/escape)
@@ -487,17 +489,12 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"bD" = (
-/obj/machinery/sleeper{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
+/obj/structure/closet/emcloset,
+/turf/open/floor/mineral/plastitanium/red,
/area/shuttle/escape)
"bE" = (
-/obj/machinery/sleeper{
- dir = 4
- },
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/sleeper,
/turf/open/floor/plasteel,
/area/shuttle/escape)
"bF" = (
@@ -567,13 +564,6 @@
},
/turf/open/floor/mineral/plastitanium,
/area/shuttle/escape)
-"bP" = (
-/obj/structure/kitchenspike,
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/mineral/plastitanium,
-/area/shuttle/escape)
"bQ" = (
/obj/machinery/light,
/turf/open/floor/mineral/plastitanium/red,
@@ -584,6 +574,56 @@
},
/turf/open/floor/plating,
/area/shuttle/escape)
+"bS" = (
+/obj/structure/kitchenspike,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bT" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 27
+ },
+/obj/structure/kitchenspike,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"bU" = (
+/obj/machinery/vending/sovietsoda,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"ca" = (
+/obj/structure/shuttle/engine/heater,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"cb" = (
+/obj/structure/shuttle/engine/propulsion,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"cd" = (
+/obj/structure/closet/emcloset,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
+"ce" = (
+/obj/structure/table/optable,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
+"cf" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/table,
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
+"cg" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -712,7 +752,7 @@ aj
ao
ad
aw
-ax
+aR
ax
aR
ax
@@ -721,9 +761,9 @@ ax
aR
ax
bj
-ax
+aR
ab
-by
+bS
bx
bI
bK
@@ -736,6 +776,30 @@ ak
ak
at
ax
+aR
+ax
+ax
+ax
+aR
+aR
+aR
+aR
+aR
+ax
+ab
+bT
+bx
+bI
+ca
+cb
+"}
+(8,1,1) = {"
+ac
+ag
+ak
+ap
+ab
+ax
aJ
aJ
aJ
@@ -745,30 +809,6 @@ ax
bc
bc
bc
-ax
-ab
-bz
-bx
-bI
-bK
-bL
-"}
-(8,1,1) = {"
-ac
-ag
-ak
-ap
-ab
-ay
-ay
-ay
-aS
-aY
-bf
-ax
-ax
-ax
-ax
bQ
bv
ad
@@ -783,6 +823,30 @@ af
al
aq
au
+ay
+ay
+ay
+aS
+aY
+bf
+ax
+ax
+ax
+ax
+ax
+ad
+bA
+cg
+ce
+bK
+bL
+"}
+(10,1,1) = {"
+ac
+bU
+ak
+aq
+au
az
aK
aQ
@@ -792,16 +856,16 @@ ax
ax
bl
ax
-ax
+bD
ax
ad
-bA
bE
-bA
+bB
+bJ
bK
bL
"}
-(10,1,1) = {"
+(11,1,1) = {"
ac
ah
ak
@@ -821,16 +885,16 @@ ax
ac
bB
bB
-bJ
+cf
bK
bL
"}
-(11,1,1) = {"
+(12,1,1) = {"
ad
ab
am
ar
-au
+ac
aB
aA
aA
@@ -849,12 +913,12 @@ bB
bK
bL
"}
-(12,1,1) = {"
+(13,1,1) = {"
aa
ad
ab
ad
-as
+bv
aC
aK
bM
@@ -869,11 +933,11 @@ ax
ac
bB
bB
-bD
+bF
ad
ad
"}
-(13,1,1) = {"
+(14,1,1) = {"
aa
aa
aa
@@ -892,41 +956,41 @@ ax
ax
ad
bC
-bF
+cd
ad
ad
aa
"}
-(14,1,1) = {"
-aa
-aa
-aa
-aa
-ab
-aE
-aN
-aN
-aV
-aD
-bi
-bk
-bk
-bk
-bP
-bt
-ab
-bD
-ab
-ad
-aa
-aa
-"}
(15,1,1) = {"
aa
aa
aa
aa
ad
+aE
+aN
+aN
+aV
+aD
+bi
+bz
+bz
+bz
+bk
+bt
+ab
+cd
+ab
+ad
+aa
+aa
+"}
+(16,1,1) = {"
+aa
+aa
+aa
+aa
+aa
aD
aE
aE
diff --git a/_maps/shuttles/emergency_scrapheap.dmm b/_maps/shuttles/emergency_scrapheap.dmm
index 226dee7d9d..4bd8f07c8e 100644
--- a/_maps/shuttles/emergency_scrapheap.dmm
+++ b/_maps/shuttles/emergency_scrapheap.dmm
@@ -106,6 +106,7 @@
name = "Emergency Shuttle Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"at" = (
@@ -174,6 +175,7 @@
name = "Emergency Shuttle Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"aD" = (
@@ -227,6 +229,7 @@
/obj/docking_port/mobile/emergency{
name = "Scrapheap Challenge"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"aL" = (
@@ -309,6 +312,7 @@
/obj/machinery/door/airlock/titanium{
name = "Emergency Shuttle Airlock"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"ba" = (
diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm
index fcdbf48a3d..71f791fad0 100644
--- a/_maps/shuttles/emergency_supermatter.dmm
+++ b/_maps/shuttles/emergency_supermatter.dmm
@@ -2,6 +2,13 @@
"aa" = (
/turf/template_noop,
/area/template_noop)
+"ab" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
"ac" = (
/obj/structure/sign/warning/radiation,
/turf/closed/wall/mineral/titanium,
@@ -13,6 +20,16 @@
"ae" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/escape)
+"af" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ name = "Hyperfractal Gigashuttle"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
"ag" = (
/obj/structure/closet/radiation{
anchored = 1
@@ -33,6 +50,14 @@
},
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
+"ak" = (
+/obj/machinery/door/airlock/external{
+ name = "Emergency Launch Catwalk";
+ req_access_txt = "10;13"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
"al" = (
/obj/machinery/shower{
dir = 8
@@ -101,12 +126,6 @@
"ax" = (
/turf/closed/wall/mineral/titanium/interior,
/area/shuttle/escape)
-"aA" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"aB" = (
/obj/machinery/power/supermatter_crystal/shard/hugbox/fakecrystal,
/turf/open/floor/plating,
@@ -125,26 +144,10 @@
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
-"aF" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
- },
-/obj/docking_port/mobile/emergency{
- name = "Hyperfractal Gigashuttle"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"aI" = (
/obj/structure/sign/warning/radiation,
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/shuttle/escape)
-"aL" = (
-/obj/machinery/door/airlock/external{
- name = "Emergency Launch Catwalk";
- req_access_txt = "10;13"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"aM" = (
/turf/open/floor/plating/airless,
/area/shuttle/escape)
@@ -348,9 +351,9 @@ aa
aa
aa
aw
-aA
+ab
ac
-aF
+af
aw
aa
aa
@@ -472,7 +475,7 @@ aB
bf
at
at
-aL
+ak
aM
aM
hD
@@ -588,9 +591,9 @@ aa
aa
aa
aw
-aA
+ab
ac
-aA
+ab
aw
aa
aa
diff --git a/_maps/shuttles/emergency_syndicate.dmm b/_maps/shuttles/emergency_syndicate.dmm
index 6e76bbc5f6..85048b9d89 100644
--- a/_maps/shuttles/emergency_syndicate.dmm
+++ b/_maps/shuttles/emergency_syndicate.dmm
@@ -116,7 +116,6 @@
id = "shuttleshutters";
name = "Bridge Blast Shutters";
pixel_x = -26;
- pixel_y = 0;
req_access_txt = "19"
},
/obj/effect/turf_decal/tile/neutral{
@@ -199,8 +198,7 @@
/obj/item/radio/intercom{
dir = 4;
name = "Station Intercom (General)";
- pixel_x = 27;
- pixel_y = 0
+ pixel_x = 27
},
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
@@ -309,8 +307,7 @@
/obj/item/radio/intercom{
dir = 4;
name = "Station Intercom (General)";
- pixel_x = -27;
- pixel_y = 0
+ pixel_x = -27
},
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
@@ -408,7 +405,6 @@
id = "smindicate";
name = "external door control";
pixel_x = 26;
- pixel_y = 0;
req_access_txt = "150"
},
/obj/structure/fans/tiny,
@@ -420,8 +416,7 @@
/obj/item/radio/intercom{
dir = 4;
name = "Station Intercom (General)";
- pixel_x = 27;
- pixel_y = 0
+ pixel_x = 27
},
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
@@ -878,6 +873,7 @@
/area/shuttle/escape)
"bz" = (
/obj/machinery/door/airlock/hatch,
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"bA" = (
@@ -991,6 +987,7 @@
/obj/docking_port/mobile/emergency{
name = "Syndicate Battlecruiser"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"bL" = (
@@ -1064,10 +1061,7 @@
/area/shuttle/escape)
"bR" = (
/obj/structure/table/reinforced,
-/obj/item/storage/box/drinkingglasses{
- pixel_x = 0;
- pixel_y = 0
- },
+/obj/item/storage/box/drinkingglasses,
/obj/item/storage/box/drinkingglasses{
pixel_x = -3;
pixel_y = 3
@@ -1499,8 +1493,7 @@
/obj/item/radio/intercom{
dir = 4;
name = "Station Intercom (General)";
- pixel_x = 27;
- pixel_y = 0
+ pixel_x = 27
},
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
@@ -1606,8 +1599,7 @@
/obj/item/radio/intercom{
dir = 4;
name = "Station Intercom (General)";
- pixel_x = 27;
- pixel_y = 0
+ pixel_x = 27
},
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
@@ -1634,10 +1626,7 @@
pixel_x = 3;
pixel_y = -3
},
-/obj/item/storage/toolbox/emergency{
- pixel_x = 0;
- pixel_y = 0
- },
+/obj/item/storage/toolbox/emergency,
/obj/item/storage/toolbox/syndicate{
pixel_x = -3;
pixel_y = 3
@@ -1717,38 +1706,31 @@
/obj/structure/window/reinforced{
dir = 8
},
-/obj/item/retractor,
-/obj/item/hemostat,
-/obj/item/cautery,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
+/obj/item/storage/backpack/duffelbag/med/surgery,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"cI" = (
/obj/structure/table/reinforced,
-/obj/item/circular_saw,
-/obj/item/surgicaldrill,
-/obj/item/scalpel{
- pixel_y = 15
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"cJ" = (
diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency_wabbajack.dmm
index c2707b19e9..68434a3a66 100644
--- a/_maps/shuttles/emergency_wabbajack.dmm
+++ b/_maps/shuttles/emergency_wabbajack.dmm
@@ -119,12 +119,7 @@
/area/shuttle/escape)
"ar" = (
/obj/structure/table,
-/obj/item/storage/firstaid/fire,
-/obj/item/storage/firstaid/regular{
- pixel_x = 2;
- pixel_y = 3
- },
-/obj/item/crowbar,
+/obj/item/storage/toolbox/mechanical,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"as" = (
@@ -166,6 +161,7 @@
name = "Emergency Shuttle Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"ay" = (
@@ -206,22 +202,23 @@
/obj/docking_port/mobile/emergency{
name = "NT Lepton Violet"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"aF" = (
-/obj/machinery/door/window/eastleft,
-/turf/open/floor/mineral/titanium,
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
/area/shuttle/escape)
"aG" = (
+/obj/machinery/sleeper{
+ dir = 8
+ },
/obj/structure/extinguisher_cabinet{
pixel_x = 27
},
-/obj/structure/table/glass,
-/obj/item/storage/box/syringes{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/box/beakers,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"aH" = (
@@ -244,72 +241,36 @@
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"aK" = (
-/obj/machinery/sleeper{
- dir = 4
+/obj/structure/table,
+/obj/item/storage/firstaid/regular{
+ pixel_x = 2;
+ pixel_y = 3
},
+/obj/item/storage/firstaid/fire,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"aL" = (
-/obj/structure/table/reinforced,
-/turf/open/floor/mineral/titanium,
+/obj/structure/table,
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"aM" = (
-/obj/machinery/chem_dispenser,
-/obj/machinery/light/small{
+/obj/structure/chair/comfy/shuttle{
dir = 4
},
-/turf/open/floor/mineral/titanium/white,
-/area/shuttle/escape)
-"aN" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical,
-/obj/item/storage/firstaid/regular{
- pixel_x = -1;
- pixel_y = 1
- },
-/obj/item/wrench/medical,
-/turf/open/floor/mineral/titanium/white,
-/area/shuttle/escape)
-"aO" = (
-/turf/open/floor/plating,
-/area/shuttle/escape)
-"aP" = (
-/obj/structure/chair/office/light{
+/obj/structure/window/reinforced{
dir = 8
},
-/turf/open/floor/mineral/titanium,
-/area/shuttle/escape)
-"aQ" = (
-/obj/machinery/chem_heater,
-/turf/open/floor/mineral/titanium/white,
-/area/shuttle/escape)
-"aR" = (
-/obj/machinery/chem_master,
-/turf/open/floor/mineral/titanium/white,
-/area/shuttle/escape)
-"aS" = (
-/obj/machinery/door/window/eastright,
-/turf/open/floor/mineral/titanium,
+/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"aT" = (
-/obj/structure/table/glass,
-/obj/item/reagent_containers/glass/bottle/epinephrine{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/reagent_containers/glass/bottle/charcoal,
+/obj/structure/table/optable,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"aU" = (
/obj/machinery/door/airlock/public/glass,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
-"aV" = (
-/obj/machinery/door/airlock/titanium{
- name = "Emergency Shuttle Airlock"
- },
-/turf/open/floor/plating,
-/area/shuttle/escape)
"aW" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -517,21 +478,21 @@
},
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
+"cF" = (
+/obj/machinery/sleeper{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
"ji" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
-"Ec" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/mineral/titanium/white,
-/area/shuttle/escape)
"MK" = (
/obj/structure/chair/comfy/shuttle,
/turf/open/floor/mineral/titanium/blue,
@@ -553,9 +514,9 @@ as
as
as
ab
-aV
+aF
ab
-aV
+aF
ab
ab
ab
@@ -644,9 +605,9 @@ ab
ab
ab
aq
-aK
-aN
-aK
+aM
+aM
+aM
aq
ab
ji
@@ -673,10 +634,10 @@ aq
aq
bn
aH
-ab
-ab
-ab
-ab
+as
+as
+as
+as
be
bf
bg
@@ -691,11 +652,11 @@ ao
au
az
ab
-aF
-Ec
aq
-Ec
-aS
+aJ
+aJ
+aJ
+aq
as
aI
aI
@@ -716,9 +677,9 @@ av
aA
ab
aq
-aL
-aO
-aL
+aM
+aM
+aM
aq
aU
aq
@@ -741,7 +702,7 @@ aq
aC
aq
aq
-aP
+aq
aq
aq
as
@@ -764,9 +725,9 @@ aw
aw
ab
aG
-aM
-aQ
-aR
+aK
+cF
+aL
aT
as
MK
diff --git a/_maps/shuttles/ferry_fancy.dmm b/_maps/shuttles/ferry_fancy.dmm
index 432791c936..a5705ad37f 100644
--- a/_maps/shuttles/ferry_fancy.dmm
+++ b/_maps/shuttles/ferry_fancy.dmm
@@ -11,6 +11,7 @@
/area/shuttle/transport)
"d" = (
/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
/turf/open/floor/pod/dark,
/area/shuttle/transport)
"e" = (
@@ -74,6 +75,7 @@
preferred_direction = 4;
width = 5
},
+/obj/structure/fans/tiny,
/turf/open/floor/pod/light,
/area/shuttle/transport)
"o" = (
@@ -98,6 +100,7 @@
/area/shuttle/transport)
"r" = (
/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
/turf/open/floor/pod/light,
/area/shuttle/transport)
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index 7be3533d47..60fb49f780 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -105,6 +105,7 @@
#define MATRIXED 22 //if icon is color matrix'd
#define SKINTONE 23 //uses skin tones
#define HORNCOLOR 24
+#define WINGCOLOR 25
//organ slots
#define ORGAN_SLOT_BRAIN "brain"
diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm
index c9d545fc03..c2021a86f2 100644
--- a/code/__DEFINES/access.dm
+++ b/code/__DEFINES/access.dm
@@ -6,7 +6,7 @@
#define ACCESS_MORGUE 6
#define ACCESS_TOX 7 //R&D department, R&D console, burn chamber on some maps
#define ACCESS_TOX_STORAGE 8 //Toxins storage, burn chamber on some maps
-#define ACCESS_GENETICS 9
+#define ACCESS_GENETICS 9
#define ACCESS_ENGINE 10 //Engineering area, power monitor, power flow control console
#define ACCESS_ENGINE_EQUIP 11 //APCs, EngiVend/YouTool, engineering equipment lockers
#define ACCESS_MAINT_TUNNELS 12
@@ -64,6 +64,8 @@
#define ACCESS_WEAPONS 66 //Weapon authorization for secbots
#define ACCESS_NETWORK 67 //NTnet diagnostics/monitoring software
#define ACCESS_CLONING 68 //Cloning room and clone pod ejection
+#define ACCESS_ENTER_GENPOP 69
+#define ACCESS_LEAVE_GENPOP 70
//BEGIN CENTCOM ACCESS
/*Should leave plenty of room if we need to add more access levels.
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index d966c73d23..3301def4a1 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -93,12 +93,6 @@
#define isgenital(A) (istype(A, /obj/item/organ/genital))
#define isborer(A) (istype(A, /mob/living/simple_animal/borer))
-#define isipcperson(A) (is_species(A, /datum/species/ipc))
-#define ismammal(A) (is_species(A, /datum/species/mammal))
-#define isavian(A) (is_species(A, /datum/species/avian))
-#define isaquatic(A) (is_species(A, /datum/species/aquatic))
-#define isinsect(A) (is_species(A, /datum/species/insect))
-#define isxenoperson(A) (is_species(A, /datum/species/xeno))
#define CITADEL_MENTOR_OOC_COLOUR "#224724"
diff --git a/code/__DEFINES/cleaning.dm b/code/__DEFINES/cleaning.dm
index c4db590e90..6049fd7918 100644
--- a/code/__DEFINES/cleaning.dm
+++ b/code/__DEFINES/cleaning.dm
@@ -5,8 +5,3 @@
#define CLEAN_STRONG 4 // Industrial strength
#define CLEAN_IMPRESSIVE 5 // Cleaning strong enough your granny would be proud
#define CLEAN_GOD 6 // Cleans things spotless down to the atomic structure
-
-//How strong things have to be to wipe forensic evidence...
-#define CLEAN_STRENGTH_FINGERPRINTS CLEAN_IMPRESSIVE
-#define CLEAN_STRENGTH_BLOOD CLEAN_WEAK
-#define CLEAN_STRENGTH_FIBERS CLEAN_IMPRESSIVE
diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm
index 47b00e67f7..2f2f94413b 100644
--- a/code/__DEFINES/clockcult.dm
+++ b/code/__DEFINES/clockcult.dm
@@ -8,6 +8,7 @@
GLOBAL_VAR_INIT(clockwork_construction_value, 0) //The total value of all structures built by the clockwork cult
GLOBAL_VAR_INIT(clockwork_vitality, 0) //How much Vitality is stored, total
GLOBAL_VAR_INIT(clockwork_power, 0) //How many watts of power are globally available to the clockwork cult
+GLOBAL_VAR_INIT(neovgre_exists, 0) //Does neovgre exist?
GLOBAL_LIST_EMPTY(all_clockwork_objects) //All clockwork items, structures, and effects in existence
GLOBAL_LIST_EMPTY(all_clockwork_mobs) //All clockwork SERVANTS (not creatures) in existence
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index c2482f6fbf..4e03ab3ebf 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -7,6 +7,7 @@
#define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src)
#define COMPONENT_INCOMPATIBLE 1
+#define COMPONENT_NOTRANSFER 2
// How multiple components of the exact same type are handled in the same datum
@@ -225,6 +226,8 @@
#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool.
#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength)
+//Blood color
+#define COMSIG_BLOOD_COLOR "blood_DNA_to_color" //RGB blood stuff
//Food
#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder)
diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm
index ef96b83cc8..16d763606b 100644
--- a/code/__DEFINES/footsteps.dm
+++ b/code/__DEFINES/footsteps.dm
@@ -15,6 +15,15 @@
//misc footstep sounds
#define FOOTSTEP_GENERIC_HEAVY "heavy"
+#define FOOTPRINT_SHOE "shoe"
+#define FOOTPRINT_FOOT "foot"
+#define FOOTPRINT_PAW "paw"
+#define FOOTPRINT_CLAW "claw"
+#define FOOTPRINT_WHEEL "wheels"
+#define FOOTPRINT_TRAIL "trails_"
+#define FOOTPRINT_SNAKE "snake"
+#define FOOTPRINT_DRAG "drag"
+
/*
id = list(
diff --git a/code/__DEFINES/forensics.dm b/code/__DEFINES/forensics.dm
deleted file mode 100644
index bb512edcde..0000000000
--- a/code/__DEFINES/forensics.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-#define IF_HAS_BLOOD_DNA(__thing) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA))
-#define IF_HAS_BLOOD_DNA_AND(__thing, __conditions...) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA) && (##__conditions))
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 1709714904..9f69da0154 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -61,6 +61,15 @@
#define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) )
#define isdwarf(A) (is_species(A, /datum/species/dwarf))
+// Citadel specific species
+#define isipcperson(A) (is_species(A, /datum/species/ipc))
+#define ismammal(A) (is_species(A, /datum/species/mammal))
+#define isavian(A) (is_species(A, /datum/species/avian))
+#define isaquatic(A) (is_species(A, /datum/species/aquatic))
+#define isinsect(A) (is_species(A, /datum/species/insect))
+#define isxenoperson(A) (is_species(A, /datum/species/xeno))
+#define isstartjelly(A) (is_species(A, /datum/species/jelly/roundstartslime))
+
//more carbon mobs
#define ismonkey(A) (istype(A, /mob/living/carbon/monkey))
@@ -176,6 +185,8 @@ GLOBAL_LIST_INIT(heavyfootmob, typecacheof(list(
#define iscameramob(A) (istype(A, /mob/camera))
+#define isaicamera(A) (istype(A, /mob/camera/aiEye))
+
#define iseminence(A) (istype(A, /mob/camera/eminence))
//Footstep helpers
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index bccf1f28dd..94a189ff07 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -171,12 +171,22 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
#define BLOOD_LOSS_IN_SPREAD 20
//Bloody shoe blood states
-#define BLOOD_STATE_HUMAN "blood"
-#define BLOOD_STATE_XENO "xeno"
+#define BLOOD_STATE_BLOOD "blood"
#define BLOOD_STATE_OIL "oil"
#define BLOOD_STATE_NOT_BLOODY "no blood whatsoever"
#define BLOOD_AMOUNT_PER_DECAL 20
+//Blood Decal Colors
+#define BLOOD_COLOR_HUMAN "#dc0000"
+#define BLOOD_COLOR_XENO "#94a83c"
+#define BLOOD_COLOR_OIL "#301d02"
+#define BLOOD_COLOR_SYNTHETIC "#3f48aa"
+#define BLOOD_COLOR_SLIME "#00ff90"
+#define BLOOD_COLOR_LIZARD "#db004D"
+#define BLOOD_COLOR_UNIVERSAL "#db3300"
+#define BLOOD_COLOR_BUG "#a37c0f"
+
+
//suit sensors: sensor_mode defines
#define SENSOR_OFF 0
diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm
index 4336ad28f7..12a3c331ec 100644
--- a/code/__DEFINES/movespeed_modification.dm
+++ b/code/__DEFINES/movespeed_modification.dm
@@ -33,4 +33,6 @@
#define MOVESPEED_ID_SANITY "MOOD_SANITY"
#define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG"
-#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
\ No newline at end of file
+#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
+
+#define MOVESPEED_ID_TASED_STATUS "TASED"
\ No newline at end of file
diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm
index 7cebc37d94..9579571174 100644
--- a/code/__DEFINES/reactions.dm
+++ b/code/__DEFINES/reactions.dm
@@ -31,41 +31,14 @@
#define STIMULUM_RESEARCH_AMOUNT 50
//Plasma fusion properties
#define FUSION_ENERGY_THRESHOLD 3e9 //Amount of energy it takes to start a fusion reaction
-#define FUSION_TEMPERATURE_THRESHOLD 1000 //Temperature required to start a fusion reaction
#define FUSION_MOLE_THRESHOLD 250 //Mole count required (tritium/plasma) to start a fusion reaction
-#define FUSION_RELEASE_ENERGY_SUPER 3e9 //Amount of energy released in the fusion process, super tier
-#define FUSION_RELEASE_ENERGY_HIGH 1e9 //Amount of energy released in the fusion process, high tier
-#define FUSION_RELEASE_ENERGY_MID 5e8 //Amount of energy released in the fusion process, mid tier
-#define FUSION_RELEASE_ENERGY_LOW 1e8 //Amount of energy released in the fusion process, low tier
-#define FUSION_MEDIATION_FACTOR 80 //Arbitrary
-#define FUSION_SUPER_TIER_THRESHOLD 50 //anything above this is super tier
-#define FUSION_HIGH_TIER_THRESHOLD 20 //anything above this and below 50 is high tier
-#define FUSION_MID_TIER_THRESHOLD 5 //anything above this and below 20 is mid tier - below this is low tier, but that doesnt need a define
-#define FUSION_ENERGY_DIVISOR_SUPER 25 //power_ratio is divided by this during energy calculations
-#define FUSION_ENERGY_DIVISOR_HIGH 20
-#define FUSION_ENERGY_DIVISOR_MID 10
-#define FUSION_ENERGY_DIVISOR_LOW 2
-#define FUSION_GAS_CREATION_FACTOR_TRITIUM 0.40 //trit - one gas rather than two, so think about that when calculating stuff - 40% in total
-#define FUSION_GAS_CREATION_FACTOR_STIM 0.05 //stim percentage creation from high tier - 5%, 60% in total with pluox
-#define FUSION_GAS_CREATION_FACTOR_PLUOX 0.55 //pluox percentage creation from high tier - 55%, 60% in total with stim
-#define FUSION_GAS_CREATION_FACTOR_NITRYL 0.20 //nitryl and N2O - 80% in total
-#define FUSION_GAS_CREATION_FACTOR_N2O 0.60 //nitryl and N2O - 80% in total
-#define FUSION_GAS_CREATION_FACTOR_BZ 0.05 //BZ - 5% - 90% in total with CO2
-#define FUSION_GAS_CREATION_FACTOR_CO2 0.85 //CO2 - 85% - 90% in total with BZ
-#define FUSION_MID_TIER_RAD_PROB_FACTOR 2 //probability of radpulse is power ratio * this for whatever tier
-#define FUSION_LOW_TIER_RAD_PROB_FACTOR 5
-#define FUSION_EFFICIENCY_BASE 60 //used in the fusion efficiency calculations
-#define FUSION_EFFICIENCY_DIVISOR 0.6 //ditto
-#define FUSION_RADIATION_FACTOR 15000 //horizontal asymptote
-#define FUSION_RADIATION_CONSTANT 30 //equation is form of (ax) / (x + b), where a = radiation factor and b = radiation constant and x = power ratio (https://www.desmos.com/calculator/4i1f296phl)
-#define FUSION_ZAP_POWER_ASYMPTOTE 50000 //maximum value - not enough to instacrit but it'll still hurt like shit
-#define FUSION_ZAP_POWER_CONSTANT 75 //equation is of from [ax / (x + b)] + c, where a = zap power asymptote, b = zap power constant, c = zap power base and x = power ratio
-#define FUSION_ZAP_POWER_BASE 1000 //(https://www.desmos.com/calculator/vvbmhf4unm)
-#define FUSION_ZAP_RANGE_SUPER 9 //range of the tesla zaps that occur from fusion
-#define FUSION_ZAP_RANGE_HIGH 7
-#define FUSION_ZAP_RANGE_MID 5
-#define FUSION_ZAP_RANGE_LOW 3
-#define FUSION_PARTICLE_FACTOR_SUPER 4 //# of particles fired out is equal to rand(3,6) * this for whatever tier
-#define FUSION_PARTICLE_FACTOR_HIGH 3
-#define FUSION_PARTICLE_FACTOR_MID 2
-#define FUSION_PARTICLE_FACTOR_LOW 1
+#define FUSION_TRITIUM_CONVERSION_COEFFICIENT (1e-10)
+#define INSTABILITY_GAS_POWER_FACTOR 0.003
+#define FUSION_TRITIUM_MOLES_USED 1
+#define PLASMA_BINDING_ENERGY 20000000
+#define TOROID_VOLUME_BREAKEVEN 1000
+#define FUSION_TEMPERATURE_THRESHOLD 10000
+#define PARTICLE_CHANCE_CONSTANT (-20000000)
+#define FUSION_RAD_MAX 2000
+#define FUSION_RAD_COEFFICIENT (-1000)
+#define FUSION_INSTABILITY_ENDOTHERMALITY 2
diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm
index 0820d63247..a05e6f6160 100644
--- a/code/__DEFINES/robots.dm
+++ b/code/__DEFINES/robots.dm
@@ -50,3 +50,7 @@
#define ASSEMBLY_THIRD_STEP 2
#define ASSEMBLY_FOURTH_STEP 3
#define ASSEMBLY_FIFTH_STEP 4
+
+
+//Checks to determine borg availability depending on the server's config. These are defines in the interest of reducing copypasta
+#define BORG_SEC_AVAILABLE (!CONFIG_GET(flag/disable_secborg) && GLOB.security_level >= CONFIG_GET(number/minimum_secborg_alert))
\ No newline at end of file
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index 3cd64af8c7..332d36f2f4 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -44,6 +44,8 @@
#define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep
+#define STATUS_EFFECT_TASED /datum/status_effect/electrode //the affected has been tased, preventing fine muscle control
+
#define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions
#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 39d58ec15a..19d126f08f 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -400,6 +400,12 @@ GLOBAL_LIST_EMPTY(species_list)
. = 0
break
+ if(isliving(user))
+ var/mob/living/L = user
+ if(L.recoveringstam)
+ . = 0
+ break
+
if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc))
if((Uloc != Tloc || Tloc != user) && !drifting)
. = 0
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 3c8d62ce3a..80c9b0c2dd 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -756,7 +756,6 @@ Turf and target are separate in case you want to teleport some distance from a t
loc = loc.loc
return null
-
//For objects that should embed, but make no sense being is_sharp or is_pointed()
//e.g: rods
GLOBAL_LIST_INIT(can_embed_types, typecacheof(list(
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
index c883254afe..8b5657a6f6 100644
--- a/code/_globalvars/lists/mobs.dm
+++ b/code/_globalvars/lists/mobs.dm
@@ -58,3 +58,64 @@ GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traito
for(var/i in GLOB.mob_list)
var/mob/M = i
M.update_config_movespeed()
+
+GLOBAL_LIST_INIT(noodle_taurs, list(
+ "Naga",
+ "Tentacle"
+ ))
+
+GLOBAL_LIST_INIT(paw_taurs, list(
+ "Fox",
+ "Wolf",
+ "Otie",
+ "Drake",
+ "Lab",
+ "Shepherd",
+ "Husky",
+ "Eevee",
+ "Panther",
+ "Horse",
+ "Cow",
+ "Tiger"
+ ))
+
+ //blood types
+GLOBAL_LIST_INIT(regular_bloods,list(
+ "O-",
+ "O+",
+ "A-",
+ "A+",
+ "B-",
+ "B+",
+ "AB-",
+ "AB+"
+ ))
+
+GLOBAL_LIST_INIT(all_types_bloods,list(
+ "O-",
+ "O+",
+ "A-",
+ "A+",
+ "B-",
+ "B+",
+ "AB-",
+ "AB+",
+ "SY",
+ "X*",
+ "HF",
+ "L",
+ "U",
+ "GEL",
+ "BUG"
+ ))
+
+GLOBAL_LIST_INIT(blood_types, list(
+ "blood",
+ "jellyblood"
+ ))
+
+GLOBAL_LIST_INIT(blood_id_types, list(
+ "blood" = /datum/reagent/blood,
+ "jellyblood" = /datum/reagent/blood/jellyblood
+ ))
+
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index cfd57b4850..cf0caebb61 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -70,6 +70,9 @@
/datum/config_entry/flag/disable_peaceborg
+/datum/config_entry/number/minimum_secborg_alert //Minimum alert level for secborgs to be chosen.
+ config_entry_value = 3
+
/datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors
config_entry_value = 6
min_val = 1
diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm
index b3d3b46434..e41755b6c2 100644
--- a/code/datums/components/_component.dm
+++ b/code/datums/components/_component.dm
@@ -2,6 +2,10 @@
var/dupe_mode = COMPONENT_DUPE_HIGHLANDER
var/dupe_type
var/datum/parent
+ //only set to true if you are able to properly transfer this component
+ //At a minimum RegisterWithParent and UnregisterFromParent should be used
+ //Make sure you also implement PostTransfer for any post transfer handling
+ var/can_transfer = FALSE
/datum/component/New(datum/P, ...)
parent = P
@@ -154,7 +158,7 @@
return
/datum/component/proc/PostTransfer()
- return
+ return COMPONENT_INCOMPATIBLE //Do not support transfer by default as you must properly support it
/datum/component/proc/_GetInverseTypeList(our_type = type)
//we can do this one simple trick
@@ -285,10 +289,12 @@
if(target.parent)
target.RemoveComponent()
target.parent = src
- if(target.PostTransfer() == COMPONENT_INCOMPATIBLE)
- var/c_type = target.type
- qdel(target)
- CRASH("Incompatible [c_type] transfer attempt to a [type]!")
+ var/result = target.PostTransfer()
+ switch(result)
+ if(COMPONENT_INCOMPATIBLE)
+ var/c_type = target.type
+ qdel(target)
+ CRASH("Incompatible [c_type] transfer attempt to a [type]!")
if(target == AddComponent(target))
target._JoinParent()
@@ -298,10 +304,13 @@
return
var/comps = dc[/datum/component]
if(islist(comps))
- for(var/I in comps)
- target.TakeComponent(I)
+ for(var/datum/component/I in comps)
+ if(I.can_transfer)
+ target.TakeComponent(I)
else
- target.TakeComponent(comps)
+ var/datum/component/C = comps
+ if(C.can_transfer)
+ target.TakeComponent(comps)
/datum/component/ui_host()
return parent
diff --git a/code/datums/components/cleaning.dm b/code/datums/components/cleaning.dm
index 05c26efcc1..5324a87fee 100644
--- a/code/datums/components/cleaning.dm
+++ b/code/datums/components/cleaning.dm
@@ -8,32 +8,39 @@
/datum/component/cleaning/proc/Clean()
var/atom/movable/AM = parent
- var/turf/tile = AM.loc
- if(!isturf(tile))
- return
-
- SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- for(var/A in tile)
+ var/turf/T = AM.loc
+ SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ for(var/A in T)
if(is_cleanable(A))
qdel(A)
- else if(istype(A, /obj/item))
- var/obj/item/I = A
- SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- if(ismob(I.loc))
- var/mob/M = I.loc
+ else if(isitem(A))
+ var/obj/item/cleaned_item = A
+ SEND_SIGNAL(cleaned_item, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_item.clean_blood()
+ if(ismob(cleaned_item.loc))
+ var/mob/M = cleaned_item.loc
M.regenerate_icons()
else if(ishuman(A))
var/mob/living/carbon/human/cleaned_human = A
if(cleaned_human.lying)
if(cleaned_human.head)
- SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.head.clean_blood()
+ cleaned_human.update_inv_head()
if(cleaned_human.wear_suit)
- SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.wear_suit.clean_blood()
+ cleaned_human.update_inv_wear_suit()
else if(cleaned_human.w_uniform)
- SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.w_uniform.clean_blood()
+ cleaned_human.update_inv_w_uniform()
if(cleaned_human.shoes)
- SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.shoes.clean_blood()
+ cleaned_human.update_inv_shoes()
+ SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.clean_blood()
cleaned_human.wash_cream()
cleaned_human.regenerate_icons()
- to_chat(cleaned_human, "[AM] cleans your face!")
+ to_chat(cleaned_human, "[src] cleans your face!")
\ No newline at end of file
diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm
index e5547ee0ec..bdc1d3a2f6 100644
--- a/code/datums/components/decal.dm
+++ b/code/datums/components/decal.dm
@@ -1,6 +1,6 @@
/datum/component/decal
dupe_mode = COMPONENT_DUPE_ALLOWED
-
+ can_transfer = TRUE
var/cleanable
var/description
var/mutable_appearance/pic
diff --git a/code/datums/components/decals/blood.dm b/code/datums/components/decals/blood.dm
index 7fae975678..c8be6251b5 100644
--- a/code/datums/components/decals/blood.dm
+++ b/code/datums/components/decals/blood.dm
@@ -1,39 +1,13 @@
-/datum/component/decal/blood
- dupe_mode = COMPONENT_DUPE_UNIQUE
-
-/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER)
- if(!isitem(parent))
- return COMPONENT_INCOMPATIBLE
- . = ..()
- RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name)
-
-/datum/component/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color)
- var/obj/item/I = parent
- if(!_icon)
- _icon = 'icons/effects/blood.dmi'
- if(!_icon_state)
- _icon_state = "itemblood"
- var/icon = initial(I.icon)
- var/icon_state = initial(I.icon_state)
- if(!icon || !icon_state)
- // It's something which takes on the look of other items, probably
- icon = I.icon
- icon_state = I.icon_state
- var/static/list/blood_splatter_appearances = list()
- //try to find a pre-processed blood-splatter. otherwise, make a new one
- var/index = "[REF(icon)]-[icon_state]"
- pic = blood_splatter_appearances[index]
-
- if(!pic)
- var/icon/blood_splatter_icon = icon(initial(I.icon), initial(I.icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object
- blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
- blood_splatter_icon.Blend(icon(_icon, _icon_state), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
- pic = mutable_appearance(blood_splatter_icon, initial(I.icon_state))
- blood_splatter_appearances[index] = pic
- return TRUE
-
-/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override)
- var/atom/A = parent
- override[EXAMINE_POSITION_ARTICLE] = A.gender == PLURAL? "some" : "a"
- override[EXAMINE_POSITION_BEFORE] = " blood-stained "
- return COMPONENT_EXNAME_CHANGED
+/datum/component/decal/blood
+ dupe_mode = COMPONENT_DUPE_UNIQUE
+
+/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER)
+ if(!isitem(parent))
+ return COMPONENT_INCOMPATIBLE
+ . = ..()
+ RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name)
+
+/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override)
+ var/atom/A = parent
+
+ return COMPONENT_EXNAME_CHANGED
diff --git a/code/datums/components/forensics.dm b/code/datums/components/forensics.dm
deleted file mode 100644
index c7a1f7eba5..0000000000
--- a/code/datums/components/forensics.dm
+++ /dev/null
@@ -1,159 +0,0 @@
-/datum/component/forensics
- dupe_mode = COMPONENT_DUPE_UNIQUE
- var/list/fingerprints //assoc print = print
- var/list/hiddenprints //assoc ckey = realname/gloves/ckey
- var/list/blood_DNA //assoc dna = bloodtype
- var/list/fibers //assoc print = print
-
-/datum/component/forensics/InheritComponent(datum/component/forensics/F, original) //Use of | and |= being different here is INTENTIONAL.
- fingerprints = fingerprints | F.fingerprints
- hiddenprints = hiddenprints | F.hiddenprints
- blood_DNA = blood_DNA | F.blood_DNA
- fibers = fibers | F.fibers
- check_blood()
- return ..()
-
-/datum/component/forensics/Initialize(new_fingerprints, new_hiddenprints, new_blood_DNA, new_fibers)
- if(!isatom(parent))
- return COMPONENT_INCOMPATIBLE
- fingerprints = new_fingerprints
- hiddenprints = new_hiddenprints
- blood_DNA = new_blood_DNA
- fibers = new_fibers
- check_blood()
- RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_act)
-
-/datum/component/forensics/proc/wipe_fingerprints()
- fingerprints = null
- return TRUE
-
-/datum/component/forensics/proc/wipe_hiddenprints()
- return //no.
-
-/datum/component/forensics/proc/wipe_blood_DNA()
- blood_DNA = null
- if(isitem(parent))
- qdel(parent.GetComponent(/datum/component/decal/blood))
- return TRUE
-
-/datum/component/forensics/proc/wipe_fibers()
- fibers = null
- return TRUE
-
-/datum/component/forensics/proc/clean_act(datum/source, strength)
- if(strength >= CLEAN_STRENGTH_FINGERPRINTS)
- wipe_fingerprints()
- if(strength >= CLEAN_STRENGTH_BLOOD)
- wipe_blood_DNA()
- if(strength >= CLEAN_STRENGTH_FIBERS)
- wipe_fibers()
-
-/datum/component/forensics/proc/add_fingerprint_list(list/_fingerprints) //list(text)
- if(!length(_fingerprints))
- return
- LAZYINITLIST(fingerprints)
- for(var/i in _fingerprints) //We use an associative list, make sure we don't just merge a non-associative list into ours.
- fingerprints[i] = i
- return TRUE
-
-/datum/component/forensics/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE)
- if(!M)
- return
- add_hiddenprint(M)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- add_fibers(H)
- if(H.gloves) //Check if the gloves (if any) hide fingerprints
- var/obj/item/clothing/gloves/G = H.gloves
- if(G.transfer_prints)
- ignoregloves = TRUE
- if(!ignoregloves)
- H.gloves.add_fingerprint(H, TRUE) //ignoregloves = 1 to avoid infinite loop.
- return
- var/full_print = md5(H.dna.uni_identity)
- LAZYSET(fingerprints, full_print, full_print)
- return TRUE
-
-/datum/component/forensics/proc/add_fiber_list(list/_fibertext) //list(text)
- if(!length(_fibertext))
- return
- LAZYINITLIST(fibers)
- for(var/i in _fibertext) //We use an associative list, make sure we don't just merge a non-associative list into ours.
- fibers[i] = i
- return TRUE
-
-/datum/component/forensics/proc/add_fibers(mob/living/carbon/human/M)
- var/fibertext
- var/item_multiplier = isitem(src)?1.2:1
- if(M.wear_suit)
- fibertext = "Material from \a [M.wear_suit]."
- if(prob(10*item_multiplier) && !LAZYACCESS(fibers, fibertext))
- LAZYSET(fibers, fibertext, fibertext)
- if(!(M.wear_suit.body_parts_covered & CHEST))
- if(M.w_uniform)
- fibertext = "Fibers from \a [M.w_uniform]."
- if(prob(12*item_multiplier) && !LAZYACCESS(fibers, fibertext)) //Wearing a suit means less of the uniform exposed.
- LAZYSET(fibers, fibertext, fibertext)
- if(!(M.wear_suit.body_parts_covered & HANDS))
- if(M.gloves)
- fibertext = "Material from a pair of [M.gloves.name]."
- if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext))
- LAZYSET(fibers, fibertext, fibertext)
- else if(M.w_uniform)
- fibertext = "Fibers from \a [M.w_uniform]."
- if(prob(15*item_multiplier) && !LAZYACCESS(fibers, fibertext))
- // "Added fibertext: [fibertext]"
- LAZYSET(fibers, fibertext, fibertext)
- if(M.gloves)
- fibertext = "Material from a pair of [M.gloves.name]."
- if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext))
- LAZYSET(fibers, fibertext, fibertext)
- else if(M.gloves)
- fibertext = "Material from a pair of [M.gloves.name]."
- if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext))
- LAZYSET(fibers, fibertext, fibertext)
- return TRUE
-
-/datum/component/forensics/proc/add_hiddenprint_list(list/_hiddenprints) //list(ckey = text)
- if(!length(_hiddenprints))
- return
- LAZYINITLIST(hiddenprints)
- for(var/i in _hiddenprints) //We use an associative list, make sure we don't just merge a non-associative list into ours.
- hiddenprints[i] = _hiddenprints[i]
- return TRUE
-
-/datum/component/forensics/proc/add_hiddenprint(mob/living/M)
- if(!M || !M.key)
- return
- var/hasgloves = ""
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.gloves)
- hasgloves = "(gloves)"
- var/current_time = TIME_STAMP("hh:mm:ss", FALSE)
- if(!LAZYACCESS(hiddenprints, M.key))
- LAZYSET(hiddenprints, M.key, "First: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]")
- else
- var/laststamppos = findtext(LAZYACCESS(hiddenprints, M.key), " Last: ")
- if(laststamppos)
- LAZYSET(hiddenprints, M.key, copytext(hiddenprints[M.key], 1, laststamppos))
- hiddenprints[M.key] += " Last: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]" //made sure to be existing by if(!LAZYACCESS);else
- var/atom/A = parent
- A.fingerprintslast = M.ckey
- return TRUE
-
-/datum/component/forensics/proc/add_blood_DNA(list/dna) //list(dna_enzymes = type)
- if(!length(dna))
- return
- LAZYINITLIST(blood_DNA)
- for(var/i in dna)
- blood_DNA[i] = dna[i]
- check_blood()
- return TRUE
-
-/datum/component/forensics/proc/check_blood()
- if(!isitem(parent))
- return
- if(!length(blood_DNA))
- return
- parent.LoadComponent(/datum/component/decal/blood)
diff --git a/code/datums/components/lockon_aiming.dm b/code/datums/components/lockon_aiming.dm
index cc41e793ed..38b707ac19 100644
--- a/code/datums/components/lockon_aiming.dm
+++ b/code/datums/components/lockon_aiming.dm
@@ -237,6 +237,3 @@
LOCKON_RANGING_BREAK_CHECK
cd++
CHECK_TICK
-
-/datum/component/lockon_aiming/PostTransfer(datum/new_parent)
- return COMPONENT_INCOMPATIBLE
diff --git a/code/datums/components/mirage_border.dm b/code/datums/components/mirage_border.dm
index 2e6f8f79f6..20e3b317ec 100644
--- a/code/datums/components/mirage_border.dm
+++ b/code/datums/components/mirage_border.dm
@@ -1,4 +1,5 @@
/datum/component/mirage_border
+ can_transfer = TRUE
var/obj/effect/abstract/mirage_holder/holder
/datum/component/mirage_border/Initialize(turf/target, direction, range=world.view)
diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm
index ff424dc02e..eef3873e6e 100644
--- a/code/datums/components/rotation.dm
+++ b/code/datums/components/rotation.dm
@@ -44,19 +44,21 @@
if(src.rotation_flags & ROTATION_CLOCKWISE)
default_rotation_direction = ROTATION_CLOCKWISE
- if(src.rotation_flags & ROTATION_ALTCLICK)
+/datum/component/simple_rotation/proc/add_signals()
+ if(rotation_flags & ROTATION_ALTCLICK)
RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/HandRot)
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/ExamineMessage)
- if(src.rotation_flags & ROTATION_WRENCH)
+ if(rotation_flags & ROTATION_WRENCH)
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/WrenchRot)
- if(src.rotation_flags & ROTATION_VERBS)
+/datum/component/simple_rotation/proc/add_verbs()
+ if(rotation_flags & ROTATION_VERBS)
var/atom/movable/AM = parent
- if(src.rotation_flags & ROTATION_FLIP)
+ if(rotation_flags & ROTATION_FLIP)
AM.verbs += /atom/movable/proc/simple_rotate_flip
- if(src.rotation_flags & ROTATION_CLOCKWISE)
+ if(rotation_flags & ROTATION_CLOCKWISE)
AM.verbs += /atom/movable/proc/simple_rotate_clockwise
- if(src.rotation_flags & ROTATION_COUNTERCLOCKWISE)
+ if(rotation_flags & ROTATION_COUNTERCLOCKWISE)
AM.verbs += /atom/movable/proc/simple_rotate_counterclockwise
/datum/component/simple_rotation/proc/remove_verbs()
@@ -66,11 +68,30 @@
AM.verbs -= /atom/movable/proc/simple_rotate_clockwise
AM.verbs -= /atom/movable/proc/simple_rotate_counterclockwise
-/datum/component/simple_rotation/Destroy()
+/datum/component/simple_rotation/proc/remove_signals()
+ UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_PARENT_EXAMINE, COMSIG_PARENT_ATTACKBY))
+
+/datum/component/simple_rotation/RegisterWithParent()
+ add_verbs()
+ add_signals()
+ . = ..()
+
+/datum/component/simple_rotation/PostTransfer()
+ //Because of the callbacks which we don't track cleanly we can't transfer this
+ //item cleanly, better to let the new of the new item create a new rotation datum
+ //instead (there's no real state worth transferring)
+ return COMPONENT_NOTRANSFER
+
+/datum/component/simple_rotation/UnregisterFromParent()
remove_verbs()
+ remove_signals()
+ . = ..()
+
+/datum/component/simple_rotation/Destroy()
QDEL_NULL(can_user_rotate)
QDEL_NULL(can_be_rotated)
QDEL_NULL(after_rotation)
+ //Signals + verbs removed via UnRegister
. = ..()
/datum/component/simple_rotation/RemoveComponent()
diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm
index 0b78605869..f7ca711421 100644
--- a/code/datums/components/storage/concrete/_concrete.dm
+++ b/code/datums/components/storage/concrete/_concrete.dm
@@ -4,6 +4,7 @@
// /mob/living/Move() in /modules/mob/living/living.dm - hiding storage boxes on mob movement
/datum/component/storage/concrete
+ can_transfer = TRUE
var/drop_all_on_deconstruct = TRUE
var/drop_all_on_destroy = FALSE
var/drop_all_on_break = FALSE
diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm
index 84be4fdca4..fe5e1e5217 100644
--- a/code/datums/components/storage/concrete/pockets.dm
+++ b/code/datums/components/storage/concrete/pockets.dm
@@ -56,7 +56,7 @@
/obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector,
/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper,
/obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini,
- /obj/item/firing_pin
+ /obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol/mag
))
/datum/component/storage/concrete/pockets/shoes/clown/Initialize()
diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm
index 6d504cefd4..dc124750e4 100644
--- a/code/datums/components/wet_floor.dm
+++ b/code/datums/components/wet_floor.dm
@@ -1,5 +1,6 @@
/datum/component/wet_floor
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
+ can_transfer = TRUE
var/highest_strength = TURF_DRY
var/lube_flags = NONE //why do we have this?
var/list/time_left_list //In deciseconds.
@@ -26,14 +27,20 @@
if(!isopenturf(parent))
return COMPONENT_INCOMPATIBLE
add_wet(strength, duration_minimum, duration_add, duration_maximum)
- RegisterSignal(parent, COMSIG_TURF_IS_WET, .proc/is_wet)
- RegisterSignal(parent, COMSIG_TURF_MAKE_DRY, .proc/dry)
permanent = _permanent
if(!permanent)
START_PROCESSING(SSwet_floors, src)
addtimer(CALLBACK(src, .proc/gc, TRUE), 1) //GC after initialization.
last_process = world.time
+/datum/component/wet_floor/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_TURF_IS_WET, .proc/is_wet)
+ RegisterSignal(parent, COMSIG_TURF_MAKE_DRY, .proc/dry)
+
+/datum/component/wet_floor/UnregisterFromParent()
+ UnregisterSignal(parent, list(COMSIG_TURF_IS_WET, COMSIG_TURF_MAKE_DRY))
+
+
/datum/component/wet_floor/Destroy()
STOP_PROCESSING(SSwet_floors, src)
var/turf/T = parent
@@ -138,12 +145,19 @@
/datum/component/wet_floor/PreTransfer()
var/turf/O = parent
O.cut_overlay(current_overlay)
+ //That turf is no longer slippery, we're out of here
+ //Slippery components don't transfer due to callbacks
+ qdel(O.GetComponent(/datum/component/slippery))
/datum/component/wet_floor/PostTransfer()
if(!isopenturf(parent))
return COMPONENT_INCOMPATIBLE
var/turf/T = parent
T.add_overlay(current_overlay)
+ //Make sure to add/update any slippery component on the new turf (update_flags calls LoadComponent)
+ update_flags()
+
+ //NB it's possible we get deleted after this, due to inherit
/datum/component/wet_floor/proc/add_wet(type, duration_minimum = 0, duration_add = 0, duration_maximum = MAXIMUM_WET_TIME, _permanent = FALSE)
var/static/list/allowed_types = list(TURF_WET_WATER, TURF_WET_LUBE, TURF_WET_ICE, TURF_WET_PERMAFROST)
diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm
index 1b095c555d..31023b3fc7 100644
--- a/code/datums/mutable_appearance.dm
+++ b/code/datums/mutable_appearance.dm
@@ -10,10 +10,11 @@
// And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var
// Helper similar to image()
-/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE)
+/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, color = "#FFFFFF")
var/mutable_appearance/MA = new()
MA.icon = icon
MA.icon_state = icon_state
MA.layer = layer
MA.plane = plane
+ MA.color = color
return MA
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index e6147297df..e6d80bedb5 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -177,8 +177,8 @@
/datum/map_template/shuttle/emergency/airless
suffix = "airless"
name = "Build your own shuttle kit"
- description = "Save money by building your own shuttle! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Interior and atmosphere not included."
- admin_notes = "No brig, no medical facilities, no air."
+ description = "Save money by building your own shuttle! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Interior and lighting not included."
+ admin_notes = "No brig, no medical facilities, just an empty box."
credit_cost = -7500
/datum/map_template/shuttle/emergency/airless/prerequisites_met()
@@ -222,9 +222,9 @@
/datum/map_template/shuttle/emergency/luxury
suffix = "luxury"
name = "Luxury Shuttle"
- description = "A luxurious golden shuttle complete with an indoor swimming pool. Each crewmember wishing to board must bring 500 credits, payable in cash and mineral coin."
- admin_notes = "Due to the limited space for non paying crew, this shuttle may cause a riot."
- credit_cost = 10000
+ description = "A luxurious golden shuttle complete with an indoor swimming pool. Entry is free, so long as you can afford the initial cost."
+ admin_notes = "Fancy, and very roomy!"
+ credit_cost = 17500
/datum/map_template/shuttle/emergency/discoinferno
suffix = "discoinferno"
@@ -300,7 +300,7 @@
suffix = "syndicate"
name = "Syndicate GM Battlecruiser"
credit_cost = 20000
- description = "Manufactured by the Gorlex Marauders, this cruiser has been specially designed with high occupancy in mind, while remaining robust in combat situations. Features a fully stocked EVA storage, armory, medbay, and bar!"
+ description = "(Emag only) Manufactured by the Gorlex Marauders, this cruiser has been specially designed with high occupancy in mind, while remaining robust in combat situations. Features a fully stocked EVA storage, armory, medbay, and bar!"
admin_notes = "An emag exclusive, stocked with syndicate equipment and turrets that will target any simplemob."
/datum/map_template/shuttle/emergency/syndicate/prerequisites_met()
@@ -333,7 +333,7 @@
/datum/map_template/shuttle/emergency/supermatter
suffix = "supermatter"
name = "Hyperfractal Gigashuttle"
- description = "\"I dunno, this seems kinda needlessly complicated.\"\n\
+ description = "(Emag only) \"I dunno, this seems kinda needlessly complicated.\"\n\
\"This shuttle has very a very high safety record, according to CentCom Officer Cadet Yins.\"\n\
\"Are you sure?\"\n\
\"Yes, it has a safety record of N-A-N, which is apparently larger than 100%.\""
@@ -341,7 +341,12 @@
Outside of admin intervention, it cannot explode. \
It does, however, still dust anything on contact, emits high levels of radiation, and induce hallucinations in anyone looking at it without protective goggles. \
Emitters spawn powered on, expect admin notices, they are harmless."
- credit_cost = 100000
+ credit_cost = 15000
+
+/datum/map_template/shuttle/emergency/supermatter/prerequisites_met()
+ if("emagged" in SSshuttle.shuttle_purchase_requirements_met)
+ return TRUE
+ return FALSE
/datum/map_template/shuttle/emergency/imfedupwiththisworld
suffix = "imfedupwiththisworld"
@@ -372,6 +377,12 @@
description = "On the smaller size with a modern design, this shuttle is for the crew who like the cosier things, while still being able to stretch their legs."
credit_cost = 1000
+/datum/map_template/shuttle/emergency/gorilla
+ suffix = "gorilla"
+ name = "Gorilla Cargo Freighter"
+ description = "A rustic, barely excuseable shuttle transporting important cargo. Not for crew who are about to go ape."
+ credit_cost = 2000
+
/datum/map_template/shuttle/ferry/base
suffix = "base"
name = "transport ferry"
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index da59c79ac5..186c988595 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -80,6 +80,36 @@
desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
icon_state = "asleep"
+//TASER
+/datum/status_effect/electrode
+ id = "tased"
+ blocks_combatmode = TRUE
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = null
+
+/datum/status_effect/electrode/on_creation(mob/living/new_owner, set_duration)
+ if(isnum(set_duration))
+ duration = set_duration
+ . = ..()
+ if(iscarbon(owner))
+ var/mob/living/carbon/C = owner
+ if(C.combatmode)
+ C.toggle_combat_mode(TRUE)
+ C.add_movespeed_modifier(MOVESPEED_ID_TASED_STATUS, TRUE, override = TRUE, multiplicative_slowdown = 8)
+
+/datum/status_effect/electrode/on_remove()
+ if(iscarbon(owner))
+ var/mob/living/carbon/C = owner
+ C.remove_movespeed_modifier(MOVESPEED_ID_TASED_STATUS)
+ . = ..()
+
+/datum/status_effect/electrode/tick()
+ if(owner)
+ owner.adjustStaminaLoss(5) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing.
+
+/datum/status_effect/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y
+ return 2
+
//OTHER DEBUFFS
/datum/status_effect/his_wrath //does minor damage over time unless holding His Grace
id = "his_wrath"
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index c8bcd831e2..bc1cfba112 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -11,6 +11,7 @@
var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted
var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves
var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
+ var/blocks_combatmode //Does this status effect prevent the user from toggling combat mode?
var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists
/datum/status_effect/New(list/arguments)
diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm
index f3b8118087..6765cdf2cd 100644
--- a/code/datums/weather/weather_types/radiation_storm.dm
+++ b/code/datums/weather/weather_types/radiation_storm.dm
@@ -18,7 +18,7 @@
area_type = /area
protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer,
- /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle)
+ /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle, /area/security/prison)
target_trait = ZTRAIT_STATION
immunity_type = "rad"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 7c9dc3f4fe..4869874501 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -36,6 +36,12 @@
var/rad_flags = NONE // Will move to flags_1 when i can be arsed to
var/rad_insulation = RAD_NO_INSULATION
+ var/icon/blood_splatter_icon
+ var/list/fingerprints
+ var/list/fingerprintshidden
+ var/list/blood_DNA
+ var/list/suit_fibers
+
/atom/New(loc, ...)
//atom creation method that preloads variables at creation
if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
@@ -220,7 +226,7 @@
return FALSE
/atom/proc/CheckExit()
- return 1
+ return TRUE
/atom/proc/HasProximity(atom/movable/AM as mob|obj)
return
@@ -254,14 +260,27 @@
if(article)
. = "[article] [src]"
override[EXAMINE_POSITION_ARTICLE] = article
+
if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED)
. = override.Join("")
+///Generate the full examine string of this atom (including icon for goonchat)
/atom/proc/get_examine_string(mob/user, thats = FALSE)
. = "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]"
/atom/proc/examine(mob/user)
- to_chat(user, get_examine_string(user, TRUE))
+ //This reformat names to get a/an properly working on item descriptions when they are bloody
+ var/f_name = "\a [src]."
+ if(src.blood_DNA && !istype(src, /obj/effect/decal))
+ if(gender == PLURAL)
+ f_name = "some "
+ else
+ f_name = "a "
+ f_name += "blood-stained [name]!"
+
+ to_chat(user, "[icon2html(src, user)] That's [f_name]")
+
+// to_chat(user, "[get_examine_string(user, TRUE)].")
if(desc)
to_chat(user, desc)
@@ -326,12 +345,14 @@
//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list
/mob/living/proc/get_blood_dna_list()
- if(get_blood_id() != "blood")
+ var/blood_id = get_blood_id()
+ if(!(blood_id =="blood" || blood_id == "jellyblood"))
return
return list("ANIMAL DNA" = "Y-")
/mob/living/carbon/get_blood_dna_list()
- if(get_blood_id() != "blood")
+ var/blood_id = get_blood_id()
+ if(!(blood_id =="blood" || blood_id == "jellyblood"))
return
var/list/blood_dna = list()
if(dna)
@@ -349,18 +370,116 @@
var/new_blood_dna = L.get_blood_dna_list()
if(!new_blood_dna)
return FALSE
- var/old_length = blood_DNA_length()
- add_blood_DNA(new_blood_dna)
- if(blood_DNA_length() == old_length)
+ LAZYINITLIST(blood_DNA) //if our list of DNA doesn't exist yet, initialise it.
+ var/old_length = blood_DNA.len
+ blood_DNA |= new_blood_dna
+ if(blood_DNA.len == old_length)
return FALSE
return TRUE
+//to add blood dna info to the object's blood_DNA list
+/atom/proc/transfer_blood_dna(list/blood_dna, list/datum/disease/diseases)
+ LAZYINITLIST(blood_DNA)
+ var/old_length = blood_DNA.len
+ blood_DNA |= blood_dna
+ if(blood_DNA.len > old_length)
+ return TRUE
+ //some new blood DNA was added
+
//to add blood from a mob onto something, and transfer their dna info
/atom/proc/add_mob_blood(mob/living/M)
var/list/blood_dna = M.get_blood_dna_list()
if(!blood_dna)
return FALSE
- return add_blood_DNA(blood_dna)
+ return add_blood_DNA(blood_dna, M.diseases)
+
+//to add blood onto something, with blood dna info to include.
+/atom/proc/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ return FALSE
+
+/obj/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ return transfer_blood_dna(blood_dna, diseases)
+
+/obj/item/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ . = ..()
+ if(!.)
+ return
+ add_blood_overlay()
+
+/obj/item/proc/add_blood_overlay()
+ if(!blood_DNA.len)
+ return
+ if(initial(icon) && initial(icon_state))
+ blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object
+ blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
+ blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
+ blood_splatter_icon.Blend(blood_DNA_to_color(), ICON_MULTIPLY)
+ add_overlay(blood_splatter_icon)
+
+/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ . = ..()
+ transfer_blood = rand(2, 4)
+
+/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src
+ if(!B)
+ B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases)
+ B.transfer_blood_dna(blood_dna, diseases) //give blood info to the blood decal.
+ return TRUE //we bloodied the floor
+
+/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ if(head)
+ head.add_blood_DNA(blood_dna, diseases)
+ update_inv_head()
+ else if(wear_mask)
+ wear_mask.add_blood_DNA(blood_dna, diseases)
+ update_inv_wear_mask()
+ if(wear_neck)
+ wear_neck.add_blood_DNA(blood_dna, diseases)
+ update_inv_neck()
+ if(wear_suit)
+ wear_suit.add_blood_DNA(blood_dna, diseases)
+ update_inv_wear_suit()
+ else if(w_uniform)
+ w_uniform.add_blood_DNA(blood_dna, diseases)
+ update_inv_w_uniform()
+ if(gloves)
+ var/obj/item/clothing/gloves/G = gloves
+ G.add_blood_DNA(blood_dna, diseases)
+ else
+ transfer_blood_dna(blood_dna, diseases)
+ bloody_hands = rand(2, 4)
+ update_inv_gloves() //handles bloody hands overlays and updating
+ return TRUE
+
+/atom/proc/blood_DNA_to_color()
+ var/list/colors = list()//first we make a list of all bloodtypes present
+ for(var/bloop in blood_DNA)
+ if(colors[blood_DNA[bloop]])
+ colors[blood_DNA[bloop]]++
+ else
+ colors[blood_DNA[bloop]] = 1
+
+ var/final_rgb = BLOOD_COLOR_HUMAN //a default so we don't have white blood graphics if something messed up
+
+ if(colors.len)
+ var/sum = 0 //this is all shitcode, but it works; trust me
+ final_rgb = bloodtype_to_color(colors[1])
+ sum = colors[colors[1]]
+ if(colors.len > 1)
+ var/i = 2
+ while(i <= colors.len)
+ var/tmp = colors[colors[i]]
+ final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum))
+ sum += tmp
+ i++
+
+ return final_rgb
+
+/atom/proc/clean_blood()
+ if(islist(blood_DNA))
+ blood_DNA = null
+ return TRUE
/atom/proc/wash_cream()
return TRUE
@@ -714,4 +833,4 @@ Proc for attack log creation, because really why not
if(filter_data[name])
filter_data -= name
update_filters()
- return TRUE
+ return TRUE
\ No newline at end of file
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 426d23b4ab..58f551c648 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -317,7 +317,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
/obj/effect/meteor/meaty/xeno/ram_turf(turf/T)
if(!isspaceturf(T))
- new /obj/effect/decal/cleanable/xenoblood(T)
+ new /obj/effect/decal/cleanable/blood/xeno(T)
//Station buster Tunguska
/obj/effect/meteor/tunguska
diff --git a/code/game/machinery/bloodbankgen.dm b/code/game/machinery/bloodbankgen.dm
new file mode 100644
index 0000000000..c489f6c9c9
--- /dev/null
+++ b/code/game/machinery/bloodbankgen.dm
@@ -0,0 +1,361 @@
+/obj/machinery/bloodbankgen
+ name = "blood bank generator"
+ desc = "Generates universally applicable synthetics for all blood types. Add regular blood to convert."
+ icon = 'icons/obj/bloodbank.dmi'
+ icon_state = "bloodbank-off"
+ density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 80
+ circuit = /obj/item/circuitboard/machine/bloodbankgen
+ interaction_flags_machine = INTERACT_MACHINE_OPEN | INTERACT_MACHINE_ALLOW_SILICON
+ var/draining = FALSE
+ var/filling = FALSE
+ var/obj/item/reagent_containers/blood/bag = null
+ var/obj/item/reagent_containers/blood/outbag = null
+ var/bloodstored = 0
+ var/maxbloodstored = 1000
+ var/menustat = "menu"
+ var/efficiency = 0
+ var/productivity = 0
+
+/obj/machinery/bloodbankgen/Initialize()
+ . = ..()
+ create_reagents(1000)
+ update_icon()
+
+/obj/machinery/bloodbankgen/Destroy()
+ QDEL_NULL(bag)
+ QDEL_NULL(outbag)
+ return ..()
+
+/obj/machinery/bloodbankgen/contents_explosion(severity, target)
+ ..()
+ if(bag)
+ bag.ex_act(severity, target)
+ if(outbag)
+ outbag.ex_act(severity, target)
+
+/obj/machinery/bloodbankgen/handle_atom_del(atom/A)
+ ..()
+ if(A == bag)
+ bag = null
+ update_icon()
+ updateUsrDialog()
+ if(A == outbag)
+ outbag = null
+ update_icon()
+ updateUsrDialog()
+
+/obj/machinery/bloodbankgen/RefreshParts()
+ var/E = 0
+ var/P = 0
+ for(var/obj/item/stock_parts/manipulator/M in component_parts)
+ E += M.rating
+ efficiency = E
+ productivity = P
+
+/obj/machinery/bloodbankgen/update_icon()
+ cut_overlays()
+ if(is_operational())
+ icon_state = "bloodbank-on"
+
+ if(panel_open)
+ add_overlay("bloodbank-panel")
+
+ if(src.bag)
+ add_overlay("bloodbag-input")
+ if(bag.reagents.total_volume)
+ var/mutable_appearance/filling_overlay = mutable_appearance(icon, "input-reagent")
+
+ var/percent = round((bag.reagents.total_volume / bag.volume) * 100)
+ switch(percent)
+ if(0 to 9)
+ filling_overlay.icon_state = "input-reagent0"
+ if(10 to 24)
+ filling_overlay.icon_state = "input-reagent10"
+ if(25 to 49)
+ filling_overlay.icon_state = "input-reagent25"
+ if(50 to 74)
+ filling_overlay.icon_state = "input-reagent50"
+ if(75 to 79)
+ filling_overlay.icon_state = "input-reagent75"
+ if(80 to 90)
+ filling_overlay.icon_state = "input-reagent80"
+ if(91 to INFINITY)
+ filling_overlay.icon_state = "input-reagent100"
+
+ filling_overlay.color = list(mix_color_from_reagents(bag.reagents.reagent_list))
+ add_overlay(filling_overlay)
+
+ if(src.outbag)
+ add_overlay("bloodbag-output")
+ if(outbag.reagents.total_volume)
+ var/mutable_appearance/filling_overlay = mutable_appearance(icon, "output-reagent")
+
+ var/percent = round((outbag.reagents.total_volume / outbag.volume) * 100)
+ switch(percent)
+ if(0 to 9)
+ filling_overlay.icon_state = "output-reagent0"
+ if(10 to 24)
+ filling_overlay.icon_state = "output-reagent10"
+ if(25 to 49)
+ filling_overlay.icon_state = "output-reagent25"
+ if(50 to 74)
+ filling_overlay.icon_state = "output-reagent50"
+ if(75 to 79)
+ filling_overlay.icon_state = "output-reagent75"
+ if(80 to 90)
+ filling_overlay.icon_state = "output-reagent80"
+ if(91 to INFINITY)
+ filling_overlay.icon_state = "output-reagent100"
+
+ filling_overlay.color = list(mix_color_from_reagents(outbag.reagents.reagent_list))
+ add_overlay(filling_overlay)
+ return
+
+/obj/machinery/bloodbankgen/process()
+ if(!is_operational())
+ return PROCESS_KILL
+
+ bloodstored = reagents.total_volume
+
+ var/transfer_amount = 20
+
+ if(draining)
+ if(reagents.total_volume >= reagents.maximum_volume)
+ draining = FALSE
+ return
+
+ if(bag)
+ if(bag.reagents.total_volume)
+ var/datum/reagent/blood/B = bag.reagents.has_reagent("blood")
+ if(B)
+ var/amount = reagents.maximum_volume - reagents.total_volume //monitor the machine's internal storage
+ amount = min(amount, transfer_amount)
+ if(!amount)
+ draining = FALSE
+ updateUsrDialog()
+ visible_message("[src] beeps loudly.")
+ playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
+ return
+
+ if(bag.blood_type == "SY") //no infinite loops using synthetics.
+ reagents.add_reagent("syntheticblood", amount)
+ else
+ reagents.add_reagent("syntheticblood", (amount+(5*efficiency)))
+
+ if(bag.reagents.total_volume >= amount)
+ bag.reagents.remove_reagent("blood", amount)
+ else
+ visible_message("[src] beeps loudly.")
+ playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
+ draining = FALSE
+
+ bag.update_icon()
+ update_icon()
+ updateUsrDialog()
+ else
+ draining = FALSE
+ updateUsrDialog()
+ return
+
+ if(filling)
+ if(!reagents || !reagents.total_volume)
+ filling = FALSE //there ain't anything in the machine yo.
+ return
+ if(outbag && outbag.reagents.total_volume < outbag.reagents.maximum_volume)
+ var/amount = outbag.reagents.maximum_volume - outbag.reagents.total_volume //monitor the output bag's internal storage
+ amount = min(amount, transfer_amount)
+ if(!amount)
+ filling = FALSE
+ visible_message("[src] pings.")
+ playsound(loc, 'sound/machines/beep.ogg', 50, 1)
+ updateUsrDialog()
+ return
+
+ reagents.trans_to(outbag, amount)
+ outbag.update_icon()
+ update_icon()
+ updateUsrDialog()
+ else
+ visible_message("[src] pings.")
+ playsound(loc, 'sound/machines/beep.ogg', 50, 1)
+ filling = FALSE
+ updateUsrDialog()
+ return
+
+/obj/machinery/bloodbankgen/attackby(obj/item/O, mob/user, params)
+ if(user.a_intent == INTENT_HARM)
+ return ..()
+
+ if(default_deconstruction_screwdriver(user, "bloodbank-off", "bloodbank-off", O))
+ if(bag)
+ var/obj/item/reagent_containers/blood/B = bag
+ B.forceMove(drop_location())
+ bag = null
+ if(outbag)
+ var/obj/item/reagent_containers/blood/B = outbag
+ B.forceMove(drop_location())
+ outbag = null
+ update_icon()
+ return
+
+ if(default_deconstruction_crowbar(O))
+ return
+
+ if(istype(O, /obj/item/reagent_containers/blood))
+ . = 1 //no afterattack
+ if(!panel_open)
+ if(bag && outbag)
+ to_chat(user, "This machine already has bags attached.")
+
+ if(!bag && !outbag)
+ var/choice = alert(user, "Choose where to place [O]", "", "Input", "Cancel", "Output")
+ switch(choice)
+ if("Cancel")
+ return FALSE
+ if("Input")
+ attachinput(O, user)
+ if("Output")
+ attachoutput(O, user)
+ else if(!bag)
+ attachinput(O, user)
+ else if(!outbag)
+ attachoutput(O, user)
+ else
+ to_chat(user, "Close the maintenance panel first.")
+ return
+
+ else
+ to_chat(user, "You cannot put this in [src]!")
+
+/obj/machinery/bloodbankgen/ui_interact(mob/user)
+ . = ..()
+
+ if(!is_operational())
+ return
+
+ var/dat
+ switch(menustat)
+ if("noblood")
+ dat += "
You do not have enough blood product to create synthetics.
"
+ menustat = "menu"
+ if("complete")
+ dat += "Operation complete.
"
+ menustat = "menu"
+ if("nobagspace")
+ dat += "Not enough space left in container. Please replace receptical.
"
+ menustat = "menu"
+
+ dat+= "
Current Synthetics stockpile: [reagents.total_volume] units.
"
+
+ dat += "
Supply Bag
"
+ if(bag)
+ dat += "
Current Capacity: [bag.reagents.total_volume] of [bag.reagents.maximum_volume]"
+ if(bag.reagents && bag.reagents.total_volume)
+ dat += "
Drain"
+
+ dat += "
Detach"
+
+
+ dat += "
Synthetics Bag
"
+ if(outbag)
+ dat += "
Current Capacity:[outbag.reagents.total_volume] of [outbag.reagents.maximum_volume]"
+ if(!(outbag.reagents.total_volume >= outbag.reagents.maximum_volume))
+ dat += "
Fill"
+ dat += "
Detach"
+
+ if(!bag && !outbag)
+ dat += "No containers inside, please insert container.
"
+
+ var/datum/browser/popup = new(user, "bloodbankgen", name, 350, 520)
+ popup.set_content(dat)
+ popup.open()
+
+/obj/machinery/bloodbankgen/proc/activateinput()
+ if(bag)
+ draining = TRUE
+ update_icon()
+ else
+ to_chat(usr, "There is no blood bag in the input slot.")
+ return
+
+/obj/machinery/bloodbankgen/proc/activateoutput()
+ if(outbag)
+ filling = TRUE
+ update_icon()
+ else
+ to_chat(usr, "There is no blood bag in the output slot.")
+ return
+
+/obj/machinery/bloodbankgen/proc/check_container_volume(list/reagents, multiplier = 1)
+ var/sum_reagents = 0
+ for(var/R in reagents)
+ sum_reagents += reagents[R]
+ sum_reagents *= multiplier
+
+ if(outbag.reagents.total_volume + sum_reagents > outbag.reagents.maximum_volume)
+ menustat = "nobagspace"
+ return FALSE
+
+ return TRUE
+
+/obj/machinery/bloodbankgen/proc/detachinput()
+ if(bag)
+ bag.forceMove(drop_location())
+ if(usr && Adjacent(usr) && !issiliconoradminghost(usr))
+ usr.put_in_hands(bag)
+ bag = null
+ update_icon()
+
+/obj/machinery/bloodbankgen/proc/detachoutput()
+ if(outbag)
+ outbag.forceMove(drop_location())
+ if(usr && Adjacent(usr) && !issiliconoradminghost(usr))
+ usr.put_in_hands(outbag)
+ outbag = null
+ update_icon()
+
+/obj/machinery/bloodbankgen/proc/attachinput(obj/item/O, mob/user)
+ if(!bag)
+ if(!user.transferItemToLoc(O, src))
+ return
+ bag = O
+ to_chat(user, "You add [O] to the machine's input slot.")
+ update_icon()
+ updateUsrDialog()
+ else
+ to_chat(user, "There is already something in this slot!")
+
+/obj/machinery/bloodbankgen/proc/attachoutput(obj/item/O, mob/user)
+ if(!outbag)
+ if(!user.transferItemToLoc(O, src))
+ return
+ outbag = O
+ to_chat(user, "You add [O] to the machine's output slot.")
+ update_icon()
+ updateUsrDialog()
+ else
+ to_chat(user, "There is already something in this slot!")
+
+/obj/machinery/bloodbankgen/Topic(href, href_list)
+ if(..() || panel_open)
+ return
+
+ usr.set_machine(src)
+
+ if(href_list["activateinput"])
+ activateinput()
+ updateUsrDialog()
+
+ else if(href_list["detachinput"])
+ detachinput()
+ updateUsrDialog()
+
+ else if(href_list["activateoutput"])
+ activateoutput()
+ updateUsrDialog()
+
+ else if(href_list["detachoutput"])
+ detachoutput()
+ updateUsrDialog()
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index d4fe3e27a2..c912586ea3 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -575,7 +575,7 @@
if(user)
if(message)
if(authenticated)
- if(user.canUseTopic(src, BE_CLOSE))
+ if(user.canUseTopic(src, !issilicon(user)))
if(!record1 || record1 == active1)
if(!record2 || record2 == active2)
return 1
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 1823e34100..efb1039b8b 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -801,7 +801,7 @@ What a mess.*/
/obj/machinery/computer/secure_data/proc/canUseSecurityRecordsConsole(mob/user, message1 = 0, record1, record2)
if(user)
if(authenticated)
- if(user.canUseTopic(src, BE_CLOSE))
+ if(user.canUseTopic(src, !issilicon(user)))
if(!trim(message1))
return 0
if(!record1 || record1 == active1)
diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm
index 0e6a059c7b..f4f20aecc9 100644
--- a/code/game/machinery/computer/teleporter.dm
+++ b/code/game/machinery/computer/teleporter.dm
@@ -139,7 +139,7 @@
L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = M
var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L
- if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) //check if we are still around
+ if(!user.canUseTopic(src, !issilicon(user), NO_DEXTERY)) //check if we are still around
return
target = L[desc]
if(imp_t)
@@ -167,7 +167,7 @@
to_chat(user, "No active connected stations located.")
return
var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L
- if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) //again, check if we are still around
+ if(!user.canUseTopic(src, !issilicon(user), NO_DEXTERY)) //again, check if we are still around
return
var/obj/machinery/teleport/station/target_station = L[desc]
if(!target_station || !target_station.teleporter_hub)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index a2da7de29a..3ac386e1fb 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -326,7 +326,7 @@
else //for simple_animals & borgs
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
var/turf/location = get_turf(src)
- //add_blood doesn't work for borgs/xenos, but add_blood_floor does.
+ //add_blood_DNA doesn't work for borgs/xenos, but add_blood_floor does.
if(iscarbon(L))
var/mob/living/carbon/C = L
C.bleed(DOOR_CRUSH_DAMAGE)
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index b217c14e53..621ca266bb 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -8,14 +8,14 @@
icon_state = "iv_drip"
anchored = FALSE
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
- var/mob/living/carbon/attached = null
+ var/mob/living/carbon/attached
var/mode = IV_INJECTING
- var/obj/item/reagent_containers/beaker = null
+ var/obj/item/reagent_containers/beaker
var/static/list/drip_containers = typecacheof(list(/obj/item/reagent_containers/blood,
/obj/item/reagent_containers/food,
/obj/item/reagent_containers/glass))
-/obj/machinery/iv_drip/Initialize()
+/obj/machinery/iv_drip/Initialize(mapload)
. = ..()
update_icon()
@@ -84,6 +84,8 @@
if(Adjacent(target) && usr.Adjacent(target))
if(beaker)
usr.visible_message("[usr] attaches [src] to [target].", "You attach [src] to [target].")
+ log_combat(usr, target, "attached", src, "containing: [beaker.name] - ([beaker.reagents.log_list()])")
+ add_fingerprint(usr)
attached = target
START_PROCESSING(SSmachines, src)
update_icon()
@@ -100,6 +102,8 @@
return
beaker = W
to_chat(user, "You attach [W] to [src].")
+ user.log_message("attached a [W] to [src] at [AREACOORD(src)] containing ([beaker.reagents.log_list()])", LOG_ATTACK)
+ add_fingerprint(user)
update_icon()
return
else
@@ -142,10 +146,11 @@
if(!amount)
if(prob(5))
visible_message("[src] pings.")
+ playsound(loc, 'sound/machines/beep.ogg', 50, 1)
return
// If the human is losing too much blood, beep.
- if(attached.blood_volume < ( (BLOOD_VOLUME_SAFE*attached.blood_ratio) && prob(5) ) )
+ if(attached.blood_volume < ((BLOOD_VOLUME_SAFE*attached.blood_ratio) && prob(5) && ishuman(attached))) //really couldn't care less about monkeys
visible_message("[src] beeps loudly.")
playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
attached.transfer_blood_to(beaker, amount)
@@ -178,9 +183,10 @@
if(usr.incapacitated())
return
-
if(beaker)
- beaker.forceMove(drop_location())
+ if(usr && Adjacent(usr) && !issiliconoradminghost(usr))
+ if(!usr.put_in_hands(beaker))
+ beaker.forceMove(drop_location())
beaker = null
update_icon()
@@ -195,27 +201,27 @@
if(usr.incapacitated())
return
-
mode = !mode
to_chat(usr, "The IV drip is now [mode ? "injecting" : "taking blood"].")
update_icon()
/obj/machinery/iv_drip/examine(mob/user)
- ..()
+ . = ..()
if(get_dist(user, src) > 2)
return
- to_chat(user, "The IV drip is [mode ? "injecting" : "taking blood"].")
+ . += "[src] is [mode ? "injecting" : "taking blood"].\n"
if(beaker)
if(beaker.reagents && beaker.reagents.reagent_list.len)
- to_chat(user, "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.")
+ . += "\tAttached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.\n"
else
- to_chat(user, "Attached is an empty [beaker.name].")
+ . += "\tAttached is an empty [beaker.name].\n"
else
- to_chat(user, "No chemicals are attached.")
+ . += "\tNo chemicals are attached.\n"
- to_chat(user, "[attached ? attached : "No one"] is attached.")
+ . += "\t[attached ? attached : "No one"] is attached."
+ to_chat(user,.)
#undef IV_TAKING
-#undef IV_INJECTING
+#undef IV_INJECTING
\ No newline at end of file
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index b0a75c99dc..165170cf0f 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -40,6 +40,8 @@
var/stun_projectile = null //stun mode projectile type
var/stun_projectile_sound
+ var/nonlethal_projectile //projectile to use in stun mode when the target is resting, if any
+ var/nonlethal_projectile_sound
var/lethal_projectile = null //lethal mode projectile type
var/lethal_projectile_sound
@@ -535,13 +537,22 @@
T = closer
break
+ var/mob/living/carbon/C
+ if(iscarbon(target))
+ C = target
+
update_icon()
var/obj/item/projectile/A
//any emagged turrets drains 2x power and uses a different projectile?
if(mode == TURRET_STUN)
- use_power(reqpower)
- A = new stun_projectile(T)
- playsound(loc, stun_projectile_sound, 75, 1)
+ if(nonlethal_projectile && C && C.resting)
+ use_power(reqpower*0.5)
+ A = new nonlethal_projectile(T)
+ playsound(loc, nonlethal_projectile_sound, 75, 1)
+ else
+ use_power(reqpower)
+ A = new stun_projectile(T)
+ playsound(loc, stun_projectile_sound, 75, 1)
else
use_power(reqpower * 2)
A = new lethal_projectile(T)
@@ -653,6 +664,8 @@
base_icon_state = "standard"
stun_projectile = /obj/item/projectile/energy/electrode
stun_projectile_sound = 'sound/weapons/taser.ogg'
+ nonlethal_projectile = /obj/item/projectile/beam/disabler
+ nonlethal_projectile_sound = 'sound/weapons/taser2.ogg'
lethal_projectile = /obj/item/projectile/beam/laser
lethal_projectile_sound = 'sound/weapons/laser.ogg'
desc = "An energy blaster auto-turret."
@@ -662,6 +675,8 @@
base_icon_state = "standard"
stun_projectile = /obj/item/projectile/energy/electrode
stun_projectile_sound = 'sound/weapons/taser.ogg'
+ nonlethal_projectile = /obj/item/projectile/beam/disabler
+ nonlethal_projectile_sound = 'sound/weapons/taser2.ogg'
lethal_projectile = /obj/item/projectile/beam/laser/heavylaser
lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg'
desc = "An energy blaster auto-turret."
@@ -681,6 +696,8 @@
/obj/machinery/porta_turret/ai
faction = list("silicon")
+ nonlethal_projectile = /obj/item/projectile/beam/disabler
+ nonlethal_projectile_sound = 'sound/weapons/taser2.ogg'
/obj/machinery/porta_turret/ai/assess_perp(mob/living/carbon/human/perp)
return 10 //AI turrets shoot at everything not in their faction
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 9d431487e0..90de34a22d 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -99,7 +99,7 @@
/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE)
var/list/to_eat
if(isitem(AM0))
- to_eat = AM0.GetAllContents()
+ to_eat = AM0.GetAllContentsIgnoring(GLOB.typecache_mob)
else
to_eat = list(AM0)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index d308d180d0..f35caf514c 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -265,6 +265,8 @@
things_to_clear += occupant.GetAllContents()
for(var/atom/movable/AM in things_to_clear) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG)
+ AM.clean_blood()
+ AM.fingerprints = list()
var/datum/component/radioactive/contamination = AM.GetComponent(/datum/component/radioactive)
if(contamination)
qdel(contamination)
@@ -435,4 +437,4 @@
if(I)
I.forceMove(loc)
. = TRUE
- update_icon()
+ update_icon()
\ No newline at end of file
diff --git a/code/game/machinery/turnstile.dm b/code/game/machinery/turnstile.dm
new file mode 100644
index 0000000000..1fd78056d4
--- /dev/null
+++ b/code/game/machinery/turnstile.dm
@@ -0,0 +1,84 @@
+/obj/machinery/turnstile
+ name = "turnstile"
+ desc = "A mechanical door that permits one-way access and prevents tailgating."
+ icon = 'icons/obj/turnstile.dmi'
+ icon_state = "turnstile_map"
+ density = FALSE
+ armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100, fire = 90, acid = 70)
+ anchored = TRUE
+ use_power = FALSE
+ idle_power_usage = 2
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ layer = OPEN_DOOR_LAYER
+
+/obj/machinery/turnstile/Initialize()
+ . = ..()
+ icon_state = "turnstile"
+
+/obj/machinery/turnstile/CanAtmosPass(turf/T)
+ return TRUE
+
+/obj/machinery/turnstile/bullet_act(obj/item/projectile/P, def_zone)
+ return -1 //Pass through!
+
+/obj/machinery/turnstile/proc/allowed_access(var/mob/B)
+ if(B.pulledby && ismob(B.pulledby))
+ return allowed(B.pulledby) | allowed(B)
+ else
+ return allowed(B)
+
+/obj/machinery/turnstile/CanPass(atom/movable/AM, turf/T)
+ if(ismob(AM))
+ var/mob/B = AM
+ if(isliving(AM))
+ var/mob/living/M = AM
+
+ if(world.time - M.last_bumped <= 5)
+ return FALSE
+ M.last_bumped = world.time
+
+ var/allowed_access = FALSE
+ var/turf/behind = get_step(src, dir)
+
+ if(B in behind.contents)
+ allowed_access = allowed_access(B)
+ else
+ to_chat(usr, "\the [src] resists your efforts.")
+ return FALSE
+
+ if(allowed_access)
+ flick("operate", src)
+ playsound(src,'sound/items/ratchet.ogg',50,0,3)
+ return TRUE
+ else
+ flick("deny", src)
+ playsound(src,'sound/machines/deniedbeep.ogg',50,0,3)
+ return FALSE
+ if(ispath(AM, /obj/item/))
+ return TRUE
+ else
+ return FALSE
+
+/obj/machinery/turnstile/CheckExit(atom/movable/AM as mob|obj, target)
+ if(isliving(AM))
+ var/mob/living/M = AM
+ var/outdir = dir
+ if(allowed_access(M))
+ switch(dir)
+ if(NORTH)
+ outdir = SOUTH
+ if(SOUTH)
+ outdir = NORTH
+ if(EAST)
+ outdir = WEST
+ if(WEST)
+ outdir = EAST
+ var/turf/outturf = get_step(src, outdir)
+ var/canexit = (target == src.loc) | (target == outturf)
+
+ if(!canexit && world.time - M.last_bumped <= 5)
+ to_chat(usr, "\the [src] resists your efforts.")
+ M.last_bumped = world.time
+ return canexit
+ else
+ return TRUE
\ No newline at end of file
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 5e8515d3d5..8be079656b 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -11,10 +11,6 @@
var/obj/item/color_source
var/max_wash_capacity = 5
-/obj/machinery/washing_machine/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood)))
-
/obj/machinery/washing_machine/examine(mob/user)
..()
to_chat(user, "Alt-click it to start a wash cycle.")
@@ -59,7 +55,8 @@
M.Translate(rand(-3, 3), rand(-1, 3))
animate(src, transform=M, time=2)
-/obj/machinery/washing_machine/proc/clean_blood()
+/obj/machinery/washing_machine/clean_blood()
+ ..()
if(!busy)
bloody_mess = FALSE
update_icon()
@@ -67,7 +64,8 @@
/obj/machinery/washing_machine/proc/wash_cycle()
for(var/X in contents)
var/atom/movable/AM = X
- SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ AM.clean_blood()
AM.machine_wash(src)
busy = FALSE
diff --git a/code/game/mecha/combat/neovgre.dm b/code/game/mecha/combat/neovgre.dm
new file mode 100644
index 0000000000..2b2ed150e2
--- /dev/null
+++ b/code/game/mecha/combat/neovgre.dm
@@ -0,0 +1,96 @@
+/obj/mecha/combat/neovgre
+ name = "Neovgre, the Anima Bulwark"
+ desc = "Nezbere's most powerful creation, a mighty war machine of unmatched power said to have ended wars in a single night."
+ icon = 'icons/mecha/neovgre.dmi'
+ icon_state = "neovgre"
+ max_integrity = 500 //This is THE ratvarian superweaon, its deployment is an investment
+ armor = list("melee" = 50, "bullet" = 40, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) //Its similar to the clockwork armour albeit with a few buffs becuase RATVARIAN SUPERWEAPON!!
+ force = 50 //SMASHY SMASHY!!
+ internal_damage_threshold = 0
+ step_in = 3
+ pixel_x = -16
+ layer = ABOVE_MOB_LAYER
+ breach_time = 100 //ten seconds till all goes to shit
+ recharge_rate = 100
+ wreckage = /obj/structure/mecha_wreckage/durand/neovgre
+
+/obj/mecha/combat/neovgre/GrantActions(mob/living/user, human_occupant = 0) //No Eject action for you sonny jim, your life for Ratvar!
+ internals_action.Grant(user, src)
+ cycle_action.Grant(user, src)
+ lights_action.Grant(user, src)
+ stats_action.Grant(user, src)
+ strafing_action.Grant(user, src)
+
+/obj/mecha/combat/neovgre/RemoveActions(mob/living/user, human_occupant = 0)
+ internals_action.Remove(user)
+ cycle_action.Remove(user)
+ lights_action.Remove(user)
+ stats_action.Remove(user)
+ strafing_action.Remove(user)
+
+/obj/mecha/combat/neovgre/MouseDrop_T(mob/M, mob/user)
+ if(!is_servant_of_ratvar(user))
+ to_chat(user, "BEGONE HERETIC!")
+ return
+ else
+ ..()
+
+/obj/mecha/combat/neovgre/moved_inside(mob/living/carbon/human/H)
+ var/list/Itemlist = H.get_contents()
+ for(var/obj/item/clockwork/slab/W in Itemlist)
+ to_chat(H, "You safely store [W] inside [src].")
+ qdel(W)
+ . = ..()
+
+/obj/mecha/combat/neovgre/obj_destruction()
+ for(var/mob/M in src)
+ to_chat(M, "You are consumed by the fires raging within Neovgre...")
+ M.dust()
+ playsound(src, 'sound/magic/lightning_chargeup.ogg', 100, 0)
+ src.visible_message("The reactor has gone critical, its going to blow!")
+ addtimer(CALLBACK(src,.proc/go_critical),breach_time)
+
+/obj/mecha/combat/neovgre/proc/go_critical()
+ explosion(get_turf(loc), 3, 5, 10, 20, 30)
+ Destroy(src)
+
+/obj/mecha/combat/neovgre/container_resist(mob/living/user)
+ to_chat(user, "Neovgre requires a lifetime commitment friend, no backing out now!")
+ return
+
+/obj/mecha/combat/neovgre/process()
+ ..()
+ if(GLOB.ratvar_awakens) // At this point only timley intervention by lord singulo could hople to stop the superweapon
+ cell.charge = INFINITY
+ max_integrity = INFINITY
+ obj_integrity = max_integrity
+ CHECK_TICK //Just to be on the safe side lag wise
+ else if(cell.charge < cell.maxcharge)
+ for(var/obj/effect/clockwork/sigil/transmission/T in range(SIGIL_ACCESS_RANGE, src))
+ var/delta = min(recharge_rate, cell.maxcharge - cell.charge)
+ if (get_clockwork_power() <= delta)
+ cell.charge += delta
+ adjust_clockwork_power(-delta)
+ CHECK_TICK
+
+/obj/mecha/combat/neovgre/Initialize()
+ .=..()
+ GLOB.neovgre_exists ++
+ var/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/N = new
+ N.attach(src)
+
+/obj/structure/mecha_wreckage/durand/neovgre
+ name = "\improper Neovgre wreckage?"
+ desc = "On closer inspection this looks like the wreck of a durand with some spraypainted cardboard duct taped to it!"
+
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre
+ equip_cooldown = 8 //Rapid fire heavy laser cannon, simple yet elegant
+ energy_drain = 30
+ name = "Aribter Laser Cannon"
+ desc = "Please re-attach this to neovgre and stop asking questions about why it looks like a normal Nanotrasen issue Solaris laser cannon - Nezbere"
+ fire_sound = "sound/weapons/neovgre_laser.ogg"
+
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/can_attach(obj/mecha/combat/neovgre/M)
+ if(istype(M))
+ return 1
+ return 0
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 22aac63d2b..7348c8a575 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -49,6 +49,8 @@
var/lights = FALSE
var/lights_power = 6
var/last_user_hud = 1 // used to show/hide the mecha hud while preserving previous preference
+ var/breach_time = 0
+ var/recharge_rate = 0
var/bumpsmash = 0 //Whether or not the mech destroys walls by running into it.
//inner atmos
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index d5aff99f32..2eb4a6aa0c 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -8,6 +8,7 @@
/obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases)
. = ..()
+ LAZYINITLIST(blood_DNA) //Kinda needed
if (random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0)
icon_state = pick(random_icon_states)
create_reagents(300)
@@ -27,7 +28,7 @@
/obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal
if(mergeable_decal)
- return TRUE
+ qdel(C)
/obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks))
@@ -81,7 +82,9 @@
add_blood = bloodiness
bloodiness -= add_blood
S.bloody_shoes[blood_state] = min(MAX_SHOE_BLOODINESS,S.bloody_shoes[blood_state]+add_blood)
- S.add_blood_DNA(return_blood_DNA())
+ if(blood_DNA && blood_DNA.len)
+ S.add_blood_DNA(blood_DNA)
+ S.add_blood_overlay()
S.blood_state = blood_state
update_icon()
H.update_inv_shoes()
@@ -90,4 +93,4 @@
if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
return bloodiness
else
- return 0
+ return FALSE
diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm
index ca2a8ccaff..988011c492 100644
--- a/code/game/objects/effects/decals/cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/cleanable/aliens.dm
@@ -1,71 +1,72 @@
-// Note: BYOND is object oriented. There is no reason for this to be copy/pasted blood code.
-/obj/effect/decal/cleanable/xenoblood
+/obj/effect/decal/cleanable/blood/xeno
name = "xeno blood"
desc = "It's green and acidic. It looks like... blood?"
- icon = 'icons/effects/blood.dmi'
- icon_state = "xfloor1"
- random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
- bloodiness = BLOOD_AMOUNT_PER_DECAL
- blood_state = BLOOD_STATE_XENO
+ color = BLOOD_COLOR_XENO
-/obj/effect/decal/cleanable/xenoblood/Initialize()
+/obj/effect/decal/cleanable/blood/splatter/xeno
+ color = BLOOD_COLOR_XENO
+
+/obj/effect/decal/cleanable/blood/gibs/xeno
+ color = BLOOD_COLOR_XENO
+ gibs_reagent_id = "liquidxenogibs"
+ gibs_bloodtype = "X*"
+
+/obj/effect/decal/cleanable/blood/gibs/xeno/Initialize(mapload, list/datum/disease/diseases)
. = ..()
- add_blood_DNA(list("UNKNOWN DNA" = "X*"))
+ update_icon()
-/obj/effect/decal/cleanable/xenoblood/xsplatter
- random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
+/obj/effect/decal/cleanable/blood/gibs/xeno/update_icon()
+ add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY)
+ cut_overlays()
+ var/mutable_appearance/flesh = mutable_appearance(icon, "[icon_state]x_flesh")
+ flesh.appearance_flags = RESET_COLOR
+ flesh.color = body_colors
+ add_overlay(flesh)
-/obj/effect/decal/cleanable/xenoblood/xgibs
- name = "xeno gibs"
- desc = "Gnarly..."
- icon = 'icons/effects/blood.dmi'
- icon_state = "xgib1"
- layer = LOW_OBJ_LAYER
- random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
- mergeable_decal = FALSE
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/proc/streak(list/directions)
+/obj/effect/decal/cleanable/blood/gibs/xeno/streak(list/directions)
set waitfor = 0
var/direction = pick(directions)
for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
sleep(2)
if(i > 0)
- new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc)
+ var/list/datum/disease/diseases
+ GET_COMPONENT(infective, /datum/component/infective)
+ if(infective)
+ diseases = infective.diseases
+ var/obj/effect/decal/cleanable/blood/splatter/xeno/splat = new /obj/effect/decal/cleanable/blood/splatter/xeno(loc, diseases)
+ splat.transfer_blood_dna(blood_DNA, diseases)
if(!step_to(src, get_step(src, direction), 0))
break
-/obj/effect/decal/cleanable/xenoblood/xgibs/ex_act()
- return
+/obj/effect/decal/cleanable/blood/gibs/xeno/up
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
-/obj/effect/decal/cleanable/xenoblood/xgibs/up
- random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1")
+/obj/effect/decal/cleanable/blood/gibs/xeno/down
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
-/obj/effect/decal/cleanable/xenoblood/xgibs/down
- random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibdown1","xgibdown1","xgibdown1")
+/obj/effect/decal/cleanable/blood/gibs/xeno/body
+ random_icon_states = list("gibhead", "gibtorso")
-/obj/effect/decal/cleanable/xenoblood/xgibs/body
- random_icon_states = list("xgibhead", "xgibtorso")
+/obj/effect/decal/cleanable/blood/gibs/xeno/torso
+ random_icon_states = list("gibtorso")
-/obj/effect/decal/cleanable/xenoblood/xgibs/torso
- random_icon_states = list("xgibtorso")
+/obj/effect/decal/cleanable/blood/gibs/xeno/limb
+ random_icon_states = list("gibleg", "gibarm")
-/obj/effect/decal/cleanable/xenoblood/xgibs/limb
- random_icon_states = list("xgibleg", "xgibarm")
+/obj/effect/decal/cleanable/blood/gibs/xeno/core
+ random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
-/obj/effect/decal/cleanable/xenoblood/xgibs/core
- random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3")
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva
+/obj/effect/decal/cleanable/blood/gibs/xeno/larva
random_icon_states = list("xgiblarva1", "xgiblarva2")
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body
+/obj/effect/decal/cleanable/blood/gibs/xeno/larva/body
random_icon_states = list("xgiblarvahead", "xgiblarvatorso")
/obj/effect/decal/cleanable/blood/xtracks
- icon_state = "xtracks"
+ icon_state = "tracks"
random_icon_states = null
/obj/effect/decal/cleanable/blood/xtracks/Initialize()
- . = ..()
- add_blood_DNA(list("Unknown DNA" = "X*"))
+ add_blood_DNA(list("UNKNOWN DNA" = "X*"))
+ . = ..()
\ No newline at end of file
diff --git a/code/game/objects/effects/decals/cleanable/gibs.dm b/code/game/objects/effects/decals/cleanable/gibs.dm
new file mode 100644
index 0000000000..e5d38d3ef6
--- /dev/null
+++ b/code/game/objects/effects/decals/cleanable/gibs.dm
@@ -0,0 +1,233 @@
+/obj/effect/decal/cleanable/blood/gibs
+ name = "gibs"
+ desc = "They look bloody and gruesome."
+ icon_state = "gibbl5"
+ layer = LOW_OBJ_LAYER
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
+ mergeable_decal = FALSE
+ var/body_colors = "#e3ba84" //a default color just in case.
+ var/gibs_reagent_id = "liquidgibs"
+ var/gibs_bloodtype = "A+"
+
+/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases)
+ . = ..()
+ if(random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0)
+ icon_state = pick(random_icon_states)
+ if(gibs_reagent_id)
+ reagents.add_reagent(gibs_reagent_id, 5)
+ if(gibs_bloodtype)
+ add_blood_DNA(list("Non-human DNA" = gibs_bloodtype, diseases))
+ update_icon()
+
+
+/obj/effect/decal/cleanable/blood/gibs/update_icon()
+ add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY)
+ cut_overlays()
+ var/mutable_appearance/guts = mutable_appearance(icon, "[icon_state]_guts")
+ guts.appearance_flags = RESET_COLOR
+ add_overlay(guts)
+ var/mutable_appearance/flesh = mutable_appearance(icon, "[icon_state]_flesh")
+ flesh.appearance_flags = RESET_COLOR
+ flesh.color = body_colors
+ add_overlay(flesh)
+
+/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target)
+ return
+
+/obj/effect/decal/cleanable/blood/gibs/Crossed(mob/living/L)
+ if(istype(L) && has_gravity(loc))
+ playsound(loc, 'sound/effects/gib_step.ogg', !HAS_TRAIT(L,TRAIT_LIGHT_STEP) ? 20 : 50, 1)
+ . = ..()
+
+/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions)
+ set waitfor = 0
+ var/direction = pick(directions)
+ for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
+ sleep(2)
+ if(i > 0)
+ var/list/datum/disease/diseases
+ GET_COMPONENT(infective, /datum/component/infective)
+ if(infective)
+ diseases = infective.diseases
+ var/obj/effect/decal/cleanable/blood/splatter/splat = new /obj/effect/decal/cleanable/blood/splatter(loc, diseases)
+ splat.transfer_blood_dna(blood_DNA, diseases)
+ if(!step_to(src, get_step(src, direction), 0))
+ break
+
+/obj/effect/decal/cleanable/blood/gibs/up
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
+
+/obj/effect/decal/cleanable/blood/gibs/down
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
+
+/obj/effect/decal/cleanable/blood/gibs/body
+ random_icon_states = list("gibhead", "gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/torso
+ random_icon_states = list("gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/limb
+ random_icon_states = list("gibleg", "gibarm")
+
+/obj/effect/decal/cleanable/blood/gibs/core
+ random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
+
+/obj/effect/decal/cleanable/blood/gibs/old
+ name = "old rotting gibs"
+ desc = "Space Jesus, why didn't anyone clean this up? It smells terrible."
+ bloodiness = 0
+
+/obj/effect/decal/cleanable/blood/gibs/old/Initialize(mapload, list/datum/disease/diseases)
+ . = ..()
+ setDir(pick(GLOB.cardinals))
+ icon_state += "-old"
+ update_icon()
+
+/obj/effect/decal/cleanable/blood/drip
+ name = "drips of blood"
+ desc = "It's gooey."
+ icon_state = "1"
+ random_icon_states = list("drip1","drip2","drip3","drip4","drip5")
+ bloodiness = 0
+ var/drips = 1
+
+/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in()
+ return TRUE
+
+/obj/effect/decal/cleanable/blood/gibs/human
+
+/obj/effect/decal/cleanable/blood/gibs/human/Initialize(mapload, list/datum/disease/diseases)
+ . = ..()
+ update_icon()
+
+/obj/effect/decal/cleanable/blood/gibs/human/up
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
+
+/obj/effect/decal/cleanable/blood/gibs/human/down
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
+
+/obj/effect/decal/cleanable/blood/gibs/human/body
+ random_icon_states = list("gibhead", "gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/human/torso
+ random_icon_states = list("gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/human/limb
+ random_icon_states = list("gibleg", "gibarm")
+
+/obj/effect/decal/cleanable/blood/gibs/human/core
+ random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
+
+
+//Lizards
+/obj/effect/decal/cleanable/blood/gibs/human/lizard
+ body_colors = "117720"
+ gibs_reagent_id = "liquidgibs"
+ gibs_bloodtype = "L"
+
+/obj/effect/decal/cleanable/blood/gibs/human/lizard/Initialize(mapload, list/datum/disease/diseases)
+ . = ..()
+ update_icon()
+
+/obj/effect/decal/cleanable/blood/gibs/human/lizard/up
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
+
+/obj/effect/decal/cleanable/blood/gibs/human/lizard/down
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
+
+/obj/effect/decal/cleanable/blood/gibs/human/lizard/body
+ random_icon_states = list("gibhead", "gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/human/lizard/torso
+ random_icon_states = list("gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/human/lizard/limb
+ random_icon_states = list("gibleg", "gibarm")
+
+/obj/effect/decal/cleanable/blood/gibs/human/lizard/core
+ random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
+
+// Slime Gibs
+/obj/effect/decal/cleanable/blood/gibs/slime
+ desc = "They look gooey and gruesome."
+ gibs_reagent_id = "liquidslimegibs"
+ gibs_bloodtype = "GEL"
+
+/obj/effect/decal/cleanable/blood/gibs/slime/Initialize(mapload, list/datum/disease/diseases)
+ . = ..()
+ update_icon()
+
+/obj/effect/decal/cleanable/blood/gibs/slime/update_icon()
+ add_atom_colour(body_colors, FIXED_COLOUR_PRIORITY)
+ cut_overlays()
+ var/mutable_appearance/guts = mutable_appearance(icon, "[icon_state]s_guts")
+ guts.appearance_flags = RESET_COLOR
+ guts.color = body_colors
+ add_overlay(guts)
+ var/mutable_appearance/flesh = mutable_appearance(icon, "[icon_state]_flesh")
+ flesh.appearance_flags = RESET_COLOR
+ flesh.color = body_colors
+ add_overlay(flesh)
+
+/obj/effect/decal/cleanable/blood/gibs/slime/up
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
+
+/obj/effect/decal/cleanable/blood/gibs/slime/down
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
+
+/obj/effect/decal/cleanable/blood/gibs/slime/body
+ random_icon_states = list("gibhead", "gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/slime/torso
+ random_icon_states = list("gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/slime/limb
+ random_icon_states = list("gibleg", "gibarm")
+
+/obj/effect/decal/cleanable/blood/gibs/slime/core
+ random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
+
+/obj/effect/decal/cleanable/blood/gibs/synth
+ desc = "They look sludgy and disgusting."
+ gibs_reagent_id = "liquidsyntheticgibs"
+ gibs_bloodtype = "SY"
+
+/obj/effect/decal/cleanable/blood/gibs/synth/Initialize(mapload, list/datum/disease/diseases)
+ . = ..()
+ update_icon()
+
+//IPCs
+/obj/effect/decal/cleanable/blood/gibs/ipc
+ desc = "They look sharp yet oozing."
+ body_colors = "00ff00"
+ gibs_reagent_id = "liquidoilgibs"
+ gibs_bloodtype = "HF"
+
+/obj/effect/decal/cleanable/blood/gibs/ipc/Initialize(mapload, list/datum/disease/diseases)
+ . = ..()
+ update_icon()
+
+/obj/effect/decal/cleanable/blood/gibs/ipc/update_icon()
+ add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY)
+ cut_overlays()
+ var/mutable_appearance/guts = mutable_appearance(icon, "[icon_state]r-overlay")
+ guts.appearance_flags = RESET_COLOR
+ add_overlay(guts)
+
+/obj/effect/decal/cleanable/blood/gibs/ipc/up
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
+
+/obj/effect/decal/cleanable/blood/gibs/ipc/down
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
+
+/obj/effect/decal/cleanable/blood/gibs/ipc/body
+ random_icon_states = list("gibhead", "gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/ipc/torso
+ random_icon_states = list("gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/ipc/limb
+ random_icon_states = list("gibleg", "gibarm")
+
+/obj/effect/decal/cleanable/blood/gibs/ipc/core
+ random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index 35f06c2768..842b230b53 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -1,31 +1,45 @@
/obj/effect/decal/cleanable/blood
name = "blood"
- desc = "It's red and gooey. Perhaps it's the chef's cooking?"
+ desc = "It's gooey. Perhaps it's the chef's cooking?"
icon = 'icons/effects/blood.dmi'
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
- blood_state = BLOOD_STATE_HUMAN
- bloodiness = BLOOD_AMOUNT_PER_DECAL
+ blood_state = BLOOD_STATE_BLOOD
+ bloodiness = MAX_SHOE_BLOODINESS
+ color = BLOOD_COLOR_HUMAN //default so we don't have white splotches everywhere.
/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
- C.add_blood_DNA(return_blood_DNA())
- if (bloodiness)
- if (C.bloodiness < MAX_SHOE_BLOODINESS)
- C.bloodiness += bloodiness
- return ..()
+ if (C.blood_DNA)
+ blood_DNA |= C.blood_DNA.Copy()
+ update_icon()
+ ..()
+
+/obj/effect/decal/cleanable/blood/transfer_blood_dna()
+ ..()
+ update_icon()
+
+/obj/effect/decal/cleanable/blood/transfer_mob_blood_dna()
+ . = ..()
+ update_icon()
+
+/obj/effect/decal/cleanable/blood/update_icon()
+ color = blood_DNA_to_color()
/obj/effect/decal/cleanable/blood/old
name = "dried blood"
- desc = "Looks like it's been here a while. Eew."
+ desc = "Looks like it's been here a while. Eew."
bloodiness = 0
/obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases)
- icon_state += "-old" //This IS necessary because the parent /blood type uses icon randomization.
- add_blood_DNA(list("Non-human DNA" = "A+")) // Needs to happen before ..()
- return ..()
+ ..()
+ icon_state += "-old"
+ add_blood_DNA(list("Non-human DNA" = "A+"))
+
+/obj/effect/decal/cleanable/blood/splats
+ random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
/obj/effect/decal/cleanable/blood/splatter
- random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
+ random_icon_states = list("splatter1", "splatter2", "splatter3", "splatter4", "splatter5")
/obj/effect/decal/cleanable/blood/tracks
icon_state = "tracks"
@@ -39,84 +53,23 @@
random_icon_states = null
var/list/existing_dirs = list()
+/obj/effect/decal/cleanable/trail_holder/update_icon()
+ color = blood_DNA_to_color()
+
+/obj/effect/cleanable/trail_holder/Initialize()
+ . = ..()
+ update_icon()
+
/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in()
return TRUE
-/obj/effect/decal/cleanable/blood/gibs
- name = "gibs"
- desc = "They look bloody and gruesome."
- icon = 'icons/effects/blood.dmi'
- icon_state = "gibbl5"
- layer = LOW_OBJ_LAYER
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
- mergeable_decal = FALSE
+/obj/effect/decal/cleanable/trail_holder/transfer_blood_dna()
+ ..()
+ update_icon()
-/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases)
+/obj/effect/decal/cleanable/trail_holder/transfer_mob_blood_dna()
. = ..()
- reagents.add_reagent("liquidgibs", 5)
-
-/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target)
- return
-
-/obj/effect/decal/cleanable/blood/gibs/Crossed(mob/living/L)
- if(istype(L) && has_gravity(loc))
- playsound(loc, 'sound/effects/gib_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 20 : 50, 1)
- . = ..()
-
-/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions)
- set waitfor = 0
- var/direction = pick(directions)
- for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
- sleep(2)
- if(i > 0)
- var/list/datum/disease/diseases
- GET_COMPONENT(infective, /datum/component/infective)
- if(infective)
- diseases = infective.diseases
- new /obj/effect/decal/cleanable/blood/splatter(loc, diseases)
- if(!step_to(src, get_step(src, direction), 0))
- break
-
-/obj/effect/decal/cleanable/blood/gibs/up
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
-
-/obj/effect/decal/cleanable/blood/gibs/down
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
-
-/obj/effect/decal/cleanable/blood/gibs/body
- random_icon_states = list("gibhead", "gibtorso")
-
-/obj/effect/decal/cleanable/blood/gibs/torso
- random_icon_states = list("gibtorso")
-
-/obj/effect/decal/cleanable/blood/gibs/limb
- random_icon_states = list("gibleg", "gibarm")
-
-/obj/effect/decal/cleanable/blood/gibs/core
- random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
-
-/obj/effect/decal/cleanable/blood/gibs/old
- name = "old rotting gibs"
- desc = "Space Jesus, why didn't anyone clean this up? It smells terrible."
- bloodiness = 0
-
-/obj/effect/decal/cleanable/blood/gibs/old/Initialize(mapload, list/datum/disease/diseases)
- . = ..()
- setDir(pick(1,2,4,8))
- icon_state += "-old"
- add_blood_DNA(list("Non-human DNA" = "A+"))
-
-/obj/effect/decal/cleanable/blood/drip
- name = "drips of blood"
- desc = "It's red."
- icon_state = "1"
- random_icon_states = list("drip1","drip2","drip3","drip4","drip5")
- bloodiness = 0
- var/drips = 1
-
-/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in()
- return TRUE
-
+ update_icon()
//BLOODY FOOTPRINTS
/obj/effect/decal/cleanable/blood/footprints
@@ -127,15 +80,16 @@
random_icon_states = null
var/entered_dirs = 0
var/exited_dirs = 0
- blood_state = BLOOD_STATE_HUMAN //the icon state to load images from
+ blood_state = BLOOD_STATE_BLOOD //the icon state to load images from
var/list/shoe_types = list()
/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O)
- ..()
if(ishuman(O))
var/mob/living/carbon/human/H = O
var/obj/item/clothing/shoes/S = H.shoes
if(S && S.bloody_shoes[blood_state])
+ if(color != bloodtype_to_color(S.last_bloodtype))
+ return
S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
shoe_types |= S.type
if (!(entered_dirs & H.dir))
@@ -143,21 +97,21 @@
update_icon()
/obj/effect/decal/cleanable/blood/footprints/Uncrossed(atom/movable/O)
- ..()
if(ishuman(O))
var/mob/living/carbon/human/H = O
var/obj/item/clothing/shoes/S = H.shoes
if(S && S.bloody_shoes[blood_state])
+ if(color != bloodtype_to_color(S.last_bloodtype))//last entry - we check its color
+ return
S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
shoe_types |= S.type
if (!(exited_dirs & H.dir))
exited_dirs |= H.dir
update_icon()
-
/obj/effect/decal/cleanable/blood/footprints/update_icon()
+ ..()
cut_overlays()
-
for(var/Ddir in GLOB.cardinals)
if(entered_dirs & Ddir)
var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"]
@@ -170,7 +124,7 @@
GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]2", dir = Ddir)
add_overlay(bloodstep_overlay)
- alpha = BLOODY_FOOTPRINT_BASE_ALPHA+bloodiness
+ alpha = BLOODY_FOOTPRINT_BASE_ALPHA + bloodiness
/obj/effect/decal/cleanable/blood/footprints/examine(mob/user)
@@ -179,16 +133,62 @@
. += "You recognise the footprints as belonging to:\n"
for(var/shoe in shoe_types)
var/obj/item/clothing/shoes/S = shoe
- . += "[icon2html(initial(S.icon), user)] Some [initial(S.name)].\n"
+ . += "some [initial(S.name)] [icon2html(initial(S.icon), user)]\n"
to_chat(user, .)
/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C)
if(blood_state != C.blood_state) //We only replace footprints of the same type as us
return
+ if(color != C.color)
+ return
..()
/obj/effect/decal/cleanable/blood/footprints/can_bloodcrawl_in()
if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
- return 1
- return 0
+ return TRUE
+ return FALSE
+
+/* Eventually TODO: make snowflake trails like baycode's
+/obj/effect/decal/cleanable/blood/footprints/tracks/shoe
+ name = "footprints"
+ desc = "They look like tracks left by footwear."
+ icon_state = FOOTPRINT_SHOE
+ print_state = FOOTPRINT_SHOE
+
+/obj/effect/decal/cleanable/blood/footprints/tracks/foot
+ name = "footprints"
+ desc = "They look like tracks left by a bare foot."
+ icon_state = FOOTPRINT_FOOT
+ print_state = FOOTPRINT_FOOT
+
+/obj/effect/decal/cleanable/blood/footprints/tracks/snake
+ name = "tracks"
+ desc = "They look like tracks left by a giant snake."
+ icon_state = FOOTPRINT_SNAKE
+ print_state = FOOTPRINT_SNAKE
+
+/obj/effect/decal/cleanable/blood/footprints/tracks/paw
+ name = "footprints"
+ desc = "They look like tracks left by paws."
+ icon_state = FOOTPRINT_PAW
+ print_state = FOOTPRINT_PAW
+
+/obj/effect/decal/cleanable/blood/footprints/tracks/claw
+ name = "footprints"
+ desc = "They look like tracks left by claws."
+ icon_state = FOOTPRINT_CLAW
+ print_state = FOOTPRINT_CLAW
+
+/obj/effect/decal/cleanable/blood/footprints/tracks/wheels
+ name = "tracks"
+ desc = "They look like tracks left by wheels."
+ gender = PLURAL
+ icon_state = FOOTPRINT_WHEEL
+ print_state = FOOTPRINT_WHEEL
+
+/obj/effect/decal/cleanable/blood/footprints/tracks/body
+ name = "trails"
+ desc = "A trail left by something being dragged."
+ icon_state = FOOTPRINT_DRAG
+ print_state = FOOTPRINT_DRAG */
diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm
index 484e0438e2..02bf51bdd9 100644
--- a/code/game/objects/effects/decals/cleanable/robots.dm
+++ b/code/game/objects/effects/decals/cleanable/robots.dm
@@ -11,6 +11,10 @@
bloodiness = BLOOD_AMOUNT_PER_DECAL
mergeable_decal = FALSE
+/obj/effect/decal/cleanable/robot_debris/Initialize(mapload, list/datum/disease/diseases)
+ . = ..()
+ reagents.add_reagent("liquidoilgibs", 5)
+
/obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions)
set waitfor = 0
var/direction = pick(directions)
@@ -50,6 +54,7 @@
/obj/effect/decal/cleanable/oil/Initialize()
. = ..()
reagents.add_reagent("oil", 30)
+ reagents.add_reagent("liquidoilgibs", 5)
/obj/effect/decal/cleanable/oil/streak
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm
index e99a2fcbc6..dd39bc567a 100644
--- a/code/game/objects/effects/spawners/gibspawner.dm
+++ b/code/game/objects/effects/spawners/gibspawner.dm
@@ -1,25 +1,69 @@
/obj/effect/gibspawner
- var/sparks = 0 //whether sparks spread
+ var/sparks = FALSE //whether sparks spread
var/virusProb = 20 //the chance for viruses to spread on the gibs
+ var/gib_mob_type //generate a fake mob to transfer DNA from if we weren't passed a mob.
+ var/gib_mob_species //We'll want to nip-pick their species for blood type stuff
+ var/sound_to_play = 'sound/effects/blobattack.ogg'
+ var/sound_vol = 60
var/list/gibtypes = list() //typepaths of the gib decals to spawn
var/list/gibamounts = list() //amount to spawn for each gib decal type we'll spawn.
var/list/gibdirections = list() //of lists of possible directions to spread each gib decal type towards.
-/obj/effect/gibspawner/Initialize(mapload, datum/dna/MobDNA, list/datum/disease/diseases)
+/obj/effect/gibspawner/Initialize(mapload, mob/living/source_mob, list/datum/disease/diseases)
. = ..()
-
- if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
- to_chat(world, "Gib list length mismatch!")
+ if(gibtypes.len != gibamounts.len)
+ stack_trace("Gib list amount length mismatch!")
+ return
+ if(gibamounts.len != gibdirections.len)
+ stack_trace("Gib list dir length mismatch!")
return
var/obj/effect/decal/cleanable/blood/gibs/gib = null
+ if(sound_to_play && isnum(sound_vol))
+ playsound(src, sound_to_play, sound_vol, TRUE)
+
if(sparks)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(2, 1, loc)
s.start()
+ var/list/dna_to_add //find the dna to pass to the spawned gibs. do note this can be null if the mob doesn't have blood. add_blood_DNA() has built in null handling.
+ var/body_coloring = ""
+ if(source_mob)
+ dna_to_add = source_mob.get_blood_dna_list() //ez pz
+ if(ishuman(source_mob))
+ var/mob/living/carbon/human/H = source_mob
+ if(H.dna.species.use_skintones)
+ body_coloring = "#[skintone2hex(H.skin_tone)]"
+ else
+ body_coloring = "#[H.dna.features["mcolor"]]"
+
+ else if(gib_mob_type)
+ var/mob/living/temp_mob = new gib_mob_type(src) //generate a fake mob so that we pull the right type of DNA for the gibs.
+ if(gib_mob_species)
+ if(ishuman(temp_mob))
+ var/mob/living/carbon/human/H = temp_mob
+ H.set_species(gib_mob_species)
+ dna_to_add = temp_mob.get_blood_dna_list()
+ if(H.dna.species.use_skintones)
+ body_coloring = "#[skintone2hex(H.skin_tone)]"
+ else
+ body_coloring = "#[H.dna.features["mcolor"]]"
+ qdel(H)
+ else
+ dna_to_add = temp_mob.get_blood_dna_list()
+ qdel(temp_mob)
+ else if(!issilicon(temp_mob))
+ dna_to_add = temp_mob.get_blood_dna_list()
+ qdel(temp_mob)
+ else
+ qdel(temp_mob)
+ else
+ dna_to_add = list("Non-human DNA" = random_blood_type()) //else, generate a random bloodtype for it.
+
+
for(var/i = 1, i<= gibtypes.len, i++)
if(gibamounts[i])
for(var/j = 1, j<= gibamounts[i], j++)
@@ -29,10 +73,11 @@
var/mob/living/carbon/digester = loc
digester.stomach_contents += gib
- if(MobDNA)
+ if(dna_to_add && dna_to_add.len)
+ gib.add_blood_DNA(dna_to_add)
+ gib.body_colors = body_coloring
+ gib.update_icon()
- else if(istype(src, /obj/effect/gibspawner/generic)) // Probably a monkey
- gib.add_blood_DNA(list("Non-human DNA" = "A+"))
var/list/directions = gibdirections[i]
if(isturf(loc))
if(directions.len)
@@ -41,80 +86,158 @@
return INITIALIZE_HINT_QDEL
-
/obj/effect/gibspawner/generic
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core)
- gibamounts = list(2,2,1)
+ gibamounts = list(2, 2, 1)
+ sound_vol = 40
/obj/effect/gibspawner/generic/Initialize()
- playsound(src, 'sound/effects/blobattack.ogg', 40, 1)
- gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
- . = ..()
+ if(!gibdirections.len)
+ gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
+ return ..()
+
+/obj/effect/gibspawner/generic/animal
+ gib_mob_type = /mob/living/simple_animal/pet
/obj/effect/gibspawner/human
- gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up, /obj/effect/decal/cleanable/blood/gibs/down, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/body, /obj/effect/decal/cleanable/blood/gibs/limb, /obj/effect/decal/cleanable/blood/gibs/core)
- gibamounts = list(1,1,1,1,1,1,1)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human/up, /obj/effect/decal/cleanable/blood/gibs/human/down, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/body, /obj/effect/decal/cleanable/blood/gibs/human/limb, /obj/effect/decal/cleanable/blood/gibs/human/core)
+ gibamounts = list(1, 1, 1, 1, 1, 1, 1)
+ gib_mob_type = /mob/living/carbon/human
+ gib_mob_species = /datum/species/human
+ sound_vol = 50
/obj/effect/gibspawner/human/Initialize()
- playsound(src, 'sound/effects/blobattack.ogg', 50, 1)
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
- . = ..()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
+ return ..()
-
-/obj/effect/gibspawner/humanbodypartless //only the gibs that don't look like actual full bodyparts (except torso).
- gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/torso)
+/obj/effect/gibspawner/human/bodypartless //only the gibs that don't look like actual full bodyparts (except torso).
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/core, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/core, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/torso)
gibamounts = list(1, 1, 1, 1, 1, 1)
-/obj/effect/gibspawner/humanbodypartless/Initialize()
- playsound(src, 'sound/effects/blobattack.ogg', 50, 1)
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
- . = ..()
+/obj/effect/gibspawner/human/bodypartless/Initialize()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
+ return ..()
+/obj/effect/gibspawner/lizard
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human/lizard/up, /obj/effect/decal/cleanable/blood/gibs/human/lizard/down, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/body, /obj/effect/decal/cleanable/blood/gibs/human/lizard/limb, /obj/effect/decal/cleanable/blood/gibs/human/lizard/core)
+ gibamounts = list(1, 1, 1, 1, 1, 1, 1)
+ gib_mob_type = /mob/living/carbon/human/species/lizard
+ gib_mob_species = /datum/species/lizard
+ sound_vol = 50
+
+/obj/effect/gibspawner/lizard/Initialize()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
+ return ..()
+
+/obj/effect/gibspawner/lizard/bodypartless
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/core, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/core, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/torso)
+ gibamounts = list(1, 1, 1, 1, 1, 1)
+
+/obj/effect/gibspawner/lizard/bodypartless/Initialize()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
+ return ..()
+
+/obj/effect/gibspawner/slime
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/slime/up, /obj/effect/decal/cleanable/blood/gibs/slime/down, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/body, /obj/effect/decal/cleanable/blood/gibs/slime/limb, /obj/effect/decal/cleanable/blood/gibs/slime/core)
+ gibamounts = list(1, 1, 1, 1, 1, 1, 1)
+ gib_mob_type = /mob/living/carbon/human/species/roundstartslime
+ gib_mob_species = /datum/species/jelly/roundstartslime
+ sound_vol = 50
+
+/obj/effect/gibspawner/slime/Initialize()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
+ return ..()
+
+/obj/effect/gibspawner/slime/bodypartless //only the gibs that don't look like actual full bodyparts (except torso).
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/core, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/core, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/torso)
+ gibamounts = list(1, 1, 1, 1, 1, 1)
+
+/obj/effect/gibspawner/slime/bodypartless/Initialize()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
+ return ..()
+
+/obj/effect/gibspawner/ipc
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/ipc/up, /obj/effect/decal/cleanable/blood/gibs/ipc/down, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/body, /obj/effect/decal/cleanable/blood/gibs/ipc/limb, /obj/effect/decal/cleanable/blood/gibs/ipc/core)
+ gibamounts = list(1, 1, 1, 1, 1, 1, 1)
+ gib_mob_type = /mob/living/carbon/human/species/ipc
+ gib_mob_species = /datum/species/ipc
+ sound_vol = 50
+ sparks = TRUE
+ sound_to_play = 'sound/effects/bang.ogg'
+
+/obj/effect/gibspawner/ipc/Initialize()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
+ return ..()
+
+/obj/effect/gibspawner/ipc/bodypartless //only the gibs that don't look like actual full bodyparts (except torso).
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/core, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/core, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/torso)
+ gibamounts = list(1, 1, 1, 1, 1, 1)
+
+/obj/effect/gibspawner/ipc/bodypartless/Initialize()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
+ return ..()
/obj/effect/gibspawner/xeno
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/up, /obj/effect/decal/cleanable/xenoblood/xgibs/down, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/body, /obj/effect/decal/cleanable/xenoblood/xgibs/limb, /obj/effect/decal/cleanable/xenoblood/xgibs/core)
- gibamounts = list(1,1,1,1,1,1,1)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up, /obj/effect/decal/cleanable/blood/gibs/xeno/down, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/body, /obj/effect/decal/cleanable/blood/gibs/xeno/limb, /obj/effect/decal/cleanable/blood/gibs/xeno/core)
+ gibamounts = list(1, 1, 1, 1, 1, 1, 1)
+ gib_mob_type = /mob/living/carbon/alien
/obj/effect/gibspawner/xeno/Initialize()
- playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
- . = ..()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
+ return ..()
-
-/obj/effect/gibspawner/xenobodypartless //only the gibs that don't look like actual full bodyparts (except torso).
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/torso)
+/obj/effect/gibspawner/xeno/bodypartless //only the gibs that don't look like actual full bodyparts (except torso).
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/torso)
gibamounts = list(1, 1, 1, 1, 1, 1)
+/obj/effect/gibspawner/xeno/bodypartless/Initialize()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
+ return ..()
-/obj/effect/gibspawner/xenobodypartless/Initialize()
- playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
- . = ..()
+/obj/effect/gibspawner/xeno/xenoperson
+ gib_mob_type = /mob/living/carbon/human/species/xeno
+ gib_mob_species = /datum/species/xeno
+
+/obj/effect/gibspawner/xeno/xenoperson/bodypartless
/obj/effect/gibspawner/larva
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body)
gibamounts = list(1, 1, 1, 1)
+ gib_mob_type = /mob/living/carbon/alien/larva
/obj/effect/gibspawner/larva/Initialize()
- playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs)
- . = ..()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs)
+ return ..()
-/obj/effect/gibspawner/larvabodypartless
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva)
+/obj/effect/gibspawner/larva/bodypartless
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva)
gibamounts = list(1, 1, 1)
-/obj/effect/gibspawner/larvabodypartless/Initialize()
- playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list())
- . = ..()
+/obj/effect/gibspawner/larva/bodypartless/Initialize()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list())
+ return ..()
/obj/effect/gibspawner/robot
- sparks = 1
+ sparks = TRUE
gibtypes = list(/obj/effect/decal/cleanable/robot_debris/up, /obj/effect/decal/cleanable/robot_debris/down, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris/limb)
- gibamounts = list(1,1,1,1,1,1)
+ gibamounts = list(1, 1, 1, 1, 1, 1)
+ gib_mob_type = /mob/living/silicon/robot
/obj/effect/gibspawner/robot/Initialize()
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs)
- gibamounts[6] = pick(0,1,2)
- . = ..()
+ if(!gibdirections.len)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs)
+ gibamounts[6] = pick(0, 1, 2)
+ return ..()
+
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 7d02d9d383..fbad000098 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -6,7 +6,9 @@
layer = BELOW_MOB_LAYER
var/splatter_type = "splatter"
-/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir)
+/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir, new_color)
+ if(new_color)
+ color = new_color
if(set_dir in GLOB.diagonals)
icon_state = "[splatter_type][pick(1, 2, 6)]"
else
@@ -41,7 +43,7 @@
animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration)
/obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter
- splatter_type = "xsplatter"
+ color = BLOOD_COLOR_XENO
/obj/effect/temp_visual/dir_setting/speedbike_trail
name = "speedbike trails"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 6a706fede9..92fb2531b8 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -111,7 +111,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/list/grind_results //A reagent list containing the reagents this item produces when ground up in a grinder - this can be an empty list to allow for reagent transferring only
var/list/juice_results //A reagent list containing blah blah... but when JUICED in a grinder!
-
/obj/item/Initialize()
materials = typelist("materials", materials)
@@ -537,6 +536,17 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
M.become_blind(EYE_DAMAGE)
to_chat(M, "You go blind!")
+/obj/item/clean_blood()
+ . = ..()
+ if(.)
+ if(blood_splatter_icon)
+ cut_overlay(blood_splatter_icon)
+
+/obj/item/clothing/gloves/clean_blood()
+ . = ..()
+ if(.)
+ transfer_blood = 0
+
/obj/item/singularity_pull(S, current_size)
..()
if(current_size >= STAGE_FOUR)
diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm
index ea72197cf0..f0d20afbbd 100644
--- a/code/game/objects/items/body_egg.dm
+++ b/code/game/objects/items/body_egg.dm
@@ -45,8 +45,8 @@
RemoveInfectionImages()
AddInfectionImages()
-/obj/item/organ/body_egg/proc/AddInfectionImages()
+/obj/item/organ/body_egg/proc/AddInfectionImages(mob/living/carbon/C)
return
-/obj/item/organ/body_egg/proc/RemoveInfectionImages()
+/obj/item/organ/body_egg/proc/RemoveInfectionImages(mob/living/carbon/C)
return
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 05ffcbf2fd..875a4bd04f 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -342,12 +342,41 @@ update_label("John Doe", "Clowny")
lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
assignment = "Prisoner"
- registered_name = "Scum"
+ access = list(ACCESS_ENTER_GENPOP)
+
+ //Lavaland labor camp
var/goal = 0 //How far from freedom?
var/points = 0
+ //Genpop
+ var/sentence = 0 //When world.time is greater than this number, the card will have its ACCESS_ENTER_GENPOP access replaced with ACCESS_LEAVE_GENPOP the next time it's checked, unless this value is 0/null
+ var/crime= "\[REDACTED\]"
-/obj/item/card/id/prisoner/attack_self(mob/user)
- to_chat(usr, "You have accumulated [points] out of the [goal] points you need for freedom.")
+/obj/item/card/id/prisoner/GetAccess()
+ if((sentence && world.time >= sentence) || (goal && points >= goal))
+ access = list(ACCESS_LEAVE_GENPOP)
+ return ..()
+
+/obj/item/card/id/prisoner/process()
+ if(!sentence)
+ STOP_PROCESSING(SSobj, src)
+ return
+ if(world.time >= sentence)
+ playsound(loc, 'sound/machines/ping.ogg', 50, 1)
+ if(isliving(loc))
+ to_chat(loc, "[src] buzzes: You have served your sentence! You may now exit prison through the turnstiles and collect your belongings.")
+ STOP_PROCESSING(SSobj, src)
+ return
+
+/obj/item/card/id/prisoner/examine(mob/user)
+ . = ..()
+ if(sentence && world.time < sentence)
+ to_chat(user, "You're currently serving a sentence for [crime]. [DisplayTimeText(sentence - world.time)] left.")
+ else if(goal)
+ to_chat(user, "You have accumulated [points] out of the [goal] points you need for freedom.")
+ else if(!sentence)
+ to_chat(user, "You are currently serving a permanent sentence for [crime].")
+ else
+ to_chat(user, "Your sentence is up! You're free!")
/obj/item/card/id/prisoner/one
name = "Prisoner #13-001"
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 639d570462..1059a310eb 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -31,6 +31,15 @@
/obj/item/stock_parts/manipulator = 1,
/obj/item/stack/sheet/glass = 1)
+/obj/item/circuitboard/machine/bloodbankgen
+ name = "Blood Bank Generator (Machine Board)"
+ build_path = /obj/machinery/bloodbankgen
+ req_components = list(
+ /obj/item/stock_parts/matter_bin = 1,
+ /obj/item/stock_parts/manipulator = 1,
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/stack/sheet/glass = 1)
+
/obj/item/circuitboard/machine/clonepod
name = "Clone Pod (Machine Board)"
build_path = /obj/machinery/clonepod
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 7655654f78..d644e0637e 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -410,7 +410,7 @@ SLIME SCANNER
msg += "Subject is bleeding!\n"
var/blood_percent = round((C.blood_volume / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100)
var/blood_type = C.dna.blood_type
- if(blood_id != "blood")//special blood substance
+ if(blood_id != ("blood" || "jellyblood"))//special blood substance
var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id]
if(R)
blood_type = R.name
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index fdb016df38..6ea68bf548 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -432,6 +432,14 @@
user.mind.teach_crafting_recipe(crafting_recipe_type)
to_chat(user,"You learned how to make [initial(R.name)].")
+/obj/item/book/granter/crafting_recipe/threads //Durathread crafting book
+ name = "Credible Threads"
+ desc = "A simple book about sewing and usefull clothing crafting with cloth and durathreads."
+ crafting_recipe_types = list(/datum/crafting_recipe/durathread_duffelbag, /datum/crafting_recipe/durathread_toolbelt, /datum/crafting_recipe/durathread_bandolier, /datum/crafting_recipe/durathread_helmet, /datum/crafting_recipe/durathread_vest)
+ icon_state = "tailers_art1"
+ oneuse = FALSE
+ remarks = list("Durathread is cloth thats also fire-resistant?", "Strong threads that can be used with leather for some light weight storage!", "The cloth can withstand a beating it said but not that much...")
+
/obj/item/book/granter/crafting_recipe/cooking_sweets_101 //We start at 101 for 103 and 105
name = "Cooking Desserts 101"
desc = "A cook book that teaches you some more of the newest desserts. AI approved, and a best seller on Honkplanet."
diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm
index 709fedbe5a..1956a1f317 100644
--- a/code/game/objects/items/grenades/plastic.dm
+++ b/code/game/objects/items/grenades/plastic.dm
@@ -174,6 +174,7 @@
gender = PLURAL
var/open_panel = 0
can_attach_mob = TRUE
+ full_damage_on_mobs = TRUE
/obj/item/grenade/plastic/c4/New()
wires = new /datum/wires/explosive/c4(src)
diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm
index 7524fc9007..3f7fe7ee8d 100644
--- a/code/game/objects/items/mop.dm
+++ b/code/game/objects/items/mop.dm
@@ -27,6 +27,7 @@
/obj/item/mop/proc/clean(turf/A)
if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1) || reagents.has_reagent("cleaner", 1))
SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
+ A.clean_blood()
for(var/obj/effect/O in A)
if(is_cleanable(O))
qdel(O)
diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm
index 8582725cda..74919016f5 100644
--- a/code/game/objects/items/religion.dm
+++ b/code/game/objects/items/religion.dm
@@ -82,14 +82,6 @@
/obj/item/banner/security/mundane
inspiration_available = FALSE
-/datum/crafting_recipe/security_banner
- name = "Securistan Banner"
- result = /obj/item/banner/security/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/rank/security = 1)
- category = CAT_MISC
-
/obj/item/banner/medical
name = "meditopia banner"
desc = "The banner of Meditopia, generous benefactors that cure wounds and shelter the weak."
@@ -103,14 +95,6 @@
/obj/item/banner/medical/check_inspiration(mob/living/carbon/human/H)
return H.stat //Meditopia is moved to help those in need
-/datum/crafting_recipe/medical_banner
- name = "Meditopia Banner"
- result = /obj/item/banner/medical/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/rank/medical = 1)
- category = CAT_MISC
-
/obj/item/banner/medical/special_inspiration(mob/living/carbon/human/H)
H.adjustToxLoss(-15)
H.setOxyLoss(0)
@@ -129,14 +113,6 @@
/obj/item/banner/science/check_inspiration(mob/living/carbon/human/H)
return H.on_fire //Sciencia is pleased by dedication to the art of Toxins
-/datum/crafting_recipe/science_banner
- name = "Sciencia Banner"
- result = /obj/item/banner/science/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/rank/scientist = 1)
- category = CAT_MISC
-
/obj/item/banner/cargo
name = "cargonia banner"
desc = "The banner of the eternal Cargonia, with the mystical power of conjuring any object into existence."
@@ -147,14 +123,6 @@
/obj/item/banner/cargo/mundane
inspiration_available = FALSE
-/datum/crafting_recipe/cargo_banner
- name = "Cargonia Banner"
- result = /obj/item/banner/cargo/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/rank/cargotech = 1)
- category = CAT_MISC
-
/obj/item/banner/engineering
name = "engitopia banner"
desc = "The banner of Engitopia, wielders of limitless power."
@@ -168,14 +136,6 @@
/obj/item/banner/engineering/special_inspiration(mob/living/carbon/human/H)
H.radiation = 0
-/datum/crafting_recipe/engineering_banner
- name = "Engitopia Banner"
- result = /obj/item/banner/engineering/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/rank/engineer = 1)
- category = CAT_MISC
-
/obj/item/banner/command
name = "command banner"
desc = "The banner of Command, a staunch and ancient line of bueraucratic kings and queens."
@@ -189,14 +149,6 @@
/obj/item/banner/command/check_inspiration(mob/living/carbon/human/H)
return HAS_TRAIT(H, TRAIT_MINDSHIELD) //Command is stalwart but rewards their allies.
-/datum/crafting_recipe/command_banner
- name = "Command Banner"
- result = /obj/item/banner/command/mundane
- time = 40
- reqs = list(/obj/item/stack/rods = 2,
- /obj/item/clothing/under/captainparade = 1)
- category = CAT_MISC
-
/obj/item/banner/red
name = "red banner"
icon_state = "banner-red"
@@ -286,7 +238,6 @@
var/staffcooldown = 0
var/staffwait = 30
-
/obj/item/godstaff/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(staffcooldown + staffwait > world.time)
@@ -332,19 +283,16 @@
heat_protection = FEET
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
-
/obj/item/clothing/shoes/plate/red
icon_state = "crusader-red"
/obj/item/clothing/shoes/plate/blue
icon_state = "crusader-blue"
-
/obj/item/storage/box/itemset/crusader
name = "Crusader's Armour Set" //i can't into ck2 references
desc = "This armour is said to be based on the armor of kings on another world thousands of years ago, who tended to assassinate, conspire, and plot against everyone who tried to do the same to them. Some things never change."
-
/obj/item/storage/box/itemset/crusader/blue/New()
..()
contents = list()
@@ -354,7 +302,6 @@
new /obj/item/clothing/gloves/plate/blue(src)
new /obj/item/clothing/shoes/plate/blue(src)
-
/obj/item/storage/box/itemset/crusader/red/New()
..()
contents = list()
@@ -364,7 +311,6 @@
new /obj/item/clothing/gloves/plate/red(src)
new /obj/item/clothing/shoes/plate/red(src)
-
/obj/item/claymore/weak
desc = "This one is rusted."
force = 30
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 9c929a6ebf..2356319cd7 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -680,7 +680,7 @@
action_icon_state = "Chevron_State_0"
var/currentState = 0
- var/maxReduction = 2
+ var/maxReduction = 1
/obj/effect/proc_holder/silicon/cyborg/vtecControl/Click(mob/living/silicon/robot/user)
@@ -688,14 +688,14 @@
currentState = (currentState + 1) % 3
- if(usr)
+ if(istype(self))
switch(currentState)
if (0)
- self.speed = maxReduction
+ self.speed = initial(self.speed)
if (1)
- self.speed -= maxReduction*0.5
+ self.speed = initial(self.speed) - maxReduction * 0.5
if (2)
- self.speed -= maxReduction*1.25
+ self.speed = initial(self.speed) - maxReduction * 1
action.button_icon_state = "Chevron_State_[currentState]"
action.UpdateButtonIcon()
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 5610cbad9a..886997eab9 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -17,7 +17,6 @@
var/self_delay = 50
/obj/item/stack/medical/attack(mob/living/M, mob/user)
-
if(M.stat == DEAD && !stop_bleeding)
var/t_him = "it"
if(M.gender == MALE)
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 155d1f1643..7654199cf5 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -390,9 +390,9 @@
. = ..()
/obj/item/stack/proc/copy_evidences(obj/item/stack/from)
- add_blood_DNA(from.return_blood_DNA())
- add_fingerprint_list(from.return_fingerprints())
- add_hiddenprint_list(from.return_hiddenprints())
+ blood_DNA = from.blood_DNA
+ fingerprints = from.fingerprints
+ fingerprintshidden = from.fingerprintshidden
fingerprintslast = from.fingerprintslast
//TODO bloody overlay
@@ -437,4 +437,4 @@
/datum/stack_recipe_list/New(title, recipes)
src.title = title
- src.recipes = recipes
+ src.recipes = recipes
\ No newline at end of file
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index d18212be42..1861947832 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -35,6 +35,8 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
/obj/item/storage/toolbox/update_icon()
..()
cut_overlays()
+ if(blood_DNA && blood_DNA.len)
+ add_blood_overlay()
if(has_latches)
var/icon/I = icon('icons/obj/storage.dmi', latches)
add_overlay(I)
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index b1c2c36585..dda704e1bf 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -346,7 +346,8 @@
icon_state = "dualsaber[item_color][wielded]"
else
icon_state = "dualsaber0"
- SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+
+ clean_blood()
/obj/item/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user)
if(user.has_dna())
@@ -891,4 +892,4 @@
var/client/C = user.client
C.change_view(CONFIG_GET(string/default_view))
user.client.pixel_x = 0
- user.client.pixel_y = 0
+ user.client.pixel_y = 0
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/genpop.dm b/code/game/objects/structures/crates_lockers/closets/genpop.dm
new file mode 100644
index 0000000000..80b64aaedc
--- /dev/null
+++ b/code/game/objects/structures/crates_lockers/closets/genpop.dm
@@ -0,0 +1,117 @@
+/obj/structure/closet/secure_closet/genpop
+ desc = "It's a secure locker for inmates's personal belongings."
+ var/default_desc = "It's a secure locker for the storage inmates's personal belongings during their time in prison."
+ name = "prisoner closet"
+ var/default_name = "prisoner closet"
+ req_access = list(ACCESS_BRIG)
+ var/obj/item/card/id/prisoner/registered_id = null
+ icon_state = "prisoner"
+ locked = FALSE
+ anchored = TRUE
+ opened = TRUE
+ density = FALSE
+
+/obj/structure/closet/secure_closet/genpop/attackby(obj/item/W, mob/user, params)
+ if(!broken && locked && W == registered_id) //Prisoner opening
+ handle_prisoner_id(user)
+ return
+
+ return ..()
+
+/obj/structure/closet/secure_closet/genpop/proc/handle_prisoner_id(mob/user)
+ var/obj/item/card/id/prisoner/prisoner_id = null
+ for(prisoner_id in user.held_items)
+ if(prisoner_id != registered_id)
+ prisoner_id = null
+ else
+ break
+
+ if(!prisoner_id)
+ to_chat(user, "Access Denied.")
+ return FALSE
+
+ qdel(registered_id)
+ registered_id = null
+ locked = FALSE
+ open(user)
+ desc = "It's a secure locker for prisoner effects."
+ to_chat(user, "You insert your prisoner id into \the [src] and it springs open!")
+
+ return TRUE
+
+/obj/structure/closet/secure_closet/genpop/proc/handle_edit_sentence(mob/user)
+ var/prisoner_name = input(user, "Please input the name of the prisoner.", "Prisoner Name", registered_id.registered_name) as text|null
+ if(prisoner_name == null | !user.Adjacent(src))
+ return FALSE
+ var/sentence_length = input(user, "Please input the length of their sentence in minutes (0 for perma).", "Sentence Length", registered_id.sentence) as num|null
+ if(sentence_length == null | !user.Adjacent(src))
+ return FALSE
+ var/crimes = input(user, "Please input their crimes.", "Crimes", registered_id.crime) as text|null
+ if(crimes == null | !user.Adjacent(src))
+ return FALSE
+
+ registered_id.registered_name = prisoner_name
+ var/filteredsentlength = text2num(sentence_length)
+ registered_id.sentence = filteredsentlength ? (filteredsentlength MINUTES) + world.time : 0
+ registered_id.crime = crimes
+ registered_id.update_label(prisoner_name, registered_id.assignment)
+ if(registered_id.sentence)
+ START_PROCESSING(SSobj, registered_id)
+ else
+ STOP_PROCESSING(SSobj, registered_id)
+
+ name = "[default_name] ([prisoner_name])"
+ desc = "[default_desc] It contains the personal effects of [prisoner_name]."
+
+ return TRUE
+
+/obj/structure/closet/secure_closet/genpop/togglelock(mob/living/user)
+ if(!allowed(user))
+ return ..()
+
+ if(!broken && locked && registered_id != null)
+ var/name = registered_id.registered_name
+ var/result = alert(user, "This locker currently contains [name]'s personal belongings ","Locker In Use","Reset","Amend ID", "Open")
+ if(!user.Adjacent(src))
+ return
+ if(result == "Reset")
+ name = default_name
+ desc = default_desc
+ registered_id = null
+ if(result == "Open" | result == "Reset")
+ locked = FALSE
+ open(user)
+ if(result == "Amend ID")
+ handle_edit_sentence(user)
+ else
+ return ..()
+
+/obj/structure/closet/secure_closet/genpop/close(mob/living/user)
+ if(registered_id != null)
+ locked = TRUE
+ return ..()
+
+/obj/structure/closet/secure_closet/genpop/attack_hand(mob/user)
+ if(user.lying && get_dist(src, user) > 0)
+ return
+
+ if(!broken && registered_id != null && registered_id in user.held_items)
+ handle_prisoner_id(user)
+ return
+
+ if(!broken && opened && !locked && allowed(user) && !registered_id) //Genpop setup
+
+ registered_id = new /obj/item/card/id/prisoner/(src.contents)
+ if(handle_edit_sentence(user))
+ close(user)
+ locked = TRUE
+ update_icon()
+ registered_id.forceMove(src.loc)
+ new /obj/item/clothing/under/rank/prisoner(src.loc)
+ else
+ qdel(registered_id)
+ registered_id = null
+
+ return
+
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 46db567b10..76c8f7f11f 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -318,6 +318,7 @@
/obj/machinery/shower/proc/wash_obj(obj/O)
. = SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ . = O.clean_blood()
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
if(isitem(O))
var/obj/item/I = O
@@ -328,8 +329,9 @@
/obj/machinery/shower/proc/wash_turf()
if(isturf(loc))
var/turf/tile = loc
- SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
tile.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
+ tile.clean_blood()
+ SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
for(var/obj/effect/E in tile)
if(is_cleanable(E))
qdel(E)
@@ -381,7 +383,8 @@
else if(H.w_uniform && wash_obj(H.w_uniform))
H.update_inv_w_uniform()
if(washgloves)
- SEND_SIGNAL(H, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ H.clean_blood()
+ SEND_SIGNAL(H, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
if(H.shoes && washshoes && wash_obj(H.shoes))
H.update_inv_shoes()
if(H.wear_mask && washmask && wash_obj(H.wear_mask))
@@ -398,9 +401,11 @@
else
if(M.wear_mask && wash_obj(M.wear_mask))
M.update_inv_wear_mask(0)
- SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ M.clean_blood()
+ SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
else
- SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ L.clean_blood()
+ SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
/obj/machinery/shower/proc/contamination_cleanse(atom/movable/thing)
var/datum/component/radioactive/healthy_green_glow = thing.GetComponent(/datum/component/radioactive)
@@ -498,7 +503,8 @@
H.regenerate_icons()
user.drowsyness = max(user.drowsyness - rand(2,3), 0) //Washing your face wakes you up if you're falling asleep
else
- SEND_SIGNAL(user, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(user, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ user.clean_blood()
/obj/structure/sink/attackby(obj/item/O, mob/living/user, params)
if(busy)
@@ -554,7 +560,8 @@
busy = FALSE
return 1
busy = FALSE
- SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ O.clean_blood()
O.acid_level = 0
create_reagents(5)
reagents.add_reagent(dispensedreagent, 5)
@@ -675,4 +682,4 @@
else
playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
if(BURN)
- playsound(loc, 'sound/items/welder.ogg', 80, 1)
+ playsound(loc, 'sound/items/welder.ogg', 80, 1)
\ No newline at end of file
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index f6d234b346..bd24e0ff93 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -251,6 +251,7 @@
M.apply_water()
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ clean_blood()
for(var/obj/effect/O in src)
if(is_cleanable(O))
qdel(O)
diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm
index 80eb007605..e8d30e8dbe 100644
--- a/code/modules/antagonists/abductor/abductor.dm
+++ b/code/modules/antagonists/abductor/abductor.dm
@@ -26,7 +26,7 @@
sub_role = "Scientist"
outfit = /datum/outfit/abductor/scientist
landmark_type = /obj/effect/landmark/abductor/scientist
- greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve."
+ greet_text = "Use your experimental console and surgical equipment to monitor your agent and experiment upon abducted humans."
show_in_antagpanel = TRUE
/datum/antagonist/abductor/create_team(datum/team/abductor_team/new_team)
@@ -40,15 +40,14 @@
return team
/datum/antagonist/abductor/on_gain()
- owner.special_role = "[name] [sub_role]"
- owner.assigned_role = "[name] [sub_role]"
- owner.objectives += team.objectives
+ owner.special_role = "[name]"
+ owner.assigned_role = "[name]"
+ objectives += team.objectives
finalize_abductor()
ADD_TRAIT(owner, TRAIT_ABDUCTOR_TRAINING, ABDUCTOR_ANTAGONIST)
return ..()
/datum/antagonist/abductor/on_removal()
- owner.objectives -= team.objectives
if(owner.current)
to_chat(owner.current,"You are no longer the [owner.special_role]!")
owner.special_role = null
@@ -66,6 +65,7 @@
//Equip
var/mob/living/carbon/human/H = owner.current
H.set_species(/datum/species/abductor)
+
H.real_name = "[team.name] [sub_role]"
H.equipOutfit(outfit)
@@ -99,8 +99,8 @@
else
return
new_owner.add_antag_datum(src)
- log_admin("[key_name(usr)] made [key_name(new_owner.current)] [name] on [choice]!")
- message_admins("[key_name_admin(usr)] made [key_name_admin(new_owner.current)] [name] on [choice] !")
+ log_admin("[key_name(usr)] made [key_name(new_owner)] [name] on [choice]!")
+ message_admins("[key_name_admin(usr)] made [key_name_admin(new_owner)] [name] on [choice] !")
/datum/antagonist/abductor/get_admin_commands()
. = ..()
@@ -153,7 +153,7 @@
result += ""
for(var/datum/mind/abductor_mind in members)
result += printplayer(abductor_mind)
- result += printobjectives(abductor_mind)
+ result += printobjectives(objectives)
return "[result.Join("
")]
"
@@ -178,7 +178,6 @@
var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random))
var/datum/objective/abductee/O = new objtype()
objectives += O
- owner.objectives += objectives
/datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override)
update_abductor_icons_added(mob_override ? mob_override.mind : owner,"abductee")
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index 7620aa752b..ed26b894d9 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -135,12 +135,14 @@
/obj/item/abductor/proc/AbductorCheck(mob/user)
if(HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING))
return TRUE
+ if (istype(user) && user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING))
+ return TRUE
to_chat(user, "You can't figure how this works!")
return FALSE
/obj/item/abductor/proc/ScientistCheck(mob/user)
- var/training = HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING)
- var/sci_training = HAS_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)
+ var/training = HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING))
+ var/sci_training = HAS_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING))
if(training && !sci_training)
to_chat(user, "You're not trained to use this!")
diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm
index cc52b3e910..a35cbbf0e4 100644
--- a/code/modules/antagonists/abductor/equipment/gland.dm
+++ b/code/modules/antagonists/abductor/equipment/gland.dm
@@ -19,7 +19,7 @@
/obj/item/organ/heart/gland/examine(mob/user)
. = ..()
- if(HAS_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) || isobserver(user))
+ if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user))
to_chat(user, "It is \a [true_name].")
/obj/item/organ/heart/gland/proc/ownerCheck()
@@ -48,19 +48,19 @@
/obj/item/organ/heart/gland/proc/mind_control(command, mob/living/user)
if(!ownerCheck() || !mind_control_uses || active_mind_control)
- return
+ return FALSE
mind_control_uses--
to_chat(owner, "You suddenly feel an irresistible compulsion to follow an order...")
to_chat(owner, "[command]")
active_mind_control = TRUE
- log_admin("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]")
+ message_admins("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]")
update_gland_hud()
addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration)
/obj/item/organ/heart/gland/proc/clear_mind_control()
if(!ownerCheck() || !active_mind_control)
- return
+ return FALSE
to_chat(owner, "You feel the compulsion fade, and you completely forget about your previous orders.")
active_mind_control = FALSE
diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm
index 30b82398ff..9a9b1a6ba0 100644
--- a/code/modules/antagonists/abductor/machinery/console.dm
+++ b/code/modules/antagonists/abductor/machinery/console.dm
@@ -28,7 +28,7 @@
. = ..()
if(.)
return
- if(!HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING))
+ if(!HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) && !HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING))
to_chat(user, "You start mashing alien buttons at random!")
if(do_after(user,100, target = src))
TeleporterSend()
diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
index 2018067b77..8000be87e6 100644
--- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
@@ -366,6 +366,8 @@
break
if(!GLOB.ratvar_awakens)
+ if(GLOB.clockwork_vitality <= 0)
+ break
GLOB.clockwork_vitality -= vitality_used
sleep(2)
diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm
index da499065d7..3d467350ff 100644
--- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm
+++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm
@@ -119,3 +119,33 @@
var/datum/clockwork_scripture/create_object/construct/clockwork_marauder/CM = new()
CM.recent_marauders--
qdel(CM)
+
+//Summon Neovgre: Summon a very powerful combat mech that explodes when destroyed for massive damage.
+/datum/clockwork_scripture/create_object/summon_arbiter
+ descname = "Powerful Assault Mech"
+ name = "Summon Neovgre, the Anima Bulwark"
+ desc = "Calls forth the mighty Anima Bulwark, a weapon of unmatched power,\
+ mech with superior defensive and offensive capabilities. It will \
+ steadily regenerate HP and triple its regeneration speed while standing \
+ on a clockwork tile. It will automatically draw power from nearby sigils of \
+ transmission should the need arise. Its Arbiter laser cannon can decimate foes \
+ from a range and is capable of smashing through any barrier presented to it. \
+ Be warned, choosing to pilot Neovgre is a lifetime commitment, once you are \
+ in you cannot leave and when it is destroyed it will explode catastrophically with you inside."
+ invocations = list("By the strength of the alloy...!!", "...call forth the Arbiter!!")
+ channel_time = 200 // This is a strong fucking weapon, 20 seconds channel time is getting off light I tell ya.
+ power_cost = 75000 //75 KW
+ usage_tip = "Neovgre is a powerful mech that will crush your enemies!"
+ invokers_required = 5
+ multiple_invokers_used = TRUE
+ object_path = /obj/mecha/combat/neovgre
+ tier = SCRIPTURE_APPLICATION
+ primary_component = BELLIGERENT_EYE
+ sort_priority = 2
+ creator_message = "Neovgre, the Anima Bulwark towers over you... your enemies reckoning has come."
+
+/datum/clockwork_scripture/create_object/summon_arbiter/check_special_requirements()
+ if(GLOB.neovgre_exists)
+ to_chat(invoker, "\"You've already got one...\"")
+ return FALSE
+ return ..()
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index 57488a6722..6ea2dd1ce9 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -324,14 +324,11 @@
cooldown = world.time + cooldown_time
/obj/item/voodoo/proc/update_targets()
- possible = list()
+ LAZYINITLIST(possible)
if(!voodoo_link)
return
- var/list/prints = voodoo_link.return_fingerprints()
- if(!length(prints))
- return FALSE
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
- if(prints[md5(H.dna.uni_identity)])
+ if(md5(H.dna.uni_identity) in voodoo_link.fingerprints)
possible |= H
/obj/item/voodoo/proc/GiveHint(mob/victim,force=0)
diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm
index 1df8e43316..6f4c3fca10 100644
--- a/code/modules/antagonists/wizard/equipment/soulstone.dm
+++ b/code/modules/antagonists/wizard/equipment/soulstone.dm
@@ -238,6 +238,7 @@
T.stop_sound_channel(CHANNEL_HEARTBEAT)
T.invisibility = INVISIBILITY_ABSTRACT
T.dust_animation()
+ QDEL_IN(T, 5)
var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade(src)
S.status_flags |= GODMODE //So they won't die inside the stone somehow
S.canmove = FALSE//Can't move out of the soul stone
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index 8e320b2f3e..f9c831a65a 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -210,9 +210,9 @@
return cached_results["fire"] ? REACTING : NO_REACTION
-//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again, and again)
+//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again, and again). Again!
//Fusion Rework Counter: Please increment this if you make a major overhaul to this system again.
-//5 reworks
+//6 reworks
/datum/gas_reaction/fusion
exclude = FALSE
@@ -220,100 +220,79 @@
name = "Plasmic Fusion"
id = "fusion"
-//Since fusion isn't really intended to happen in successive chains, the requirements are very high
/datum/gas_reaction/fusion/init_reqs()
min_requirements = list(
"TEMP" = FUSION_TEMPERATURE_THRESHOLD,
- "ENER" = FUSION_ENERGY_THRESHOLD,
+ /datum/gas/tritium = FUSION_TRITIUM_MOLES_USED,
/datum/gas/plasma = FUSION_MOLE_THRESHOLD,
- /datum/gas/tritium = FUSION_MOLE_THRESHOLD
- )
+ /datum/gas/carbon_dioxide = FUSION_MOLE_THRESHOLD)
/datum/gas_reaction/fusion/react(datum/gas_mixture/air, datum/holder)
var/list/cached_gases = air.gases
- var/temperature = air.temperature
- if(!air.analyzer_results)
- air.analyzer_results = new
- var/list/cached_scan_results = air.analyzer_results
var/turf/open/location
if (istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet.
var/datum/pipeline/fusion_pipenet = holder
location = get_turf(pick(fusion_pipenet.members))
else
location = get_turf(holder)
-
+ if(!air.analyzer_results)
+ air.analyzer_results = new
+ var/list/cached_scan_results = air.analyzer_results
var/old_heat_capacity = air.heat_capacity()
- var/reaction_energy = 0
-
- var/mediation = FUSION_MEDIATION_FACTOR*(air.heat_capacity()-(cached_gases[/datum/gas/plasma]*GLOB.meta_gas_specific_heats[/datum/gas/plasma]))/(air.total_moles()-cached_gases[/datum/gas/plasma]) //This is the average specific heat of the mixture,not including plasma.
-
- var/gases_fused = air.total_moles() - cached_gases[/datum/gas/plasma]
- var/plasma_differential = (cached_gases[/datum/gas/plasma] - gases_fused) / air.total_moles()
- var/reaction_efficiency = FUSION_EFFICIENCY_BASE ** -((plasma_differential ** 2) / FUSION_EFFICIENCY_DIVISOR) //https://www.desmos.com/calculator/6jjx3vdrvx
-
+ var/reaction_energy = 0 //Reaction energy can be negative or positive, for both exothermic and endothermic reactions.
+ var/initial_plasma = cached_gases[/datum/gas/plasma]
+ var/initial_carbon = cached_gases[/datum/gas/carbon_dioxide]
+ var/scale_factor = (air.volume)/(PI) //We scale it down by volume/Pi because for fusion conditions, moles roughly = 2*volume, but we want it to be based off something constant between reactions.
+ var/toroidal_size = (2*PI)+TORADIANS(arctan((air.volume-TOROID_VOLUME_BREAKEVEN)/TOROID_VOLUME_BREAKEVEN)) //The size of the phase space hypertorus
var/gas_power = 0
+ var/list/gas_fusion_powers = GLOB.meta_gas_fusions
for (var/gas_id in cached_gases)
- gas_power += reaction_efficiency * (GLOB.meta_gas_fusions[gas_id]*cached_gases[gas_id])
+ gas_power += (gas_fusion_powers[gas_id]*cached_gases[gas_id])
+ var/instability = MODULUS((gas_power*INSTABILITY_GAS_POWER_FACTOR)**2,toroidal_size) //Instability effects how chaotic the behavior of the reaction is
+ cached_scan_results[id] = instability//used for analyzer feedback
- var/power_ratio = gas_power/mediation
- cached_scan_results[id] = power_ratio //used for analyzer feedback
+ var/plasma = (initial_plasma-FUSION_MOLE_THRESHOLD)/(scale_factor) //We have to scale the amounts of carbon and plasma down a significant amount in order to show the chaotic dynamics we want
+ var/carbon = (initial_carbon-FUSION_MOLE_THRESHOLD)/(scale_factor) //We also subtract out the threshold amount to make it harder for fusion to burn itself out.
- for (var/gas_id in cached_gases) //and now we fuse
- cached_gases[gas_id] = 0
+ //The reaction is a specific form of the Kicked Rotator system, which displays chaotic behavior and can be used to model particle interactions.
+ plasma = MODULUS(plasma - (instability*sin(TODEGREES(carbon))), toroidal_size)
+ carbon = MODULUS(carbon - plasma, toroidal_size)
- var/radiation_power = (FUSION_RADIATION_FACTOR * power_ratio) / (power_ratio + FUSION_RADIATION_CONSTANT) //https://www.desmos.com/calculator/4i1f296phl
- var/zap_power = ((FUSION_ZAP_POWER_ASYMPTOTE * power_ratio) / (power_ratio + FUSION_ZAP_POWER_CONSTANT)) + FUSION_ZAP_POWER_BASE //https://www.desmos.com/calculator/n0zkdpxnrr
- var/do_explosion = FALSE
- var/zap_range //these ones are set later
- var/fusion_prepare_to_die_edition_rng
- if (power_ratio > FUSION_SUPER_TIER_THRESHOLD) //power ratio 50+: SUPER TIER. The gases become so energized that they fuse into a ton of tritium, which is pretty nice! Until you consider the fact that everything just exploded, the canister is probably going to break and you're irradiated.
- reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_SUPER * (power_ratio / FUSION_ENERGY_DIVISOR_SUPER)
- cached_gases[/datum/gas/tritium] += gases_fused * FUSION_GAS_CREATION_FACTOR_TRITIUM //60% of the gas is converted to energy, 40% to trit
- fusion_prepare_to_die_edition_rng = 100 //Wait a minute..
- do_explosion = TRUE
- zap_range = FUSION_ZAP_RANGE_SUPER
+ cached_gases[/datum/gas/plasma] = plasma*scale_factor + FUSION_MOLE_THRESHOLD //Scales the gases back up
+ cached_gases[/datum/gas/carbon_dioxide] = carbon*scale_factor + FUSION_MOLE_THRESHOLD
+ var/delta_plasma = initial_plasma - cached_gases[/datum/gas/plasma]
- else if (power_ratio > FUSION_HIGH_TIER_THRESHOLD) //power ratio 20-50; High tier. The reaction is so energized that it fuses into a small amount of stimulum, and some pluoxium. Very dangerous, but super cool and super useful.
- reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_HIGH * (power_ratio / FUSION_ENERGY_DIVISOR_HIGH)
- cached_gases[/datum/gas/stimulum] += gases_fused * FUSION_GAS_CREATION_FACTOR_STIM //40% of the gas is converted to energy, 60% to stim and pluox
- cached_gases[/datum/gas/pluoxium] += gases_fused * FUSION_GAS_CREATION_FACTOR_PLUOX
- fusion_prepare_to_die_edition_rng = power_ratio //Now we're getting into dangerous territory
- do_explosion = TRUE
- zap_range = FUSION_ZAP_RANGE_HIGH
-
- else if (power_ratio > FUSION_MID_TIER_THRESHOLD) //power_ratio 5 to 20; Mediation is overpowered, fusion reaction starts to break down.
- reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_MID * (power_ratio / FUSION_ENERGY_DIVISOR_MID)
- cached_gases[/datum/gas/nitryl] += gases_fused * FUSION_GAS_CREATION_FACTOR_NITRYL //20% of the gas is converted to energy, 80% to nitryl and N2O
- cached_gases[/datum/gas/nitrous_oxide] += gases_fused * FUSION_GAS_CREATION_FACTOR_N2O
- fusion_prepare_to_die_edition_rng = power_ratio * FUSION_MID_TIER_RAD_PROB_FACTOR //Still unlikely, but don't stand next to the reaction unprotected
- zap_range = FUSION_ZAP_RANGE_MID
-
- else //power ratio 0 to 5; Gas power is overpowered. Fusion isn't nearly as powerful.
- reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_LOW * (power_ratio / FUSION_ENERGY_DIVISOR_LOW)
- cached_gases[/datum/gas/bz] += gases_fused * FUSION_GAS_CREATION_FACTOR_BZ //10% of the gas is converted to energy, 90% to BZ and CO2
- cached_gases[/datum/gas/carbon_dioxide] += gases_fused * FUSION_GAS_CREATION_FACTOR_CO2
- fusion_prepare_to_die_edition_rng = power_ratio * FUSION_LOW_TIER_RAD_PROB_FACTOR //Low, but still something to look out for
- zap_range = FUSION_ZAP_RANGE_LOW
-
- //All the deadly consequences of fusion, consolidated for your viewing pleasure
- if (location)
- if(prob(fusion_prepare_to_die_edition_rng)) //Some.. permanent effects
- if(do_explosion)
- explosion(location, 0, 0, 5, power_ratio, TRUE, TRUE) //large shockwave, the actual radius is quite small - people will recognize that you're doing fusion
- radiation_pulse(location, radiation_power) //You mean causing a super-tier fusion reaction in the halls is a bad idea?
- SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, 30000)//The science is cool though.
- playsound(location, 'sound/effects/supermatter.ogg', 100, 0)
- else
- playsound(location, 'sound/effects/phasein.ogg', 75, 0)
- //These will always happen, so be prepared
- tesla_zap(location, zap_range, zap_power, TESLA_FUSION_FLAGS) //larpers beware
- location.fire_nuclear_particles(power_ratio) //see code/modules/projectile/energy/nuclear_particle.dm
+ reaction_energy += delta_plasma*PLASMA_BINDING_ENERGY //Energy is gained or lost corresponding to the creation or destruction of mass.
+ if(instability < FUSION_INSTABILITY_ENDOTHERMALITY)
+ reaction_energy = max(reaction_energy,0) //Stable reactions don't end up endothermic.
+ else if (reaction_energy < 0)
+ reaction_energy *= (instability-FUSION_INSTABILITY_ENDOTHERMALITY)**0.5
+ if(air.thermal_energy() + reaction_energy < 0) //No using energy that doesn't exist.
+ cached_gases[/datum/gas/plasma] = initial_plasma
+ cached_gases[/datum/gas/carbon_dioxide] = initial_carbon
+ return NO_REACTION
+ cached_gases[/datum/gas/tritium] -= FUSION_TRITIUM_MOLES_USED
+ //The decay of the tritium and the reaction's energy produces waste gases, different ones depending on whether the reaction is endo or exothermic
if(reaction_energy > 0)
+ cached_gases[/datum/gas/oxygen] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)
+ cached_gases[/datum/gas/nitrous_oxide] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)
+ else
+ cached_gases[/datum/gas/bz] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)
+ cached_gases[/datum/gas/nitryl] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)
+
+ if(reaction_energy)
+ if(location)
+ var/particle_chance = ((PARTICLE_CHANCE_CONSTANT)/(reaction_energy-PARTICLE_CHANCE_CONSTANT)) + 1//Asymptopically approaches 100% as the energy of the reaction goes up.
+ if(prob(PERCENT(particle_chance)))
+ location.fire_nuclear_particle()
+ var/rad_power = max((FUSION_RAD_COEFFICIENT/instability) + FUSION_RAD_MAX,0)
+ radiation_pulse(location,rad_power)
+
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
- air.temperature = max(((temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB)
+ air.temperature = CLAMP(((air.temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY)
return REACTING
/datum/gas_reaction/nitrylformation //The formation of nitryl. Endothermic. Requires N2O as a catalyst.
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index c9e9c37f6c..89c463f3e3 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -35,4 +35,4 @@
A.flags_1 |= ADMIN_SPAWNED_1
else
for(var/item in contains)
- new item(C)
\ No newline at end of file
+ new item(C)
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index e1d27c5022..656474cc1d 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -30,17 +30,31 @@
/datum/supply_pack/medical/bloodpacks
name = "Blood Pack Variety Crate"
- desc = "Contains eight different blood packs for reintroducing blood to patients."
+ desc = "Contains ten different blood packs for reintroducing blood to patients."
cost = 3000
- contains = list(/obj/item/reagent_containers/blood,
- /obj/item/reagent_containers/blood,
+ contains = list(/obj/item/reagent_containers/blood/random,
+ /obj/item/reagent_containers/blood/random,
/obj/item/reagent_containers/blood/APlus,
/obj/item/reagent_containers/blood/AMinus,
/obj/item/reagent_containers/blood/BPlus,
/obj/item/reagent_containers/blood/BMinus,
/obj/item/reagent_containers/blood/OPlus,
/obj/item/reagent_containers/blood/OMinus,
- /obj/item/reagent_containers/blood/lizard)
+ /obj/item/reagent_containers/blood/lizard,
+ /obj/item/reagent_containers/blood/jellyblood,
+ /obj/item/reagent_containers/blood/insect)
+ crate_name = "blood freezer"
+ crate_type = /obj/structure/closet/crate/freezer
+
+/datum/supply_pack/medical/bloodpackssynth
+ name = "Synthetics Blood Pack Crate"
+ desc = "Contains five synthetics blood packs for reintroducing blood to patients."
+ cost = 3000
+ contains = list(/obj/item/reagent_containers/blood/synthetics,
+ /obj/item/reagent_containers/blood/synthetics,
+ /obj/item/reagent_containers/blood/synthetics,
+ /obj/item/reagent_containers/blood/synthetics,
+ /obj/item/reagent_containers/blood/synthetics)
crate_name = "blood freezer"
crate_type = /obj/structure/closet/crate/freezer
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index c6166ca970..47c3293c35 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -86,6 +86,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/skin_tone = "caucasian1" //Skin color
var/eye_color = "000" //Eye color
var/horn_color = "85615a" //Horn color
+ var/wing_color = "fff" //Wing color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
var/list/features = list("mcolor" = "FFF",
"tail_lizard" = "Smooth",
@@ -591,6 +592,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Decorative wings
"
dat += "[features["deco_wings"]]"
+ dat += " Change
"
+
if("insect_wings" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -598,6 +601,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Insect wings
"
dat += "[features["insect_wings"]]"
+ dat += " Change
"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
dat += ""
@@ -1689,7 +1693,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("horns_color")
var/new_horn_color = input(user, "Choose your character's horn colour:", "Character Preference","#"+horn_color) as color|null
if(new_horn_color)
- horn_color = sanitize_hexcolor(new_horn_color)
+ if (new_horn_color == "#000000")
+ horn_color = "#85615A"
+ else
+ horn_color = sanitize_hexcolor(new_horn_color)
if("wings")
var/new_wings
@@ -1697,6 +1704,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_wings)
features["wings"] = new_wings
+ if("wings_color")
+ var/new_wing_color = input(user, "Choose your character's wing colour:", "Character Preference","#"+wing_color) as color|null
+ if(new_wing_color)
+ if (new_wing_color == "#000000")
+ wing_color = "#FFFFFF"
+ else
+ wing_color = sanitize_hexcolor(new_wing_color)
+
if("frills")
var/new_frills
new_frills = input(user, "Choose your character's frills:", "Character Preference") as null|anything in GLOB.frills_list
@@ -1730,13 +1745,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
new_insect_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_wings_list
if(new_insect_wings)
features["insect_wings"] = new_insect_wings
-
+
if("deco_wings")
var/new_deco_wings
new_deco_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.deco_wings_list
if(new_deco_wings)
features["deco_wings"] = new_deco_wings
-
+
if("insect_fluffs")
var/new_insect_fluff
new_insect_fluff = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_fluffs_list
@@ -2262,6 +2277,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.hair_color = hair_color
character.facial_hair_color = facial_hair_color
character.horn_color = horn_color
+ character.wing_color = wing_color
character.skin_tone = skin_tone
character.hair_style = hair_style
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 94c1158885..01a46a44a0 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -317,6 +317,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000")
WRITE_FILE(S["features["mcolor"]"] , "#FFF")
+ if(!S["features["horn_color"]"] || S["features["horn_color"]"] == "#000")
+ WRITE_FILE(S["features["horn_color"]"] , "#85615a")
+
+ if(!S["features["wing_color"]"] || S["features["wing_color"]"] == "#000")
+ WRITE_FILE(S["features["wing_color"]"] , "#FFF")
+
//Character
S["real_name"] >> real_name
S["nameless"] >> nameless
@@ -338,6 +344,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["socks"] >> socks
S["socks_color"] >> socks_color
S["horn_color"] >> horn_color
+ S["wing_color"] >> wing_color
S["backbag"] >> backbag
S["jumpsuit_style"] >> jumpsuit_style
S["uplink_loc"] >> uplink_spawn_loc
@@ -449,6 +456,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(!features["mcolor"] || features["mcolor"] == "#000")
features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
+ if(!features["horn_color"] || features["horn_color"] == "#000")
+ features["horn_color"] = "85615a"
+
+ if(!features["wing_color"] || features["wing_color"] == "#000")
+ features["wing_color"] = "FFFFFF"
+
nameless = sanitize_integer(nameless, 0, 1, initial(nameless))
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
@@ -471,6 +484,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
eye_color = sanitize_hexcolor(eye_color, 3, 0)
skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
horn_color = sanitize_hexcolor(horn_color, 3, FALSE)
+ wing_color = sanitize_hexcolor(wing_color, 3, FALSE, "#FFFFFF")
backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag))
jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
@@ -485,7 +499,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list)
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
- features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list)
+ features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None")
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
@@ -540,6 +554,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["socks"] , socks)
WRITE_FILE(S["socks_color"] , socks_color)
WRITE_FILE(S["horn_color"] , horn_color)
+ WRITE_FILE(S["wing_color"] , wing_color)
WRITE_FILE(S["backbag"] , backbag)
WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style)
WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc)
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index f0c1eeb833..9d75fc6ce4 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -14,11 +14,10 @@
/obj/item/clothing/gloves/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood)))
+ AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, /obj/item/clothing/gloves/clean_blood)))
-/obj/item/clothing/gloves/proc/clean_blood(datum/source, strength)
- if(strength < CLEAN_STRENGTH_BLOOD)
- return
+/obj/item/clothing/gloves/clean_blood(datum/source, strength)
+ . = ..()
transfer_blood = 0
/obj/item/clothing/gloves/suicide_act(mob/living/carbon/user)
@@ -30,8 +29,8 @@
if(!isinhands)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves")
- IF_HAS_BLOOD_DNA(src)
- . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands")
+ if(blood_DNA)
+ . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands", color = blood_DNA_to_color())
/obj/item/clothing/gloves/update_clothes_damaged_state(damaging = TRUE)
..()
@@ -41,4 +40,4 @@
// Called just before an attack_hand(), in mob/UnarmedAttack()
/obj/item/clothing/gloves/proc/Touch(atom/A, proximity)
- return 0 // return 1 to cancel attack_hand()
\ No newline at end of file
+ return FALSE // return TRUE to cancel attack_hand()
\ No newline at end of file
diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm
index 8bd7065c1f..ccc167dcbc 100644
--- a/code/modules/clothing/head/_head.dm
+++ b/code/modules/clothing/head/_head.dm
@@ -46,8 +46,8 @@
if(!isinhands)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet")
- IF_HAS_BLOOD_DNA(src)
- . += mutable_appearance('icons/effects/blood.dmi', "helmetblood")
+ if(blood_DNA)
+ . += mutable_appearance('icons/effects/blood.dmi', "helmetblood", color = blood_DNA_to_color())
/obj/item/clothing/head/update_clothes_damaged_state(damaging = TRUE)
..()
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index 9ee2ebcd54..c00e6f72e0 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -59,8 +59,8 @@
if(body_parts_covered & HEAD)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
- IF_HAS_BLOOD_DNA(src)
- . += mutable_appearance('icons/effects/blood.dmi', "maskblood")
+ if(blood_DNA)
+ . += mutable_appearance('icons/effects/blood.dmi', "maskblood", color = blood_DNA_to_color())
/obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE)
..()
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 330f69ddaf..2356bb16eb 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -12,8 +12,8 @@
if(body_parts_covered & HEAD)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
- IF_HAS_BLOOD_DNA(src)
- . += mutable_appearance('icons/effects/blood.dmi', "maskblood")
+ if(blood_DNA)
+ . += mutable_appearance('icons/effects/blood.dmi', "maskblood", color = blood_DNA_to_color())
/obj/item/clothing/neck/tie
name = "tie"
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 00cb2678cd..488f59bb88 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -11,17 +11,19 @@
permeability_coefficient = 0.5
slowdown = SHOES_SLOWDOWN
var/blood_state = BLOOD_STATE_NOT_BLOODY
- var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
+ var/list/bloody_shoes = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
var/offset = 0
var/equipped_before_drop = FALSE
//CITADEL EDIT Enables digitigrade shoe styles
var/adjusted = NORMAL_STYLE
mutantrace_variation = MUTANTRACE_VARIATION
+ var/last_bloodtype = "" //used to track the last bloodtype to have graced these shoes; makes for better performing footprint shenanigans
+ var/last_blood_DNA = "" //same as last one
/obj/item/clothing/shoes/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood)))
+ AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, /obj/item/clothing/shoes/clean_blood)))
/obj/item/clothing/shoes/suicide_act(mob/living/carbon/user)
if(rand(2)>1)
@@ -42,22 +44,29 @@
playsound(user, 'sound/weapons/genhit2.ogg', 50, 1)
return(BRUTELOSS)
+
+/obj/item/clothing/shoes/transfer_blood_dna(list/blood_dna, diseases)
+ ..()
+ if(blood_dna.len)
+ last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works
+ last_blood_DNA = blood_dna[blood_dna.len]
+
/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)
var/bloody = FALSE
- IF_HAS_BLOOD_DNA(src)
+ if(blood_DNA)
bloody = TRUE
else
- bloody = bloody_shoes[BLOOD_STATE_HUMAN]
+ bloody = bloody_shoes[BLOOD_STATE_BLOOD]
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe")
if(bloody)
if(adjusted == NORMAL_STYLE)
- . += mutable_appearance('icons/effects/blood.dmi', "shoeblood")
+ . += mutable_appearance('icons/effects/blood.dmi', "shoeblood", color = blood_DNA_to_color())
else
- . += mutable_appearance('modular_citadel/icons/mob/digishoes.dmi', "shoeblood")
+ . += mutable_appearance('modular_citadel/icons/mob/digishoes.dmi', "shoeblood", color = blood_DNA_to_color())
/obj/item/clothing/shoes/equipped(mob/user, slot)
. = ..()
@@ -93,14 +102,13 @@
var/mob/M = loc
M.update_inv_shoes()
-/obj/item/clothing/shoes/proc/clean_blood(datum/source, strength)
- if(strength < CLEAN_STRENGTH_BLOOD)
- return
- bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
+/obj/item/clothing/shoes/clean_blood(datum/source, strength)
+ . = ..()
+ bloody_shoes = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
blood_state = BLOOD_STATE_NOT_BLOODY
if(ismob(loc))
var/mob/M = loc
M.update_inv_shoes()
/obj/item/proc/negates_gravity()
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index 3008043156..6e469faaa4 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -1,74 +1,74 @@
-/obj/item/clothing/suit
- icon = 'icons/obj/clothing/suits.dmi'
- name = "suit"
- var/fire_resist = T0C+100
- allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- slot_flags = ITEM_SLOT_OCLOTHING
- body_parts_covered = CHEST
- var/blood_overlay_type = "suit"
- var/togglename = null
- var/suittoggled = FALSE
-
- var/adjusted = NORMAL_STYLE
- mutantrace_variation = MUTANTRACE_VARIATION
- var/tauric = FALSE //Citadel Add for tauric hardsuits
- var/taurmode = NOT_TAURIC
- var/dimension_x = 32
- var/dimension_y = 32
- var/center = FALSE //Should we center the sprite?
-
-/obj/item/clothing/suit/equipped(mob/user, slot)
- ..()
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
-
- if(mutantrace_variation)
- if(DIGITIGRADE in H.dna.species.species_traits)
- adjusted = ALT_STYLE
- H.update_inv_wear_suit()
- else if(adjusted == ALT_STYLE)
- adjusted = NORMAL_STYLE
-
- if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None"))
- if(H.dna.features["taur"] in list("Naga", "Tentacle"))
- taurmode = SNEK_TAURIC
- if(tauric == TRUE)
- center = TRUE
- dimension_x = 64
- else if(H.dna.features["taur"] in list("Fox","Wolf","Otie","Drake","Lab","Shepherd","Husky","Eevee","Panther","Horse","Cow","Tiger","Deer"))
- taurmode = PAW_TAURIC
- if(tauric == TRUE)
- center = TRUE
- dimension_x = 64
- else
- taurmode = NOT_TAURIC
- if(tauric == TRUE)
- center = FALSE
- dimension_x = 32
- H.update_inv_wear_suit()
-
-
-/obj/item/clothing/suit/worn_overlays(isinhands = FALSE)
- . = list()
- if(!isinhands)
- if(damaged_clothes)
- . += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]")
- IF_HAS_BLOOD_DNA(src)
- if(taurmode >= SNEK_TAURIC)
- . += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "[blood_overlay_type]blood")
- else
- . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood")
- var/mob/living/carbon/human/M = loc
- if(ishuman(M) && M.w_uniform)
- var/obj/item/clothing/under/U = M.w_uniform
- if(istype(U) && U.attached_accessory)
- var/obj/item/clothing/accessory/A = U.attached_accessory
- if(A.above_suit)
- . += U.accessory_overlay
-
-/obj/item/clothing/suit/update_clothes_damaged_state(damaging = TRUE)
- ..()
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_wear_suit()
+/obj/item/clothing/suit
+ icon = 'icons/obj/clothing/suits.dmi'
+ name = "suit"
+ var/fire_resist = T0C+100
+ allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ slot_flags = ITEM_SLOT_OCLOTHING
+ body_parts_covered = CHEST
+ var/blood_overlay_type = "suit"
+ var/togglename = null
+ var/suittoggled = FALSE
+
+ var/adjusted = NORMAL_STYLE
+ mutantrace_variation = MUTANTRACE_VARIATION
+ var/tauric = FALSE //Citadel Add for tauric hardsuits
+ var/taurmode = NOT_TAURIC
+ var/dimension_x = 32
+ var/dimension_y = 32
+ var/center = FALSE //Should we center the sprite?
+
+/obj/item/clothing/suit/equipped(mob/user, slot)
+ ..()
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+
+ if(mutantrace_variation)
+ if(DIGITIGRADE in H.dna.species.species_traits)
+ adjusted = ALT_STYLE
+ H.update_inv_wear_suit()
+ else if(adjusted == ALT_STYLE)
+ adjusted = NORMAL_STYLE
+
+ if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None"))
+ if(H.dna.features["taur"] in GLOB.noodle_taurs)
+ taurmode = SNEK_TAURIC
+ if(tauric == TRUE)
+ center = TRUE
+ dimension_x = 64
+ else if(H.dna.features["taur"] in GLOB.paw_taurs)
+ taurmode = PAW_TAURIC
+ if(tauric == TRUE)
+ center = TRUE
+ dimension_x = 64
+ else
+ taurmode = NOT_TAURIC
+ if(tauric == TRUE)
+ center = FALSE
+ dimension_x = 32
+ H.update_inv_wear_suit()
+
+
+/obj/item/clothing/suit/worn_overlays(isinhands = FALSE)
+ . = list()
+ if(!isinhands)
+ if(damaged_clothes)
+ . += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]")
+ if(blood_DNA)
+ if(tauric)
+ . += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "[blood_overlay_type]blood", color = blood_DNA_to_color())
+ else
+ . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood", color = blood_DNA_to_color())
+ var/mob/living/carbon/human/M = loc
+ if(ishuman(M) && M.w_uniform)
+ var/obj/item/clothing/under/U = M.w_uniform
+ if(istype(U) && U.attached_accessory)
+ var/obj/item/clothing/accessory/A = U.attached_accessory
+ if(A.above_suit)
+ . += U.accessory_overlay
+
+/obj/item/clothing/suit/update_clothes_damaged_state(damaging = TRUE)
+ ..()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_wear_suit()
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index c2c3f19b9d..eda0e31e93 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -22,8 +22,8 @@
if(!isinhands)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
- IF_HAS_BLOOD_DNA(src)
- . += mutable_appearance('icons/effects/blood.dmi', "uniformblood")
+ if(blood_DNA)
+ . += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color())
if(accessory_overlay)
. += accessory_overlay
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 5f8f1f145d..2987b52338 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -1,4 +1,3 @@
-
/datum/crafting_recipe
var/name = "" //in-game display name
var/reqs[] = list() //type paths of items consumed associated with how many are needed
@@ -9,956 +8,4 @@
var/chem_catalysts[] = list() //like tools but for reagents
var/category = CAT_NONE //where it shows up in the crafting UI
var/subcategory = CAT_NONE
- var/always_availible = TRUE //Set to FALSE if it needs to be learned first.
-
-/datum/crafting_recipe/pin_removal
- name = "Pin Removal"
- result = /obj/item/gun
- reqs = list(/obj/item/gun = 1)
- parts = list(/obj/item/gun = 1)
- tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/IED
- name = "IED"
- result = /obj/item/grenade/iedcasing
- reqs = list(/datum/reagent/fuel = 50,
- /obj/item/stack/cable_coil = 1,
- /obj/item/assembly/igniter = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans = 1)
- parts = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1)
- time = 15
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/lance
- name = "Explosive Lance (Grenade)"
- result = /obj/item/twohanded/spear
- reqs = list(/obj/item/twohanded/spear = 1,
- /obj/item/grenade = 1)
- parts = list(/obj/item/twohanded/spear = 1,
- /obj/item/grenade = 1)
- time = 15
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/strobeshield
- name = "Strobe Shield"
- result = /obj/item/assembly/flash/shield
- reqs = list(/obj/item/wallframe/flasher = 1,
- /obj/item/assembly/flash/handheld = 1,
- /obj/item/shield/riot = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/makeshiftshield
- name = "Makeshift Metal Shield"
- result = /obj/item/shield/makeshift
- reqs = list(/obj/item/stack/cable_coil = 30,
- /obj/item/stack/sheet/metal = 10,
- /obj/item/stack/sheet/cloth = 2,
- /obj/item/stack/sheet/leather = 3)
- tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/molotov
- name = "Molotov"
- result = /obj/item/reagent_containers/food/drinks/bottle/molotov
- reqs = list(/obj/item/reagent_containers/rag = 1,
- /obj/item/reagent_containers/food/drinks/bottle = 1)
- parts = list(/obj/item/reagent_containers/food/drinks/bottle = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/stunprod
- name = "Stunprod"
- result = /obj/item/melee/baton/cattleprod
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/stack/rods = 1,
- /obj/item/assembly/igniter = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/teleprod
- name = "Teleprod"
- result = /obj/item/melee/baton/cattleprod/teleprod
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/stack/rods = 1,
- /obj/item/assembly/igniter = 1,
- /obj/item/stack/ore/bluespace_crystal = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/bola
- name = "Bola"
- result = /obj/item/restraints/legcuffs/bola
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/stack/sheet/metal = 6)
- time = 20//15 faster than crafting them by hand!
- category= CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/tailclub
- name = "Tail Club"
- result = /obj/item/tailclub
- reqs = list(/obj/item/organ/tail/lizard = 1,
- /obj/item/stack/sheet/metal = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/tailwhip
- name = "Liz O' Nine Tails"
- result = /obj/item/melee/chainofcommand/tailwhip
- reqs = list(/obj/item/organ/tail/lizard = 1,
- /obj/item/stack/cable_coil = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/catwhip
- name = "Cat O' Nine Tails"
- result = /obj/item/melee/chainofcommand/tailwhip/kitty
- reqs = list(/obj/item/organ/tail/cat = 1,
- /obj/item/stack/cable_coil = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/minigun
- name = "Laser Minigun"
- result = /obj/item/minigunpack2
- reqs = list(/obj/item/gun/energy/laser/carbine = 3,
- /obj/item/stack/sheet/plasteel = 5,
- /obj/item/stack/cable_coil = 30,
- /obj/item/stock_parts/cell/bluespace = 2)
- tools = list(TOOL_WIRECUTTER, TOOL_SCREWDRIVER, TOOL_WELDER)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/ed209
- name = "ED209"
- result = /mob/living/simple_animal/bot/ed209
- reqs = list(/obj/item/robot_suit = 1,
- /obj/item/clothing/head/helmet = 1,
- /obj/item/clothing/suit/armor/vest = 1,
- /obj/item/bodypart/l_leg/robot = 1,
- /obj/item/bodypart/r_leg/robot = 1,
- /obj/item/stack/sheet/metal = 1,
- /obj/item/stack/cable_coil = 1,
- /obj/item/gun/energy/e_gun/advtaser = 1,
- /obj/item/stock_parts/cell = 1,
- /obj/item/assembly/prox_sensor = 1)
- tools = list(TOOL_WELDER, TOOL_SCREWDRIVER)
- time = 60
- category = CAT_ROBOT
-
-/datum/crafting_recipe/secbot
- name = "Secbot"
- result = /mob/living/simple_animal/bot/secbot
- reqs = list(/obj/item/assembly/signaler = 1,
- /obj/item/clothing/head/helmet/sec = 1,
- /obj/item/melee/baton = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
- tools = list(TOOL_WELDER)
- time = 60
- category = CAT_ROBOT
-
-/datum/crafting_recipe/cleanbot
- name = "Cleanbot"
- result = /mob/living/simple_animal/bot/cleanbot
- reqs = list(/obj/item/reagent_containers/glass/bucket = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
- time = 40
- category = CAT_ROBOT
-
-/datum/crafting_recipe/floorbot
- name = "Floorbot"
- result = /mob/living/simple_animal/bot/floorbot
- reqs = list(/obj/item/storage/toolbox/mechanical = 1,
- /obj/item/stack/tile/plasteel = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
- time = 40
- category = CAT_ROBOT
-
-/datum/crafting_recipe/medbot
- name = "Medbot"
- result = /mob/living/simple_animal/bot/medbot
- reqs = list(/obj/item/healthanalyzer = 1,
- /obj/item/storage/firstaid = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
- time = 40
- category = CAT_ROBOT
-
-/datum/crafting_recipe/honkbot
- name = "Honkbot"
- result = /mob/living/simple_animal/bot/honkbot
- reqs = list(/obj/item/storage/box/clown = 1,
- /obj/item/bodypart/r_arm/robot = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/bikehorn/ = 1)
- time = 40
- category = CAT_ROBOT
-
-/datum/crafting_recipe/Firebot
- name = "Firebot"
- result = /mob/living/simple_animal/bot/firebot
- reqs = list(/obj/item/extinguisher = 1,
- /obj/item/bodypart/r_arm/robot = 1,
- /obj/item/assembly/prox_sensor = 1,
- /obj/item/clothing/head/hardhat/red = 1)
- time = 40
- category = CAT_ROBOT
-
-/datum/crafting_recipe/potatos
- name = "Potat-OS"
- reqs = list(/obj/item/stack/cable_coil = 1, /obj/item/stack/rods = 1, /obj/item/reagent_containers/food/snacks/grown/potato = 1, /obj/item/aicard = 1 )
- result = /obj/item/aicard/potato
- category = CAT_ROBOT
-
-/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
- name = "Pneumatic Cannon"
- result = /obj/item/pneumatic_cannon/ghetto
- tools = list(TOOL_WELDER, TOOL_WRENCH)
- reqs = list(/obj/item/stack/sheet/metal = 4,
- /obj/item/stack/packageWrap = 8,
- /obj/item/pipe = 2)
- time = 300
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/flamethrower
- name = "Flamethrower"
- result = /obj/item/flamethrower
- reqs = list(/obj/item/weldingtool = 1,
- /obj/item/assembly/igniter = 1,
- /obj/item/stack/rods = 1)
- parts = list(/obj/item/assembly/igniter = 1,
- /obj/item/weldingtool = 1)
- tools = list(TOOL_SCREWDRIVER)
- time = 10
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/meteorslug
- name = "Meteorslug Shell"
- result = /obj/item/ammo_casing/shotgun/meteorslug
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/rcd_ammo = 1,
- /obj/item/stock_parts/manipulator = 2)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/pulseslug
- name = "Pulse Slug Shell"
- result = /obj/item/ammo_casing/shotgun/pulseslug
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/capacitor/adv = 2,
- /obj/item/stock_parts/micro_laser/ultra = 1)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/dragonsbreath
- name = "Dragonsbreath Shell"
- result = /obj/item/ammo_casing/shotgun/dragonsbreath
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/frag12
- name = "FRAG-12 Shell"
- result = /obj/item/ammo_casing/shotgun/frag12
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /datum/reagent/glycerol = 5,
- /datum/reagent/toxin/acid = 5,
- /datum/reagent/toxin/acid/fluacid = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/ionslug
- name = "Ion Scatter Shell"
- result = /obj/item/ammo_casing/shotgun/ion
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/micro_laser/ultra = 1,
- /obj/item/stock_parts/subspace/crystal = 1)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/improvisedslug
- name = "Improvised Shotgun Shell"
- result = /obj/item/ammo_casing/shotgun/improvised
- reqs = list(/obj/item/grenade/chem_grenade = 1,
- /obj/item/stack/sheet/metal = 1,
- /obj/item/stack/cable_coil = 1,
- /datum/reagent/fuel = 10)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/laserslug
- name = "Scatter Laser Shell"
- result = /obj/item/ammo_casing/shotgun/laserslug
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/capacitor/adv = 1,
- /obj/item/stock_parts/micro_laser/high = 1)
- tools = list(TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/ishotgun
- name = "Improvised Shotgun"
- result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised
- reqs = list(/obj/item/weaponcrafting/receiver = 1,
- /obj/item/pipe = 1,
- /obj/item/weaponcrafting/stock = 1,
- /obj/item/stack/packageWrap = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/irifle
- name = "Improvised Rifle(7.62mm)"
- result = /obj/item/gun/ballistic/shotgun/boltaction/improvised
- reqs = list(/obj/item/weaponcrafting/receiver = 1,
- /obj/item/pipe = 2,
- /obj/item/weaponcrafting/stock = 1,
- /obj/item/stack/packageWrap = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/chainsaw
- name = "Chainsaw"
- result = /obj/item/twohanded/required/chainsaw
- reqs = list(/obj/item/circular_saw = 1,
- /obj/item/stack/cable_coil = 3,
- /obj/item/stack/sheet/plasteel = 5)
- tools = list(TOOL_WELDER)
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/spear
- name = "Spear"
- result = /obj/item/twohanded/spear
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/shard = 1,
- /obj/item/stack/rods = 1)
- parts = list(/obj/item/shard = 1)
- time = 40
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/spooky_camera
- name = "Camera Obscura"
- result = /obj/item/camera/spooky
- time = 15
- reqs = list(/obj/item/camera = 1,
- /datum/reagent/water/holywater = 10)
- parts = list(/obj/item/camera = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/skateboard
- name = "Skateboard"
- result = /obj/vehicle/ridden/scooter/skateboard
- time = 60
- reqs = list(/obj/item/stack/sheet/metal = 5,
- /obj/item/stack/rods = 10)
- category = CAT_MISC
-
-/datum/crafting_recipe/scooter
- name = "Scooter"
- result = /obj/vehicle/ridden/scooter
- time = 65
- reqs = list(/obj/item/stack/sheet/metal = 5,
- /obj/item/stack/rods = 12)
- category = CAT_MISC
-
-/datum/crafting_recipe/mousetrap
- name = "Mouse Trap"
- result = /obj/item/assembly/mousetrap
- time = 10
- reqs = list(/obj/item/stack/sheet/cardboard = 1,
- /obj/item/stack/rods = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/papersack
- name = "Paper Sack"
- result = /obj/item/storage/box/papersack
- time = 10
- reqs = list(/obj/item/paper = 5)
- category = CAT_MISC
-
-/datum/crafting_recipe/flashlight_eyes
- name = "Flashlight Eyes"
- result = /obj/item/organ/eyes/robotic/flashlight
- time = 10
- reqs = list(
- /obj/item/flashlight = 2,
- /obj/item/restraints/handcuffs/cable = 1
- )
- category = CAT_MISC
-
-/datum/crafting_recipe/paperframes
- name = "Paper Frames"
- result = /obj/item/stack/sheet/paperframes/five
- time = 10
- reqs = list(/obj/item/stack/sheet/mineral/wood = 5, /obj/item/paper = 20)
- category = CAT_MISC
-
-/datum/crafting_recipe/naturalpaper
- name = "Hand-Pressed Paper"
- time = 30
- reqs = list(/datum/reagent/water = 50, /obj/item/stack/sheet/mineral/wood = 1)
- tools = list(/obj/item/hatchet)
- result = /obj/item/paper_bin/bundlenatural
- category = CAT_MISC
-
-/datum/crafting_recipe/toysword
- name = "Toy Sword"
- reqs = list(/obj/item/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
- result = /obj/item/toy/sword
- category = CAT_MISC
-
-/datum/crafting_recipe/blackcarpet
- name = "Black Carpet"
- reqs = list(/obj/item/stack/tile/carpet = 50, /obj/item/toy/crayon/black = 1)
- result = /obj/item/stack/tile/carpet/black/fifty
- category = CAT_MISC
-
-/datum/crafting_recipe/showercurtain
- name = "Shower Curtains"
- reqs = list(/obj/item/stack/sheet/cloth = 2, /obj/item/stack/sheet/plastic = 2, /obj/item/stack/rods = 1)
- result = /obj/structure/curtain
- category = CAT_MISC
-
-/datum/crafting_recipe/extendohand
- name = "Extendo-Hand"
- reqs = list(/obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1)
- result = /obj/item/extendohand
- category = CAT_MISC
-
-/datum/crafting_recipe/bluespacehonker
- name = "Bluespace Bike horn"
- result = /obj/item/bikehorn/bluespacehonker
- time = 10
- reqs = list(/obj/item/stack/ore/bluespace_crystal = 1,
- /obj/item/toy/crayon/blue = 1,
- /obj/item/bikehorn = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/toyneb
- name = "Non-Euplastic Blade"
- reqs = list(/obj/item/light/tube = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
- result = /obj/item/toy/sword/cx
- category = CAT_MISC
-
-/datum/crafting_recipe/chemical_payload
- name = "Chemical Payload (C4)"
- result = /obj/item/bombcore/chemical
- reqs = list(
- /obj/item/stock_parts/matter_bin = 1,
- /obj/item/grenade/plastic/c4 = 1,
- /obj/item/grenade/chem_grenade = 2
- )
- parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
- time = 30
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/chemical_payload2
- name = "Chemical Payload (Gibtonite)"
- result = /obj/item/bombcore/chemical
- reqs = list(
- /obj/item/stock_parts/matter_bin = 1,
- /obj/item/twohanded/required/gibtonite = 1,
- /obj/item/grenade/chem_grenade = 2
- )
- parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/bonearmor
- name = "Bone Armor"
- result = /obj/item/clothing/suit/armor/bone
- time = 30
- reqs = list(/obj/item/stack/sheet/bone = 6)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonetalisman
- name = "Bone Talisman"
- result = /obj/item/clothing/accessory/talisman
- time = 20
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/stack/sheet/sinew = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonecodpiece
- name = "Skull Codpiece"
- result = /obj/item/clothing/accessory/skullcodpiece
- time = 20
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bracers
- name = "Bone Bracers"
- result = /obj/item/clothing/gloves/bracer
- time = 20
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/stack/sheet/sinew = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/skullhelm
- name = "Skull Helmet"
- result = /obj/item/clothing/head/helmet/skull
- time = 30
- reqs = list(/obj/item/stack/sheet/bone = 4)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/goliathcloak
- name = "Goliath Cloak"
- result = /obj/item/clothing/suit/hooded/cloak/goliath
- time = 50
- reqs = list(/obj/item/stack/sheet/leather = 2,
- /obj/item/stack/sheet/sinew = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/drakecloak
- name = "Ash Drake Armour"
- result = /obj/item/clothing/suit/hooded/cloak/drake
- time = 60
- reqs = list(/obj/item/stack/sheet/bone = 10,
- /obj/item/stack/sheet/sinew = 2,
- /obj/item/stack/sheet/animalhide/ashdrake = 5)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonebag
- name = "Bone Satchel"
- result = /obj/item/storage/backpack/satchel/bone
- time = 30
- reqs = list(/obj/item/stack/sheet/bone = 3,
- /obj/item/stack/sheet/sinew = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/gold_horn
- name = "Golden Bike Horn"
- result = /obj/item/bikehorn/golden
- time = 20
- reqs = list(/obj/item/stack/sheet/mineral/bananium = 5,
- /obj/item/bikehorn = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/bonedagger
- name = "Bone Dagger"
- result = /obj/item/kitchen/knife/combat/bone
- time = 20
- reqs = list(/obj/item/stack/sheet/bone = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonespear
- name = "Bone Spear"
- result = /obj/item/twohanded/bonespear
- time = 30
- reqs = list(/obj/item/stack/sheet/bone = 4,
- /obj/item/stack/sheet/sinew = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/boneaxe
- name = "Bone Axe"
- result = /obj/item/twohanded/fireaxe/boneaxe
- time = 50
- reqs = list(/obj/item/stack/sheet/bone = 6,
- /obj/item/stack/sheet/sinew = 3)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonfire
- name = "Bonfire"
- time = 60
- reqs = list(/obj/item/grown/log = 5)
- result = /obj/structure/bonfire
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/headpike
- name = "Spike Head (Glass Spear)"
- time = 65
- reqs = list(/obj/item/twohanded/spear = 1,
- /obj/item/bodypart/head = 1)
- parts = list(/obj/item/bodypart/head = 1,
- /obj/item/twohanded/spear = 1)
- result = /obj/structure/headpike
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/headpikebone
- name = "Spike Head (Bone Spear)"
- time = 65
- reqs = list(/obj/item/twohanded/bonespear = 1,
- /obj/item/bodypart/head = 1)
- parts = list(/obj/item/bodypart/head = 1,
- /obj/item/twohanded/bonespear = 1)
- result = /obj/structure/headpike/bone
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/smallcarton
- name = "Small Carton"
- result = /obj/item/reagent_containers/food/drinks/sillycup/smallcarton
- time = 10
- reqs = list(/obj/item/stack/sheet/cardboard = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/pressureplate
- name = "Pressure Plate"
- result = /obj/item/pressure_plate
- time = 5
- reqs = list(/obj/item/stack/sheet/metal = 1,
- /obj/item/stack/tile/plasteel = 1,
- /obj/item/stack/cable_coil = 2,
- /obj/item/assembly/igniter = 1)
- category = CAT_MISC
-
-
-/datum/crafting_recipe/wheelchair
- name = "Wheelchair"
- result = /obj/vehicle/ridden/wheelchair
- reqs = list(/obj/item/stack/sheet/plasteel = 2,
- /obj/item/stack/rods = 8)
- time = 100
- category = CAT_MISC
-
-/datum/crafting_recipe/rcl
- name = "Makeshift Rapid Cable Layer"
- result = /obj/item/twohanded/rcl/ghetto
- time = 40
- tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH)
- reqs = list(/obj/item/stack/sheet/metal = 15)
- category = CAT_MISC
-
-/datum/crafting_recipe/mummy
- name = "Mummification Bandages (Mask)"
- result = /obj/item/clothing/mask/mummy
- time = 10
- tools = list(/obj/item/nullrod/egyptian)
- reqs = list(/obj/item/stack/sheet/cloth = 2)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/mummy/body
- name = "Mummification Bandages (Body)"
- result = /obj/item/clothing/under/mummy
- reqs = list(/obj/item/stack/sheet/cloth = 5)
-
-/datum/crafting_recipe/guillotine
- name = "Guillotine"
- result = /obj/structure/guillotine
- time = 150 // Building a functioning guillotine takes time
- reqs = list(/obj/item/stack/sheet/plasteel = 3,
- /obj/item/stack/sheet/mineral/wood = 20,
- /obj/item/stack/cable_coil = 10)
- tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
- category = CAT_MISC
-
-/datum/crafting_recipe/femur_breaker
- name = "Femur Breaker"
- result = /obj/structure/femur_breaker
- time = 150
- reqs = list(/obj/item/stack/sheet/metal = 20,
- /obj/item/stack/cable_coil = 30)
- tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
- category = CAT_MISC
-
-/datum/crafting_recipe/lizardhat
- name = "Lizard Cloche Hat"
- result = /obj/item/clothing/head/lizard
- time = 10
- reqs = list(/obj/item/organ/tail/lizard = 1)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/lizardhat_alternate
- name = "Lizard Cloche Hat"
- result = /obj/item/clothing/head/lizard
- time = 10
- reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/kittyears
- name = "Kitty Ears"
- result = /obj/item/clothing/head/kitty/genuine
- time = 10
- reqs = list(/obj/item/organ/tail/cat = 1,
- /obj/item/organ/ears/cat = 1)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/hudsunsec
- name = "Security HUDsunglasses"
- result = /obj/item/clothing/glasses/hud/security/sunglasses
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/hud/security = 1,
- /obj/item/clothing/glasses/sunglasses = 1,
- /obj/item/stack/cable_coil = 5)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/hudsunsecremoval
- name = "Security HUD removal"
- result = /obj/item/clothing/glasses/sunglasses
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/hudsunmed
- name = "Medical HUDsunglasses"
- result = /obj/item/clothing/glasses/hud/health/sunglasses
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/hud/health = 1,
- /obj/item/clothing/glasses/sunglasses = 1,
- /obj/item/stack/cable_coil = 5)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/hudsunmedremoval
- name = "Medical HUD removal"
- result = /obj/item/clothing/glasses/sunglasses
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/hud/health/sunglasses = 1)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/beergoggles
- name = "Beer Goggles"
- result = /obj/item/clothing/glasses/sunglasses/reagent
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/science = 1,
- /obj/item/clothing/glasses/sunglasses = 1,
- /obj/item/stack/cable_coil = 5)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/beergogglesremoval
- name = "Beer Goggles removal"
- result = /obj/item/clothing/glasses/sunglasses
- time = 20
- tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- reqs = list(/obj/item/clothing/glasses/sunglasses/reagent = 1)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/ghostsheet
- name = "Ghost Sheet"
- result = /obj/item/clothing/suit/ghost_sheet
- time = 5
- tools = list(TOOL_WIRECUTTER)
- reqs = list(/obj/item/bedsheet = 1)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/briefcase
- name = "Hand made Briefcase"
- result = /obj/item/storage/briefcase/crafted
- time = 35
- tools = list(TOOL_WIRECUTTER)
- reqs = list(/obj/item/stack/sheet/cardboard = 1,
- /obj/item/stack/sheet/cloth = 2,
- /obj/item/stack/sheet/leather = 5)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/aitater
- name = "intelliTater"
- result = /obj/item/aicard/aitater
- time = 30
- reqs = list(/obj/item/aicard = 1,
- /obj/item/reagent_containers/food/snacks/grown/potato = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/paperwork
- name = "Filed Paper Work"
- result = /obj/item/folder/paperwork_correct
- time = 60 //Takes time for people to file and complete paper work!
- reqs = list(/obj/item/pen = 1,
- /obj/item/folder/paperwork = 2)
- category = CAT_MISC
-
-/datum/crafting_recipe/ghettojetpack
- name = "Improvised Jetpack"
- result = /obj/item/tank/jetpack/improvised
- time = 30
- reqs = list(/obj/item/tank/internals/oxygen = 2,
- /obj/item/extinguisher = 1,
- /obj/item/pipe = 3,
- /obj/item/stack/cable_coil = 30)
- category = CAT_MISC
- tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER)
-
-/datum/crafting_recipe/goldenbox
- name = "Gold Plated Toolbox"
- result = /obj/item/storage/toolbox/gold_fake
- reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting
- /obj/item/stack/cable_coil = 10,
- /obj/item/stack/sheet/mineral/gold = 1,
- /obj/item/stock_parts/cell = 1,
- /datum/reagent/water = 15)
- time = 40
- category = CAT_MISC
-
-/datum/crafting_recipe/bronze_driver
- name = "Bronze Plated Screwdriver"
- result = /obj/item/screwdriver/bronze
- reqs = list(/obj/item/screwdriver = 1,
- /obj/item/stack/cable_coil = 10,
- /obj/item/stack/tile/bronze = 1,
- /datum/reagent/water = 15)
- time = 40
- category = CAT_MISC
-
-/datum/crafting_recipe/bronze_welder
- name = "Bronze Plated Welding Tool"
- result = /obj/item/weldingtool/bronze
- reqs = list(/obj/item/weldingtool = 1,
- /obj/item/stack/cable_coil = 10,
- /obj/item/stack/tile/bronze = 1,
- /datum/reagent/water = 15)
- time = 40
- category = CAT_MISC
-
-/datum/crafting_recipe/bronze_wirecutters
- name = "Bronze Plated Wirecutters"
- result = /obj/item/wirecutters/bronze
- reqs = list(/obj/item/wirecutters = 1,
- /obj/item/stack/cable_coil = 10,
- /obj/item/stack/tile/bronze = 1,
- /datum/reagent/water = 15)
- time = 40
- category = CAT_MISC
-
-/datum/crafting_recipe/bronze_crowbar
- name = "Bronze Plated Crowbar"
- result = /obj/item/crowbar/bronze
- reqs = list(/obj/item/crowbar = 1,
- /obj/item/stack/cable_coil = 10,
- /obj/item/stack/tile/bronze = 1,
- /datum/reagent/water = 15)
- time = 40
- category = CAT_MISC
-
-/datum/crafting_recipe/bronze_wrench
- name = "Bronze Plated Wrench"
- result = /obj/item/wrench/bronze
- reqs = list(/obj/item/wrench = 1,
- /obj/item/stack/cable_coil = 10,
- /obj/item/stack/tile/bronze = 1,
- /datum/reagent/water = 15)
- time = 40
- category = CAT_MISC
-
-/datum/crafting_recipe/smartdart
- name = "Medical smartdart"
- result = /obj/item/reagent_containers/syringe/dart
- reqs = list(/obj/item/stack/sheet/metal = 1,
- /obj/item/stack/sheet/glass = 1,
- /obj/item/stack/sheet/plastic = 1)
- time = 10
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/medolier
- name = "Medolier"
- result = /obj/item/storage/belt/medolier
- reqs = list(/obj/item/stack/sheet/metal = 2,
- /obj/item/stack/sheet/cloth = 3,
- /obj/item/stack/sheet/plastic = 4)
- time = 30
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/smartdartgun
- name = "Smart dartgun"
- result = /obj/item/gun/syringe/dart
- reqs = list(/obj/item/stack/sheet/metal = 10,
- /obj/item/stack/sheet/glass = 5,
- /obj/item/tank/internals = 1,
- /obj/item/reagent_containers/glass/beaker = 1,
- /obj/item/stack/sheet/plastic = 5,
- /obj/item/stack/cable_coil = 1)
- time = 150 //It's a gun
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/rapiddartgun
- name = "Rapid Smart dartgun"
- result = /obj/item/gun/syringe/dart/rapiddart
- reqs = list(
- /obj/item/gun/syringe/dart = 1,
- /obj/item/stack/sheet/plastic = 5,
- /obj/item/stack/cable_coil = 1,
- /obj/item/reagent_containers/glass/beaker = 1
- )
- parts = list(/obj/item/reagent_containers/glass/beaker = 1)
- time = 120 //Modifying your gun
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/durathread_duffelbag
- name = "Durathread Dufflebag"
- result = /obj/item/storage/backpack/duffelbag/durathread
- reqs = list(/obj/item/stack/sheet/durathread = 7,
- /obj/item/stack/sheet/leather = 3)
- time = 70
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/durathread_toolbelt
- name = "Durathread Toolbelt"
- result = /obj/item/storage/belt/durathread
- reqs = list(/obj/item/stack/sheet/durathread = 5,
- /obj/item/stack/sheet/leather = 1)
- time = 30
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/durathread_bandolier
- name = "Durathread Bandolier"
- result = /obj/item/storage/belt/bandolier/durathread
- reqs = list(/obj/item/stack/sheet/durathread = 6,
- /obj/item/stack/sheet/leather = 2)
- time = 50
- category = CAT_CLOTHING
-
- /datum/crafting_recipe/durathread_helmet
- name = "Makeshift Durathread Helmet"
- result = /obj/item/clothing/head/helmet/durathread
- reqs = list(/obj/item/stack/sheet/durathread = 4,
- /obj/item/stack/sheet/leather = 2)
- time = 30
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/durathread_vest
- name = "Makeshift Durathread Armour"
- result = /obj/item/clothing/suit/armor/vest/durathread
- reqs = list(/obj/item/stack/sheet/durathread = 6,
- /obj/item/stack/sheet/leather = 3)
- time = 50
- category = CAT_CLOTHING
+ var/always_availible = TRUE //Set to FALSE if it needs to be learned first.
\ No newline at end of file
diff --git a/code/modules/crafting/recipes/recipes_clothing.dm b/code/modules/crafting/recipes/recipes_clothing.dm
new file mode 100644
index 0000000000..f48ee87316
--- /dev/null
+++ b/code/modules/crafting/recipes/recipes_clothing.dm
@@ -0,0 +1,160 @@
+/datum/crafting_recipe/mummy
+ name = "Mummification Bandages (Mask)"
+ result = /obj/item/clothing/mask/mummy
+ time = 10
+ tools = list(/obj/item/nullrod/egyptian)
+ reqs = list(/obj/item/stack/sheet/cloth = 2)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/mummy/body
+ name = "Mummification Bandages (Body)"
+ result = /obj/item/clothing/under/mummy
+ reqs = list(/obj/item/stack/sheet/cloth = 5)
+
+/datum/crafting_recipe/lizardhat
+ name = "Lizard Cloche Hat"
+ result = /obj/item/clothing/head/lizard
+ time = 10
+ reqs = list(/obj/item/organ/tail/lizard = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/lizardhat_alternate
+ name = "Lizard Cloche Hat"
+ result = /obj/item/clothing/head/lizard
+ time = 10
+ reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/kittyears
+ name = "Kitty Ears"
+ result = /obj/item/clothing/head/kitty/genuine
+ time = 10
+ reqs = list(/obj/item/organ/tail/cat = 1,
+ /obj/item/organ/ears/cat = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/hudsunsec
+ name = "Security HUDsunglasses"
+ result = /obj/item/clothing/glasses/hud/security/sunglasses
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ reqs = list(/obj/item/clothing/glasses/hud/security = 1,
+ /obj/item/clothing/glasses/sunglasses = 1,
+ /obj/item/stack/cable_coil = 5)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/hudsunsecremoval
+ name = "Security HUD removal"
+ result = /obj/item/clothing/glasses/sunglasses
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/hudsunmed
+ name = "Medical HUDsunglasses"
+ result = /obj/item/clothing/glasses/hud/health/sunglasses
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ reqs = list(/obj/item/clothing/glasses/hud/health = 1,
+ /obj/item/clothing/glasses/sunglasses = 1,
+ /obj/item/stack/cable_coil = 5)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/hudsunmedremoval
+ name = "Medical HUD removal"
+ result = /obj/item/clothing/glasses/sunglasses
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ reqs = list(/obj/item/clothing/glasses/hud/health/sunglasses = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/beergoggles
+ name = "Beer Goggles"
+ result = /obj/item/clothing/glasses/sunglasses/reagent
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ reqs = list(/obj/item/clothing/glasses/science = 1,
+ /obj/item/clothing/glasses/sunglasses = 1,
+ /obj/item/stack/cable_coil = 5)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/beergogglesremoval
+ name = "Beer Goggles removal"
+ result = /obj/item/clothing/glasses/sunglasses
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ reqs = list(/obj/item/clothing/glasses/sunglasses/reagent = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/ghostsheet
+ name = "Ghost Sheet"
+ result = /obj/item/clothing/suit/ghost_sheet
+ time = 5
+ tools = list(TOOL_WIRECUTTER)
+ reqs = list(/obj/item/bedsheet = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/briefcase
+ name = "Hand made Briefcase"
+ result = /obj/item/storage/briefcase/crafted
+ time = 35
+ tools = list(TOOL_WIRECUTTER)
+ reqs = list(/obj/item/stack/sheet/cardboard = 1,
+ /obj/item/stack/sheet/cloth = 2,
+ /obj/item/stack/sheet/leather = 5)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/medolier
+ name = "Medolier"
+ result = /obj/item/storage/belt/medolier
+ reqs = list(/obj/item/stack/sheet/metal = 2,
+ /obj/item/stack/sheet/cloth = 3,
+ /obj/item/stack/sheet/plastic = 4)
+ time = 30
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/durathread_duffelbag
+ name = "Durathread Dufflebag"
+ result = /obj/item/storage/backpack/duffelbag/durathread
+ reqs = list(/obj/item/stack/sheet/durathread = 7,
+ /obj/item/stack/sheet/leather = 3)
+ time = 70
+ always_availible = TRUE
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/durathread_toolbelt
+ name = "Durathread Toolbelt"
+ result = /obj/item/storage/belt/durathread
+ reqs = list(/obj/item/stack/sheet/durathread = 5,
+ /obj/item/stack/sheet/leather = 2)
+ time = 30
+ always_availible = TRUE
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/durathread_bandolier
+ name = "Durathread Bandolier"
+ result = /obj/item/storage/belt/bandolier/durathread
+ reqs = list(/obj/item/stack/sheet/durathread = 6,
+ /obj/item/stack/sheet/leather = 2)
+ time = 50
+ always_availible = TRUE
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/durathread_helmet
+ name = "Makeshift Durathread Helmet"
+ result = /obj/item/clothing/head/helmet/durathread
+ reqs = list(/obj/item/stack/sheet/durathread = 4,
+ /obj/item/stack/sheet/leather = 2)
+ time = 30
+ always_availible = TRUE
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/durathread_vest
+ name = "Makeshift Durathread Armour"
+ result = /obj/item/clothing/suit/armor/vest/durathread
+ reqs = list(/obj/item/stack/sheet/durathread = 6,
+ /obj/item/stack/sheet/leather = 3)
+ time = 50
+ always_availible = TRUE
+ category = CAT_CLOTHING
diff --git a/code/modules/crafting/recipes/recipes_misc.dm b/code/modules/crafting/recipes/recipes_misc.dm
new file mode 100644
index 0000000000..f05c7bd94b
--- /dev/null
+++ b/code/modules/crafting/recipes/recipes_misc.dm
@@ -0,0 +1,325 @@
+/////////////////
+//Large Objects//
+/////////////////
+
+/datum/crafting_recipe/showercurtain
+ name = "Shower Curtains"
+ reqs = list(/obj/item/stack/sheet/cloth = 2,
+ /obj/item/stack/sheet/plastic = 2,
+ /obj/item/stack/rods = 1)
+ result = /obj/structure/curtain
+ category = CAT_MISC
+
+/datum/crafting_recipe/guillotine
+ name = "Guillotine"
+ result = /obj/structure/guillotine
+ time = 150 // Building a functioning guillotine takes time
+ reqs = list(/obj/item/stack/sheet/plasteel = 3,
+ /obj/item/stack/sheet/mineral/wood = 20,
+ /obj/item/stack/cable_coil = 10)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
+ category = CAT_MISC
+
+/datum/crafting_recipe/femur_breaker
+ name = "Femur Breaker"
+ result = /obj/structure/femur_breaker
+ time = 150
+ reqs = list(/obj/item/stack/sheet/metal = 20,
+ /obj/item/stack/cable_coil = 30)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
+ category = CAT_MISC
+
+///////////////////
+//Tools & Storage//
+///////////////////
+
+/datum/crafting_recipe/ghettojetpack
+ name = "Improvised Jetpack"
+ result = /obj/item/tank/jetpack/improvised
+ time = 30
+ reqs = list(/obj/item/tank/internals/oxygen = 2,
+ /obj/item/extinguisher = 1,
+ /obj/item/pipe = 3,
+ /obj/item/stack/cable_coil = 30)
+ category = CAT_MISC
+ tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER)
+
+/datum/crafting_recipe/goldenbox
+ name = "Gold Plated Toolbox"
+ result = /obj/item/storage/toolbox/gold_fake
+ reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/sheet/mineral/gold = 1,
+ /obj/item/stock_parts/cell = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
+
+/datum/crafting_recipe/bronze_driver
+ name = "Bronze Plated Screwdriver"
+ result = /obj/item/screwdriver/bronze
+ reqs = list(/obj/item/screwdriver = 1,
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/tile/bronze = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
+
+/datum/crafting_recipe/bronze_welder
+ name = "Bronze Plated Welding Tool"
+ result = /obj/item/weldingtool/bronze
+ reqs = list(/obj/item/weldingtool = 1,
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/tile/bronze = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
+
+/datum/crafting_recipe/bronze_wirecutters
+ name = "Bronze Plated Wirecutters"
+ result = /obj/item/wirecutters/bronze
+ reqs = list(/obj/item/wirecutters = 1,
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/tile/bronze = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
+
+/datum/crafting_recipe/bronze_crowbar
+ name = "Bronze Plated Crowbar"
+ result = /obj/item/crowbar/bronze
+ reqs = list(/obj/item/crowbar = 1,
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/tile/bronze = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
+
+/datum/crafting_recipe/bronze_wrench
+ name = "Bronze Plated Wrench"
+ result = /obj/item/wrench/bronze
+ reqs = list(/obj/item/wrench = 1,
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/tile/bronze = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
+
+/datum/crafting_recipe/rcl
+ name = "Makeshift Rapid Cable Layer"
+ result = /obj/item/twohanded/rcl/ghetto
+ time = 40
+ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH)
+ reqs = list(/obj/item/stack/sheet/metal = 15)
+ category = CAT_MISC
+
+////////////
+//Vehicles//
+////////////
+
+/datum/crafting_recipe/wheelchair
+ name = "Wheelchair"
+ result = /obj/vehicle/ridden/wheelchair
+ reqs = list(/obj/item/stack/sheet/plasteel = 2,
+ /obj/item/stack/rods = 8)
+ time = 100
+ category = CAT_MISC
+
+/datum/crafting_recipe/skateboard
+ name = "Skateboard"
+ result = /obj/vehicle/ridden/scooter/skateboard
+ time = 60
+ reqs = list(/obj/item/stack/sheet/metal = 5,
+ /obj/item/stack/rods = 10)
+ category = CAT_MISC
+
+/datum/crafting_recipe/scooter
+ name = "Scooter"
+ result = /obj/vehicle/ridden/scooter
+ time = 65
+ reqs = list(/obj/item/stack/sheet/metal = 5,
+ /obj/item/stack/rods = 12)
+ category = CAT_MISC
+
+/////////
+//Toys///
+/////////
+
+/datum/crafting_recipe/toysword
+ name = "Toy Sword"
+ reqs = list(/obj/item/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
+ result = /obj/item/toy/sword
+ category = CAT_MISC
+
+/datum/crafting_recipe/extendohand
+ name = "Extendo-Hand"
+ reqs = list(/obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1)
+ result = /obj/item/extendohand
+ category = CAT_MISC
+
+/datum/crafting_recipe/toyneb
+ name = "Non-Euplastic Blade"
+ reqs = list(/obj/item/light/tube = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
+ result = /obj/item/toy/sword/cx
+ category = CAT_MISC
+
+////////////
+//Unsorted//
+////////////
+
+/datum/crafting_recipe/blackcarpet
+ name = "Black Carpet"
+ reqs = list(/obj/item/stack/tile/carpet = 50, /obj/item/toy/crayon/black = 1)
+ result = /obj/item/stack/tile/carpet/black/fifty
+ category = CAT_MISC
+
+/datum/crafting_recipe/paperframes
+ name = "Paper Frames"
+ result = /obj/item/stack/sheet/paperframes/five
+ time = 10
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 5, /obj/item/paper = 20)
+ category = CAT_MISC
+
+/datum/crafting_recipe/naturalpaper
+ name = "Hand-Pressed Paper"
+ time = 30
+ reqs = list(/datum/reagent/water = 50, /obj/item/stack/sheet/mineral/wood = 1)
+ tools = list(/obj/item/hatchet)
+ result = /obj/item/paper_bin/bundlenatural
+ category = CAT_MISC
+
+/datum/crafting_recipe/bluespacehonker
+ name = "Bluespace Bike horn"
+ result = /obj/item/bikehorn/bluespacehonker
+ time = 10
+ reqs = list(/obj/item/stack/ore/bluespace_crystal = 1,
+ /obj/item/toy/crayon/blue = 1,
+ /obj/item/bikehorn = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/aitater
+ name = "intelliTater"
+ result = /obj/item/aicard/aitater
+ time = 30
+ reqs = list(/obj/item/aicard = 1,
+ /obj/item/reagent_containers/food/snacks/grown/potato = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/mousetrap
+ name = "Mouse Trap"
+ result = /obj/item/assembly/mousetrap
+ time = 10
+ reqs = list(/obj/item/stack/sheet/cardboard = 1,
+ /obj/item/stack/rods = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/papersack
+ name = "Paper Sack"
+ result = /obj/item/storage/box/papersack
+ time = 10
+ reqs = list(/obj/item/paper = 5)
+ category = CAT_MISC
+
+/datum/crafting_recipe/flashlight_eyes
+ name = "Flashlight Eyes"
+ result = /obj/item/organ/eyes/robotic/flashlight
+ time = 10
+ reqs = list(
+ /obj/item/flashlight = 2,
+ /obj/item/restraints/handcuffs/cable = 1
+ )
+ category = CAT_MISC
+
+/datum/crafting_recipe/smallcarton
+ name = "Small Carton"
+ result = /obj/item/reagent_containers/food/drinks/sillycup/smallcarton
+ time = 10
+ reqs = list(/obj/item/stack/sheet/cardboard = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/pressureplate
+ name = "Pressure Plate"
+ result = /obj/item/pressure_plate
+ time = 5
+ reqs = list(/obj/item/stack/sheet/metal = 1,
+ /obj/item/stack/tile/plasteel = 1,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/assembly/igniter = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/gold_horn
+ name = "Golden Bike Horn"
+ result = /obj/item/bikehorn/golden
+ time = 20
+ reqs = list(/obj/item/stack/sheet/mineral/bananium = 5,
+ /obj/item/bikehorn = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/spooky_camera
+ name = "Camera Obscura"
+ result = /obj/item/camera/spooky
+ time = 15
+ reqs = list(/obj/item/camera = 1,
+ /datum/reagent/water/holywater = 10)
+ parts = list(/obj/item/camera = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/paperwork
+ name = "Filed Paper Work"
+ result = /obj/item/folder/paperwork_correct
+ time = 10 //Takes time for people to file and complete paper work!
+ tools = list(/obj/item/pen)
+ reqs = list(/obj/item/folder/paperwork = 1)
+ category = CAT_MISC
+
+//////////////
+//Banners/////
+//////////////
+
+/datum/crafting_recipe/command_banner
+ name = "Command Banner"
+ result = /obj/item/banner/command/mundane
+ time = 40
+ reqs = list(/obj/item/stack/rods = 2,
+ /obj/item/clothing/under/captainparade = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/engineering_banner
+ name = "Engitopia Banner"
+ result = /obj/item/banner/engineering/mundane
+ time = 40
+ reqs = list(/obj/item/stack/rods = 2,
+ /obj/item/clothing/under/rank/engineer = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/cargo_banner
+ name = "Cargonia Banner"
+ result = /obj/item/banner/cargo/mundane
+ time = 40
+ reqs = list(/obj/item/stack/rods = 2,
+ /obj/item/clothing/under/rank/cargotech = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/science_banner
+ name = "Sciencia Banner"
+ result = /obj/item/banner/science/mundane
+ time = 40
+ reqs = list(/obj/item/stack/rods = 2,
+ /obj/item/clothing/under/rank/scientist = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/medical_banner
+ name = "Meditopia Banner"
+ result = /obj/item/banner/medical/mundane
+ time = 40
+ reqs = list(/obj/item/stack/rods = 2,
+ /obj/item/clothing/under/rank/medical = 1)
+ category = CAT_MISC
+
+/datum/crafting_recipe/security_banner
+ name = "Securistan Banner"
+ result = /obj/item/banner/security/mundane
+ time = 40
+ reqs = list(/obj/item/stack/rods = 2,
+ /obj/item/clothing/under/rank/security = 1)
+ category = CAT_MISC
diff --git a/code/modules/crafting/recipes/recipes_primal.dm b/code/modules/crafting/recipes/recipes_primal.dm
new file mode 100644
index 0000000000..1be479e4e1
--- /dev/null
+++ b/code/modules/crafting/recipes/recipes_primal.dm
@@ -0,0 +1,113 @@
+/datum/crafting_recipe/bonearmor
+ name = "Bone Armor"
+ result = /obj/item/clothing/suit/armor/bone
+ time = 30
+ reqs = list(/obj/item/stack/sheet/bone = 6)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonetalisman
+ name = "Bone Talisman"
+ result = /obj/item/clothing/accessory/talisman
+ time = 20
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonecodpiece
+ name = "Skull Codpiece"
+ result = /obj/item/clothing/accessory/skullcodpiece
+ time = 20
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bracers
+ name = "Bone Bracers"
+ result = /obj/item/clothing/gloves/bracer
+ time = 20
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/skullhelm
+ name = "Skull Helmet"
+ result = /obj/item/clothing/head/helmet/skull
+ time = 30
+ reqs = list(/obj/item/stack/sheet/bone = 4)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/goliathcloak
+ name = "Goliath Cloak"
+ result = /obj/item/clothing/suit/hooded/cloak/goliath
+ time = 50
+ reqs = list(/obj/item/stack/sheet/leather = 2,
+ /obj/item/stack/sheet/sinew = 2,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/drakecloak
+ name = "Ash Drake Armour"
+ result = /obj/item/clothing/suit/hooded/cloak/drake
+ time = 60
+ reqs = list(/obj/item/stack/sheet/bone = 10,
+ /obj/item/stack/sheet/sinew = 2,
+ /obj/item/stack/sheet/animalhide/ashdrake = 5)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonebag
+ name = "Bone Satchel"
+ result = /obj/item/storage/backpack/satchel/bone
+ time = 30
+ reqs = list(/obj/item/stack/sheet/bone = 3,
+ /obj/item/stack/sheet/sinew = 2)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonedagger
+ name = "Bone Dagger"
+ result = /obj/item/kitchen/knife/combat/bone
+ time = 20
+ reqs = list(/obj/item/stack/sheet/bone = 2)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonespear
+ name = "Bone Spear"
+ result = /obj/item/twohanded/bonespear
+ time = 30
+ reqs = list(/obj/item/stack/sheet/bone = 4,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/boneaxe
+ name = "Bone Axe"
+ result = /obj/item/twohanded/fireaxe/boneaxe
+ time = 50
+ reqs = list(/obj/item/stack/sheet/bone = 6,
+ /obj/item/stack/sheet/sinew = 3)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonfire
+ name = "Bonfire"
+ time = 60
+ reqs = list(/obj/item/grown/log = 5)
+ result = /obj/structure/bonfire
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/headpike
+ name = "Spike Head (Glass Spear)"
+ time = 65
+ reqs = list(/obj/item/twohanded/spear = 1,
+ /obj/item/bodypart/head = 1)
+ parts = list(/obj/item/bodypart/head = 1,
+ /obj/item/twohanded/spear = 1)
+ result = /obj/structure/headpike
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/headpikebone
+ name = "Spike Head (Bone Spear)"
+ time = 65
+ reqs = list(/obj/item/twohanded/bonespear = 1,
+ /obj/item/bodypart/head = 1)
+ parts = list(/obj/item/bodypart/head = 1,
+ /obj/item/twohanded/bonespear = 1)
+ result = /obj/structure/headpike/bone
+ category = CAT_PRIMAL
\ No newline at end of file
diff --git a/code/modules/crafting/recipes/recipes_robot.dm b/code/modules/crafting/recipes/recipes_robot.dm
new file mode 100644
index 0000000000..ae5bca7779
--- /dev/null
+++ b/code/modules/crafting/recipes/recipes_robot.dm
@@ -0,0 +1,84 @@
+
+/datum/crafting_recipe/ed209
+ name = "ED209"
+ result = /mob/living/simple_animal/bot/ed209
+ reqs = list(/obj/item/robot_suit = 1,
+ /obj/item/clothing/head/helmet = 1,
+ /obj/item/clothing/suit/armor/vest = 1,
+ /obj/item/bodypart/l_leg/robot = 1,
+ /obj/item/bodypart/r_leg/robot = 1,
+ /obj/item/stack/sheet/metal = 1,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/gun/energy/e_gun/advtaser = 1,
+ /obj/item/stock_parts/cell = 1,
+ /obj/item/assembly/prox_sensor = 1)
+ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER)
+ time = 60
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/secbot
+ name = "Secbot"
+ result = /mob/living/simple_animal/bot/secbot
+ reqs = list(/obj/item/assembly/signaler = 1,
+ /obj/item/clothing/head/helmet/sec = 1,
+ /obj/item/melee/baton = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/bodypart/r_arm/robot = 1)
+ tools = list(TOOL_WELDER)
+ time = 60
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/cleanbot
+ name = "Cleanbot"
+ result = /mob/living/simple_animal/bot/cleanbot
+ reqs = list(/obj/item/reagent_containers/glass/bucket = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/bodypart/r_arm/robot = 1)
+ time = 40
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/floorbot
+ name = "Floorbot"
+ result = /mob/living/simple_animal/bot/floorbot
+ reqs = list(/obj/item/storage/toolbox/mechanical = 1,
+ /obj/item/stack/tile/plasteel = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/bodypart/r_arm/robot = 1)
+ time = 40
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/medbot
+ name = "Medbot"
+ result = /mob/living/simple_animal/bot/medbot
+ reqs = list(/obj/item/healthanalyzer = 1,
+ /obj/item/storage/firstaid = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/bodypart/r_arm/robot = 1)
+ time = 40
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/honkbot
+ name = "Honkbot"
+ result = /mob/living/simple_animal/bot/honkbot
+ reqs = list(/obj/item/storage/box/clown = 1,
+ /obj/item/bodypart/r_arm/robot = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/bikehorn/ = 1)
+ time = 40
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/Firebot
+ name = "Firebot"
+ result = /mob/living/simple_animal/bot/firebot
+ reqs = list(/obj/item/extinguisher = 1,
+ /obj/item/bodypart/r_arm/robot = 1,
+ /obj/item/assembly/prox_sensor = 1,
+ /obj/item/clothing/head/hardhat/red = 1)
+ time = 40
+ category = CAT_ROBOT
+
+/datum/crafting_recipe/potatos
+ name = "Potat-OS"
+ reqs = list(/obj/item/stack/cable_coil = 1, /obj/item/stack/rods = 1, /obj/item/reagent_containers/food/snacks/grown/potato = 1, /obj/item/aicard = 1 )
+ result = /obj/item/aicard/potato
+ category = CAT_ROBOT
\ No newline at end of file
diff --git a/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm b/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm
new file mode 100644
index 0000000000..6eb1c31b12
--- /dev/null
+++ b/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm
@@ -0,0 +1,345 @@
+/datum/crafting_recipe/pin_removal
+ name = "Pin Removal"
+ result = /obj/item/gun
+ reqs = list(/obj/item/gun = 1)
+ parts = list(/obj/item/gun = 1)
+ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ time = 50
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/strobeshield
+ name = "Strobe Shield"
+ result = /obj/item/assembly/flash/shield
+ reqs = list(/obj/item/wallframe/flasher = 1,
+ /obj/item/assembly/flash/handheld = 1,
+ /obj/item/shield/riot = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/makeshiftshield
+ name = "Makeshift Metal Shield"
+ result = /obj/item/shield/makeshift
+ reqs = list(/obj/item/stack/cable_coil = 30,
+ /obj/item/stack/sheet/metal = 10,
+ /obj/item/stack/sheet/cloth = 2,
+ /obj/item/stack/sheet/leather = 3)
+ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ time = 100
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/spear
+ name = "Spear"
+ result = /obj/item/twohanded/spear
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/shard = 1,
+ /obj/item/stack/rods = 1)
+ parts = list(/obj/item/shard = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/stunprod
+ name = "Stunprod"
+ result = /obj/item/melee/baton/cattleprod
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/stack/rods = 1,
+ /obj/item/assembly/igniter = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/teleprod
+ name = "Teleprod"
+ result = /obj/item/melee/baton/cattleprod/teleprod
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/stack/rods = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/stack/ore/bluespace_crystal = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/bola
+ name = "Bola"
+ result = /obj/item/restraints/legcuffs/bola
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/stack/sheet/metal = 6)
+ time = 20//15 faster than crafting them by hand!
+ category= CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/tailclub
+ name = "Tail Club"
+ result = /obj/item/tailclub
+ reqs = list(/obj/item/organ/tail/lizard = 1,
+ /obj/item/stack/sheet/metal = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/tailwhip
+ name = "Liz O' Nine Tails"
+ result = /obj/item/melee/chainofcommand/tailwhip
+ reqs = list(/obj/item/organ/tail/lizard = 1,
+ /obj/item/stack/cable_coil = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/catwhip
+ name = "Cat O' Nine Tails"
+ result = /obj/item/melee/chainofcommand/tailwhip/kitty
+ reqs = list(/obj/item/organ/tail/cat = 1,
+ /obj/item/stack/cable_coil = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/chainsaw
+ name = "Chainsaw"
+ result = /obj/item/twohanded/required/chainsaw
+ reqs = list(/obj/item/circular_saw = 1,
+ /obj/item/stack/cable_coil = 3,
+ /obj/item/stack/sheet/plasteel = 5)
+ tools = list(TOOL_WELDER)
+ time = 50
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+//////////////////
+///BOMB CRAFTING//
+//////////////////
+
+/datum/crafting_recipe/chemical_payload
+ name = "Chemical Payload (C4)"
+ result = /obj/item/bombcore/chemical
+ reqs = list(
+ /obj/item/stock_parts/matter_bin = 1,
+ /obj/item/grenade/plastic/c4 = 1,
+ /obj/item/grenade/chem_grenade = 2
+ )
+ parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
+ time = 30
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/chemical_payload2
+ name = "Chemical Payload (Gibtonite)"
+ result = /obj/item/bombcore/chemical
+ reqs = list(
+ /obj/item/stock_parts/matter_bin = 1,
+ /obj/item/twohanded/required/gibtonite = 1,
+ /obj/item/grenade/chem_grenade = 2
+ )
+ parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
+ time = 50
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/molotov
+ name = "Molotov"
+ result = /obj/item/reagent_containers/food/drinks/bottle/molotov
+ reqs = list(/obj/item/reagent_containers/rag = 1,
+ /obj/item/reagent_containers/food/drinks/bottle = 1)
+ parts = list(/obj/item/reagent_containers/food/drinks/bottle = 1)
+ time = 40
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/IED
+ name = "IED"
+ result = /obj/item/grenade/iedcasing
+ reqs = list(/datum/reagent/fuel = 50,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/reagent_containers/food/drinks/soda_cans = 1)
+ parts = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1)
+ time = 15
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/lance
+ name = "Explosive Lance (Grenade)"
+ result = /obj/item/twohanded/spear
+ reqs = list(/obj/item/twohanded/spear = 1,
+ /obj/item/grenade = 1)
+ parts = list(/obj/item/twohanded/spear = 1,
+ /obj/item/grenade = 1)
+ time = 15
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+//////////////////
+///GUNS CRAFTING//
+//////////////////
+
+
+/datum/crafting_recipe/smartdartgun
+ name = "Smart dartgun"
+ result = /obj/item/gun/syringe/dart
+ reqs = list(/obj/item/stack/sheet/metal = 10,
+ /obj/item/stack/sheet/glass = 5,
+ /obj/item/tank/internals = 1,
+ /obj/item/reagent_containers/glass/beaker = 1,
+ /obj/item/stack/sheet/plastic = 5,
+ /obj/item/stack/cable_coil = 1)
+ time = 150 //It's a gun
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/rapiddartgun
+ name = "Rapid Smart dartgun"
+ result = /obj/item/gun/syringe/dart/rapiddart
+ reqs = list(
+ /obj/item/gun/syringe/dart = 1,
+ /obj/item/stack/sheet/plastic = 5,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/reagent_containers/glass/beaker = 1
+ )
+ parts = list(/obj/item/reagent_containers/glass/beaker = 1)
+ time = 120 //Modifying your gun
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/improvised_pneumatic_cannon
+ name = "Pneumatic Cannon"
+ result = /obj/item/pneumatic_cannon/ghetto
+ tools = list(TOOL_WELDER, TOOL_WRENCH)
+ reqs = list(/obj/item/stack/sheet/metal = 4,
+ /obj/item/stack/packageWrap = 8,
+ /obj/item/pipe = 2)
+ time = 300
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/flamethrower //Gun*
+ name = "Flamethrower"
+ result = /obj/item/flamethrower
+ reqs = list(/obj/item/weldingtool = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/stack/rods = 1)
+ parts = list(/obj/item/assembly/igniter = 1,
+ /obj/item/weldingtool = 1)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 10
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/ishotgun
+ name = "Improvised Shotgun"
+ result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised
+ reqs = list(/obj/item/weaponcrafting/receiver = 1,
+ /obj/item/pipe = 1,
+ /obj/item/weaponcrafting/stock = 1,
+ /obj/item/stack/packageWrap = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 100
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/irifle
+ name = "Improvised Rifle(7.62mm)"
+ result = /obj/item/gun/ballistic/shotgun/boltaction/improvised
+ reqs = list(/obj/item/weaponcrafting/receiver = 1,
+ /obj/item/pipe = 2,
+ /obj/item/weaponcrafting/stock = 1,
+ /obj/item/stack/packageWrap = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 100
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+//////////////////
+///AMMO CRAFTING//
+//////////////////
+
+/datum/crafting_recipe/smartdart
+ name = "Medical smartdart"
+ result = /obj/item/reagent_containers/syringe/dart
+ reqs = list(/obj/item/stack/sheet/metal = 1,
+ /obj/item/stack/sheet/glass = 1,
+ /obj/item/stack/sheet/plastic = 1)
+ time = 10
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/meteorslug
+ name = "Meteorslug Shell"
+ result = /obj/item/ammo_casing/shotgun/meteorslug
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/rcd_ammo = 1,
+ /obj/item/stock_parts/manipulator = 2)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/pulseslug
+ name = "Pulse Slug Shell"
+ result = /obj/item/ammo_casing/shotgun/pulseslug
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/stock_parts/capacitor/adv = 2,
+ /obj/item/stock_parts/micro_laser/ultra = 1)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/dragonsbreath
+ name = "Dragonsbreath Shell"
+ result = /obj/item/ammo_casing/shotgun/dragonsbreath
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /datum/reagent/phosphorus = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/frag12
+ name = "FRAG-12 Shell"
+ result = /obj/item/ammo_casing/shotgun/frag12
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /datum/reagent/glycerol = 5,
+ /datum/reagent/toxin/acid = 5,
+ /datum/reagent/toxin/acid/fluacid = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/ionslug
+ name = "Ion Scatter Shell"
+ result = /obj/item/ammo_casing/shotgun/ion
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/stock_parts/micro_laser/ultra = 1,
+ /obj/item/stock_parts/subspace/crystal = 1)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/improvisedslug
+ name = "Improvised Shotgun Shell"
+ result = /obj/item/ammo_casing/shotgun/improvised
+ reqs = list(/obj/item/grenade/chem_grenade = 1,
+ /obj/item/stack/sheet/metal = 1,
+ /obj/item/stack/cable_coil = 1,
+ /datum/reagent/fuel = 10)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/laserslug
+ name = "Scatter Laser Shell"
+ result = /obj/item/ammo_casing/shotgun/laserslug
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/stock_parts/capacitor/adv = 1,
+ /obj/item/stock_parts/micro_laser/high = 1)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 5
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm
index c892bfeffc..1a2405b9c4 100644
--- a/code/modules/detectivework/detective_work.dm
+++ b/code/modules/detectivework/detective_work.dm
@@ -1,111 +1,107 @@
//CONTAINS: Suit fibers and Detective's Scanning Computer
-/atom/proc/return_fingerprints()
- GET_COMPONENT(D, /datum/component/forensics)
- if(D)
- . = D.fingerprints
+/atom/proc/add_fibers(mob/living/carbon/human/M)
+ if(M.gloves && istype(M.gloves, /obj/item/clothing/))
+ var/obj/item/clothing/gloves/G = M.gloves
+ if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects
+ if(add_blood_DNA(G.blood_DNA)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
+ G.transfer_blood--
+ else if(M.bloody_hands > 1)
+ if(add_blood_DNA(M.blood_DNA, M.diseases))
+ M.bloody_hands--
+ if(!suit_fibers)
+ suit_fibers = list()
+ var/fibertext
+ var/item_multiplier = isitem(src)?1.2:1
+ if(M.wear_suit)
+ fibertext = "Material from \a [M.wear_suit]."
+ if(prob(10*item_multiplier) && !(fibertext in suit_fibers))
+ suit_fibers += fibertext
+ if(!(M.wear_suit.body_parts_covered & CHEST))
+ if(M.w_uniform)
+ fibertext = "Fibers from \a [M.w_uniform]."
+ if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed.
+ suit_fibers += fibertext
+ if(!(M.wear_suit.body_parts_covered & HANDS))
+ if(M.gloves)
+ fibertext = "Material from a pair of [M.gloves.name]."
+ if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
+ suit_fibers += fibertext
+ else if(M.w_uniform)
+ fibertext = "Fibers from \a [M.w_uniform]."
+ if(prob(15*item_multiplier) && !(fibertext in suit_fibers))
+ // "Added fibertext: [fibertext]"
+ suit_fibers += fibertext
+ if(M.gloves)
+ fibertext = "Material from a pair of [M.gloves.name]."
+ if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
+ suit_fibers += "Material from a pair of [M.gloves.name]."
+ else if(M.gloves)
+ fibertext = "Material from a pair of [M.gloves.name]."
+ if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
+ suit_fibers += "Material from a pair of [M.gloves.name]."
-/atom/proc/return_hiddenprints()
- GET_COMPONENT(D, /datum/component/forensics)
- if(D)
- . = D.hiddenprints
-/atom/proc/return_blood_DNA()
- GET_COMPONENT(D, /datum/component/forensics)
- if(D)
- . = D.blood_DNA
+/atom/proc/add_hiddenprint(mob/living/M)
+ if(!M || !M.key)
+ return
-/atom/proc/blood_DNA_length()
- GET_COMPONENT(D, /datum/component/forensics)
- if(D)
- . = length(D.blood_DNA)
+ if(!fingerprintshidden) //Add the list if it does not exist
+ fingerprintshidden = list()
-/atom/proc/return_fibers()
- GET_COMPONENT(D, /datum/component/forensics)
- if(D)
- . = D.fibers
+ var/hasgloves = ""
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.gloves)
+ hasgloves = "(gloves)"
+
+ var/current_time = TIME_STAMP("hh:mm:ss", FALSE)
+ if(!fingerprintshidden[M.key])
+ fingerprintshidden[M.key] = "First: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]"
+ else
+ var/laststamppos = findtext(fingerprintshidden[M.key], " Last: ")
+ if(laststamppos)
+ fingerprintshidden[M.key] = copytext(fingerprintshidden[M.key], 1, laststamppos)
+ fingerprintshidden[M.key] += " Last: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]"
+
+ fingerprintslast = M.ckey
-/atom/proc/add_fingerprint_list(list/fingerprints) //ASSOC LIST FINGERPRINT = FINGERPRINT
- if(length(fingerprints))
- . = AddComponent(/datum/component/forensics, fingerprints)
//Set ignoregloves to add prints irrespective of the mob having gloves on.
/atom/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE)
- var/datum/component/forensics/D = AddComponent(/datum/component/forensics)
- . = D.add_fingerprint(M, ignoregloves)
+ if(!M || !M.key)
+ return
-/atom/proc/add_fiber_list(list/fibertext) //ASSOC LIST FIBERTEXT = FIBERTEXT
- if(length(fibertext))
- . = AddComponent(/datum/component/forensics, null, null, null, fibertext)
+ add_hiddenprint(M)
-/atom/proc/add_fibers(mob/living/carbon/human/M)
- var/old = 0
- if(M.gloves && istype(M.gloves, /obj/item/clothing))
- var/obj/item/clothing/gloves/G = M.gloves
- old = length(G.return_blood_DNA())
- if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects
- if(add_blood_DNA(G.return_blood_DNA()) && length(G.return_blood_DNA()) > old) //only reduces the bloodiness of our gloves if the item wasn't already bloody
- G.transfer_blood--
- else if(M.bloody_hands > 1)
- old = length(M.return_blood_DNA())
- if(add_blood_DNA(M.return_blood_DNA()) && length(M.return_blood_DNA()) > old)
- M.bloody_hands--
- var/datum/component/forensics/D = AddComponent(/datum/component/forensics)
- . = D.add_fibers(M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
-/atom/proc/add_hiddenprint_list(list/hiddenprints) //NOTE: THIS IS FOR ADMINISTRATION FINGERPRINTS, YOU MUST CUSTOM SET THIS TO INCLUDE CKEY/REAL NAMES! CHECK FORENSICS.DM
- if(length(hiddenprints))
- . = AddComponent(/datum/component/forensics, null, hiddenprints)
+ add_fibers(H)
-/atom/proc/add_hiddenprint(mob/living/M)
- var/datum/component/forensics/D = AddComponent(/datum/component/forensics)
- . = D.add_hiddenprint(M)
+ if(H.gloves) //Check if the gloves (if any) hide fingerprints
+ var/obj/item/clothing/gloves/G = H.gloves
+ if(G.transfer_prints)
+ ignoregloves = TRUE
-/atom/proc/add_blood_DNA(list/dna) //ASSOC LIST DNA = BLOODTYPE
- return FALSE
+ if(!ignoregloves)
+ H.gloves.add_fingerprint(H, TRUE) //ignoregloves = TRUE to avoid infinite loop.
+ return
-/obj/add_blood_DNA(list/dna)
- . = ..()
- if(length(dna))
- . = AddComponent(/datum/component/forensics, null, null, dna)
-
-/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
- . = ..()
- transfer_blood = rand(2, 4)
-
-/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
- var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src
- if(!B)
- B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases)
- B.add_blood_DNA(blood_dna) //give blood info to the blood decal.
- return TRUE //we bloodied the floor
-
-/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
- if(wear_suit)
- wear_suit.add_blood_DNA(blood_dna)
- update_inv_wear_suit()
- else if(w_uniform)
- w_uniform.add_blood_DNA(blood_dna)
- update_inv_w_uniform()
- if(gloves)
- var/obj/item/clothing/gloves/G = gloves
- G.add_blood_DNA(blood_dna)
- else if(length(blood_dna))
- AddComponent(/datum/component/forensics, null, null, blood_dna)
- bloody_hands = rand(2, 4)
- if(head)
- head.add_blood_DNA(blood_dna)
- update_inv_head()
- else if(wear_mask)
- wear_mask.add_blood_DNA(blood_dna)
- update_inv_wear_mask()
- if(wear_neck)
- wear_neck.add_blood_DNA(blood_dna)
- update_inv_neck()
- update_inv_gloves() //handles bloody hands overlays and updating
- return TRUE
+ LAZYINITLIST(fingerprints) //Add the list if it does not exist
+ var/full_print = md5(H.dna.uni_identity)
+ fingerprints[full_print] = full_print
/atom/proc/transfer_fingerprints_to(atom/A)
- A.add_fingerprint_list(return_fingerprints())
- A.add_hiddenprint_list(return_hiddenprints())
- A.fingerprintslast = fingerprintslast
+ // Make sure everything are lists.
+ LAZYINITLIST(A.fingerprints)
+ LAZYINITLIST(A.fingerprintshidden)
+ LAZYINITLIST(fingerprints)
+ LAZYINITLIST(fingerprintshidden)
+
+ // Transfer
+ if(fingerprints)
+ A.fingerprints |= fingerprints.Copy() //detective
+ if(fingerprintshidden)
+ A.fingerprintshidden |= fingerprintshidden.Copy() //admin
+ A.fingerprintslast = fingerprintslast
\ No newline at end of file
diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm
index a3b17a4c1f..5b4a75a36c 100644
--- a/code/modules/detectivework/evidence.dm
+++ b/code/modules/detectivework/evidence.dm
@@ -16,7 +16,7 @@
/obj/item/evidencebag/attackby(obj/item/I, mob/user, params)
if(evidencebagEquip(I, user))
- return 1
+ return TRUE
/obj/item/evidencebag/handle_atom_del(atom/A)
cut_overlays()
@@ -25,12 +25,12 @@
desc = initial(desc)
/obj/item/evidencebag/proc/evidencebagEquip(obj/item/I, mob/user)
- if(!istype(I) || I.anchored == 1)
+ if(!istype(I) || I.anchored == TRUE)
return
if(istype(I, /obj/item/evidencebag))
to_chat(user, "You find putting an evidence bag in another evidence bag to be slightly absurd.")
- return 1 //now this is podracing
+ return TRUE //now this is podracing
if(I.w_class > WEIGHT_CLASS_NORMAL)
to_chat(user, "[I] won't fit in [src].")
@@ -62,7 +62,7 @@
desc = "An evidence bag containing [I]. [I.desc]"
I.forceMove(src)
w_class = I.w_class
- return 1
+ return TRUE
/obj/item/evidencebag/attack_self(mob/user)
if(contents.len)
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index fd7591db81..c578d5b4d4 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -14,7 +14,7 @@
flags_1 = CONDUCT_1
item_flags = NOBLUDGEON
slot_flags = ITEM_SLOT_BELT
- var/scanning = 0
+ var/scanning = FALSE
var/list/log = list()
var/range = 8
var/view_check = TRUE
@@ -30,7 +30,7 @@
/obj/item/detective_scanner/attack_self(mob/user)
if(log.len && !scanning)
- scanning = 1
+ scanning = TRUE
to_chat(user, "Printing report, please wait...")
addtimer(CALLBACK(src, .proc/PrintReport), 100)
else
@@ -56,7 +56,7 @@
// Clear the logs
log = list()
- scanning = 0
+ scanning = FALSE
/obj/item/detective_scanner/afterattack(atom/A, mob/user, params)
. = ..()
@@ -70,7 +70,7 @@
if((get_dist(A, user) > range) || (!(A in view(range, user)) && view_check) || (loc != user))
return
- scanning = 1
+ scanning = TRUE
user.visible_message("\The [user] points the [src.name] at \the [A] and performs a forensic scan.")
to_chat(user, "You scan \the [A]. The scanner is now analysing the results...")
@@ -80,14 +80,20 @@
//Make our lists
var/list/fingerprints = list()
- var/list/blood = A.return_blood_DNA()
- var/list/fibers = A.return_fibers()
+ var/list/blood = list()
+ var/list/fibers = list()
var/list/reagents = list()
var/target_name = A.name
// Start gathering
+ if(A.blood_DNA && A.blood_DNA.len)
+ blood = A.blood_DNA.Copy()
+
+ if(A.suit_fibers && A.suit_fibers.len)
+ fibers = A.suit_fibers.Copy()
+
if(ishuman(A))
var/mob/living/carbon/human/H = A
@@ -96,7 +102,8 @@
else if(!ismob(A))
- fingerprints = A.return_fingerprints()
+ if(A.fingerprints && A.fingerprints.len)
+ fingerprints = A.fingerprints.Copy()
// Only get reagents from non-mobs.
if(A.reagents && A.reagents.reagent_list.len)
@@ -115,40 +122,40 @@
// We gathered everything. Create a fork and slowly display the results to the holder of the scanner.
- var/found_something = 0
+ var/found_something = FALSE
add_log("[STATION_TIME_TIMESTAMP("hh:mm:ss")][get_timestamp()] - [target_name]", 0)
// Fingerprints
if(length(fingerprints))
- sleep(30)
+ sleep(3 SECONDS)
add_log("Prints:")
for(var/finger in fingerprints)
add_log("[finger]")
- found_something = 1
+ found_something = TRUE
// Blood
if (length(blood))
- sleep(30)
+ sleep(3 SECONDS)
add_log("Blood:")
- found_something = 1
+ found_something = TRUE
for(var/B in blood)
add_log("Type: [blood[B]] DNA: [B]")
//Fibers
if(length(fibers))
- sleep(30)
+ sleep(3 SECONDS)
add_log("Fibers:")
for(var/fiber in fibers)
add_log("[fiber]")
- found_something = 1
+ found_something = TRUE
//Reagents
if(length(reagents))
- sleep(30)
+ sleep(3 SECONDS)
add_log("Reagents:")
for(var/R in reagents)
add_log("Reagent: [R] Volume: [reagents[R]]")
- found_something = 1
+ found_something = TRUE
// Get a new user
var/mob/holder = null
@@ -164,10 +171,10 @@
to_chat(holder, "You finish scanning \the [target_name].")
add_log("---------------------------------------------------------", 0)
- scanning = 0
+ scanning = FALSE
return
-/obj/item/detective_scanner/proc/add_log(msg, broadcast = 1)
+/obj/item/detective_scanner/proc/add_log(msg, broadcast = TRUE)
if(scanning)
if(broadcast && ismob(loc))
var/mob/M = loc
@@ -207,4 +214,4 @@
return
to_chat(user, "Scanner Report")
for(var/iterLog in log)
- to_chat(user, iterLog)
+ to_chat(user, iterLog)
\ No newline at end of file
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index c575c97901..604e203cd6 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -32,8 +32,6 @@
determine_wave_type()
/datum/round_event/meteor_wave/proc/determine_wave_type()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- wave_name = "halloween"
if(!wave_name)
wave_name = pickweight(list(
"normal" = 50,
@@ -45,7 +43,10 @@
if("threatening")
wave_type = GLOB.meteors_threatening
if("catastrophic")
- wave_type = GLOB.meteors_catastrophic
+ if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
+ wave_type = GLOB.meteorsSPOOKY
+ else
+ wave_type = GLOB.meteors_catastrophic
if("meaty")
wave_type = GLOB.meteorsB
if("space dust")
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 88f72d27c3..bac2e0bb65 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -771,7 +771,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
..()
var/turf/source = random_far_turf()
if(!sound_type)
- sound_type = pick("airlock","airlock pry","console","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack")
+ sound_type = pick("airlock","airlock pry","console","flash","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack")
feedback_details += "Type: [sound_type]"
//Strange audio
switch(sound_type)
@@ -788,6 +788,8 @@ GLOBAL_LIST_INIT(hallucination_list, list(
target.playsound_local(source,'sound/effects/explosion1.ogg', 50, 1)
else
target.playsound_local(source, 'sound/effects/explosion2.ogg', 50, 1)
+ if("flash")
+ target.playsound_local(source, 'sound/weapons/flash.ogg', 50, 1)
if("far explosion")
target.playsound_local(source, 'sound/effects/explosionfar.ogg', 50, 1)
if("glass")
@@ -1291,4 +1293,4 @@ GLOBAL_LIST_INIT(hallucination_list, list(
H.hal_target = target
H.preparePixelProjectile(target, start)
H.fire()
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index e88a80514a..1ffdff2347 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -121,7 +121,7 @@
return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_BAR)
/proc/get_all_accesses()
- return list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT,
+ return list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP,
ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_RD,
ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_CHEMISTRY, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD,
@@ -157,7 +157,7 @@
if(1) //station general
return list(ACCESS_KITCHEN,ACCESS_BAR, ACCESS_HYDROPONICS, ACCESS_JANITOR, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_LIBRARY, ACCESS_THEATRE, ACCESS_LAWYER)
if(2) //security
- return list(ACCESS_SEC_DOORS, ACCESS_WEAPONS, ACCESS_SECURITY, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_HOS)
+ return list(ACCESS_SEC_DOORS, ACCESS_WEAPONS, ACCESS_SECURITY, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_HOS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP,)
if(3) //medbay
return list(ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_SURGERY, ACCESS_CMO)
if(4) //research
@@ -312,6 +312,10 @@
return "Gateway"
if(ACCESS_SEC_DOORS)
return "Brig"
+ if(ACCESS_ENTER_GENPOP)
+ return "Prison Turnstile Entrance"
+ if(ACCESS_LEAVE_GENPOP)
+ return "Prison Turnstile Exit"
if(ACCESS_MINERAL_STOREROOM)
return "Mineral Storage"
if(ACCESS_MINISAT)
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index f6b5dbd3ef..33c8856d81 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -19,11 +19,11 @@
outfit = /datum/outfit/job/hos
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
- access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS,
+ access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
- minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS,
+ minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index 4f12d6a19c..ae50f71c0c 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -15,8 +15,8 @@
outfit = /datum/outfit/job/security
- access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
- minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access()
+ access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
+ minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access()
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index a5c16ab5cf..1787d13ee3 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -15,8 +15,8 @@
outfit = /datum/outfit/job/warden
- access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
- minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access()
+ access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
+ minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access()
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 23ec02976d..559ffc0673 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -11,6 +11,7 @@
heat_protection = CHEST|GROIN|LEGS|ARMS
hoodtype = /obj/item/clothing/head/hooded/explorer
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
+ flags_inv = HIDEJUMPSUIT|HIDETAUR
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
resistance_flags = FIRE_PROOF
tauric = TRUE //Citadel Add for tauric hardsuits
@@ -129,7 +130,7 @@
/obj/item/clothing/suit/hooded/explorer/seva
name = "SEVA Suit"
- desc = "A fire-proof suit for exploring hot environments."
+ desc = "A fire-proof suit for exploring hot environments. Its design and material make it easier for a Goliath to keep their grip on the wearer."
icon_state = "seva"
item_state = "seva"
w_class = WEIGHT_CLASS_BULKY
@@ -141,7 +142,7 @@
/obj/item/clothing/head/hooded/explorer/seva
name = "SEVA Hood"
- desc = "A fire-proof hood for exploring hot environments."
+ desc = "A fire-proof hood for exploring hot environments. Its design and material make it easier for a Goliath to keep their grip on the wearer."
icon_state = "seva"
item_state = "seva"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -159,7 +160,7 @@
/obj/item/clothing/suit/hooded/explorer/exo
name = "Exo-suit"
- desc = "A robust suit for exploring dangerous environments."
+ desc = "A robust suit for fighting dangerous animals. Its design and material make it harder for a Goliath to keep their grip on the wearer."
icon_state = "exo"
item_state = "exo"
w_class = WEIGHT_CLASS_BULKY
@@ -170,7 +171,7 @@
/obj/item/clothing/head/hooded/explorer/exo
name = "Exo-hood"
- desc = "A robust helmet for exploring dangerous environments."
+ desc = "A robust helmet for fighting dangerous animals. Its design and material make it harder for a Goliath to keep their grip on the wearer."
icon_state = "exo"
item_state = "exo"
armor = list("melee" = 65, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 60, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0)
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index 994d082585..d54b8256a9 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -17,6 +17,8 @@
hair_color = random_short_color()
facial_hair_color = hair_color
eye_color = random_eye_color()
+ horn_color = "85615a"
+ wing_color = "fff"
if(!pref_species)
var/rando_race = pick(GLOB.roundstart_races)
pref_species = new rando_race()
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
index 2f1d48cfa7..156cc304a6 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
@@ -54,6 +54,10 @@
name = "Redpanda"
icon_state = "redpanda"
+/datum/sprite_accessory/mam_body_markings/bat
+ name = "Bat"
+ icon_state = "bat"
+
/datum/sprite_accessory/mam_body_markings/bee
name = "Bee"
icon_state = "bee"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
index 1496ca030a..ca1253feb1 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
@@ -176,6 +176,10 @@
name = "Axolotl"
icon_state = "axolotl"
+/datum/sprite_accessory/mam_ears/bat
+ name = "Bat"
+ icon_state = "bat"
+
/datum/sprite_accessory/mam_ears/bear
name = "Bear"
icon_state = "bear"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
index 7252f85324..be2ab152a8 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
@@ -194,6 +194,10 @@
name = "Mammal, Short ALT"
icon_state = "scanidalt"
+/datum/sprite_accessory/mam_snouts/scanidalt2
+ name = "Mammal, Short ALT 2"
+ icon_state = "scanidalt2"
+
/datum/sprite_accessory/mam_snouts/wolf
name = "Mammal, Thick"
icon_state = "wolf"
@@ -306,6 +310,10 @@
name = "Mammal, Short ALT (Top)"
icon_state = "fscanidalt"
+/datum/sprite_accessory/mam_snouts/fscanidalt2
+ name = "Mammal, Short ALT 2 (Top)"
+ icon_state = "fscanidalt2"
+
/datum/sprite_accessory/mam_snouts/fwolf
name = "Mammal, Thick (Top)"
icon_state = "fwolf"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
index 3975f7bafc..33b174afa4 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -114,6 +114,26 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
+/datum/sprite_accessory/mam_tails/batl
+ name = "Bat (Long)"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ icon_state = "batl"
+
+/datum/sprite_accessory/mam_tails_animated/batl
+ name = "Bat (Long)"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ icon_state = "batl"
+
+/datum/sprite_accessory/mam_tails/bats
+ name = "Bat (Short)"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ icon_state = "bats"
+
+/datum/sprite_accessory/mam_tails_animated/bats
+ name = "Bat (Short)"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ icon_state = "bats"
+
/datum/sprite_accessory/tails/human/bee
name = "Bee"
icon_state = "bee"
@@ -469,6 +489,22 @@
name = "Axolotl"
icon_state = "axolotl"
+/datum/sprite_accessory/mam_tails/batl
+ name = "Bat (Long)"
+ icon_state = "batl"
+
+/datum/sprite_accessory/mam_tails_animated/batl
+ name = "Bat (Long)"
+ icon_state = "batl"
+
+/datum/sprite_accessory/mam_tails/bats
+ name = "Bat (Short)"
+ icon_state = "bats"
+
+/datum/sprite_accessory/mam_tails_animated/bats
+ name = "Bat (Short)"
+ icon_state = "bats"
+
/datum/sprite_accessory/mam_tails/bee
name = "Bee"
icon_state = "bee"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
index 554b7edfdb..46a123c6bb 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
@@ -28,73 +28,14 @@
locked = TRUE
// Decorative wings
+
/datum/sprite_accessory/deco_wings
icon = 'icons/mob/wings.dmi'
+ color_src = WINGCOLOR
-/datum/sprite_accessory/deco_wings/plain
- name = "Plain"
- icon_state = "plain"
-
-/datum/sprite_accessory/deco_wings/monarch
- name = "Monarch"
- icon_state = "monarch"
-
-/datum/sprite_accessory/deco_wings/luna
- name = "Luna"
- icon_state = "luna"
-
-/datum/sprite_accessory/deco_wings/atlas
- name = "Atlas"
- icon_state = "atlas"
-
-/datum/sprite_accessory/deco_wings/reddish
- name = "Reddish"
- icon_state = "redish"
-
-/datum/sprite_accessory/deco_wings/royal
- name = "Royal"
- icon_state = "royal"
-
-/datum/sprite_accessory/deco_wings/gothic
- name = "Gothic"
- icon_state = "gothic"
-
-/datum/sprite_accessory/deco_wings/lovers
- name = "Lovers"
- icon_state = "lovers"
-
-/datum/sprite_accessory/deco_wings/whitefly
- name = "White Fly"
- icon_state = "whitefly"
-
-/datum/sprite_accessory/deco_wings/punished
- name = "Burnt Off"
- icon_state = "punished"
- locked = TRUE
-
-/datum/sprite_accessory/deco_wings/firewatch
- name = "Firewatch"
- icon_state = "firewatch"
-
-/datum/sprite_accessory/deco_wings/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
-
-/datum/sprite_accessory/deco_wings/poison
- name = "Poison"
- icon_state = "poison"
-
-/datum/sprite_accessory/deco_wings/ragged
- name = "Ragged"
- icon_state = "ragged"
-
-/datum/sprite_accessory/deco_wings/moonfly
- name = "Moon Fly"
- icon_state = "moonfly"
-
-/datum/sprite_accessory/deco_wings/snow
- name = "Snow"
- icon_state = "snow"
+/datum/sprite_accessory/deco_wings/none
+ name = "None"
+ icon_state = "none"
/datum/sprite_accessory/deco_wings/angel
name = "Angel"
@@ -104,44 +45,123 @@
center = TRUE
dimension_y = 34
-/datum/sprite_accessory/deco_wings/none
- name = "None"
- icon_state = "none"
+/datum/sprite_accessory/deco_wings/bat
+ name = "Bat"
+ icon_state = "bat"
+/datum/sprite_accessory/deco_wings/bee
+ name = "Bee"
+ icon_state = "bee"
+
+/datum/sprite_accessory/deco_wings/fairy
+ name = "Fairy"
+ icon_state = "fairy"
+
+/datum/sprite_accessory/deco_wings/feathery
+ name = "Feathery"
+ icon_state = "feathery"
+
+/datum/sprite_accessory/deco_wings/atlas
+ name = "Atlas"
+ icon_state = "atlas"
+
+/datum/sprite_accessory/deco_wings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
+/datum/sprite_accessory/deco_wings/firewatch
+ name = "Firewatch"
+ icon_state = "firewatch"
+
+/datum/sprite_accessory/deco_wings/gothic
+ name = "Gothic"
+ icon_state = "gothic"
+
+/datum/sprite_accessory/deco_wings/lovers
+ name = "Lovers"
+ icon_state = "lovers"
+
+/datum/sprite_accessory/deco_wings/luna
+ name = "Luna"
+ icon_state = "luna"
+
+/datum/sprite_accessory/deco_wings/monarch
+ name = "Monarch"
+ icon_state = "monarch"
+
+/datum/sprite_accessory/deco_wings/moonfly
+ name = "Moon Fly"
+ icon_state = "moonfly"
+
+/datum/sprite_accessory/deco_wings/plain
+ name = "Plain"
+ icon_state = "plain"
+
+/datum/sprite_accessory/deco_wings/poison
+ name = "Poison"
+ icon_state = "poison"
+
+/datum/sprite_accessory/deco_wings/punished
+ name = "Burnt Off"
+ icon_state = "punished"
+
+/datum/sprite_accessory/deco_wings/ragged
+ name = "Ragged"
+ icon_state = "ragged"
+
+/datum/sprite_accessory/deco_wings/reddish
+ name = "Reddish"
+ icon_state = "redish"
+
+/datum/sprite_accessory/deco_wings/royal
+ name = "Royal"
+ icon_state = "royal"
+
+/datum/sprite_accessory/deco_wings/snow
+ name = "Snow"
+ icon_state = "snow"
+
+/datum/sprite_accessory/deco_wings/whitefly
+ name = "White Fly"
+ icon_state = "whitefly"
//INSECT WINGS
/datum/sprite_accessory/insect_wings
icon = 'icons/mob/wings.dmi'
- color_src = null
+ color_src = WINGCOLOR
/datum/sprite_accessory/insect_wings/none
name = "None"
icon_state = "none"
-/datum/sprite_accessory/insect_wings/plain
- name = "Plain"
- icon_state = "plain"
+/datum/sprite_accessory/insect_wings/bat
+ name = "Bat"
+ icon_state = "bat"
-/datum/sprite_accessory/insect_wings/monarch
- name = "Monarch"
- icon_state = "monarch"
+/datum/sprite_accessory/insect_wings/bee
+ name = "Bee"
+ icon_state = "bee"
-/datum/sprite_accessory/insect_wings/luna
- name = "Luna"
- icon_state = "luna"
+/datum/sprite_accessory/insect_wings/fairy
+ name = "Fairy"
+ icon_state = "fairy"
+
+/datum/sprite_accessory/insect_wings/feathery
+ name = "Feathery"
+ icon_state = "feathery"
/datum/sprite_accessory/insect_wings/atlas
name = "Atlas"
icon_state = "atlas"
-/datum/sprite_accessory/insect_wings/reddish
- name = "Reddish"
- icon_state = "redish"
+/datum/sprite_accessory/insect_wings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
-/datum/sprite_accessory/insect_wings/royal
- name = "Royal"
- icon_state = "royal"
+/datum/sprite_accessory/insect_wings/firewatch
+ name = "Firewatch"
+ icon_state = "firewatch"
/datum/sprite_accessory/insect_wings/gothic
name = "Gothic"
@@ -151,75 +171,46 @@
name = "Lovers"
icon_state = "lovers"
-/datum/sprite_accessory/insect_wings/whitefly
- name = "White Fly"
- icon_state = "whitefly"
+/datum/sprite_accessory/insect_wings/luna
+ name = "Luna"
+ icon_state = "luna"
-/datum/sprite_accessory/insect_wings/punished
- name = "Burnt Off"
- icon_state = "punished"
-
-/datum/sprite_accessory/insect_wings/firewatch
- name = "Firewatch"
- icon_state = "firewatch"
-
-/datum/sprite_accessory/insect_wings/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
-
-/datum/sprite_accessory/insect_wings/poison
- name = "Poison"
- icon_state = "poison"
-
-/datum/sprite_accessory/insect_wings/ragged
- name = "Ragged"
- icon_state = "ragged"
+/datum/sprite_accessory/insect_wings/monarch
+ name = "Monarch"
+ icon_state = "monarch"
/datum/sprite_accessory/insect_wings/moonfly
name = "Moon Fly"
icon_state = "moonfly"
+/datum/sprite_accessory/insect_wings/plain
+ name = "Plain"
+ icon_state = "plain"
+
+/datum/sprite_accessory/insect_wings/poison
+ name = "Poison"
+ icon_state = "poison"
+
+/datum/sprite_accessory/insect_wings/punished
+ name = "Burnt Off"
+ icon_state = "punished"
+
+/datum/sprite_accessory/insect_wings/ragged
+ name = "Ragged"
+ icon_state = "ragged"
+
+/datum/sprite_accessory/insect_wings/reddish
+ name = "Reddish"
+ icon_state = "redish"
+
+/datum/sprite_accessory/insect_wings/royal
+ name = "Royal"
+ icon_state = "royal"
+
/datum/sprite_accessory/insect_wings/snow
name = "Snow"
icon_state = "snow"
-/datum/sprite_accessory/insect_wings/colored
- name = "Colored (Hair)"
- icon_state = "snowplain"
- color_src = HAIR
-
-/datum/sprite_accessory/insect_fluff/colored1
- name = "Colored (Primary)"
- icon_state = "snowplain"
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/insect_fluff/colored2
- name = "Colored (Secondary)"
- icon_state = "snowplain"
- color_src = MUTCOLORS2
-
-/datum/sprite_accessory/insect_fluff/colored3
- name = "Colored (Tertiary)"
- icon_state = "snowplain"
- color_src = MUTCOLORS3
-
-/datum/sprite_accessory/insect_wings/bee
- name = "Bee"
- icon_state = "bee"
-
-/datum/sprite_accessory/insect_wings/bee_color
- name = "Bee (Hair colored)"
- icon_state = "bee"
- color_src = HAIR
-
-/datum/sprite_accessory/insect_wings/fairy
- name = "Fairy"
- icon_state = "fairy"
-
-/datum/sprite_accessory/insect_wings/bat
- name = "Bat"
- icon_state = "bat"
-
-/datum/sprite_accessory/insect_wings/feathery
- name = "Feathery"
- icon_state = "feathery"
+/datum/sprite_accessory/insect_wings/whitefly
+ name = "White Fly"
+ icon_state = "whitefly"
\ No newline at end of file
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index ca1a961a92..757aadaea1 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -2,6 +2,9 @@
BLOOD SYSTEM
****************************************************/
+#define EXOTIC_BLEED_MULTIPLIER 4 //Multiplies the actually bled amount by this number for the purposes of turf reaction calculations.
+
+
/mob/living/carbon/human/proc/suppress_bloodloss(amount)
if(bleedsuppress)
return
@@ -30,6 +33,9 @@
bleed_rate = 0
return
+ if(bleed_rate <= 0)
+ bleed_rate = 0
+
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
//Blood regeneration if there is some space
@@ -80,6 +86,9 @@
var/obj/item/bodypart/BP = X
var/brutedamage = BP.brute_dam
+ if(BP.status == BODYPART_ROBOTIC) //for the moment, synth limbs won't bleed, but soon, my pretty.
+ continue
+
//We want an accurate reading of .len
listclearnulls(BP.embedded_objects)
temp_bleed += 0.5*BP.embedded_objects.len
@@ -87,7 +96,7 @@
if(brutedamage >= 20)
temp_bleed += (brutedamage * 0.013)
- bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
+ bleed_rate = max(bleed_rate - 0.50, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
if(bleed_rate && !bleedsuppress && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
bleed(bleed_rate)
@@ -105,9 +114,11 @@
/mob/living/carbon/human/bleed(amt)
amt *= physiology.bleed_mod
if(!(NOBLOOD in dna.species.species_traits))
- ..()
-
-
+ .=..()
+ if(dna.species.exotic_blood && .) // Do we have exotic blood, and have we left any on the ground?
+ var/datum/reagent/R = GLOB.chemical_reagents_list[get_blood_id()]
+ if(istype(R) && isturf(loc))
+ R.reaction_turf(get_turf(src), amt * EXOTIC_BLEED_MULTIPLIER)
/mob/living/proc/restore_blood()
blood_volume = initial(blood_volume)
@@ -123,16 +134,16 @@
//Gets blood from mob to a container or other mob, preserving all data in it.
/mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced)
if(!blood_volume || !AM.reagents)
- return 0
+ return FALSE
if(blood_volume < (BLOOD_VOLUME_BAD * blood_ratio) && !forced)
- return 0
+ return FALSE
if(blood_volume < amount)
amount = blood_volume
var/blood_id = get_blood_id()
if(!blood_id)
- return 0
+ return FALSE
blood_volume -= amount
@@ -141,29 +152,27 @@
if(iscarbon(AM))
var/mob/living/carbon/C = AM
if(blood_id == C.get_blood_id())//both mobs have the same blood substance
- if(blood_id == "blood") //normal blood
+ if(blood_id == "blood" || blood_id == "jellyblood") //normal blood
if(blood_data["viruses"])
for(var/thing in blood_data["viruses"])
var/datum/disease/D = thing
if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS))
continue
C.ForceContractDisease(D)
- if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type)))
- C.reagents.add_reagent("toxin", amount * 0.5)
- return 1
+ //This used to inject oof ouch results, but since we add the reagent, and the reagent causes oof ouch on mob life... why double dip?
C.blood_volume = min(C.blood_volume + round(amount, 0.1), BLOOD_VOLUME_MAXIMUM)
- return 1
+ return TRUE
AM.reagents.add_reagent(blood_id, amount, blood_data, bodytemperature)
- return 1
+ return TRUE
/mob/living/proc/get_blood_data(blood_id)
return
/mob/living/carbon/get_blood_data(blood_id)
- if(blood_id == "blood") //actual blood reagent
+ if(blood_id == "blood" || blood_id == "jellyblood") //actual blood reagent
var/blood_data = list()
//set the blood data
blood_data["donor"] = src
@@ -174,6 +183,7 @@
blood_data["viruses"] += D.Copy()
blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0)
+ blood_data["bloodcolor"] = bloodtype_to_color(dna.blood_type)
if(disease_resistances && disease_resistances.len)
blood_data["resistances"] = disease_resistances.Copy()
var/list/temp_chem = list()
@@ -206,21 +216,6 @@
if(istype(ling))
blood_data["changeling_loudness"] = ling.loudfactor
return blood_data
- if(blood_id == "slimejelly") //Just so MKUltra works. Takes the minimum required data. Sishen is testing if this breaks stuff.
- var/blood_data = list()
- if(mind)
- blood_data["mind"] = mind
- else if(last_mind)
- blood_data["mind"] = last_mind
- if(ckey)
- blood_data["ckey"] = ckey
- else if(last_mind)
- blood_data["ckey"] = ckey(last_mind.key)
- blood_data["gender"] = gender
- blood_data["real_name"] = real_name
- return blood_data
-
-
//get the id of the substance this mob use as blood.
/mob/proc/get_blood_id()
@@ -234,12 +229,15 @@
if(!(HAS_TRAIT(src, TRAIT_NOCLONE)))
return "blood"
-/mob/living/carbon/human/get_blood_id()
- if(dna.species.exotic_blood)
+/mob/living/carbon/get_blood_id()
+ if(isjellyperson(src))
+ return "jellyblood"
+ if(dna?.species?.exotic_blood)
return dna.species.exotic_blood
else if((NOBLOOD in dna.species.species_traits) || (HAS_TRAIT(src, TRAIT_NOCLONE)))
return
- return "blood"
+ else
+ return "blood"
// This is has more potential uses, and is probably faster than the old proc.
/proc/get_safe_blood(bloodtype)
@@ -248,16 +246,21 @@
return
var/static/list/bloodtypes_safe = list(
- "A-" = list("A-", "O-"),
- "A+" = list("A-", "A+", "O-", "O+"),
- "B-" = list("B-", "O-"),
- "B+" = list("B-", "B+", "O-", "O+"),
- "AB-" = list("A-", "B-", "O-", "AB-"),
- "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+"),
- "O-" = list("O-"),
- "O+" = list("O-", "O+"),
- "L" = list("L"),
- "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U")
+ "A-" = list("A-", "O-", "SY"),
+ "A+" = list("A-", "A+", "O-", "O+", "SY"),
+ "B-" = list("B-", "O-", "SY"),
+ "B+" = list("B-", "B+", "O-", "O+", "SY"),
+ "AB-" = list("A-", "B-", "O-", "AB-", "SY"),
+ "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "SY"),
+ "O-" = list("O-","SY"),
+ "O+" = list("O-", "O+","SY"),
+ "L" = list("L","SY"),
+ "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U","SY"),
+ "HF" = list("HF", "SY"),
+ "X*" = list("X*", "SY"),
+ "SY" = list("SY"),
+ "GEL" = list("GEL","SY"),
+ "BUG" = list("BUG", "SY")
)
var/safe = bloodtypes_safe[bloodtype]
@@ -266,7 +269,7 @@
//to add a splatter of blood or other mob liquid.
/mob/living/proc/add_splatter_floor(turf/T, small_drip)
- if(get_blood_id() != "blood")
+ if(get_blood_id() == null)
return
if(!T)
T = get_turf(src)
@@ -280,24 +283,27 @@
drop.drips++
drop.add_overlay(pick(drop.random_icon_states))
drop.transfer_mob_blood_dna(src)
+ drop.update_icon()
return
else
- temp_blood_DNA = drop.return_blood_DNA() //we transfer the dna from the drip to the splatter
+ temp_blood_DNA = list()
+ temp_blood_DNA |= drop.blood_DNA.Copy() //we transfer the dna from the drip to the splatter
qdel(drop)//the drip is replaced by a bigger splatter
else
drop = new(T, get_static_viruses())
drop.transfer_mob_blood_dna(src)
+ drop.update_icon()
return
// Find a blood decal or create a new one.
- var/obj/effect/decal/cleanable/blood/B = locate() in T
+ var/obj/effect/decal/cleanable/blood/splats/B = locate() in T
if(!B)
- B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses())
- if (B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit
+ B = new /obj/effect/decal/cleanable/blood/splats(T, get_static_viruses())
+ if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit
B.bloodiness += BLOOD_AMOUNT_PER_DECAL
B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
if(temp_blood_DNA)
- B.add_blood_DNA(temp_blood_DNA)
+ B.blood_DNA |= temp_blood_DNA
/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip)
if(!(NOBLOOD in dna.species.species_traits))
@@ -306,10 +312,10 @@
/mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip)
if(!T)
T = get_turf(src)
- var/obj/effect/decal/cleanable/xenoblood/B = locate() in T.contents
+ var/obj/effect/decal/cleanable/blood/splatter/B = locate() in T.contents
if(!B)
B = new(T)
- B.add_blood_DNA(list("UNKNOWN DNA" = "X*"))
+ B.blood_DNA["UNKNOWN DNA"] = "X*"
/mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip)
if(!T)
@@ -318,6 +324,44 @@
if(!B)
B = new(T)
+/mob/living/proc/add_splash_floor(turf/T)
+ if(get_blood_id() == null)
+ return
+ if(!T)
+ T = get_turf(src)
+
+ var/list/temp_blood_DNA
+
+ // Find a blood decal or create a new one.
+ var/obj/effect/decal/cleanable/blood/B = locate() in T
+ if(!B)
+ B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses())
+ if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit
+ B.bloodiness += BLOOD_AMOUNT_PER_DECAL
+ B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
+ src.transfer_blood_to(B, 10) //very heavy bleeding, should logically leave larger pools
+ if(temp_blood_DNA)
+ B.blood_DNA |= temp_blood_DNA
+
+/mob/living/carbon/human/add_splash_floor(turf/T)
+ if(!(NOBLOOD in dna.species.species_traits))
+ ..()
+
+/mob/living/carbon/alien/add_splash_floor(turf/T)
+ if(!T)
+ T = get_turf(src)
+ var/obj/effect/decal/cleanable/blood/splatter/B = locate() in T.contents
+ if(!B)
+ B = new(T)
+ B.blood_DNA["UNKNOWN DNA"] = "X*"
+
+/mob/living/silicon/robot/add_splash_floor(turf/T)
+ if(!T)
+ T = get_turf(src)
+ var/obj/effect/decal/cleanable/oil/B = locate() in T.contents
+ if(!B)
+ B = new(T)
+
//This is a terrible way of handling it.
/mob/living/proc/ResetBloodVol()
if(ishuman(src))
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index cc11c0e8bb..19500653d9 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -147,9 +147,9 @@
/mob/living/proc/exit_blood_effect(obj/effect/decal/cleanable/B)
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
//Makes the mob have the color of the blood pool it came out of
- var/newcolor = rgb(149, 10, 10)
- if(istype(B, /obj/effect/decal/cleanable/xenoblood))
- newcolor = rgb(43, 186, 0)
+ var/newcolor = BLOOD_COLOR_HUMAN
+ if(istype(B, /obj/effect/decal/cleanable/blood/xeno))
+ newcolor = BLOOD_COLOR_XENO
add_atom_colour(newcolor, TEMPORARY_COLOUR_PRIORITY)
// but only for a few seconds
spawn(30)
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index 97b29ca4e1..1b2944c1f6 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -10,7 +10,10 @@
/mob/living/brain/Initialize()
. = ..()
create_dna(src)
- stored_dna.initialize_dna(random_blood_type())
+ if(stored_dna.blood_type)
+ stored_dna.initialize_dna(stored_dna.blood_type)
+ else
+ stored_dna.initialize_dna(random_blood_type())
if(isturf(loc)) //not spawned in an MMI or brain organ (most likely adminspawned)
var/obj/item/organ/brain/OB = new(loc) //we create a new brain organ for it.
OB.brainmob = src
@@ -21,6 +24,8 @@
if(!stored_dna.species)
var/rando_race = pick(GLOB.roundstart_races)
stored_dna.species = new rando_race()
+ if(stored_dna.species.exotic_bloodtype)
+ stored_dna.blood_type = stored_dna.species.exotic_bloodtype
/mob/living/brain/Destroy()
if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting.
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index c8ece3f656..3ad7acfcdc 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -20,7 +20,7 @@
var/heat_protection = 0.5
var/leaping = 0
- gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs
+ gib_type = /obj/effect/decal/cleanable/blood/gibs/xeno
unique_name = 1
var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?")
diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm
index ce2b4401e9..77300e1435 100644
--- a/code/modules/mob/living/carbon/alien/death.dm
+++ b/code/modules/mob/living/carbon/alien/death.dm
@@ -2,7 +2,7 @@
if(with_bodyparts)
new /obj/effect/gibspawner/xeno(drop_location())
else
- new /obj/effect/gibspawner/xenobodypartless(drop_location())
+ new /obj/effect/gibspawner/xeno/bodypartless(drop_location())
/mob/living/carbon/alien/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a")
diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm
index e16be71ccf..e7cf70f441 100644
--- a/code/modules/mob/living/carbon/alien/larva/death.dm
+++ b/code/modules/mob/living/carbon/alien/larva/death.dm
@@ -10,7 +10,7 @@
if(with_bodyparts)
new /obj/effect/gibspawner/larva(drop_location())
else
- new /obj/effect/gibspawner/larvabodypartless(drop_location())
+ new /obj/effect/gibspawner/larva/bodypartless(drop_location())
/mob/living/carbon/alien/larva/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l")
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index df1be454ee..7b6962794a 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -89,6 +89,8 @@
owner.adjustFireLoss(-heal_amt)
owner.adjustOxyLoss(-heal_amt)
owner.adjustCloneLoss(-heal_amt)
+ if(owner.blood_volume && (owner.blood_volume < BLOOD_VOLUME_NORMAL))
+ owner.blood_volume += 5
else
owner.adjustPlasma(plasma_rate * 0.1)
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index 04a2e56857..0bfd23cbff 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -111,7 +111,7 @@
else //When it is removed via surgery at a late stage, rather than forced.
new_xeno.visible_message("[new_xeno] wriggles out of [owner]!", "You exit [owner], your previous host.")
owner.adjustBruteLoss(40)
- owner.cut_overlay(overlay)
+ owner.cut_overlay(overlay)
qdel(src)
@@ -119,19 +119,19 @@
Proc: AddInfectionImages(C)
Des: Adds the infection image to all aliens for this embryo
----------------------------------------*/
-/obj/item/organ/body_egg/alien_embryo/AddInfectionImages()
+/obj/item/organ/body_egg/alien_embryo/AddInfectionImages(mob/living/carbon/C)
for(var/mob/living/carbon/alien/alien in GLOB.player_list)
if(alien.client)
- var/I = image('icons/mob/alien.dmi', loc = owner, icon_state = "infected[stage]")
+ var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]")
alien.client.images += I
/*----------------------------------------
Proc: RemoveInfectionImage(C)
Des: Removes all images from the mob infected by this embryo
----------------------------------------*/
-/obj/item/organ/body_egg/alien_embryo/RemoveInfectionImages()
+/obj/item/organ/body_egg/alien_embryo/RemoveInfectionImages(mob/living/carbon/C)
for(var/mob/living/carbon/alien/alien in GLOB.player_list)
if(alien.client)
for(var/image/I in alien.client.images)
- if(dd_hasprefix_case(I.icon_state, "infected") && I.loc == owner)
+ if(dd_hasprefix_case(I.icon_state, "infected") && I.loc == C)
qdel(I)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 41daf642f2..a1184613fe 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -49,6 +49,7 @@
//Gets filled up in create_bodyparts()
var/list/hand_bodyparts = list() //a collection of arms (or actually whatever the fug /bodyparts you monsters use to wreck my systems)
+ var/list/leg_bodyparts = list()
var/icon_render_key = ""
var/static/list/limb_icon_cache = list()
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index cc0c0d7434..b509b31e5f 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -85,7 +85,7 @@
if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage
amount = -amount
if(amount > 0)
- blood_volume -= 5*amount
+ blood_volume -= 3*amount // x5 is too much, x3 should be still penalizing enough.
else
blood_volume -= amount
return ..()
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 64b75bc801..b0c3f61eec 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -5,10 +5,35 @@
new /obj/effect/temp_visual/dust_animation(loc, "dust-h")
/mob/living/carbon/human/spawn_gibs(with_bodyparts)
- if(with_bodyparts)
- new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses())
+ if(isjellyperson(src))
+ if(with_bodyparts)
+ new /obj/effect/gibspawner/slime(drop_location(), dna, get_static_viruses())
+ else
+ new /obj/effect/gibspawner/slime/bodypartless(drop_location(), dna, get_static_viruses())
+
+ if(isipcperson(src))
+ if(with_bodyparts)
+ new /obj/effect/gibspawner/ipc(drop_location(), dna, get_static_viruses())
+ else
+ new /obj/effect/gibspawner/ipc/bodypartless(drop_location(), dna, get_static_viruses())
+
+ if(isxenoperson(src))
+ if(with_bodyparts)
+ new /obj/effect/gibspawner/xeno/xenoperson(drop_location(), dna, get_static_viruses())
+ else
+ new /obj/effect/gibspawner/xeno/xenoperson/bodypartless(drop_location(), dna, get_static_viruses())
+
+ if(islizard(src))
+ if(with_bodyparts)
+ new /obj/effect/gibspawner/lizard(drop_location(), dna, get_static_viruses())
+ else
+ new /obj/effect/gibspawner/lizard/bodypartless(drop_location(), dna, get_static_viruses())
+
else
- new /obj/effect/gibspawner/humanbodypartless(drop_location(), dna, get_static_viruses())
+ if(with_bodyparts)
+ new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses())
+ else
+ new /obj/effect/gibspawner/human/bodypartless(drop_location(), dna, get_static_viruses())
/mob/living/carbon/human/spawn_dust(just_ash = FALSE)
if(just_ash)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 6ebc4f8a32..a4eee82e0c 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/examine(mob/user) //User is the person being examined
+/mob/living/carbon/human/examine(mob/user)
//this is very slightly better than it was because you can use it more places. still can't do \his[src] though.
var/t_He = p_they(TRUE)
var/t_His = p_their(TRUE)
@@ -45,7 +45,7 @@
if(wear_suit)
msg += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)].\n"
//suit/armor storage
- if(s_store)
+ if(s_store && !(SLOT_S_STORE in obscured))
msg += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name].\n"
//back
if(back)
@@ -56,11 +56,10 @@
if(!(I.item_flags & ABSTRACT))
msg += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n"
- GET_COMPONENT(FR, /datum/component/forensics)
//gloves
if(gloves && !(SLOT_GLOVES in obscured))
msg += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands.\n"
- else if(FR && length(FR.blood_DNA))
+ else if(length(blood_DNA))
var/hand_number = get_num_arms(FALSE)
if(hand_number)
msg += "[t_He] [t_has] [hand_number > 1 ? "" : "a"] blood-stained hand[hand_number > 1 ? "s" : ""]!\n"
@@ -86,7 +85,7 @@
if(wear_mask && !(SLOT_WEAR_MASK in obscured))
msg += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face.\n"
- if (wear_neck && !(SLOT_NECK in obscured))
+ if(wear_neck && !(SLOT_NECK in obscured))
msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n"
//eyes
@@ -152,7 +151,7 @@
var/temp = getBruteLoss() //no need to calculate each of these twice
- msg += ""
+ msg += "" //Everything below gets this span
var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/list/disabled = list()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 02e6043462..f2ca5bc939 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -32,7 +32,7 @@
if(CONFIG_GET(flag/disable_stambuffer))
togglesprint()
- AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood)))
+ AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, /mob/living/carbon/human/clean_blood)))
/mob/living/carbon/human/ComponentInitialize()
@@ -689,16 +689,17 @@
if(..())
dropItemToGround(I)
-/mob/living/carbon/human/proc/clean_blood(datum/source, strength)
- if(strength < CLEAN_STRENGTH_BLOOD)
- return
- if(gloves)
- if(SEND_SIGNAL(gloves, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
- update_inv_gloves()
+/mob/living/carbon/human/clean_blood()
+ var/mob/living/carbon/human/H = src
+ if(H.gloves)
+ if(H.gloves.clean_blood())
+ H.update_inv_gloves()
else
- if(bloody_hands)
- bloody_hands = 0
- update_inv_gloves()
+ ..() // Clear the Blood_DNA list
+ if(H.bloody_hands)
+ H.bloody_hands = 0
+ H.update_inv_gloves()
+ update_icons() //apply the now updated overlays to the mob
/mob/living/carbon/human/wash_cream()
if(creamed) //clean both to prevent a rare bug
@@ -1104,3 +1105,18 @@
/mob/living/carbon/human/species/zombie/krokodil_addict
race = /datum/species/krokodil_addict
+
+/mob/living/carbon/human/species/mammal
+ race = /datum/species/mammal
+
+/mob/living/carbon/human/species/insect
+ race = /datum/species/insect
+
+/mob/living/carbon/human/species/xeno
+ race = /datum/species/xeno
+
+/mob/living/carbon/human/species/ipc
+ race = /datum/species/ipc
+
+/mob/living/carbon/human/species/roundstartslime
+ race = /datum/species/jelly/roundstartslime
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index e32d073500..b1f11f6463 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -19,6 +19,8 @@
var/horn_color = "85615a" //specific horn colors, because why not?
+ var/wing_color = "fff" //wings too
+
var/skin_tone = "caucasian1" //Skin tone
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
@@ -49,6 +51,9 @@
var/bleed_rate = 0 //how much are we bleeding
var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding
+ var/blood_state = BLOOD_STATE_NOT_BLOODY
+ var/list/blood_smear = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
+
var/name_override //For temporary visible name changes
var/genital_override = FALSE //Force genitals on things incase of chems
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index b65d62b63b..8bc8866380 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -127,3 +127,9 @@
return FALSE
return .
+/*
+/mob/living/carbon/human/transfer_blood_dna(list/blood_dna)
+ ..()
+ if(blood_dna.len)
+ last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works
+ last_blood_DNA = blood_dna[blood_dna.len]*/
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 6ea9c985e2..4e6f9e0eb9 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -56,20 +56,20 @@
//Bloody footprints
var/turf/T = get_turf(src)
if(S.bloody_shoes && S.bloody_shoes[S.blood_state])
- for(var/obj/effect/decal/cleanable/blood/footprints/oldFP in T)
- if (oldFP.blood_state == S.blood_state)
- return
- //No oldFP or they're all a different kind of blood
- S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP)
- if (S.bloody_shoes[S.blood_state] > BLOOD_LOSS_IN_SPREAD)
- var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
- FP.blood_state = S.blood_state
- FP.entered_dirs |= dir
- FP.bloodiness = S.bloody_shoes[S.blood_state] - BLOOD_LOSS_IN_SPREAD
- FP.add_blood_DNA(S.return_blood_DNA())
- FP.update_icon()
+ var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T
+ if(oldFP && (oldFP.blood_state == S.blood_state && oldFP.color == bloodtype_to_color(S.last_bloodtype)))
+ return
+ S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state]-BLOOD_LOSS_PER_STEP)
+ var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
+ FP.blood_state = S.blood_state
+ FP.entered_dirs |= dir
+ FP.bloodiness = S.bloody_shoes[S.blood_state]
+ if(S.last_bloodtype)
+ FP.blood_DNA += list(S.last_blood_DNA = S.last_bloodtype)
+ FP.update_icon()
update_inv_shoes()
//End bloody footprints
+
S.step_action()
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee.
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 1f843483ee..34b8abc311 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -37,6 +37,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent.
var/horn_color //specific horn colors, because why not?
+ var/wing_color
var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans)
var/exotic_blood = "" // If your race wants to bleed something other than bog standard blood, change this to reagent id.
@@ -338,7 +339,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load)
if(C.dna.species.exotic_bloodtype)
- C.dna.blood_type = random_blood_type()
+ if(!new_species.exotic_bloodtype)
+ C.dna.blood_type = random_blood_type()
+ else
+ C.dna.blood_type = new_species.exotic_bloodtype
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(TRUE)
for(var/X in inherent_traits)
@@ -869,6 +873,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
accessory_overlay.color = "#[H.eye_color]"
if(HORNCOLOR)
accessory_overlay.color = "#[H.horn_color]"
+ if(WINGCOLOR)
+ accessory_overlay.color = "#[H.wing_color]"
else
accessory_overlay.color = forced_colour
else
@@ -946,6 +952,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(HORNCOLOR)
extra_accessory_overlay.color = "#[H.horn_color]"
+ if(WINGCOLOR)
+ extra_accessory_overlay.color = "#[H.wing_color]"
if(OFFSET_MUTPARTS in H.dna.species.offset_features)
extra_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1]
@@ -985,6 +993,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
extra2_accessory_overlay.color = "#[H.hair_color]"
if(HORNCOLOR)
extra2_accessory_overlay.color = "#[H.horn_color]"
+ if(WINGCOLOR)
+ extra2_accessory_overlay.color = "#[H.wing_color]"
if(OFFSET_MUTPARTS in H.dna.species.offset_features)
extra2_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1]
@@ -1017,6 +1027,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return "TAUR"
//END EDIT
+/* TODO: Snowflake trail marks
+// Impliments different trails for species depending on if they're wearing shoes.
+/datum/species/proc/get_move_trail(var/mob/living/carbon/human/H)
+ if(H.lying)
+ return /obj/effect/decal/cleanable/blood/footprints/tracks/body
+ if(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))
+ var/obj/item/clothing/shoes/shoes = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) ? H.wear_suit : H.shoes // suits take priority over shoes
+ return shoes.move_trail
+ else
+ return move_trail */
/datum/species/proc/spec_life(mob/living/carbon/human/H)
if(HAS_TRAIT(H, TRAIT_NOBREATH))
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 94dba550b6..d264f11b73 100644
--- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
@@ -3,7 +3,7 @@
id = "insect"
say_mod = "flutters"
default_color = "00FF00"
- species_traits = list(LIPS,NOEYES,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR)
+ species_traits = list(LIPS,NOEYES,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
mutant_bodyparts = list("mam_ears", "mam_snout", "mam_tail", "taur", "insect_wings", "mam_snouts", "insect_fluff","horns")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None",
@@ -17,6 +17,7 @@
toxic_food = MEAT | RAW
mutanteyes = /obj/item/organ/eyes/insect
should_draw_citadel = TRUE
+ exotic_bloodtype = "BUG"
/datum/species/insect/on_species_gain(mob/living/carbon/C)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm
index 1ee697d66c..ec58a3be9c 100644
--- a/code/modules/mob/living/carbon/human/species_types/felinid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm
@@ -4,8 +4,8 @@
id = "felinid"
limbs_id = "human"
- mutant_bodyparts = list("mam_ears", "mam_tail")
- default_features = list("mcolor" = "FFF", "mam_tail" = "Cat", "mam_ears" = "Cat", "wings" = "None")
+ mutant_bodyparts = list("mam_ears", "mam_tail", "deco_wings")
+ default_features = list("mcolor" = "FFF", "mam_tail" = "Cat", "mam_ears" = "Cat", "wings" = "None", "deco_wings" = "None")
mutantears = /obj/item/organ/ears/cat
mutanttail = /obj/item/organ/tail/cat
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index 043ee4fde1..0c3bcc2b00 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -10,6 +10,7 @@
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly
disliked_food = null
liked_food = GROSS
+ exotic_bloodtype = "BUG"
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.id == "pestkiller")
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index 07e594d20b..90714b390c 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -3,7 +3,7 @@
id = "mammal"
default_color = "4B4B4B"
should_draw_citadel = TRUE
- species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR)
+ species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "deco_wings", "taur", "horns", "legs")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None",
@@ -65,7 +65,7 @@
miss_sound = 'sound/weapons/slashmiss.ogg'
meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
skinned_type = /obj/item/stack/sheet/animalhide/xeno
- exotic_bloodtype = "L"
+ exotic_bloodtype = "X*"
damage_overlay_type = "xeno"
liked_food = MEAT
diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm
index 96b43795a2..3332465c78 100644
--- a/code/modules/mob/living/carbon/human/species_types/humans.dm
+++ b/code/modules/mob/living/carbon/human/species_types/humans.dm
@@ -1,41 +1,42 @@
-/datum/species/human
- name = "Human"
- id = "human"
- default_color = "FFFFFF"
- species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY)
- mutant_bodyparts = list("ears", "tail_human", "wings", "taur") // CITADEL EDIT gives humans snowflake parts
- default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF","tail_human" = "None", "ears" = "None", "wings" = "None", "taur" = "None")
- use_skintones = 1
- skinned_type = /obj/item/stack/sheet/animalhide/human
- disliked_food = GROSS | RAW
- liked_food = JUNKFOOD | FRIED
-
-/datum/species/human/qualifies_for_rank(rank, list/features)
- return TRUE //Pure humans are always allowed in all roles.
-
-/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/human/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/human/can_wag_tail(mob/living/carbon/human/H)
- return ("tail_human" in mutant_bodyparts) || ("waggingtail_human" in mutant_bodyparts)
-
-/datum/species/human/is_wagging_tail(mob/living/carbon/human/H)
- return ("waggingtail_human" in mutant_bodyparts)
-
-/datum/species/human/start_wagging_tail(mob/living/carbon/human/H)
- if("tail_human" in mutant_bodyparts)
- mutant_bodyparts -= "tail_human"
- mutant_bodyparts |= "waggingtail_human"
- H.update_body()
-
-/datum/species/human/stop_wagging_tail(mob/living/carbon/human/H)
- if("waggingtail_human" in mutant_bodyparts)
- mutant_bodyparts -= "waggingtail_human"
- mutant_bodyparts |= "tail_human"
- H.update_body()
+/datum/species/human
+ name = "Human"
+ id = "human"
+ default_color = "FFFFFF"
+
+ species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR)
+ mutant_bodyparts = list("ears", "tail_human", "wings", "taur", "deco_wings") // CITADEL EDIT gives humans snowflake parts
+ default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF","tail_human" = "None", "ears" = "None", "wings" = "None", "taur" = "None", "deco_wings" = "None")
+ use_skintones = 1
+ skinned_type = /obj/item/stack/sheet/animalhide/human
+ disliked_food = GROSS | RAW
+ liked_food = JUNKFOOD | FRIED
+
+/datum/species/human/qualifies_for_rank(rank, list/features)
+ return TRUE //Pure humans are always allowed in all roles.
+
+/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
+ if(H)
+ stop_wagging_tail(H)
+
+/datum/species/human/spec_stun(mob/living/carbon/human/H,amount)
+ if(H)
+ stop_wagging_tail(H)
+ . = ..()
+
+/datum/species/human/can_wag_tail(mob/living/carbon/human/H)
+ return ("tail_human" in mutant_bodyparts) || ("waggingtail_human" in mutant_bodyparts)
+
+/datum/species/human/is_wagging_tail(mob/living/carbon/human/H)
+ return ("waggingtail_human" in mutant_bodyparts)
+
+/datum/species/human/start_wagging_tail(mob/living/carbon/human/H)
+ if("tail_human" in mutant_bodyparts)
+ mutant_bodyparts -= "tail_human"
+ mutant_bodyparts |= "waggingtail_human"
+ H.update_body()
+
+/datum/species/human/stop_wagging_tail(mob/living/carbon/human/H)
+ if("waggingtail_human" in mutant_bodyparts)
+ mutant_bodyparts -= "waggingtail_human"
+ mutant_bodyparts |= "tail_human"
+ H.update_body()
diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm
index 95b924ea18..135c98860a 100644
--- a/code/modules/mob/living/carbon/human/species_types/ipc.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm
@@ -12,8 +12,8 @@
default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None")
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
mutanttongue = /obj/item/organ/tongue/robot/ipc
-
- exotic_blood = "oil"
+ mutant_heart = /obj/item/organ/heart/ipc
+ exotic_bloodtype = "HF"
var/datum/action/innate/monitor_change/screen
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 03cd514300..f416854838 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -4,13 +4,15 @@
id = "jelly"
default_color = "00FF90"
say_mod = "chirps"
- species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
+ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,WINGCOLOR)
mutantlungs = /obj/item/organ/lungs/slime
- mutant_bodyparts = list("mam_tail", "mam_ears", "mam_snouts", "taur") //CIT CHANGE
- default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None") //CIT CHANGE
+ mutant_heart = /obj/item/organ/heart/slime
+ mutant_bodyparts = list("mam_tail", "mam_ears", "mam_snouts", "taur", "deco_wings") //CIT CHANGE
+ default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None") //CIT CHANGE
inherent_traits = list(TRAIT_TOXINLOVER)
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime
- exotic_blood = "slimejelly"
+ exotic_blood = "jellyblood"
+ exotic_bloodtype = "GEL"
damage_overlay_type = ""
var/datum/action/innate/regenerate_limbs/regenerate_limbs
var/datum/action/innate/slime_change/slime_change //CIT CHANGE
@@ -121,7 +123,7 @@
name = "Xenobiological Slime Entity"
id = "slime"
default_color = "00FFFF"
- species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
+ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR)
say_mod = "says"
hair_color = "mutcolor"
hair_alpha = 150
@@ -396,7 +398,7 @@
id = "slimeperson"
limbs_id = "slime"
default_color = "00FFFF"
- species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
+ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR)
inherent_traits = list(TRAIT_TOXINLOVER)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur")
default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None")
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 4dbfd23df8..a719f2eda0 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -4,16 +4,16 @@
id = "lizard"
say_mod = "hisses"
default_color = "00FF00"
- species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR)
+ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_REPTILE)
- mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur")
+ mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur", "deco_wings")
mutanttongue = /obj/item/organ/tongue/lizard
mutanttail = /obj/item/organ/tail/lizard
coldmod = 1.5
heatmod = 0.67
default_features = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round",
"horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None",
- "legs" = "Digitigrade", "taur" = "None")
+ "legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index 5a20ca37a8..6a4c7a4463 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -22,6 +22,7 @@
/datum/species/skeleton/space
name = "Spooky Spacey Skeleton"
id = "spaceskeleton"
+ limbs_id = "skeleton"
blacklisted = 1
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index e0cc3bb147..fefaa025d3 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -18,6 +18,7 @@
/datum/species/zombie/notspaceproof
id = "notspaceproofzombie"
+ limbs_id = "zombie"
blacklisted = 0
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH)
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index fa3e29f119..a68aded85f 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -180,7 +180,7 @@ There are several things that need to be remembered:
inv.update_icon()
if(!gloves && bloody_hands)
- var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER)
+ var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER, color = blood_DNA_to_color())
if(get_num_arms() < 2)
if(has_left_hand())
bloody_overlay.icon_state = "bloodyhands_left"
@@ -270,6 +270,32 @@ There are several things that need to be remembered:
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES]
inv.update_icon()
+/*
+ if(!shoes && bloody_feet)
+ var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color())
+ if(dna.features["taur"] != "None")
+ if(dna.features["taur"] in GLOB.noodle_taurs)
+ bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "snekbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color())
+ if(get_num_legs() < 2)
+ if(has_left_leg())
+ bloody_overlay.icon_state = "snekbloodyfeet_left"
+ else if(has_right_leg())
+ bloody_overlay.icon_state = "snekbloodyfeet_right"
+ else if(dna.features["taur"] in GLOB.paw_taurs)
+ bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "pawbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color())
+ if(get_num_legs() < 2)
+ if(has_left_leg())
+ bloody_overlay.icon_state = "pawbloodyfeet_left"
+ else if(has_right_leg())
+ bloody_overlay.icon_state = "pawbloodyfeet_right"
+ else
+ if(get_num_legs() < 2)
+ if(has_left_leg())
+ bloody_overlay.icon_state = "bloodyfeet_left"
+ else if(has_right_leg())
+ bloody_overlay.icon_state = "bloodyfeet_right"
+
+ overlays_standing[GLOVES_LAYER] = bloody_overlay*/
if(shoes)
var/obj/item/clothing/shoes/S = shoes
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index cdae073af8..63a83ac96b 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -97,8 +97,12 @@
/mob/living/carbon/update_damage_overlays()
remove_overlay(DAMAGE_LAYER)
+ var/dam_colors = "#E62525"
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+ dam_colors = bloodtype_to_color(H.dna.blood_type)
- var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER)
+ var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER, color = dam_colors)
overlays_standing[DAMAGE_LAYER] = damage_overlay
for(var/X in bodyparts)
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 563ab7cfb6..fbb6074ba2 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -79,7 +79,7 @@
-/mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE)
+/mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE, knockdown_stamoverride, knockdown_stammax)
var/hit_percent = (100-blocked)/100
if(!effect || (hit_percent <= 0))
return 0
@@ -87,7 +87,7 @@
if(EFFECT_STUN)
Stun(effect * hit_percent)
if(EFFECT_KNOCKDOWN)
- Knockdown(effect * hit_percent)
+ Knockdown(effect * hit_percent, override_stamdmg = knockdown_stammax ? CLAMP(knockdown_stamoverride, 0, knockdown_stammax-getStaminaLoss()) : knockdown_stamoverride)
if(EFFECT_UNCONSCIOUS)
Unconscious(effect * hit_percent)
if(EFFECT_IRRADIATE)
@@ -107,13 +107,13 @@
return 1
-/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0)
+/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0, kd_stamoverride, kd_stammax)
if(blocked >= 100)
return 0
if(stun)
apply_effect(stun, EFFECT_STUN, blocked)
if(knockdown)
- apply_effect(knockdown, EFFECT_KNOCKDOWN, blocked)
+ apply_effect(knockdown, EFFECT_KNOCKDOWN, blocked, kd_stamoverride, kd_stammax)
if(unconscious)
apply_effect(unconscious, EFFECT_UNCONSCIOUS, blocked)
if(irradiate)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 6c58921abc..2b2cc4c0b5 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -226,6 +226,9 @@
to_chat(src,"ERROR: Module installer reply timeout. Please check internal connections.")
return
+ if(!CONFIG_GET(flag/disable_secborg) && GLOB.security_level < CONFIG_GET(number/minimum_secborg_alert))
+ to_chat(src, "NOTICE: Due to local station regulations, the security cyborg module and its variants are only available during [num2seclevel(CONFIG_GET(number/minimum_secborg_alert))] alert and greater.")
+
var/list/modulelist = list("Standard" = /obj/item/robot_module/standard, \
"Engineering" = /obj/item/robot_module/engineering, \
"Medical" = /obj/item/robot_module/medical, \
@@ -234,7 +237,7 @@
"Service" = /obj/item/robot_module/butler)
if(!CONFIG_GET(flag/disable_peaceborg))
modulelist["Peacekeeper"] = /obj/item/robot_module/peacekeeper
- if(!CONFIG_GET(flag/disable_secborg))
+ if(BORG_SEC_AVAILABLE)
modulelist["Security"] = /obj/item/robot_module/security
modulelist += get_cit_modules() //Citadel change - adds Citadel's borg modules.
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index ab1e906cf2..d31c368ca4 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -198,7 +198,6 @@
)
if(blood)
- target_types += /obj/effect/decal/cleanable/xenoblood
target_types += /obj/effect/decal/cleanable/blood
target_types += /obj/effect/decal/cleanable/trail_holder
target_types += /obj/effect/decal/cleanable/insectguts
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 1bc7493684..94283f82da 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -476,7 +476,8 @@
if(isturf(next))
if(bloodiness)
var/obj/effect/decal/cleanable/blood/tracks/B = new(loc)
- B.add_blood_DNA(return_blood_DNA())
+ if(blood_DNA && blood_DNA.len)
+ B.blood_DNA |= blood_DNA.Copy()
var/newdir = get_dir(next, loc)
if(newdir == dir)
B.setDir(newdir)
@@ -489,7 +490,6 @@
B.setDir(newdir)
bloodiness--
-
var/oldloc = loc
var/moved = step_towards(src, next) // attempt to move
if(cell)
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 8bf1874d84..d31809e9aa 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/support.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm
@@ -30,7 +30,7 @@
C.adjustBruteLoss(-5)
C.adjustFireLoss(-5)
C.adjustOxyLoss(-5)
- C.adjustToxLoss(-5)
+ C.adjustToxLoss(-5, forced = TRUE)
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(C))
if(namedatum)
H.color = namedatum.colour
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 3d92912f9c..5240b4d06c 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -168,7 +168,6 @@
/mob/living/simple_animal/hostile/alien/maid/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/cleaning)
/mob/living/simple_animal/hostile/alien/maid/AttackingTarget()
if(ismovableatom(target))
@@ -177,6 +176,7 @@
qdel(target)
return TRUE
var/atom/movable/M = target
- SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ M.clean_blood()
visible_message("[src] polishes \the [target].")
return TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
index c2d0a214b4..910e9c3c4a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
@@ -39,7 +39,7 @@
animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch
childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55)
- wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/)
+ wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/)
var/obj/item/udder/gutlunch/udder = null
/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize()
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 93b4d32123..8c287229d7 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -487,6 +487,26 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
/mob/proc/can_hear()
. = TRUE
+/proc/bloodtype_to_color(var/type)
+ . = BLOOD_COLOR_HUMAN
+ switch(type)
+ if("U")//Universal blood; a bit orange
+ . = BLOOD_COLOR_UNIVERSAL
+ if("SY")//Synthetics blood; blue
+ . = BLOOD_COLOR_SYNTHETIC
+ if("L")//lizard, a bit pink/purple
+ . = BLOOD_COLOR_LIZARD
+ if("X*")//xeno blood; greenish yellow
+ . = BLOOD_COLOR_XENO
+ if("HF")// Oil/Hydraulic blood. something something why not. reee
+ . = BLOOD_COLOR_OIL
+ if("GEL")// slimepeople blood, rgb 0, 255, 144
+ . = BLOOD_COLOR_SLIME
+ if("BUG")// yellowish, like, y'know bug guts I guess.
+ . = BLOOD_COLOR_BUG
+ //add more stuff to the switch if you have more blood colors for different types
+ // the defines are in _DEFINES/misc.dm
+
//Examine text for traits shared by multiple types. I wish examine was less copypasted.
/mob/proc/common_trait_examine()
if(HAS_TRAIT(src, TRAIT_DISSECTED))
@@ -497,4 +517,4 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
dissectionmsg = " via Experimental Dissection"
else if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED,"Thorough Dissection"))
dissectionmsg = " via Thorough Dissection"
- . += "This body has been dissected and analyzed[dissectionmsg].
"
\ No newline at end of file
+ . += "This body has been dissected and analyzed[dissectionmsg].
"
diff --git a/code/modules/oracle_ui/hookup_procs.dm b/code/modules/oracle_ui/hookup_procs.dm
index e6038744c1..0a092caf30 100644
--- a/code/modules/oracle_ui/hookup_procs.dm
+++ b/code/modules/oracle_ui/hookup_procs.dm
@@ -23,6 +23,8 @@
return TRUE
if(user.incapacitated())
return FALSE
+ if(isobj(src.loc) && get_dist(src, user) < 2)
+ return TRUE
if(isturf(src.loc) && Adjacent(user))
return TRUE
return FALSE
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 059a42bb36..471aca34c7 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -32,6 +32,7 @@
var/contact_poison // Reagent ID to transfer on contact
var/contact_poison_volume = 0
var/datum/oracle_ui/ui = null
+ var/force_stars = FALSE // If we should force the text to get obfuscated with asterisks
/obj/item/paper/pickup(user)
@@ -59,7 +60,8 @@
updateinfolinks()
/obj/item/paper/oui_getcontent(mob/target)
- if(!target.is_literate())
+ if(!target.is_literate() || force_stars)
+ force_stars = FALSE
return "[name][stars(info)]
[stamps]"
else if(istype(target.get_active_held_item(), /obj/item/pen) | istype(target.get_active_held_item(), /obj/item/toy/crayon))
return "[name][info_links]
[stamps]"
@@ -70,8 +72,8 @@
if(check_rights_for(target.client, R_FUN)) //Allows admins to view faxes
return TRUE
if(isAI(target))
- var/mob/living/silicon/ai/ai = target
- return get_dist(src, ai.current) < 2
+ force_stars = TRUE
+ return TRUE
if(iscyborg(target))
return get_dist(src, target) < 2
return ..()
@@ -133,18 +135,8 @@
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
addtimer(CALLBACK(src, .proc/reset_spamflag), 20)
-
/obj/item/paper/attack_ai(mob/living/silicon/ai/user)
- var/dist
- if(istype(user) && user.current) //is AI
- dist = get_dist(src, user.current)
- else //cyborg or AI not seeing through a camera
- dist = get_dist(src, user)
- if(dist < 2)
- show_content(user)
- else
- to_chat(user, "You can't quite see it.")
-
+ show_content(user)
/obj/item/paper/proc/addtofield(id, text, links = 0)
var/locid = 0
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 5bcb7a60df..875a65d306 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -158,6 +158,7 @@
if(..())
if(reagents.total_volume)
if(M.reagents)
+ reagents.reaction(M, INJECT)
reagents.trans_to(M, reagents.total_volume)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 120976b61f..8d2162a0ff 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -421,7 +421,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if(prob(50))
radiation_pulse(src, power * (1 + (tritiumcomp * TRITIUM_RADIOACTIVITY_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_RADIOACTIVITY_MODIFIER) * pluoxiumbonus) * (power_transmission_bonus/(10-(bzcomp * BZ_RADIOACTIVITY_MODIFIER))))) // Rad Modifiers BZ(500%), Tritium(300%), and Pluoxium(-200%)
if(bzcomp >= 0.4 && prob(30 * bzcomp))
- src.fire_nuclear_particles() // Start to emit radballs at a maximum of 30% chance per tick
+ fire_nuclear_particle() // Start to emit radballs at a maximum of 30% chance per tick
var/device_energy = power * REACTION_POWER_MODIFIER
diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm
index 638711e8d4..0940144721 100644
--- a/code/modules/projectiles/ammunition/energy/laser.dm
+++ b/code/modules/projectiles/ammunition/energy/laser.dm
@@ -71,9 +71,3 @@
projectile_type = /obj/item/projectile/beam/mindflayer
select_name = "MINDFUCK"
fire_sound = 'sound/weapons/laser.ogg'
-
-/obj/item/ammo_casing/energy/laser/weak
- projectile_type = /obj/item/projectile/beam/weak/minigun
- e_cost = 10
- fire_sound = 'sound/weapons/gatling.ogg'
- click_cooldown_override = 1
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index b5e34ea152..2f198c1319 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -169,7 +169,7 @@
if(iscarbon(user))
var/mob/living/carbon/C = user
user_dna = C.dna
- B.add_blood_DNA(user_dna)
+ B.add_blood_DNA(user_dna, C.diseases)
var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, /proc/spawn_atom_to_turf, /obj/effect/gibspawner/generic, B, 1, FALSE, list(user_dna))
B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner)
return(BRUTELOSS)
diff --git a/code/modules/projectiles/guns/energy/minigun.dm b/code/modules/projectiles/guns/energy/minigun.dm
deleted file mode 100644
index d903cda47c..0000000000
--- a/code/modules/projectiles/guns/energy/minigun.dm
+++ /dev/null
@@ -1,149 +0,0 @@
-//The ammo/gun is stored in a back slot item
-/obj/item/minigunpack2
- name = " Laser Gatling Pack"
- desc = "A massive battery pack with an attached laser gatling gun!"
- icon = 'icons/obj/guns/minigun.dmi'
- icon_state = "holstered"
- item_state = "backpack"
- lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
- slot_flags = ITEM_SLOT_BACK
- w_class = WEIGHT_CLASS_HUGE
- var/obj/item/gun/energy/minigun/gun
- var/armed = 0 //whether the gun is attached, 0 is attached, 1 is the gun is wielded.
- var/overheat = 0
- var/overheat_max = 60
- var/heat_diffusion = 5
-
-/obj/item/minigunpack2/Initialize()
- . = ..()
- gun = new(src)
- START_PROCESSING(SSobj, src)
-
-/obj/item/minigunpack2/Destroy()
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-/obj/item/minigunpack2/process()
- overheat = max(0, overheat - heat_diffusion)
-
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/minigunpack2/attack_hand(var/mob/living/carbon/user)
- if(src.loc == user)
- if(!armed)
- if(user.get_item_by_slot(SLOT_BACK) == src)
- armed = 1
- if(!user.put_in_hands(gun))
- armed = 0
- to_chat(user, "You need a free hand to hold the gun!")
- return
- update_icon()
- user.update_inv_back()
- else
- to_chat(user, "You are already holding the gun!")
- else
- ..()
-
-/obj/item/minigunpack2/attackby(obj/item/W, mob/user, params)
- if(W == gun) //Don't need armed check, because if you have the gun assume its armed.
- user.dropItemToGround(gun, TRUE)
- else
- ..()
-
-/obj/item/minigunpack2/dropped(mob/user)
- if(armed)
- user.dropItemToGround(gun, TRUE)
-
-/obj/item/minigunpack2/MouseDrop(atom/over_object)
- . = ..()
- if(armed)
- return
- if(iscarbon(usr))
- var/mob/M = usr
-
- if(!over_object)
- return
-
- if(!M.incapacitated())
-
- if(istype(over_object, /obj/screen/inventory/hand))
- var/obj/screen/inventory/hand/H = over_object
- M.putItemFromInventoryInHandIfPossible(src, H.held_index)
-
-
-/obj/item/minigunpack2/update_icon()
- if(armed)
- icon_state = "notholstered"
- else
- icon_state = "holstered"
-
-/obj/item/minigunpack2/proc/attach_gun(var/mob/user)
- if(!gun)
- gun = new(src)
- gun.forceMove(src)
- armed = 0
- if(user)
- to_chat(user, "You attach the [gun.name] to the [name].")
- else
- src.visible_message("The [gun.name] snaps back onto the [name]!")
- update_icon()
- user.update_inv_back()
-
-
-/obj/item/gun/energy/minigun
- name = "laser gatling gun"
- desc = "An advanced laser cannon with an incredible rate of fire. Requires a bulky backpack power source to use."
- icon = 'icons/obj/guns/minigun.dmi'
- icon_state = "minigun_spin"
- item_state = "minigun"
- flags_1 = CONDUCT_1
- force = 15
- recoil = 2
- slowdown = 1
- slot_flags = null
- w_class = WEIGHT_CLASS_HUGE
- materials = list()
- ammo_type = list(/obj/item/ammo_casing/energy/laser/weak)
- burst_size = 2
- automatic = 1
- can_charge = 0
- selfcharge = EGUN_SELFCHARGE
- charge_tick = 2
- charge_delay = 5
- weapon_weight = WEAPON_HEAVY
- item_flags = NEEDS_PERMIT | SLOWS_WHILE_IN_HAND
- var/obj/item/minigunpack2/ammo_pack
-
-/obj/item/gun/energy/minigun/Initialize()
- if(istype(loc, /obj/item/minigunpack2)) //We should spawn inside an ammo pack so let's use that one.
- ammo_pack = loc
- else
- return INITIALIZE_HINT_QDEL //No pack, no gun
-
- return ..()
-
-/obj/item/gun/energy/minigun/attack_self(mob/living/user)
- return
-
-/obj/item/gun/energy/minigun/dropped(mob/user)
- if(ammo_pack)
- ammo_pack.attach_gun(user)
- else
- qdel(src)
-
-/obj/item/gun/energy/minigun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
- if(ammo_pack)
- if(ammo_pack.overheat < ammo_pack.overheat_max)
- ammo_pack.overheat += burst_size
- ..()
- else
- to_chat(user, "The gun's heat sensor locked the trigger to prevent lens damage.")
-
-/obj/item/gun/energy/minigun/afterattack(atom/target, mob/living/user, flag, params)
- if(!ammo_pack || ammo_pack.loc != user)
- to_chat(user, "You need the backpack power source to fire the gun!")
- . = ..()
-
-/obj/item/gun/energy/minigun/dropped(mob/living/user)
- ammo_pack.attach_gun(user)
-
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 44c7894467..c5d4c36813 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -20,7 +20,7 @@
name = "hybrid taser"
desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams."
icon_state = "advtaser"
- ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler)
+ ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode)
ammo_x_offset = 2
/obj/item/gun/energy/e_gun/advtaser/cyborg
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index efae090707..8b881b57ed 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -88,6 +88,8 @@
//Effects
var/stun = 0
var/knockdown = 0
+ var/knockdown_stamoverride
+ var/knockdown_stam_max
var/unconscious = 0
var/irradiate = 0
var/stutter = 0
@@ -161,15 +163,26 @@
var/splatter_dir = dir
if(starting)
splatter_dir = get_dir(starting, target_loca)
- if(isalien(L))
+ var/obj/item/bodypart/B = L.get_bodypart(def_zone)
+ if(B.status == BODYPART_ROBOTIC) // So if you hit a robotic, it sparks instead of bloodspatters
+ do_sparks(2, FALSE, target.loc)
+ if(prob(25))
+ new /obj/effect/decal/cleanable/oil(target_loca)
+ else if(isalien(L))
new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir)
else
- new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color(H.dna.blood_type))
+ else
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color())
+
if(iscarbon(L))
var/mob/living/carbon/C = L
C.bleed(damage)
else
L.add_splatter_floor(target_loca)
+
else if(impact_effect_type && !hitscan)
new impact_effect_type(target_loca, hitx, hity)
@@ -202,7 +215,7 @@
else
L.log_message("has been shot by [firer] with [src]", LOG_ATTACK, color="orange")
- return L.apply_effects(stun, knockdown, unconscious, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter)
+ return L.apply_effects(stun, knockdown, unconscious, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter, knockdown_stamoverride, knockdown_stam_max)
/obj/item/projectile/proc/vol_by_damage()
if(src.damage)
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index d8154b367d..e43eb5a3bc 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -39,14 +39,6 @@
/obj/item/projectile/beam/weak
damage = 15
-/obj/item/projectile/beam/weak/minigun
- damage = 12.5
- armour_penetration = 40
-
-/obj/item/projectile/beam/weak/minigun/Initialize()
- .=..()
- speed = pick(0.7,0.75,0.8,0.85,0.9,0.95,1,1.05,1.1,1.15)
-
/obj/item/projectile/beam/weak/penetrator
armour_penetration = 50
diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm
index 1c5158f59a..94ec2d3c2b 100644
--- a/code/modules/projectiles/projectile/bullets/smg.dm
+++ b/code/modules/projectiles/projectile/bullets/smg.dm
@@ -1,60 +1,69 @@
-// .45 (M1911 & C20r)
-
-/obj/item/projectile/bullet/c45
- name = ".45 bullet"
- damage = 20
- stamina = 65
-
-/obj/item/projectile/bullet/c45_nostamina
- name = ".45 bullet"
- damage = 30
-
-/obj/item/projectile/bullet/c45_cleaning
- name = ".45 bullet"
- damage = 24
- stamina = 10
-
-/obj/item/projectile/bullet/c45_cleaning/on_hit(atom/target, blocked = FALSE)
- . = ..()
- var/turf/T = get_turf(target)
-
- //section shamelessly copypasta'd from the clean component
- SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- for(var/A in T)
- if(is_cleanable(A))
- qdel(A)
- else if(istype(A, /obj/item))
- var/obj/item/I = A
- SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- if(ismob(I.loc))
- var/mob/M = I.loc
- M.regenerate_icons()
- else if(ishuman(A))
- var/mob/living/carbon/human/cleaned_human = A
- if(cleaned_human.head)
- SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- if(cleaned_human.wear_suit)
- SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- else if(cleaned_human.w_uniform)
- SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- if(cleaned_human.shoes)
- SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- cleaned_human.wash_cream()
- cleaned_human.regenerate_icons()
-
-// 4.6x30mm (Autorifles)
-
-/obj/item/projectile/bullet/c46x30mm
- name = "4.6x30mm bullet"
- damage = 15
-
-/obj/item/projectile/bullet/c46x30mm_ap
- name = "4.6x30mm armor-piercing bullet"
- damage = 12.5
- armour_penetration = 40
-
-/obj/item/projectile/bullet/incendiary/c46x30mm
- name = "4.6x30mm incendiary bullet"
- damage = 7.5
- fire_stacks = 1
+// .45 (M1911 & C20r)
+
+/obj/item/projectile/bullet/c45
+ name = ".45 bullet"
+ damage = 20
+ stamina = 65
+
+/obj/item/projectile/bullet/c45_nostamina
+ name = ".45 bullet"
+ damage = 30
+
+/obj/item/projectile/bullet/c45_cleaning
+ name = ".45 bullet"
+ damage = 24
+ stamina = 10
+
+/obj/item/projectile/bullet/c45_cleaning/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ var/turf/T = get_turf(target)
+ SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ for(var/A in T)
+ if(is_cleanable(A))
+ qdel(A)
+ else if(isitem(A))
+ var/obj/item/cleaned_item = A
+ SEND_SIGNAL(cleaned_item, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_item.clean_blood()
+ if(ismob(cleaned_item.loc))
+ var/mob/M = cleaned_item.loc
+ M.regenerate_icons()
+ else if(ishuman(A))
+ var/mob/living/carbon/human/cleaned_human = A
+ if(cleaned_human.lying)
+ if(cleaned_human.head)
+ SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.head.clean_blood()
+ cleaned_human.update_inv_head()
+ if(cleaned_human.wear_suit)
+ SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.wear_suit.clean_blood()
+ cleaned_human.update_inv_wear_suit()
+ else if(cleaned_human.w_uniform)
+ SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.w_uniform.clean_blood()
+ cleaned_human.update_inv_w_uniform()
+ if(cleaned_human.shoes)
+ SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.shoes.clean_blood()
+ cleaned_human.update_inv_shoes()
+ SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.clean_blood()
+ cleaned_human.wash_cream()
+ cleaned_human.regenerate_icons()
+
+// 4.6x30mm (Autorifles)
+
+/obj/item/projectile/bullet/c46x30mm
+ name = "4.6x30mm bullet"
+ damage = 15
+
+/obj/item/projectile/bullet/c46x30mm_ap
+ name = "4.6x30mm armor-piercing bullet"
+ damage = 12.5
+ armour_penetration = 40
+
+/obj/item/projectile/bullet/incendiary/c46x30mm
+ name = "4.6x30mm incendiary bullet"
+ damage = 7.5
+ fire_stacks = 1
diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm
index 1753587ad3..e08f806fe5 100644
--- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm
+++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm
@@ -3,10 +3,9 @@
name = "nuclear particle"
icon_state = "nuclear_particle"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
- damage = 20
- damage_type = TOX
- irradiate = 2500 //enough to knockdown and induce vomiting
- speed = 0.4
+ flag = "rad"
+ irradiate = 5000
+ speed = 0.4
hitsound = 'sound/weapons/emitter2.ogg'
impact_type = /obj/effect/projectile/impact/xray
var/static/list/particle_colors = list(
@@ -25,22 +24,6 @@
add_atom_colour(particle_colors[our_color], FIXED_COLOUR_PRIORITY)
set_light(4, 3, particle_colors[our_color]) //Range of 4, brightness of 3 - Same range as a flashlight
-/atom/proc/fire_nuclear_particles(power_ratio) //used by fusion to fire random # of nuclear particles - power ratio determines about how many are fired
- var/random_particles = rand(3,6)
- var/particles_to_fire
- var/particles_fired
- switch(power_ratio) //multiply random_particles * factor for whatever tier
- if(0 to FUSION_MID_TIER_THRESHOLD)
- particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_LOW
- if(FUSION_MID_TIER_THRESHOLD to FUSION_HIGH_TIER_THRESHOLD)
- particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_MID
- if(FUSION_HIGH_TIER_THRESHOLD to FUSION_SUPER_TIER_THRESHOLD)
- particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_HIGH
- if(FUSION_SUPER_TIER_THRESHOLD to INFINITY)
- particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_SUPER
- while(particles_to_fire)
- particles_fired++
- var/angle = rand(0,360)
- var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src)
- addtimer(CALLBACK(P, /obj/item/projectile.proc/fire, angle), particles_fired) //multiply particles fired * delay so the particles end up stagnated (once every decisecond)
- particles_to_fire--
\ No newline at end of file
+/atom/proc/fire_nuclear_particle(angle = rand(0,360)) //used by fusion to fire random nuclear particles. Fires one particle in a random direction.
+ var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src)
+ P.fire(angle)
diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm
index 895a165f49..d7c8b8b082 100644
--- a/code/modules/projectiles/projectile/energy/stun.dm
+++ b/code/modules/projectiles/projectile/energy/stun.dm
@@ -3,7 +3,9 @@
icon_state = "spark"
color = "#FFFF00"
nodamage = 1
- knockdown = 100
+ knockdown = 60
+ knockdown_stamoverride = 36
+ knockdown_stam_max = 50
stutter = 5
jitter = 20
hitsound = 'sound/weapons/taserhit.ogg'
@@ -11,6 +13,7 @@
tracer_type = /obj/effect/projectile/tracer/stun
muzzle_type = /obj/effect/projectile/muzzle/stun
impact_type = /obj/effect/projectile/impact/stun
+ var/tase_duration = 50
/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE)
. = ..()
@@ -23,6 +26,7 @@
if(C.dna && C.dna.check_mutation(HULK))
C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE))
+ C.apply_status_effect(STATUS_EFFECT_TASED, tase_duration)
addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5)
/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm
index baf1495abb..1d359585c0 100644
--- a/code/modules/projectiles/projectile/special/neurotoxin.dm
+++ b/code/modules/projectiles/projectile/special/neurotoxin.dm
@@ -8,7 +8,7 @@
if(isalien(target))
knockdown = 0
nodamage = TRUE
- else if(isliving(target))
+ else if(iscarbon(target))
var/mob/living/L = target
L.Knockdown(100, TRUE, FALSE, 30, 25)
return ..()
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 6efa4276b6..05fa4d382a 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -188,7 +188,7 @@
to_chat(usr, "ERROR: Cannot replicate virus strain.")
return
A = A.Copy()
- var/list/data = list("viruses" = list(A))
+ var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY", "viruses" = list(A))
var/obj/item/reagent_containers/glass/bottle/B = new(drop_location())
B.name = "[A.name] culture bottle"
B.desc = "A small bottle. Contains [A.agent] culture in synthblood medium."
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 95b4a33c0d..7b41368495 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1,9 +1,9 @@
/datum/reagent/blood
- data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
name = "Blood"
id = "blood"
- color = "#C80000" // rgb: 200, 0, 0
- description = "Blood from a human, or otherwise."
+ color = BLOOD_COLOR_HUMAN // rgb: 200, 0, 0
+ description = "Blood from some creature."
metabolization_rate = 5 //fast rate so it disappears fast.
taste_description = "iron"
taste_mult = 1.3
@@ -28,27 +28,75 @@
if(iscarbon(L))
var/mob/living/carbon/C = L
- if(C.get_blood_id() == "blood" && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits))))
- if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type)))
- C.reagents.add_reagent("toxin", reac_volume * 0.5)
- else
- C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM)
+ var/blood_id = C.get_blood_id()
+ if((blood_id == "blood" || blood_id == "jellyblood") && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits))))
+ C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM * C.blood_ratio)
+ // we don't care about bloodtype here, we're just refilling the mob
- if(reac_volume >= 10 && istype(L))
+ if(reac_volume >= 10 && istype(L) && method != INJECT)
L.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
+/datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino.
+ var/blood_id = C.get_blood_id()
+ if((blood_id == "blood" || blood_id == "jellyblood"))
+ if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be
+ C.adjustToxLoss(rand(2,8)*REM, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person
+ ..()
+
/datum/reagent/blood/reaction_obj(obj/O, volume)
if(volume >= 3 && istype(O))
- O.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
+ O.add_blood_DNA(data)
+
+/datum/reagent/blood/reaction_turf(turf/T, reac_volume)//splash the blood all over the place
+ if(!istype(T))
+ return
+ if(reac_volume < 3)
+ return
+
+ var/obj/effect/decal/cleanable/blood/B = locate() in T //find some blood here
+ if(!B)
+ B = new(T)
+ if(data["blood_DNA"])
+ B.blood_DNA[data["blood_DNA"]] = data["blood_type"]
+ if(!B.reagents)
+ B.reagents.add_reagent(id, reac_volume)
+ B.update_icon()
/datum/reagent/blood/on_new(list/data)
if(istype(data))
SetViruses(src, data)
+ color = bloodtype_to_color(data["blood_type"])
+ if(data["blood_type"] == "SY")
+ name = "Synthetic Blood"
+ taste_description = "oily"
+
+ if(data["blood_type"] == "X*")
+ name = "Xenomorph Blood"
+ taste_description = "acidic heresy"
+ shot_glass_icon_state = "shotglassgreen"
+ pH = 2.5
+
+ if(data["blood_type"] == "HF")
+ name = "Hydraulic Blood"
+ taste_description = "burnt oil"
+ pH = 9.75
+
+ if(data["blood_type"] == "BUG")
+ name = "Insect Blood"
+ taste_description = "greasy"
+ pH = 7.25
+
+ if(data["blood_type"] == "L")
+ name = "Lizard Blood"
+ taste_description = "spicy"
+ pH = 6.85
+
+
/datum/reagent/blood/on_merge(list/mix_data)
if(data && mix_data)
if(data["blood_DNA"] != mix_data["blood_DNA"])
- data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning if the DNA sample doesn't match.
+ data["cloneable"] = FALSE //On mix, consider the genetic sampling unviable for pod cloning if the DNA sample doesn't match.
if(data["viruses"] || mix_data["viruses"])
var/list/mix1 = data["viruses"]
@@ -78,27 +126,111 @@
var/datum/disease/D = thing
. += D
-/datum/reagent/blood/reaction_turf(turf/T, reac_volume)//splash the blood all over the place
- if(!istype(T))
- return
- if(reac_volume < 3)
- return
+/datum/reagent/blood/synthetics
+ data = list("donor"=null,"viruses"=null,"blood_DNA"="REPLICATED", "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Synthetic Blood"
+ id = "syntheticblood"
+ taste_description = "oily"
+ color = BLOOD_COLOR_SYNTHETIC // rgb: 11, 7, 48
- var/obj/effect/decal/cleanable/blood/B = locate() in T //find some blood here
- if(!B)
- B = new(T)
- if(data["blood_DNA"])
- B.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
+/datum/reagent/blood/lizard
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_LIZARD, "blood_type"="L","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Lizard Blood"
+ id = "lizardblood"
+ taste_description = "spicy"
+ color = BLOOD_COLOR_LIZARD // rgb: 11, 7, 48
+ pH = 6.85
+
+/datum/reagent/blood/jellyblood
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SLIME, "blood_type"="GEL","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Slime Jelly Blood"
+ id = "jellyblood"
+ description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL."
+ color = BLOOD_COLOR_SLIME
+ taste_description = "slime"
+ taste_mult = 1.3
+ pH = 4
+
+/datum/reagent/blood/xenomorph
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_XENO, "blood_type"="X*","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Xenomorph Blood"
+ id = "xenoblood"
+ taste_description = "acidic heresy"
+ color = BLOOD_COLOR_XENO // greenish yellow ooze
+ shot_glass_icon_state = "shotglassgreen"
+ pH = 2.5
+
+/datum/reagent/blood/oil
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_OIL, "blood_type"="HF","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Hydraulic Blood"
+ id = "oilblood"
+ taste_description = "burnt oil"
+ color = BLOOD_COLOR_OIL // dark, y'know, expected batman colors.
+ pH = 9.75
+
+/datum/reagent/blood/insect
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_BUG, "blood_type"="BUG","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Insectoid Blood"
+ id = "bugblood"
+ taste_description = "waxy"
+ color = BLOOD_COLOR_BUG // Bug colored, I guess.
+ pH = 7.25
+
+
+/datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M)
+ if(prob(10))
+ if(M.dna?.species?.exotic_bloodtype != "GEL")
+ to_chat(M, "Your insides are burning!")
+ M.adjustToxLoss(rand(20,60)*REM, 0)
+ . = 1
+ else if(prob(40) && isjellyperson(M))
+ M.heal_bodypart_damage(2*REM)
+ . = 1
+ ..()
/datum/reagent/liquidgibs
name = "Liquid gibs"
id = "liquidgibs"
- color = "#FF9966"
+ color = BLOOD_COLOR_HUMAN
description = "You don't even want to think about what's in here."
taste_description = "gross iron"
shot_glass_icon_state = "shotglassred"
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= "O+","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
pH = 7.45
+/datum/reagent/liquidgibs/xeno
+ name = "Liquid xeno gibs"
+ id = "liquidxenogibs"
+ color = BLOOD_COLOR_XENO
+ taste_description = "blended heresy"
+ shot_glass_icon_state = "shotglassgreen"
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_XENO, "blood_type"="X*","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ pH = 2.5
+
+/datum/reagent/liquidgibs/slime
+ name = "Slime sludge"
+ id = "liquidslimegibs"
+ color = BLOOD_COLOR_SLIME
+ taste_description = "slime"
+ shot_glass_icon_state = "shotglassgreen"
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SLIME, "blood_type"="GEL","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ pH = 4
+
+/datum/reagent/liquidgibs/synth
+ name = "Synthetic sludge"
+ id = "liquidsyntheticgibs"
+ color = BLOOD_COLOR_SYNTHETIC
+ taste_description = "jellied plastic"
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+
+/datum/reagent/liquidgibs/oil
+ name = "Hydraulic sludge"
+ id = "liquidoilgibs"
+ color = BLOOD_COLOR_OIL
+ taste_description = "chunky burnt oil"
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_OIL, "blood_type"="HF","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ pH = 9.75
+
/datum/reagent/vaccine
//data must contain virus type
name = "Vaccine"
@@ -585,6 +717,30 @@
race = /datum/species/android
mutationtext = "The pain subsides. You feel... artificial."
+//Citadel Races
+/datum/reagent/mutationtoxin/mammal
+ name = "Mammal Mutation Toxin"
+ id = "mammalmutationtoxin"
+ description = "A glowing toxin."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/mammal
+ mutationtext = "The pain subsides. You feel... fluffier."
+
+/datum/reagent/mutationtoxin/insect
+ name = "Insect Mutation Toxin"
+ id = "insectmutationtoxin"
+ description = "A glowing toxin."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/insect
+ mutationtext = "The pain subsides. You feel... attracted to dark, moist areas."
+
+/datum/reagent/mutationtoxin/xenoperson
+ name = "Xeno-Hybrid Mutation Toxin"
+ id = "xenopersonmutationtoxin"
+ description = "A glowing toxin."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/xeno
+ mutationtext = "The pain subsides. You feel... oddly longing for the Queen." //sadly, not the British one.
//BLACKLISTED RACES
/datum/reagent/mutationtoxin/skeleton
@@ -947,12 +1103,12 @@
reagent_state = SOLID
taste_description = "iron"
pH = 6
-
+ overdose_threshold = 30
color = "#c2391d"
/datum/reagent/iron/on_mob_life(mob/living/carbon/C)
if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio))
- C.blood_volume += 0.5
+ C.blood_volume += 0.01 //we'll have synthetics from medbay.
..()
/datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
@@ -961,6 +1117,17 @@
M.reagents.add_reagent("toxin", reac_volume)
..()
+/datum/reagent/iron/overdose_start(mob/living/M)
+ to_chat(M, "You start feeling your guts twisting painfully!")
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/overdose, name)
+
+/datum/reagent/iron/overdose_process(mob/living/carbon/C)
+ if(prob(20))
+ var/obj/item/organ/liver/L = C.getorganslot(ORGAN_SLOT_LIVER)
+ if (istype(L))
+ C.applyLiverDamage(2) //mild until the fabled med rework comes out. the organ damage galore
+ ..()
+
/datum/reagent/gold
name = "Gold"
id = "gold"
@@ -1077,17 +1244,19 @@
pH = 5.5
/datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume)
- if(istype(O, /obj/effect/decal/cleanable))
+ if(istype(O, /obj/effect/decal/cleanable) || istype(O, /obj/item/projectile/bullet/reusable/foam_dart) || istype(O, /obj/item/ammo_casing/caseless/foam_dart))
qdel(O)
else
if(O)
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
- SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ O.clean_blood()
/datum/reagent/space_cleaner/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 1)
T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
- SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ T.clean_blood()
for(var/obj/effect/decal/cleanable/C in T)
qdel(C)
@@ -1105,26 +1274,33 @@
H.lip_style = null
H.update_body()
for(var/obj/item/I in C.held_items)
- SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ I.clean_blood()
if(C.wear_mask)
- if(SEND_SIGNAL(C.wear_mask, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
+ SEND_SIGNAL(C.wear_mask, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ if(C.wear_mask.clean_blood())
C.update_inv_wear_mask()
if(ishuman(M))
var/mob/living/carbon/human/H = C
if(H.head)
- if(SEND_SIGNAL(H.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
+ SEND_SIGNAL(H.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ if(H.head.clean_blood())
H.update_inv_head()
if(H.wear_suit)
- if(SEND_SIGNAL(H.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
+ SEND_SIGNAL(H.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ if(H.wear_suit.clean_blood())
H.update_inv_wear_suit()
else if(H.w_uniform)
- if(SEND_SIGNAL(H.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
+ SEND_SIGNAL(H.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ if(H.w_uniform.clean_blood())
H.update_inv_w_uniform()
if(H.shoes)
- if(SEND_SIGNAL(H.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
+ SEND_SIGNAL(H.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ if(H.shoes.clean_blood())
H.update_inv_shoes()
H.wash_cream()
- SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ M.clean_blood()
/datum/reagent/space_cleaner/ez_clean
name = "EZ Clean"
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 2ed9a31107..374f7715bb 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -283,6 +283,12 @@
results = list("regen_jelly" = 2)
required_reagents = list("tricordrazine" = 1, "slimejelly" = 1)
+/datum/chemical_reaction/jelly_convert
+ name = "Blood Jelly Conversion"
+ id = "blood_jelly"
+ results = list("slimejelly" = 1)
+ required_reagents = list("toxin" = 1, "jellyblood" = 1)
+
/datum/chemical_reaction/corazone
name = "Corazone"
id = "corazone"
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index b3f9591f64..d475b118b2 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -26,7 +26,7 @@
create_reagents(volume, reagent_flags)
if(spawned_disease)
var/datum/disease/F = new spawned_disease()
- var/list/data = list("viruses"= list(F))
+ var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY","viruses"= list(F))
reagents.add_reagent("blood", disease_amount, data)
add_initial_reagents()
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 3e555f385f..fe35981bfe 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -4,13 +4,16 @@
icon = 'icons/obj/bloodpack.dmi'
icon_state = "bloodpack"
volume = 200
+ reagent_flags = DRAINABLE
var/blood_type = null
var/labelled = 0
+ var/color_to_apply = "#FFFFFF"
+ var/mutable_appearance/fill_overlay
/obj/item/reagent_containers/blood/Initialize()
. = ..()
if(blood_type != null)
- reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null))
+ reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_colour"=color, "blood_type"=blood_type,"resistances"=null,"trace_chem"=null))
update_icon()
/obj/item/reagent_containers/blood/on_reagent_change(changetype)
@@ -18,6 +21,7 @@
var/datum/reagent/blood/B = reagents.has_reagent("blood")
if(B && B.data && B.data["blood_type"])
blood_type = B.data["blood_type"]
+ color_to_apply = bloodtype_to_color(blood_type)
else
blood_type = null
update_pack_name()
@@ -45,7 +49,7 @@
/obj/item/reagent_containers/blood/random/Initialize()
icon_state = "bloodpack"
- blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L")
+ blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L", "SY", "HF", "GEL", "BUG")
return ..()
/obj/item/reagent_containers/blood/APlus
@@ -72,6 +76,18 @@
/obj/item/reagent_containers/blood/universal
blood_type = "U"
+/obj/item/reagent_containers/blood/synthetics
+ blood_type = "SY"
+
+/obj/item/reagent_containers/blood/oilblood
+ blood_type = "HF"
+
+/obj/item/reagent_containers/blood/jellyblood
+ blood_type = "GEL"
+
+/obj/item/reagent_containers/blood/insect
+ blood_type = "BUG"
+
/obj/item/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
if (istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon))
if(!user.is_literate())
diff --git a/code/modules/research/designs/machine_desings/machine_designs_medical.dm b/code/modules/research/designs/machine_desings/machine_designs_medical.dm
index 65b3d74f71..2f95954e01 100644
--- a/code/modules/research/designs/machine_desings/machine_designs_medical.dm
+++ b/code/modules/research/designs/machine_desings/machine_designs_medical.dm
@@ -89,3 +89,11 @@
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
build_path = /obj/item/circuitboard/machine/clonescanner
category = list("Medical Machinery")
+
+/datum/design/board/bloodbankgen
+ name = "Machine Design (Blood Bank Generator Board)"
+ desc = "The circuit board for a blood bank generator."
+ id = "bloodbankgen"
+ build_path = /obj/item/circuitboard/machine/bloodbankgen
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+ category = list ("Medical Machinery")
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 11bc31bedc..5176c4fd71 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -105,7 +105,7 @@
materials = list(MAT_METAL = 200)
build_path = /obj/item/ammo_casing/shotgun/stunslug
category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/techshell
name = "Unloaded Technological Shotshell"
@@ -139,7 +139,7 @@
materials = list(MAT_METAL = 500, MAT_GLASS = 300)
build_path = /obj/item/firing_pin/test_range
category = list("Firing Pins")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/pin_mindshield
name = "Mindshield Firing Pin"
@@ -235,7 +235,7 @@
reagents_list = list("radium" = 20)
build_path = /obj/item/gun/energy/floragun
category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/xray
name = "X-ray Laser Gun"
@@ -309,7 +309,7 @@
materials = list(MAT_METAL = 2000, MAT_PLASMA = 500)
build_path = /obj/item/grenade/chem_grenade/pyro
category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/cryo_grenade
name = "Cryo Grenade"
@@ -319,7 +319,7 @@
materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
build_path = /obj/item/grenade/chem_grenade/cryo
category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/adv_grenade
name = "Advanced Release Grenade"
@@ -329,7 +329,7 @@
materials = list(MAT_METAL = 3000, MAT_GLASS = 500)
build_path = /obj/item/grenade/chem_grenade/adv_release
category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
//////////
//MISC////
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 5b3a21dd5c..82037a9b48 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -60,7 +60,7 @@
display_name = "Biological Technology"
description = "What makes us tick." //the MC, silly!
prereq_ids = list("base")
- design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag")
+ design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index dffb7bf355..b46be627fb 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -768,6 +768,8 @@
px_y = 12
stam_heal_tick = 2
max_stamina_damage = 50
+ var/blood_state = BLOOD_STATE_NOT_BLOODY
+ var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
/obj/item/bodypart/l_leg/is_disabled()
if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG))
@@ -828,6 +830,8 @@
px_y = 12
max_stamina_damage = 50
stam_heal_tick = 2
+ var/blood_state = BLOOD_STATE_NOT_BLOODY
+ var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
/obj/item/bodypart/r_leg/is_disabled()
if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG))
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index a2e8017956..c6e2da0849 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -49,6 +49,27 @@
+/mob/proc/has_left_leg()
+ return TRUE
+
+/mob/living/carbon/has_left_leg()
+ var/obj/item/bodypart/l_leg = get_bodypart(BODY_ZONE_L_LEG)
+ if(l_leg)
+ return TRUE
+ else
+ return FALSE
+
+/mob/proc/has_right_leg()
+ return TRUE
+
+/mob/living/carbon/has_right_leg()
+ var/obj/item/bodypart/r_leg = get_bodypart(BODY_ZONE_R_LEG)
+ if(r_leg)
+ return TRUE
+ else
+ return FALSE
+
+
//Limb numbers
/mob/proc/get_num_arms(check_disabled = TRUE)
return 2
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 8e4caab436..82fbf932e9 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -57,7 +57,7 @@
/obj/item/organ/heart/prepare_eat()
var/obj/S = ..()
- S.icon_state = "heart-off"
+ S.icon_state = "[icon_base]-off"
return S
/obj/item/organ/heart/on_life()
@@ -90,6 +90,12 @@
owner.set_heartattack(TRUE)
failed = TRUE
+obj/item/organ/heart/slime
+ name = "slime heart"
+ desc = "It seems we've gotten to the slimy core of the matter."
+ icon_state = "heart-s-on"
+ icon_base = "heart-s"
+
/obj/item/organ/heart/cursed
name = "cursed heart"
desc = "A heart that, when inserted, will force you to pump it manually."
@@ -212,6 +218,19 @@ obj/item/organ/heart/cybernetic/upgraded/on_life()
+/obj/item/organ/heart/ipc
+ name = "IPC heart"
+ desc = "An electronic pump that regulates hydraulic functions, they have an auto-restart after EMPs."
+ icon_state = "heart-c"
+ organ_flags = ORGAN_SYNTHETIC
+
+/obj/item/organ/heart/ipc/emp_act()
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ Stop()
+ addtimer(CALLBACK(src, .proc/Restart), 10)
+
/obj/item/organ/heart/freedom
name = "heart of freedom"
desc = "This heart pumps with the passion to give... something freedom."
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 1d660df794..e81cbf528f 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -42,7 +42,7 @@
if(replaced_by == /datum/surgery)
return FALSE
- if(HAS_TRAIT(user, TRAIT_SURGEON))
+ if(HAS_TRAIT(user, TRAIT_SURGEON) || HAS_TRAIT(user.mind, TRAIT_SURGEON))
if(replaced_by)
return FALSE
else
diff --git a/code/modules/vending/magivend.dm b/code/modules/vending/magivend.dm
index b414638be9..30c6ae6161 100644
--- a/code/modules/vending/magivend.dm
+++ b/code/modules/vending/magivend.dm
@@ -4,7 +4,7 @@
icon_state = "MagiVend"
product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!"
vend_reply = "Have an enchanted evening!"
- product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
+ product_ads = "EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!;Now-magic proofing venders!"
products = list(/obj/item/clothing/head/wizard = 1,
/obj/item/clothing/suit/wizrobe = 1,
/obj/item/clothing/head/wizard/red = 1,
@@ -14,5 +14,5 @@
/obj/item/clothing/shoes/sandal/magic = 1,
/obj/item/staff = 2)
contraband = list(/obj/item/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave
- armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
+ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "magic" = 100)
resistance_flags = FIRE_PROOF
diff --git a/config/game_options.txt b/config/game_options.txt
index 2e346ce0ac..02d620eb31 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -267,6 +267,10 @@ ALLOW_AI_MULTICAM
## Uncomment to prevent the security cyborg module from being chosen
#DISABLE_SECBORG
+## Determines the minimum alert level for the security cyborg model to be chosen
+## 0: Green, 1:Blue, 2:Amber, 3:Red, 4:Delta
+MINIMUM_SECBORG_ALERT 3
+
## Peacekeeper Borg ###
## Uncomment to prevent the peacekeeper cyborg module from being chosen
#DISABLE_PEACEBORG
diff --git a/html/changelogs/AutoChangeLog-pr-9047.yml b/html/changelogs/AutoChangeLog-pr-9047.yml
new file mode 100644
index 0000000000..1f024b71e3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9047.yml
@@ -0,0 +1,7 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Added RGB blood effects, know whose blood this is by color!"
+ - rscadd: "Added Synthetics blood, and a machine that produces it. A universal donor for medical to heal people with. Make it via medical protolathe!"
+ - bugfix: "With hearts, slimepeople shouldn't die from the effects of not having a heart."
+ - bugfix: "Plasma vessels from xenomorphs will restore blood if you're on resin."
diff --git a/html/changelogs/AutoChangeLog-pr-9198.yml b/html/changelogs/AutoChangeLog-pr-9198.yml
new file mode 100644
index 0000000000..f06767334d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9198.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "New book - Unused"
+ - code_imp: "organized files"
diff --git a/html/changelogs/AutoChangeLog-pr-9214.yml b/html/changelogs/AutoChangeLog-pr-9214.yml
new file mode 100644
index 0000000000..edc41426f2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9214.yml
@@ -0,0 +1,7 @@
+author: "original by GuyonBroadway, SkowronX, and Arizon5. port by sishen1542 and kerse"
+delete-after: True
+changes:
+ - rscadd: "Clockwork cultists may now summon forth Neovgre, the ratvrarian super weapon. This powerful mech can be summoned when applications scripture has been unlocked, boasts superior offensive and defensive capabilities, however once a pilot enters he cannot leave and is doomed to die with the mech."
+ - imageadd: "Sexy Sprite work courtesy or SkowronX from /tg/"
+ - imageadd: "brass edits by Arizon5"
+ - soundadd: "steamy laser by kerse"
diff --git a/html/changelogs/AutoChangeLog-pr-9246.yml b/html/changelogs/AutoChangeLog-pr-9246.yml
new file mode 100644
index 0000000000..adffae737b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9246.yml
@@ -0,0 +1,8 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "blood on your body floating a bit to your right if you're a taur"
+ - bugfix: "some suits having no icon on tauric characters"
+ - tweak: "front facing CMO hardsuit icon for naga taurs"
+ - tweak: "colour of medical cross on CMO hardsuit for taurs"
+ - bugfix: "taur body and jumpsuit showing through mining suits"
diff --git a/html/changelogs/AutoChangeLog-pr-9466.yml b/html/changelogs/AutoChangeLog-pr-9466.yml
new file mode 100644
index 0000000000..473ec04eec
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9466.yml
@@ -0,0 +1,5 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - tweak: "Security borgs and K9s are now only available during red alert or higher."
+ - server: "Headmins or other folks with access to the server's config can choose the minimum alert level for secborgs to be chosen via the MINIMUM_SECBORG_ALERT config option. See the default game_options.txt for more info."
diff --git a/html/changelogs/AutoChangeLog-pr-9503.yml b/html/changelogs/AutoChangeLog-pr-9503.yml
new file mode 100644
index 0000000000..7b79ad7185
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9503.yml
@@ -0,0 +1,6 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - balance: "The taser's electrode has been reworked. Instead of being a strong knockdown that deals a heavy amount of stamloss, it now causes a weak knockdown, applies a debilitating status effect for 5 seconds, and deals 35 stamloss on hit up to a maximum 50 total stamloss."
+ - balance: "Roundstart turrets now have a nonlethal projectile that gets used when they're set to stun and the target is resting"
+ - tweak: "Hybrid tasers now have disablers set as their default mode."
diff --git a/html/changelogs/AutoChangeLog-pr-9520.yml b/html/changelogs/AutoChangeLog-pr-9520.yml
new file mode 100644
index 0000000000..20188b7137
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9520.yml
@@ -0,0 +1,4 @@
+author: "r4d6"
+delete-after: True
+changes:
+ - rscadd: "Added Decorative Wings for Humans, Felinids, Slimepersons and Lizardpeoples."
diff --git a/html/changelogs/AutoChangeLog-pr-9524.yml b/html/changelogs/AutoChangeLog-pr-9524.yml
new file mode 100644
index 0000000000..df1ff4959a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9524.yml
@@ -0,0 +1,7 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - rscadd: "Decorative and insect wings can now be coloured individually, similar to horns."
+ - bugfix: "people getting assigned wings if their savefile is old."
+ - rscdel: "wings that take the hair colour. Unnecessary if you can just set the colour."
+ - tweak: "Cannot make horns pure black. Trying to do so will set it to a default value."
diff --git a/html/changelogs/AutoChangeLog-pr-9525.yml b/html/changelogs/AutoChangeLog-pr-9525.yml
new file mode 100644
index 0000000000..a77b9e28b2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9525.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "decorative angel wings being invisible"
diff --git a/html/changelogs/AutoChangeLog-pr-9534.yml b/html/changelogs/AutoChangeLog-pr-9534.yml
new file mode 100644
index 0000000000..4654503f9b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9534.yml
@@ -0,0 +1,5 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "abductors now actually work"
+ - tweak: "abductor scientist has their own greet message now"
diff --git a/html/changelogs/AutoChangeLog-pr-9536.yml b/html/changelogs/AutoChangeLog-pr-9536.yml
new file mode 100644
index 0000000000..ffac8e8f6f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9536.yml
@@ -0,0 +1,4 @@
+author: "r4d6"
+delete-after: True
+changes:
+ - tweak: "Change the SEVA suit & Exo-suit's descriptions"
diff --git a/html/changelogs/AutoChangeLog-pr-9537.yml b/html/changelogs/AutoChangeLog-pr-9537.yml
new file mode 100644
index 0000000000..24318d4364
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9537.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - rscadd: "Magnetic pistols now fit in boot pockets - jackboots, workboots, etc."
diff --git a/html/changelogs/AutoChangeLog-pr-9540.yml b/html/changelogs/AutoChangeLog-pr-9540.yml
new file mode 100644
index 0000000000..8dd4e46bc6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9540.yml
@@ -0,0 +1,4 @@
+author: "YakumoChen"
+delete-after: True
+changes:
+ - rscdel: "Reverted laser miniguns."
diff --git a/html/changelogs/AutoChangeLog-pr-9545.yml b/html/changelogs/AutoChangeLog-pr-9545.yml
new file mode 100644
index 0000000000..970e463f41
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9545.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by Barhandar"
+delete-after: True
+changes:
+ - bugfix: "Pumpkin meteors on Halloween now replace catastrophic meteor waves, instead of ALL OF THEM."
diff --git a/html/changelogs/AutoChangeLog-pr-9547.yml b/html/changelogs/AutoChangeLog-pr-9547.yml
new file mode 100644
index 0000000000..7e0abca8f4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9547.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Silicons can now operate teleporter, medical and security records console from a distance again."
diff --git a/html/changelogs/AutoChangeLog-pr-9551.yml b/html/changelogs/AutoChangeLog-pr-9551.yml
new file mode 100644
index 0000000000..da7aac0e48
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9551.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed mobs folded inside bluespace bodybags getting their clothing and items deleted when passing through a recycler."
diff --git a/html/changelogs/AutoChangeLog-pr-9556.yml b/html/changelogs/AutoChangeLog-pr-9556.yml
new file mode 100644
index 0000000000..31951c3e70
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9556.yml
@@ -0,0 +1,5 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "unable to read paper on airlocks"
+ - tweak: "ai can see paper (still just shows stars)"
diff --git a/html/changelogs/AutoChangeLog-pr-9561.yml b/html/changelogs/AutoChangeLog-pr-9561.yml
new file mode 100644
index 0000000000..6db9ad0385
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9561.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "The alien-bursting-from-your-thorax and the xeno \"hud\" embryo stage images will now properly delete them once the embryo egg lifecycle is complete."
diff --git a/html/changelogs/AutoChangeLog-pr-9565.yml b/html/changelogs/AutoChangeLog-pr-9565.yml
new file mode 100644
index 0000000000..e2c6aa0d12
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9565.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "Nerfed VTEC modules."
diff --git a/html/changelogs/AutoChangeLog-pr-9566.yml b/html/changelogs/AutoChangeLog-pr-9566.yml
new file mode 100644
index 0000000000..92e5307b09
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9566.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - bugfix: "Neurotoxin no longer stuns non-carbons."
diff --git a/html/changelogs/AutoChangeLog-pr-9588.yml b/html/changelogs/AutoChangeLog-pr-9588.yml
new file mode 100644
index 0000000000..03f4ab8a57
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9588.yml
@@ -0,0 +1,5 @@
+author: "ItzGabby"
+delete-after: True
+changes:
+ - rscadd: "Bat Species parts for more leeway for character customization."
+ - code_imp: "Alphabetized decor wing selection window in character creator for simplicity."
diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi
index 6a1a35f326..5bc30f886c 100644
Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ
diff --git a/icons/effects/fluidtracks.dmi b/icons/effects/fluidtracks.dmi
new file mode 100644
index 0000000000..e2f0c97479
Binary files /dev/null and b/icons/effects/fluidtracks.dmi differ
diff --git a/icons/effects/footprints.dmi b/icons/effects/footprints.dmi
index a98344abe4..69207097c0 100644
Binary files a/icons/effects/footprints.dmi and b/icons/effects/footprints.dmi differ
diff --git a/icons/mecha/neovgre.dmi b/icons/mecha/neovgre.dmi
new file mode 100644
index 0000000000..ba9d57daf9
Binary files /dev/null and b/icons/mecha/neovgre.dmi differ
diff --git a/icons/mob/dam_mob.dmi b/icons/mob/dam_mob.dmi
index fe92746b43..c34b57b434 100644
Binary files a/icons/mob/dam_mob.dmi and b/icons/mob/dam_mob.dmi differ
diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi
index 58f4cb735c..105da7d865 100644
Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ
diff --git a/icons/obj/bloodbank.dmi b/icons/obj/bloodbank.dmi
new file mode 100644
index 0000000000..4b4b2b6990
Binary files /dev/null and b/icons/obj/bloodbank.dmi differ
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index 1b8eada39c..d3f055d1f2 100644
Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index bdfbae3d75..fcc28de7b9 100755
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/turnstile.dmi b/icons/obj/turnstile.dmi
new file mode 100644
index 0000000000..0107ade705
Binary files /dev/null and b/icons/obj/turnstile.dmi differ
diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
index e677c1f3ab..e7017b8481 100644
--- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
+++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
@@ -307,7 +307,7 @@
var/mob/M = loc
M.update_inv_hands()
- SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)//blood overlays get weird otherwise, because the sprite changes. (retained from original desword because I have no idea what this is)
+ clean_blood()
/obj/item/twohanded/dualsaber/hypereutactic/AltClick(mob/living/user)
if(!user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
index 43931db689..02b98bdbf2 100644
--- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
@@ -18,9 +18,13 @@
return FALSE
return .
-/mob/living/carbon/proc/toggle_combat_mode()
+/mob/living/carbon/proc/toggle_combat_mode(forced)
if(recoveringstam)
return TRUE
+ if(!forced)
+ for(var/datum/status_effect/S in status_effects)
+ if(S.blocks_combatmode)
+ return TRUE
combatmode = !combatmode
if(voremode)
toggle_vore_mode()
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human.dm b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
index e0d592827e..e5d386b56b 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/human.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
@@ -1,12 +1,3 @@
-/mob/living/carbon/human/species/mammal
- race = /datum/species/mammal
-
-/mob/living/carbon/human/species/insect
- race = /datum/species/insect
-
-/mob/living/carbon/human/species/xeno
- race = /datum/species/xeno
-
/mob/living/proc/resist_embedded()
return
diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm
index ac79ea7f25..ed33041d58 100644
--- a/modular_citadel/code/modules/mob/living/living.dm
+++ b/modular_citadel/code/modules/mob/living/living.dm
@@ -116,7 +116,7 @@
to_chat(src, "You're too exhausted to keep going...")
resting = TRUE
if(combatmode)
- toggle_combat_mode()
+ toggle_combat_mode(TRUE)
recoveringstam = TRUE
filters += CIT_FILTER_STAMINACRIT
update_canmove()
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
index b16ac1d586..c063d8b9ef 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -13,7 +13,7 @@
/mob/living/silicon/robot/proc/get_cit_modules()
var/list/modulelist = list()
modulelist["MediHound"] = /obj/item/robot_module/medihound
- if(!CONFIG_GET(flag/disable_secborg))
+ if(BORG_SEC_AVAILABLE)
modulelist["Security K-9"] = /obj/item/robot_module/k9
modulelist["Scrub Puppy"] = /obj/item/robot_module/scrubpup
modulelist["Borgi"] = /obj/item/robot_module/borgi
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
index c7a2447be6..964ef65ebc 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -11,6 +11,7 @@
. = ..()
if(!resting && !sprinting)
. += 1
+ . += speed
/mob/living/silicon/robot/proc/togglesprint(shutdown = FALSE) //Basically a copypaste of the proc from /mob/living/carbon/human
if(!shutdown && (!cell || cell.charge < 25))
diff --git a/modular_citadel/code/modules/projectiles/projectile/energy.dm b/modular_citadel/code/modules/projectiles/projectile/energy.dm
deleted file mode 100644
index a32f23f0fc..0000000000
--- a/modular_citadel/code/modules/projectiles/projectile/energy.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/obj/item/projectile/energy/electrode
- stamina = 36
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 00063c22d4..c8ebde11d9 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1,11 +1,3 @@
-/datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume)
- if(istype(O, /obj/effect/decal/cleanable) || istype(O, /obj/item/projectile/bullet/reusable/foam_dart) || istype(O, /obj/item/ammo_casing/caseless/foam_dart))
- qdel(O)
- else
- if(O)
- O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
- SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
-
/datum/reagent/syndicateadrenals
name = "Syndicate Adrenaline"
id = "syndicateadrenals"
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index 47f71d1acf..7fcae0eb13 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -327,10 +327,10 @@
//So slimes can play too.
/datum/chemical_reaction/fermi/enthrall/slime
- required_catalysts = list("slimejelly" = 1)
+ required_catalysts = list("jellyblood" = 1)
/datum/chemical_reaction/fermi/enthrall/slime/FermiFinish(datum/reagents/holder, var/atom/my_atom)
- var/datum/reagent/toxin/slimejelly/B = locate(/datum/reagent/toxin/slimejelly) in my_atom.reagents.reagent_list//The one line change.
+ var/datum/reagent/blood/jellyblood/B = locate(/datum/reagent/blood/jellyblood) in my_atom.reagents.reagent_list//The one line change.
var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list
if(!B.data)
var/list/seen = viewers(5, get_turf(my_atom))
diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index 0e823a658f..df3922dc09 100644
--- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -2,7 +2,7 @@
/datum/reagent/consumable/semen
name = "Semen"
id = "semen"
- description = "Sperm from some animal. Useless for anything but insemination, really."
+ description = "Sperm from some animal. I bet you'll drink this out of a bucket someday."
taste_description = "something salty"
taste_mult = 2 //Not very overpowering flavor
data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null)
@@ -39,7 +39,9 @@
add_blood_DNA(list("Non-human DNA" = "A+"))
/obj/effect/decal/cleanable/semen/replace_decal(obj/effect/decal/cleanable/semen/S)
- S.add_blood_DNA(return_blood_DNA())
+ if(S.blood_DNA)
+ blood_DNA |= S.blood_DNA.Copy()
+ ..()
/datum/reagent/consumable/femcum
name = "Female Ejaculate"
@@ -71,7 +73,8 @@
add_blood_DNA(list("Non-human DNA" = "A+"))
/obj/effect/decal/cleanable/femcum/replace_decal(obj/effect/decal/cleanable/femcum/F)
- F.add_blood_DNA(return_blood_DNA())
+ if(F.blood_DNA)
+ blood_DNA |= F.blood_DNA.Copy()
..()
/datum/reagent/consumable/femcum/reaction_turf(turf/T, reac_volume)
diff --git a/modular_citadel/icons/mob/64x32_effects.dmi b/modular_citadel/icons/mob/64x32_effects.dmi
index 7db65a8fc3..a11b3584a3 100644
Binary files a/modular_citadel/icons/mob/64x32_effects.dmi and b/modular_citadel/icons/mob/64x32_effects.dmi differ
diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi
index a23716562e..fcc124c695 100644
Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ
diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi
index dce56de556..d61baa4a51 100644
Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ
diff --git a/modular_citadel/icons/mob/mam_snouts.dmi b/modular_citadel/icons/mob/mam_snouts.dmi
index d2cb9b7286..d0f5d56314 100644
Binary files a/modular_citadel/icons/mob/mam_snouts.dmi and b/modular_citadel/icons/mob/mam_snouts.dmi differ
diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi
index 5395e5c7c6..e4bd5119b6 100644
Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ
diff --git a/modular_citadel/icons/mob/taur_canine.dmi b/modular_citadel/icons/mob/taur_canine.dmi
index 0242d2e673..15d6214446 100644
Binary files a/modular_citadel/icons/mob/taur_canine.dmi and b/modular_citadel/icons/mob/taur_canine.dmi differ
diff --git a/modular_citadel/icons/mob/taur_hooved.dmi b/modular_citadel/icons/mob/taur_hooved.dmi
index e9860f2014..63e604b430 100644
Binary files a/modular_citadel/icons/mob/taur_hooved.dmi and b/modular_citadel/icons/mob/taur_hooved.dmi differ
diff --git a/modular_citadel/icons/mob/taur_naga.dmi b/modular_citadel/icons/mob/taur_naga.dmi
index 1ca4509db7..7214ec7073 100644
Binary files a/modular_citadel/icons/mob/taur_naga.dmi and b/modular_citadel/icons/mob/taur_naga.dmi differ
diff --git a/sound/weapons/gatling.ogg b/sound/weapons/gatling.ogg
deleted file mode 100644
index 0f8045560d..0000000000
Binary files a/sound/weapons/gatling.ogg and /dev/null differ
diff --git a/sound/weapons/neovgre_laser.ogg b/sound/weapons/neovgre_laser.ogg
new file mode 100644
index 0000000000..da97117ae8
Binary files /dev/null and b/sound/weapons/neovgre_laser.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index f13e7c4763..1a45dc619f 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -47,7 +47,6 @@
#include "code\__DEFINES\flags.dm"
#include "code\__DEFINES\food.dm"
#include "code\__DEFINES\footsteps.dm"
-#include "code\__DEFINES\forensics.dm"
#include "code\__DEFINES\hud.dm"
#include "code\__DEFINES\integrated_electronics.dm"
#include "code\__DEFINES\interaction_flags.dm"
@@ -357,7 +356,6 @@
#include "code\datums\components\empprotection.dm"
#include "code\datums\components\footstep.dm"
#include "code\datums\components\forced_gravity.dm"
-#include "code\datums\components\forensics.dm"
#include "code\datums\components\infective.dm"
#include "code\datums\components\jousting.dm"
#include "code\datums\components\knockoff.dm"
@@ -386,7 +384,6 @@
#include "code\datums\components\virtual_reality.dm"
#include "code\datums\components\wearertargeting.dm"
#include "code\datums\components\wet_floor.dm"
-#include "code\datums\components\decals\blood.dm"
#include "code\datums\components\storage\storage.dm"
#include "code\datums\components\storage\concrete\_concrete.dm"
#include "code\datums\components\storage\concrete\bag_of_holding.dm"
@@ -579,6 +576,7 @@
#include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\bank_machine.dm"
#include "code\game\machinery\Beacon.dm"
+#include "code\game\machinery\bloodbankgen.dm"
#include "code\game\machinery\buttons.dm"
#include "code\game\machinery\cell_charger.dm"
#include "code\game\machinery\cloning.dm"
@@ -623,6 +621,7 @@
#include "code\game\machinery\syndicatebomb.dm"
#include "code\game\machinery\teleporter.dm"
#include "code\game\machinery\transformer.dm"
+#include "code\game\machinery\turnstile.dm"
#include "code\game\machinery\washing_machine.dm"
#include "code\game\machinery\wishgranter.dm"
#include "code\game\machinery\camera\camera.dm"
@@ -714,6 +713,7 @@
#include "code\game\mecha\combat\gygax.dm"
#include "code\game\mecha\combat\honker.dm"
#include "code\game\mecha\combat\marauder.dm"
+#include "code\game\mecha\combat\neovgre.dm"
#include "code\game\mecha\combat\phazon.dm"
#include "code\game\mecha\combat\reticence.dm"
#include "code\game\mecha\equipment\mecha_equipment.dm"
@@ -756,6 +756,7 @@
#include "code\game\objects\effects\decals\misc.dm"
#include "code\game\objects\effects\decals\remains.dm"
#include "code\game\objects\effects\decals\cleanable\aliens.dm"
+#include "code\game\objects\effects\decals\cleanable\gibs.dm"
#include "code\game\objects\effects\decals\cleanable\humans.dm"
#include "code\game\objects\effects\decals\cleanable\misc.dm"
#include "code\game\objects\effects\decals\cleanable\robots.dm"
@@ -1038,6 +1039,7 @@
#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm"
#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm"
#include "code\game\objects\structures\crates_lockers\closets\fitness.dm"
+#include "code\game\objects\structures\crates_lockers\closets\genpop.dm"
#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm"
#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm"
#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm"
@@ -1586,6 +1588,11 @@
#include "code\modules\crafting\craft.dm"
#include "code\modules\crafting\guncrafting.dm"
#include "code\modules\crafting\recipes.dm"
+#include "code\modules\crafting\recipes\recipes_clothing.dm"
+#include "code\modules\crafting\recipes\recipes_misc.dm"
+#include "code\modules\crafting\recipes\recipes_primal.dm"
+#include "code\modules\crafting\recipes\recipes_robot.dm"
+#include "code\modules\crafting\recipes\recipes_weapon_and_ammo.dm"
#include "code\modules\detectivework\detective_work.dm"
#include "code\modules\detectivework\evidence.dm"
#include "code\modules\detectivework\scanner.dm"
@@ -2487,7 +2494,6 @@
#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
#include "code\modules\projectiles\guns\energy\laser.dm"
#include "code\modules\projectiles\guns\energy\megabuster.dm"
-#include "code\modules\projectiles\guns\energy\minigun.dm"
#include "code\modules\projectiles\guns\energy\mounted.dm"
#include "code\modules\projectiles\guns\energy\plasma_cit.dm"
#include "code\modules\projectiles\guns\energy\pulse.dm"
@@ -3116,7 +3122,6 @@
#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm"
#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm"
#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm"
-#include "modular_citadel\code\modules\projectiles\projectile\energy.dm"
#include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm"
#include "modular_citadel\code\modules\reagents\chemistry\reagents\astrogen.dm"
#include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm"
diff --git a/tools/mapmerge2/dmi.py b/tools/mapmerge2/dmi.py
index f0a8182c9f..c12964cead 100644
--- a/tools/mapmerge2/dmi.py
+++ b/tools/mapmerge2/dmi.py
@@ -45,6 +45,8 @@ class Dmi:
@classmethod
def from_file(cls, fname):
image = Image.open(fname)
+ if image.mode != 'RGBA':
+ image = image.convert('RGBA')
# no metadata = regular image file
if 'Description' not in image.info:
@@ -250,4 +252,4 @@ if __name__ == '__main__':
Dmi.from_file(os.path.join(dirpath, filename))
count += 1
- print(f"Successfully parsed {count} dmi files")
+ print(f"Successfully parsed {count} dmi files")
\ No newline at end of file
diff --git a/tools/mapmerge2/dmm.py b/tools/mapmerge2/dmm.py
index 8bb1dca353..15aa04c07f 100644
--- a/tools/mapmerge2/dmm.py
+++ b/tools/mapmerge2/dmm.py
@@ -343,7 +343,7 @@ def _parse(map_raw_text):
in_map_block = False
in_coord_block = False
in_map_string = False
- iter_x = 0
+ base_x = 0
adjust_y = True
curr_num = ""
@@ -487,7 +487,7 @@ def _parse(map_raw_text):
curr_x = int(curr_num)
if curr_x > maxx:
maxx = curr_x
- iter_x = 0
+ base_x = curr_x
curr_num = ""
reading_coord = "y"
elif reading_coord == "y":
@@ -521,21 +521,15 @@ def _parse(map_raw_text):
adjust_y = False
else:
curr_y += 1
- if curr_x > maxx:
- maxx = curr_x
- if iter_x > 1:
- curr_x = 1
- iter_x = 0
-
+ curr_x = base_x
else:
curr_key = BASE * curr_key + base52_r[char]
curr_key_len += 1
if curr_key_len == key_length:
- iter_x += 1
- if iter_x > 1:
- curr_x += 1
-
grid[curr_x, curr_y, curr_z] = duplicate_keys.get(curr_key, curr_key)
+ if curr_x > maxx:
+ maxx = curr_x
+ curr_x += 1
curr_key = 0
curr_key_len = 0
@@ -551,4 +545,4 @@ def _parse(map_raw_text):
data = DMM(key_length, Coordinate(maxx, maxy, maxz))
data.dictionary = dictionary
data.grid = grid
- return data
+ return data
\ No newline at end of file
diff --git a/tools/mapmerge2/update_paths.py b/tools/mapmerge2/update_paths.py
index 2c316e941d..deab468ecd 100644
--- a/tools/mapmerge2/update_paths.py
+++ b/tools/mapmerge2/update_paths.py
@@ -173,4 +173,4 @@ if __name__ == "__main__":
parser.add_argument("--directory", "-d", help="path to maps directory, defaults to _maps/")
parser.add_argument("--inline", "-i", help="treat update source as update string instead of path", action="store_true")
parser.add_argument("--verbose", "-v", help="toggle detailed update information", action="store_true")
- main(parser.parse_args())
+ main(parser.parse_args())
\ No newline at end of file