diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 8f47c8079670..cd4a7fa1b717 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -4,6 +4,7 @@
"platymuus.dm-langclient",
"EditorConfig.EditorConfig",
"arcanis.vscode-zipfs",
- "dbaeumer.vscode-eslint"
+ "dbaeumer.vscode-eslint",
+ "anturk.dmi-editor"
]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index fb9cb43db606..a8212eb45c10 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -7,9 +7,8 @@
"tgui/.yarn": true,
"tgui/.pnp.*": true
},
- "workbench.editorAssociations": {
- "*.dmi": "imagePreview.previewEditor"
- },
"files.eol": "\n",
- "gitlens.advanced.blame.customArguments": ["-w"]
-}
\ No newline at end of file
+ "gitlens.advanced.blame.customArguments": [
+ "-w"
+ ]
+}
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_chemistry.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_chemistry.dmm
index c31248a7d141..b02d03abef79 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_chemistry.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_chemistry.dmm
@@ -350,7 +350,7 @@
/turf/open/floor/plating,
/area/ruin/powered)
"Q" = (
-/obj/machinery/chem_dispenser,
+/obj/machinery/chem_dispenser/fullupgrade,
/obj/structure/cable/yellow{
icon_state = "0-4"
},
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_clownfacility.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_clownfacility.dmm
index 223363bbb595..c6ca0c00762e 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_clownfacility.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_clownfacility.dmm
@@ -59,7 +59,7 @@
/area/ruin/unpowered)
"an" = (
/obj/structure/closet/malf,
-/obj/item/clothing/gloves/color/rainbow/clown,
+/obj/item/clothing/gloves/color/rainbow,
/obj/item/clothing/mask/gas/clown_hat,
/obj/item/clothing/shoes/clown_shoes,
/obj/item/clothing/under/rank/clown,
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cugganscove.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cugganscove.dmm
index 3ec9b7089de2..2993e9dd9cc5 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cugganscove.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cugganscove.dmm
@@ -380,8 +380,8 @@
/obj/item/clothing/shoes/jackboots,
/obj/item/clothing/glasses/eyepatch,
/obj/item/clothing/glasses/eyepatch,
-/obj/item/clothing/head/bandana,
-/obj/item/clothing/head/bandana,
+/obj/item/clothing/head/pirate/bandana,
+/obj/item/clothing/head/pirate/bandana,
/turf/open/floor/wood,
/area/ruin/unpowered)
"bC" = (
@@ -407,8 +407,8 @@
/obj/item/clothing/shoes/jackboots,
/obj/item/clothing/glasses/eyepatch,
/obj/item/clothing/glasses/eyepatch,
-/obj/item/clothing/head/bandana,
-/obj/item/clothing/head/bandana,
+/obj/item/clothing/head/pirate/bandana,
+/obj/item/clothing/head/pirate/bandana,
/obj/item/toy/katana,
/turf/open/floor/wood,
/area/ruin/unpowered)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cursedtoyshop.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cursedtoyshop.dmm
index 83b65f24781b..ef4d9f183223 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cursedtoyshop.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cursedtoyshop.dmm
@@ -56,7 +56,7 @@
/obj/item/clothing/shoes/clown_shoes,
/obj/item/clothing/under/rank/clown,
/obj/item/storage/backpack/clown,
-/obj/item/clothing/gloves/color/rainbow/clown,
+/obj/item/clothing/gloves/color/rainbow,
/turf/open/floor/wood,
/area/ruin/powered)
"ak" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm
index d587d19b9760..03c072743a08 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm
@@ -12,7 +12,7 @@
/turf/open/lava/smooth,
/area/ruin/powered/gluttony)
"f" = (
-/obj/item/reagent_containers/syringe/gluttony,
+/obj/item/organ/stomach/cursed,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
"g" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm
index 903d986f0a71..15d0418eb6c0 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm
@@ -148,7 +148,7 @@
/turf/open/floor/plasteel/white,
/area/ruin/powered)
"aw" = (
-/obj/machinery/chem_dispenser,
+/obj/machinery/chem_dispenser/fullupgrade,
/turf/open/floor/plasteel/white,
/area/ruin/powered)
"ax" = (
diff --git a/_maps/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/RandomRuins/SpaceRuins/spacebar.dmm
index 25c3b6efaa6b..649b3ccf2bdb 100644
--- a/_maps/RandomRuins/SpaceRuins/spacebar.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacebar.dmm
@@ -95,7 +95,7 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/machinery/chem_dispenser,
+/obj/machinery/chem_dispenser/fullupgrade,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/powered/spacebar)
"eC" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fishinghole.dmm b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fishinghole.dmm
new file mode 100644
index 000000000000..277d2d79154d
--- /dev/null
+++ b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fishinghole.dmm
@@ -0,0 +1,648 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ag" = (
+/obj/effect/decal/cleanable/glass,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair/stool/bamboo,
+/turf/open/floor/plasteel/cafeteria,
+/area/template_noop)
+"ak" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/trashbin,
+/obj/effect/turf_decal/pool,
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"bv" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/pool{
+ dir = 1
+ },
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"eW" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/effect/turf_decal/pool{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"hn" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair/stool/bamboo,
+/obj/structure/chair/stool/bamboo,
+/turf/open/floor/plasteel/cafeteria,
+/area/template_noop)
+"kF" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/trimline/green/filled/line,
+/turf/open/floor/plasteel/white,
+/area/template_noop)
+"lf" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/pool{
+ dir = 8
+ },
+/obj/structure/railing/corner,
+/turf/open/floor/wood,
+/area/template_noop)
+"li" = (
+/turf/open/water/safe,
+/area/template_noop)
+"nH" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/broken,
+/obj/machinery/vending/dinnerware,
+/turf/open/floor/plasteel/blackwhite,
+/area/template_noop)
+"of" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/trashbin,
+/turf/open/floor/plasteel/blackwhite,
+/area/template_noop)
+"oW" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"pj" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/template_noop)
+"qR" = (
+/obj/effect/spawner/lootdrop/trashbin,
+/turf/open/water/safe,
+/area/template_noop)
+"rS" = (
+/obj/effect/decal/cleanable/vomit/old,
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/cafeteria,
+/area/template_noop)
+"sb" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/structure/railing,
+/turf/open/floor/wood,
+/area/template_noop)
+"tg" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/twohanded/fishingrod,
+/obj/structure/rack,
+/obj/item/poster/random_contraband,
+/obj/item/picket_sign,
+/obj/item/picket_sign,
+/obj/item/picket_sign,
+/obj/item/picket_sign,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel/checker,
+/area/template_noop)
+"tw" = (
+/obj/machinery/griddle,
+/obj/item/reagent_containers/food/snacks/deadmouse,
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/blackwhite,
+/area/template_noop)
+"tO" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table/glass,
+/turf/open/floor/plasteel/cafeteria,
+/area/template_noop)
+"uj" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/table/glass,
+/turf/open/floor/plasteel/cafeteria,
+/area/template_noop)
+"vX" = (
+/obj/effect/decal/cleanable/vomit/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/template_noop)
+"wk" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/vending/coffee,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/template_noop)
+"xi" = (
+/obj/item/reagent_containers/food/snacks/fish/goldfish{
+ bitecount = 0;
+ length = 1;
+ weight = 2
+ },
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/effect/turf_decal/pool{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"xG" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/grill,
+/turf/open/floor/plasteel/blackwhite,
+/area/template_noop)
+"yw" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/effect/turf_decal/pool{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"zC" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/turf/open/floor/plasteel/blackwhite,
+/area/template_noop)
+"AR" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/blackwhite,
+/area/template_noop)
+"BO" = (
+/obj/machinery/smartfridge/food,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/reagent_containers/food/snacks/carpmeat/fish,
+/obj/item/reagent_containers/food/snacks/carpmeat/fish,
+/obj/item/reagent_containers/food/snacks/carpmeat/fish,
+/obj/item/reagent_containers/food/snacks/carpmeat/fish,
+/turf/open/floor/plasteel/blackwhite,
+/area/template_noop)
+"Cj" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/cafeteria,
+/area/template_noop)
+"Ei" = (
+/obj/machinery/vending/fishing,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/broken{
+ dir = 1
+ },
+/turf/open/floor/plasteel/checker,
+/area/template_noop)
+"ED" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/pool/corner,
+/obj/structure/railing/corner,
+/turf/open/floor/wood,
+/area/template_noop)
+"EH" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/smartfridge/drying_rack,
+/turf/open/floor/plasteel/checker,
+/area/template_noop)
+"EQ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/vending/cola/random{
+ tilted = 1
+ },
+/obj/effect/turf_decal/trimline/green/filled/line,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 6
+ },
+/turf/open/floor/plasteel/white,
+/area/template_noop)
+"FV" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"GH" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/turf/open/floor/plasteel/checker,
+/area/template_noop)
+"GJ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/pool/corner{
+ dir = 4
+ },
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"GL" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/cafeteria,
+/area/template_noop)
+"He" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 9
+ },
+/turf/open/floor/plasteel/white,
+/area/template_noop)
+"Ig" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/pool{
+ dir = 1
+ },
+/obj/structure/railing/corner,
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"JM" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/blackwhite,
+/area/template_noop)
+"Ke" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/template_noop)
+"KU" = (
+/obj/effect/landmark/blobstart,
+/turf/open/water/safe,
+/area/template_noop)
+"LT" = (
+/obj/structure/rack,
+/obj/item/radio,
+/obj/item/relic,
+/obj/item/twohanded/fishingrod,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/template_noop)
+"Mq" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/blood/gibs/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/pool/corner{
+ dir = 1
+ },
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"Mw" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 9
+ },
+/turf/open/floor/plasteel/white,
+/area/template_noop)
+"MA" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/turf_decal/pool,
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/obj/structure/railing/corner,
+/turf/open/floor/wood,
+/area/template_noop)
+"MI" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/twohanded/fishingrod,
+/obj/structure/rack,
+/obj/item/pet_carrier,
+/turf/open/floor/plasteel/checker,
+/area/template_noop)
+"Ng" = (
+/obj/machinery/smartfridge/drinks,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/item/reagent_containers/food/drinks/beer/stout,
+/obj/item/reagent_containers/food/drinks/beer/light,
+/obj/item/reagent_containers/food/drinks/beer/light,
+/obj/item/reagent_containers/food/drinks/beer/light,
+/obj/item/reagent_containers/food/drinks/beer/light,
+/obj/item/reagent_containers/food/drinks/beer/light,
+/obj/item/reagent_containers/food/drinks/beer/light,
+/obj/item/reagent_containers/food/drinks/beer/light,
+/obj/item/reagent_containers/food/drinks/beer/light,
+/obj/item/reagent_containers/food/drinks/beer/light,
+/obj/item/reagent_containers/food/drinks/beer/light,
+/obj/item/reagent_containers/food/drinks/beer/stout,
+/turf/open/floor/plasteel/blackwhite,
+/area/template_noop)
+"Og" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"Ou" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/checker,
+/area/template_noop)
+"OV" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/pool{
+ dir = 8
+ },
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"Pj" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing,
+/turf/open/floor/wood,
+/area/template_noop)
+"Qj" = (
+/obj/effect/landmark/xeno_spawn,
+/turf/open/water/safe,
+/area/template_noop)
+"Rc" = (
+/obj/machinery/vending/fishing,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/template_noop)
+"RS" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing,
+/obj/effect/turf_decal/pool,
+/turf/open/floor/wood,
+/area/template_noop)
+"SA" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair/stool/bamboo,
+/turf/open/floor/plasteel/cafeteria,
+/area/template_noop)
+"SM" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/trashbin,
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"Tw" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/effect/turf_decal/pool{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"Uj" = (
+/obj/structure/rack,
+/obj/item/soap/homemade,
+/obj/item/soap/homemade,
+/obj/item/twohanded/fishingrod,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 5
+ },
+/turf/open/floor/plasteel/white,
+/area/template_noop)
+"Wi" = (
+/obj/effect/decal/cleanable/cobweb,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table/glass,
+/turf/open/floor/plasteel/cafeteria,
+/area/template_noop)
+"Xp" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/pool{
+ dir = 4
+ },
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"YR" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/pool/corner{
+ dir = 8
+ },
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/template_noop)
+"Ze" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/broken,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 10
+ },
+/turf/open/floor/plasteel/white,
+/area/template_noop)
+"ZB" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/pool{
+ dir = 4
+ },
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/obj/structure/railing/corner,
+/turf/open/floor/wood,
+/area/template_noop)
+"ZO" = (
+/obj/effect/decal/cleanable/vomit/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/mob/living/simple_animal/mouse,
+/turf/open/floor/plasteel/checker,
+/area/template_noop)
+
+(1,1,1) = {"
+Wi
+tO
+tO
+uj
+FV
+Pj
+Ng
+BO
+of
+xG
+"}
+(2,1,1) = {"
+SA
+SA
+ag
+hn
+FV
+sb
+JM
+of
+of
+tw
+"}
+(3,1,1) = {"
+Cj
+rS
+ED
+yw
+Xp
+ZB
+xi
+Mq
+AR
+zC
+"}
+(4,1,1) = {"
+Rc
+GL
+RS
+qR
+li
+li
+li
+eW
+AR
+nH
+"}
+(5,1,1) = {"
+oW
+oW
+ak
+li
+Qj
+li
+li
+bv
+oW
+oW
+"}
+(6,1,1) = {"
+Og
+Og
+MA
+li
+li
+KU
+li
+Ig
+Og
+Og
+"}
+(7,1,1) = {"
+Ei
+Ou
+RS
+li
+li
+li
+qR
+eW
+Mw
+Ze
+"}
+(8,1,1) = {"
+EH
+Ou
+GJ
+Tw
+OV
+lf
+Tw
+YR
+vX
+kF
+"}
+(9,1,1) = {"
+EH
+Ou
+ZO
+Ou
+FV
+Pj
+He
+Ke
+pj
+kF
+"}
+(10,1,1) = {"
+GH
+Ou
+MI
+tg
+SM
+Pj
+Uj
+LT
+wk
+EQ
+"}
diff --git a/_maps/RandomRuins/StationRuins/maint/3x3/3x3_vendoraccident.dmm b/_maps/RandomRuins/StationRuins/maint/3x3/3x3_vendoraccident.dmm
new file mode 100644
index 000000000000..29ddea7b5a6e
--- /dev/null
+++ b/_maps/RandomRuins/StationRuins/maint/3x3/3x3_vendoraccident.dmm
@@ -0,0 +1,76 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/machinery/vending/snack/random,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/template_noop)
+"c" = (
+/obj/machinery/vending/autodrobe/all_access,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/template_noop)
+"i" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/vomit/old,
+/obj/effect/spawner/lootdrop/trashbin,
+/turf/open/floor/plating,
+/area/template_noop)
+"p" = (
+/obj/machinery/vending/cola/random{
+ tilted = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/template_noop)
+"s" = (
+/obj/effect/decal/cleanable/ash,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/trashbin,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/template_noop)
+"B" = (
+/obj/item/holochip{
+ credits = 50
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/template_noop)
+"I" = (
+/obj/machinery/vending/cigarette,
+/obj/effect/decal/cleanable/cobweb,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/template_noop)
+"P" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/glowstick,
+/obj/effect/spawner/lootdrop/gloves,
+/turf/open/floor/plating,
+/area/template_noop)
+"W" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/organ_spawner,
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/blood/gibs/old,
+/obj/effect/decal/remains/human,
+/turf/open/floor/plating,
+/area/template_noop)
+
+(1,1,1) = {"
+I
+s
+a
+"}
+(2,1,1) = {"
+P
+B
+i
+"}
+(3,1,1) = {"
+p
+W
+c
+"}
diff --git a/_maps/RandomRuins/StationRuins/maint/3x5/3x5_dissection.dmm b/_maps/RandomRuins/StationRuins/maint/3x5/3x5_dissection.dmm
index 3797c0030f8d..81fd0e4e5d64 100644
--- a/_maps/RandomRuins/StationRuins/maint/3x5/3x5_dissection.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/3x5/3x5_dissection.dmm
@@ -79,7 +79,7 @@
/obj/effect/decal/cleanable/blood/old,
/obj/item/organ/eyes,
/obj/item/organ/eyes/moth,
-/obj/item/organ/eyes/preternis,
+/obj/item/organ/eyes/robotic/preternis,
/obj/item/organ/eyes/snail,
/turf/open/floor/plasteel/white,
/area/template_noop)
diff --git a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_shoestore.dmm b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_shoestore.dmm
index fa324992ab7c..e9ee8acafb4f 100644
--- a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_shoestore.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_shoestore.dmm
@@ -38,7 +38,7 @@
pixel_x = 12;
pixel_y = 7
},
-/obj/item/clothing/shoes/yogs/fire_crocs{
+/obj/item/clothing/shoes/fire_crocs{
pixel_x = 30;
pixel_y = 13
},
diff --git a/_maps/RandomZLevels/VR/syndicate_trainer.dmm b/_maps/RandomZLevels/VR/syndicate_trainer.dmm
index a4dc1b041e2c..1fc1b4328a38 100644
--- a/_maps/RandomZLevels/VR/syndicate_trainer.dmm
+++ b/_maps/RandomZLevels/VR/syndicate_trainer.dmm
@@ -2060,7 +2060,7 @@
/turf/open/indestructible,
/area/awaymission/centcomAway/thunderdome)
"lX" = (
-/obj/machinery/chem_dispenser,
+/obj/machinery/chem_dispenser/fullupgrade,
/obj/item/storage/box/beakers,
/turf/open/indestructible,
/area/awaymission/centcomAway/cafe)
diff --git a/_maps/RandomZLevels/VR/vrhub.dmm b/_maps/RandomZLevels/VR/vrhub.dmm
index 628973427ab0..e8fa6f2478ac 100644
--- a/_maps/RandomZLevels/VR/vrhub.dmm
+++ b/_maps/RandomZLevels/VR/vrhub.dmm
@@ -642,7 +642,7 @@
/turf/open/indestructible,
/area/awaymission/vr/syndicate)
"eI" = (
-/obj/machinery/chem_dispenser,
+/obj/machinery/chem_dispenser/fullupgrade,
/obj/item/storage/box/beakers,
/turf/open/indestructible,
/area/awaymission/vr/syndicate)
diff --git a/_maps/map_files/GaxStation/GaxStation.dmm b/_maps/map_files/GaxStation/GaxStation.dmm
index a1f19e981cdb..cad1c1025762 100644
--- a/_maps/map_files/GaxStation/GaxStation.dmm
+++ b/_maps/map_files/GaxStation/GaxStation.dmm
@@ -16777,7 +16777,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"iYZ" = (
-/obj/effect/landmark/stationroom/gax/ai_whale,
+/obj/effect/landmark/stationroom/limited_spawn/gax/ai_whale,
/turf/open/space/basic,
/area/space)
"iZa" = (
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 9555f915f477..26555d3c074d 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -29646,27 +29646,6 @@
/obj/effect/landmark/start/roboticist,
/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
-"aZU" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/item/surgical_drapes,
-/obj/item/retractor,
-/obj/item/cautery,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 1;
- pixel_y = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
"aZV" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
@@ -29867,28 +29846,6 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/science/robotics/lab)
-"baj" = (
-/obj/structure/table,
-/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/item/circular_saw,
-/obj/item/scalpel{
- pixel_y = 16
- },
-/obj/item/hemostat,
-/obj/structure/window/reinforced{
- dir = 1;
- pixel_y = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
"bak" = (
/obj/machinery/computer/operating{
dir = 1;
@@ -95909,6 +95866,25 @@
icon_state = "panelscorched"
},
/area/security/prison)
+"pmX" = (
+/obj/structure/table,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 1;
+ pixel_y = 1
+ },
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/lab)
"pnQ" = (
/obj/structure/lattice,
/obj/structure/girder/reinforced,
@@ -98541,6 +98517,25 @@
},
/turf/open/floor/plasteel/dark,
/area/medical/chemistry)
+"saU" = (
+/obj/structure/table,
+/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/structure/window/reinforced{
+ dir = 1;
+ pixel_y = 1
+ },
+/obj/item/tank/internals/anesthetic,
+/obj/item/clothing/mask/breath/medical,
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/lab)
"sbr" = (
/obj/effect/turf_decal/stripes/line{
dir = 2
@@ -139712,7 +139707,7 @@ cHi
waG
bhC
aCK
-baj
+saU
bak
aZS
bOL
@@ -140226,7 +140221,7 @@ azN
aAo
aBw
aHM
-aZU
+pmX
bgB
bez
aJV
diff --git a/_maps/map_files/YogStation/YogStation.dmm b/_maps/map_files/YogStation/YogStation.dmm
index 9e968be2484b..d9df52bd83e6 100644
--- a/_maps/map_files/YogStation/YogStation.dmm
+++ b/_maps/map_files/YogStation/YogStation.dmm
@@ -183,10 +183,6 @@
},
/turf/open/floor/plasteel,
/area/ai_monitored/security/armory)
-"abd" = (
-/obj/machinery/bounty_board,
-/turf/closed/wall,
-/area/science/lab)
"abe" = (
/obj/machinery/airalarm{
pixel_y = 24
@@ -13731,9 +13727,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
-"bgc" = (
-/turf/closed/wall/r_wall,
-/area/science/lab)
"bgh" = (
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
@@ -14039,34 +14032,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/white,
/area/science/research)
-"bhC" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "rnd";
- name = "research lab shutters"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/obj/machinery/door/firedoor/border_only,
-/turf/open/floor/plating,
-/area/science/lab)
-"bhD" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/southright{
- name = "Research and Development Desk";
- req_access_txt = "7"
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "rnd";
- name = "research lab shutters"
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/obj/machinery/door/firedoor/border_only,
-/turf/open/floor/plating,
-/area/science/lab)
"bhE" = (
/obj/structure/table,
/obj/item/stack/sheet/glass/fifty{
@@ -14338,19 +14303,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/research)
-"biS" = (
-/obj/machinery/camera{
- c_tag = "Research Division Access"
- },
-/obj/structure/sink{
- dir = 4;
- pixel_x = 11
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel/white,
-/area/science/research)
"biT" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
@@ -14407,15 +14359,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/lab)
-"biY" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
"bja" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -15288,12 +15231,6 @@
"bnp" = (
/turf/open/floor/plasteel,
/area/science/lab)
-"bnr" = (
-/obj/structure/plasticflaps{
- opacity = 1
- },
-/turf/open/floor/plating,
-/area/science/lab)
"bnu" = (
/obj/machinery/door/firedoor/border_only{
dir = 8
@@ -15629,9 +15566,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/lab)
-"boB" = (
-/turf/closed/wall,
-/area/science/lab)
"boC" = (
/obj/machinery/door/airlock/mining/glass{
name = "Quartermaster";
@@ -15869,17 +15803,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/lab)
-"bpp" = (
-/obj/machinery/door/window/eastright{
- base_state = "left";
- dir = 8;
- icon_state = "left";
- name = "Research Division Delivery";
- req_access_txt = "47"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/science/lab)
"bpq" = (
/obj/machinery/light_switch{
pixel_y = -23
@@ -16084,17 +16007,6 @@
"bqe" = (
/turf/closed/wall/r_wall,
/area/science/explab)
-"bqf" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "rnd2";
- name = "research lab shutters"
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/obj/machinery/door/firedoor/border_only,
-/turf/open/floor/plasteel/white,
-/area/science/lab)
"bqi" = (
/obj/effect/turf_decal/stripes/corner,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
@@ -16103,25 +16015,6 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
-"bqk" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "rnd2";
- name = "research lab shutters"
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 1
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
"bqo" = (
/obj/machinery/computer/cargo{
dir = 1
@@ -16229,11 +16122,6 @@
/obj/structure/chair/stool,
/turf/open/floor/plating,
/area/maintenance/fore)
-"bro" = (
-/turf/open/floor/plasteel/white/side{
- dir = 10
- },
-/area/science/research)
"brp" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
@@ -16256,13 +16144,6 @@
},
/turf/open/floor/plasteel,
/area/science/robotics/lab)
-"brr" = (
-/obj/effect/spawner/structure/window,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/science/explab)
"brs" = (
/obj/structure/table/reinforced,
/obj/machinery/door/window/eastright{
@@ -16316,14 +16197,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard)
-"brx" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "rnd2";
- name = "research lab shutters"
- },
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/science/lab)
"brz" = (
/obj/item/flashlight/flare/signal,
/turf/open/floor/plating,
@@ -20516,10 +20389,6 @@
/obj/machinery/door/firedoor/border_only,
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet)
-"bMr" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/science/xenobiology)
"bMs" = (
/obj/effect/spawner/structure/window/reinforced/shutter,
/turf/open/floor/plating,
@@ -21103,10 +20972,6 @@
/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/space/basic,
/area/engine/atmos_distro)
-"bPK" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/science/misc_lab)
"bPN" = (
/turf/closed/wall,
/area/science/misc_lab)
@@ -21633,6 +21498,36 @@
},
/turf/open/floor/plasteel,
/area/security/checkpoint/engineering)
+"bUA" = (
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/machinery/door/airlock/medical{
+ name = "Operating Theatre";
+ req_access_txt = "45"
+ },
+/obj/effect/mapping_helpers/airlock/unres{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/holosign/surgery,
+/turf/open/floor/plasteel/white,
+/area/medical/surgery)
"bVa" = (
/obj/machinery/door/firedoor/border_only{
dir = 4
@@ -23918,14 +23813,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"ctu" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/medical/sleeper)
"ctv" = (
/obj/effect/turf_decal/tile/yellow{
dir = 1
@@ -25351,18 +25238,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/quartermaster/office)
-"cQe" = (
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "surgery_shutters";
- name = "Surgery Shutters"
- },
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/medical/surgery)
"cQr" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
@@ -26746,6 +26621,26 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"dDo" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 5
+ },
+/obj/machinery/button/door{
+ id = "surgery_shutters";
+ name = "Surgery shutters";
+ pixel_x = 26;
+ pixel_y = 6;
+ req_access_txt = "45";
+ req_one_access_txt = null
+ },
+/obj/machinery/computer/operating,
+/obj/machinery/button/holosign{
+ id = "surgery";
+ pixel_x = 26;
+ pixel_y = -4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/surgery)
"dDp" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/portable_atmospherics/canister/water_vapor,
@@ -29408,23 +29303,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"eYp" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/engine/foyer)
"eYt" = (
/obj/machinery/meter,
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
@@ -30646,6 +30524,15 @@
},
/turf/open/floor/plasteel/dark,
/area/bridge)
+"fJH" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/turf/closed/indestructible/riveted,
+/area/maintenance/starboard)
"fJS" = (
/obj/machinery/button/door{
id = "bridge blast";
@@ -31471,6 +31358,17 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"giP" = (
+/obj/machinery/door/window/eastright{
+ base_state = "left";
+ dir = 8;
+ icon_state = "left";
+ name = "Research Division Delivery";
+ req_access_txt = "7"
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/science/lab)
"gjl" = (
/turf/closed/wall,
/area/quartermaster/warehouse)
@@ -31815,23 +31713,6 @@
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload_foyer)
-"gsF" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 1
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"gsH" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 1
@@ -32595,21 +32476,6 @@
/obj/item/pen/red,
/turf/open/floor/wood,
/area/vacant_room)
-"gKi" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 5
- },
-/obj/machinery/button/door{
- id = "surgery_shutters";
- name = "Surgery shutters";
- pixel_x = 26;
- pixel_y = 6;
- req_access_txt = "45";
- req_one_access_txt = null
- },
-/obj/machinery/computer/operating,
-/turf/open/floor/plasteel/white,
-/area/medical/surgery)
"gKy" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -32626,21 +32492,6 @@
"gLo" = (
/turf/open/floor/circuit/telecomms,
/area/science/xenobiology)
-"gNd" = (
-/obj/machinery/light,
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/structure/noticeboard{
- dir = 8;
- pixel_x = 27
- },
-/turf/open/floor/plasteel,
-/area/engine/foyer)
"gNS" = (
/obj/effect/turf_decal/loading_area{
dir = 4
@@ -33252,6 +33103,18 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/warehouse)
+"hcZ" = (
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "surgery_shutters";
+ name = "Surgery Shutters"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/medical/surgery)
"hdd" = (
/obj/machinery/door/airlock/public/glass{
name = "Library"
@@ -34871,16 +34734,6 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"hNl" = (
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/machinery/computer/rdconsole/production{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/foyer)
"hNs" = (
/obj/effect/landmark/stationroom/maint/fivexthree,
/turf/template_noop,
@@ -36300,14 +36153,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/virology)
-"iuo" = (
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/medical/sleeper)
"iuR" = (
/obj/machinery/door/window/southleft{
base_state = "right";
@@ -37685,18 +37530,6 @@
},
/turf/open/floor/plasteel,
/area/maintenance/disposal/incinerator)
-"iYd" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "surgery_shutters";
- name = "Surgery Shutters"
- },
-/turf/open/floor/plating,
-/area/medical/surgery)
"iYj" = (
/obj/machinery/meter{
target_layer = 4
@@ -38575,6 +38408,18 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos_distro)
+"jte" = (
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "surgery_shutters";
+ name = "Surgery Shutters"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/medical/surgery)
"jtq" = (
/obj/machinery/portable_atmospherics/canister/air,
/obj/effect/turf_decal/stripes/line{
@@ -39032,27 +38877,6 @@
},
/turf/open/floor/plating,
/area/maintenance/fore)
-"jHV" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/engine/foyer)
"jHY" = (
/obj/machinery/camera{
c_tag = "Central Hallway East";
@@ -39178,6 +39002,23 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
/turf/open/floor/plating,
/area/storage/tech)
+"jOc" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/engine/foyer)
"jOV" = (
/obj/machinery/atmospherics/components/unary/vent_pump/layer2{
dir = 8
@@ -41621,6 +41462,16 @@
/obj/structure/closet/l3closet,
/turf/open/floor/plating,
/area/maintenance/aft)
+"kZP" = (
+/obj/structure/table,
+/obj/item/stack/sheet/glass/fifty,
+/obj/item/stack/sheet/metal/fifty,
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/foyer)
"kZX" = (
/obj/structure/window/reinforced{
dir = 8
@@ -42826,6 +42677,14 @@
},
/turf/open/floor/plasteel/dark/telecomms,
/area/tcommsat/server)
+"lEQ" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "robotics2";
+ name = "robotics lab shutters"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/science/robotics/lab)
"lFb" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
dir = 4
@@ -45199,6 +45058,22 @@
/obj/structure/rack,
/turf/open/floor/plating,
/area/maintenance/port/aft)
+"mQz" = (
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/item/twohanded/required/kirbyplants/random,
+/obj/machinery/light,
+/obj/structure/noticeboard{
+ dir = 8;
+ pixel_x = 27
+ },
+/turf/open/floor/plasteel,
+/area/engine/foyer)
"mQB" = (
/obj/machinery/light{
dir = 1
@@ -45552,6 +45427,26 @@
},
/turf/open/floor/plating,
/area/hallway/secondary/exit)
+"mYj" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/airlock/medical{
+ name = "Operating Theatre";
+ req_access_txt = "45"
+ },
+/obj/machinery/holosign/surgery{
+ id = "surgery"
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/surgery)
"mYS" = (
/obj/machinery/camera{
c_tag = "Atmospherics South West";
@@ -47693,6 +47588,18 @@
},
/turf/open/floor/plasteel/white,
/area/science/mixing/chamber)
+"oao" = (
+/obj/item/folder/white,
+/obj/structure/table,
+/obj/item/disk/tech_disk,
+/obj/item/disk/tech_disk,
+/obj/item/disk/design_disk,
+/obj/item/disk/design_disk,
+/obj/item/paicard{
+ pixel_x = 4
+ },
+/turf/closed/indestructible/riveted,
+/area/science/lab)
"oaF" = (
/obj/machinery/door/firedoor/border_only{
dir = 4
@@ -47728,6 +47635,14 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"obM" = (
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/medical/medbay/lobby)
"ocq" = (
/obj/machinery/door/poddoor{
id = "trash";
@@ -48313,14 +48228,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
-"orq" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/medical/medbay/lobby)
"orC" = (
/obj/structure/grille,
/obj/structure/lattice,
@@ -48429,6 +48336,27 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
+"osQ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/engine/foyer)
"ota" = (
/obj/structure/toilet{
dir = 1
@@ -49523,18 +49451,6 @@
/obj/item/stock_parts/subspace/analyzer,
/turf/open/floor/plasteel/white,
/area/storage/tech)
-"oRC" = (
-/obj/item/folder/white,
-/obj/structure/table,
-/obj/item/disk/tech_disk,
-/obj/item/disk/tech_disk,
-/obj/item/disk/design_disk,
-/obj/item/disk/design_disk,
-/obj/item/paicard{
- pixel_x = 4
- },
-/turf/open/floor/plasteel/white,
-/area/science/lab)
"oRG" = (
/obj/structure/table,
/obj/machinery/cell_charger,
@@ -49942,6 +49858,14 @@
/obj/effect/turf_decal/box,
/turf/open/floor/engine,
/area/maintenance/disposal/incinerator)
+"piL" = (
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/medical/sleeper)
"piV" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 1
@@ -51189,6 +51113,9 @@
},
/turf/open/floor/plasteel/dark/telecomms,
/area/tcommsat/server)
+"pTz" = (
+/turf/closed/indestructible/riveted,
+/area/science/research)
"pTL" = (
/obj/structure/sign/departments/minsky/engineering/telecommmunications{
pixel_y = 32
@@ -52400,18 +52327,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/turf/open/floor/plating,
/area/engine/engineering)
-"qzJ" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "surgery_shutters";
- name = "Surgery Shutters"
- },
-/turf/open/floor/plating,
-/area/medical/surgery)
"qAb" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
@@ -53303,14 +53218,6 @@
/obj/effect/turf_decal/trimline/white,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
-"qYz" = (
-/obj/effect/spawner/structure/window,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "robotics2";
- name = "robotics lab shutters"
- },
-/turf/open/floor/plating,
-/area/science/robotics/lab)
"qZu" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 1
@@ -54185,10 +54092,6 @@
/obj/machinery/door/firedoor/border_only,
/turf/open/floor/plating,
/area/maintenance/aft)
-"ryf" = (
-/obj/structure/sign/departments/minsky/research/research,
-/turf/closed/wall/r_wall,
-/area/science/lab)
"rym" = (
/obj/effect/turf_decal/siding/wood{
dir = 8
@@ -56967,26 +56870,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"sKm" = (
-/obj/machinery/door/airlock/medical{
- name = "Operating Theatre";
- req_access_txt = "45"
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 8
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/sleeper)
"sKs" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 4
@@ -57278,6 +57161,21 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/qm)
+"sTv" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 5
+ },
+/turf/closed/indestructible/riveted,
+/area/maintenance/starboard)
"sTw" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4;
@@ -58814,23 +58712,6 @@
},
/turf/open/floor/plasteel/dark,
/area/storage/tech)
-"tEa" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/airlock/medical{
- name = "Operating Theatre";
- req_access_txt = "45"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/surgery)
"tEk" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
/obj/structure/disposalpipe/segment{
@@ -58838,6 +58719,19 @@
},
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
+"tEo" = (
+/obj/machinery/camera{
+ c_tag = "Research Division Access"
+ },
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 11
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/closed/indestructible/riveted,
+/area/science/research)
"tEp" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -61908,35 +61802,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/heads/chief)
-"vhN" = (
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 4
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 8
- },
-/obj/machinery/door/airlock/medical{
- name = "Operating Theatre";
- req_access_txt = "45"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/white,
-/area/medical/surgery)
"vhP" = (
/obj/structure/sign/poster/contraband/power{
pixel_y = 32
@@ -63154,6 +63019,14 @@
},
/turf/open/floor/plasteel/white,
/area/medical/genetics)
+"vPZ" = (
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/border_only,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/medical/medbay/lobby)
"vQq" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
@@ -63564,14 +63437,6 @@
},
/turf/open/floor/plating,
/area/science/xenobiology)
-"wci" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "robotics2";
- name = "robotics lab shutters"
- },
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/science/robotics/lab)
"wcw" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -63806,6 +63671,29 @@
"wkN" = (
/turf/closed/wall,
/area/science/nanite)
+"wls" = (
+/obj/machinery/door/airlock/medical{
+ name = "Operating Theatre";
+ req_access_txt = "45"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/holosign/surgery{
+ id = "surgery"
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/sleeper)
"wlG" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 6
@@ -64637,17 +64525,6 @@
},
/turf/open/floor/circuit/green/telecomms/mainframe,
/area/tcommsat/server)
-"wIL" = (
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/item/twohanded/required/kirbyplants/random,
-/turf/open/floor/plasteel,
-/area/engine/foyer)
"wIS" = (
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
@@ -64828,6 +64705,13 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"wMP" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/science/explab)
"wNo" = (
/obj/effect/turf_decal/tile/yellow{
dir = 1
@@ -64936,6 +64820,9 @@
/obj/structure/window/reinforced,
/turf/open/floor/plasteel,
/area/security/prison)
+"wQS" = (
+/turf/closed/indestructible/riveted,
+/area/space)
"wRg" = (
/obj/machinery/flasher{
id = "AI";
@@ -65387,6 +65274,20 @@
/obj/structure/closet/radiation,
/turf/open/floor/plasteel/dark,
/area/engine/atmos_distro)
+"xgv" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"xgD" = (
/obj/structure/table,
/obj/item/hand_labeler,
@@ -67155,6 +67056,17 @@
/obj/item/twohanded/rcl/pre_loaded,
/turf/open/floor/plasteel,
/area/engine/engineering)
+"xYI" = (
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/machinery/computer/rdconsole/production{
+ dir = 8;
+ req_access = list(32)
+ },
+/turf/open/floor/plasteel,
+/area/engine/foyer)
"xYW" = (
/obj/structure/table,
/obj/item/clothing/glasses/meson,
@@ -98506,7 +98418,7 @@ aiv
aiv
xaW
aAq
-jHV
+osQ
kbN
ixa
nQZ
@@ -99020,7 +98932,7 @@ jxp
lFb
jxp
jxp
-eYp
+jOc
hOf
cfF
rhn
@@ -99030,7 +98942,7 @@ kfj
naG
clM
qpB
-gsF
+xgv
mhO
qQV
qQV
@@ -100046,11 +99958,11 @@ ahi
ajs
uxH
akB
-hNl
+xYI
cMv
uQS
-gNd
-wIL
+kZP
+mQz
cbp
ykH
dWR
@@ -103614,7 +103526,7 @@ bfF
ocA
opn
wiA
-ctu
+piL
kJb
oCO
bZg
@@ -104128,7 +104040,7 @@ cfu
uYq
ogm
pZK
-ctu
+piL
mtT
lvO
bDR
@@ -104381,7 +104293,7 @@ aco
dIW
rJo
hIu
-mgH
+vPZ
oQi
aBB
vle
@@ -104642,7 +104554,7 @@ gtC
mKN
kub
tva
-ctu
+piL
tzC
rUG
bDR
@@ -104899,7 +104811,7 @@ gtC
sxa
kub
tva
-iuo
+piL
iTR
vXI
gaU
@@ -105923,11 +105835,11 @@ fCh
dlx
vMp
wtY
-orq
+obM
sxa
kub
hLI
-ctu
+piL
sTb
mxh
sgE
@@ -106188,7 +106100,7 @@ bvj
bvj
bvj
shz
-sKm
+wls
bvj
tDe
tVV
@@ -106441,7 +106353,7 @@ orY
hHy
pjc
hLI
-qzJ
+hcZ
qmI
xOh
shN
@@ -106698,7 +106610,7 @@ gtC
iBZ
kub
tva
-cQe
+jte
jbq
vvK
vvK
@@ -106955,13 +106867,13 @@ bEi
mvC
cXg
tva
-iYd
+jte
bdw
urv
uMu
vYV
oQs
-tEa
+mYj
tzM
ulL
oEY
@@ -107212,7 +107124,7 @@ luE
uSW
rTC
tva
-iYd
+jte
jbq
lMh
uuV
@@ -107469,8 +107381,8 @@ bEi
hoP
kub
hLI
-iYd
-gKi
+jte
+dDo
gQe
doF
hnj
@@ -107730,7 +107642,7 @@ adK
adK
adK
adK
-vhN
+bUA
adK
adK
jrP
@@ -112866,7 +112778,7 @@ sUL
jna
cIb
hlz
-wci
+lEQ
bgp
sRl
byf
@@ -113123,7 +113035,7 @@ dEU
bTv
cIb
rOz
-wci
+lEQ
bgp
pYr
lcM
@@ -113380,7 +113292,7 @@ bkr
cHW
cId
hkd
-wci
+lEQ
nlD
bnH
byf
@@ -114408,7 +114320,7 @@ biN
cHX
buj
buj
-wci
+lEQ
sGm
uCv
byj
@@ -114922,7 +114834,7 @@ bov
bpU
brq
bsW
-wci
+lEQ
bgp
bnx
byk
@@ -115176,7 +115088,7 @@ bfV
bfV
bfV
box
-qYz
+lEQ
brs
box
box
@@ -115193,9 +115105,9 @@ bsn
bDc
bDc
bLe
-bMr
+piv
uBi
-bMr
+piv
bDb
bDb
bDb
@@ -115453,7 +115365,7 @@ bHK
bzE
bID
bHI
-bPK
+bZZ
bQO
bSb
bOu
@@ -115942,13 +115854,13 @@ aYV
vLR
bfZ
bhA
-biS
+tEo
aMK
dcg
bvx
boz
bnJ
-bBD
+pTz
bBD
aNr
bBD
@@ -115967,7 +115879,7 @@ bHL
aPO
bBD
bJo
-bPK
+bZZ
bWr
bWr
aiW
@@ -116198,14 +116110,14 @@ aYV
jKG
mYV
bga
-bgc
-bgc
-bgc
-bgc
-bgc
-boB
-boB
-boB
+wQS
+wQS
+wQS
+wQS
+wQS
+wQS
+wQS
+wQS
btb
bmU
bvJ
@@ -116455,15 +116367,15 @@ aYV
aYV
vLR
bfX
-bhC
+wQS
biU
bks
blI
bnn
boA
-oRC
-abd
-bgp
+oao
+wQS
+pTz
bmU
bvJ
bCk
@@ -116712,15 +116624,15 @@ aYV
aYV
vLR
bfX
-bhD
+wQS
biV
biW
blK
bnp
boA
boQ
-brx
-bro
+wQS
+pTz
bmU
bvJ
bxj
@@ -116969,15 +116881,15 @@ aYV
bdv
vLR
bgb
-bhC
+wQS
biU
biW
blJ
bno
bkt
biW
-bqf
-bgp
+wQS
+pTz
bmU
bvK
bxi
@@ -117225,15 +117137,15 @@ bbF
aYV
aYV
vLR
-ryf
-bgc
+wQS
+wQS
biX
bhV
bka
bka
aCl
bpo
-bqk
+wQS
brp
bmW
bvK
@@ -117482,7 +117394,7 @@ aCR
bcy
bdx
beG
-bgc
+wQS
bhE
biW
bkv
@@ -117490,7 +117402,7 @@ blL
biW
bnh
biW
-brx
+wQS
bte
bmX
bvK
@@ -117739,7 +117651,7 @@ aMZ
nhP
wmI
beI
-bgc
+wQS
bhF
dEY
bib
@@ -117747,7 +117659,7 @@ bki
bmJ
bnl
bpq
-boB
+wQS
bta
bmY
bvK
@@ -117996,16 +117908,16 @@ aZd
aTk
aPq
beH
-bgc
-bgc
-bgc
-bgc
-bgc
-bgc
-bgc
-bpp
-bgc
-brr
+wQS
+wQS
+wQS
+wQS
+wQS
+wQS
+wQS
+giP
+wQS
+wMP
bmZ
bvK
bvK
@@ -118255,13 +118167,13 @@ bdz
beJ
xtQ
bhH
-biY
-biY
-biY
-bjS
-bnr
+fJH
+fJH
+fJH
+sTv
+wQS
bpr
-bgc
+wQS
blx
bna
bvM
@@ -118516,9 +118428,9 @@ hoc
hoc
hoc
bjT
-boB
-bgc
-bgc
+wQS
+wQS
+wQS
bsk
bsF
aCN
diff --git a/_maps/map_files/YogsDelta/YogsDelta.dmm b/_maps/map_files/YogsDelta/YogsDelta.dmm
index 6c9958be27ea..6dbf3e028609 100644
--- a/_maps/map_files/YogsDelta/YogsDelta.dmm
+++ b/_maps/map_files/YogsDelta/YogsDelta.dmm
@@ -124207,6 +124207,11 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
+"pJO" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"pKo" = (
/turf/closed/wall,
/area/aisat)
@@ -124740,6 +124745,16 @@
},
/turf/open/floor/plasteel,
/area/medical/patients_rooms/room_c)
+"qPI" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"qQT" = (
/obj/machinery/status_display/evac{
pixel_x = -32
@@ -128510,6 +128525,13 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"wVk" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"wWk" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -128598,6 +128620,13 @@
/obj/item/instrument/harmonica,
/turf/open/floor/plasteel,
/area/security/prison)
+"wZE" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"xaG" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -149740,11 +149769,11 @@ cja
ckv
clR
cnB
-clR
+wZE
clR
crI
clR
-clR
+wZE
cnB
clR
czo
@@ -150508,7 +150537,7 @@ cdE
cfA
aaa
cja
-ckw
+wVk
aad
aaa
abj
@@ -150518,7 +150547,7 @@ abj
abj
aaa
aad
-ctn
+pJO
cja
aaa
cDT
@@ -151536,7 +151565,7 @@ cdF
cfA
aaa
cja
-ckw
+wVk
aad
aaa
abj
@@ -151546,7 +151575,7 @@ abj
abj
aaa
aad
-ctn
+pJO
cja
aaa
cDT
@@ -152310,11 +152339,11 @@ cjc
ckz
clU
clU
-clU
+qPI
clU
crL
clU
-clU
+qPI
clU
clU
czr
diff --git a/_maps/map_files/Yogsmeta/Yogsmeta.dmm b/_maps/map_files/Yogsmeta/Yogsmeta.dmm
index 6b5b43774eae..c21e6e4d6875 100644
--- a/_maps/map_files/Yogsmeta/Yogsmeta.dmm
+++ b/_maps/map_files/Yogsmeta/Yogsmeta.dmm
@@ -12704,11 +12704,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
-"aDU" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/tinted/fulltile,
-/turf/open/floor/plating,
-/area/security/courtroom)
"aDV" = (
/obj/machinery/vending/cigarette,
/turf/open/floor/plasteel/dark,
@@ -112066,7 +112061,7 @@ aHD
aHD
aHD
aHD
-aDU
+aTk
aRX
aTk
aUF
diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm
index 9c4d62590d2e..07266625458e 100644
--- a/_maps/shuttles/ruin_pirate_cutter.dmm
+++ b/_maps/shuttles/ruin_pirate_cutter.dmm
@@ -171,7 +171,7 @@
/obj/item/clothing/suit/pirate,
/obj/item/clothing/under/pirate,
/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/head/bandana,
+/obj/item/clothing/head/pirate/bandana,
/turf/open/floor/plasteel/dark/side{
dir = 5
},
@@ -458,7 +458,7 @@
/obj/item/clothing/suit/pirate,
/obj/item/clothing/under/pirate,
/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/head/bandana,
+/obj/item/clothing/head/pirate/bandana,
/obj/effect/turf_decal/tile/red{
dir = 1
},
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index 885ba74810e7..2a3f8f4e6dc2 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -57,6 +57,7 @@
#define ADMIN_LOOKUP(user) "[key_name_admin(user)][ADMIN_QUE(user)]"
#define ADMIN_LOOKUPFLW(user) "[key_name_admin(user)][ADMIN_QUE(user)] [ADMIN_FLW(user)]"
#define ADMIN_SET_SD_CODE "(SETCODE)"
+#define ADMIN_SET_BC_CODE "(SETBEER)"
#define ADMIN_FULLMONTY_NONAME(user) "[ADMIN_QUE(user)] [ADMIN_PP(user)] [ADMIN_VV(user)] [ADMIN_SM(user)] [ADMIN_FLW(user)] [ADMIN_TP(user)] [ADMIN_INDIVIDUALLOG(user)] [ADMIN_SMITE(user)]"
#define ADMIN_FULLMONTY(user) "[key_name_admin(user)] [ADMIN_FULLMONTY_NONAME(user)]"
#define ADMIN_JMP(src) "(JMP)"
diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm
index ac50f313351c..a785a9580a8b 100644
--- a/code/__DEFINES/ai.dm
+++ b/code/__DEFINES/ai.dm
@@ -47,7 +47,7 @@ GLOBAL_LIST_INIT(ai_project_categories, list(
#define AI_MAX_RAM_PER_RACK 4
///How many AI research points does 1 THz generate?
-#define AI_RESEARCH_PER_CPU 7.5
+#define AI_RESEARCH_PER_CPU 8.5
//How long between each data core being able to send a warning. Wouldn't want any spam if we had jittery temps would we?
#define AI_DATA_CORE_WARNING_COOLDOWN (5 MINUTES)
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index 812ff5d9503d..317c0c52051d 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -494,3 +494,5 @@ GLOBAL_LIST_INIT(pipe_paint_colors, list(
#define MIASMA_CORPSE_MOLES 0.02
#define MIASMA_GIBS_MOLES 0.005
+
+#define TURF_SHARES(T) (LAZYLEN(T.atmos_adjacent_turfs))
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index 9d0ca1711f5f..af625445a55d 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -155,6 +155,7 @@
#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone" //from base of mob/living/hitby(): (mob/living/target, hit_zone)
#define COMSIG_MOVABLE_BUCKLE "buckle" //from base of atom/movable/buckle_mob(): (mob, force)
#define COMSIG_MOVABLE_UNBUCKLE "unbuckle" //from base of atom/movable/unbuckle_mob(): (mob, force)
+#define COMSIG_MOVABLE_PRE_DROPTHROW "movable_pre_dropthrow" //from base of atom/movable/throw_at(): Triggers when throwing, before the item is dropped and before COMSIG_MOVABLE_PRE_THROW
#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw" //from base of atom/movable/throw_at(): (list/args)
#define COMPONENT_CANCEL_THROW 1
#define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin)
diff --git a/code/__DEFINES/dye_keys.dm b/code/__DEFINES/dye_keys.dm
new file mode 100644
index 000000000000..133f9c47d340
--- /dev/null
+++ b/code/__DEFINES/dye_keys.dm
@@ -0,0 +1,28 @@
+#define DYE_REGISTRY_UNDER "under"
+#define DYE_REGISTRY_JUMPSKIRT "jumpskirt"
+#define DYE_REGISTRY_GLOVES "gloves"
+#define DYE_REGISTRY_SNEAKERS "sneakers"
+#define DYE_REGISTRY_FANNYPACK "fannypack"
+#define DYE_REGISTRY_BEDSHEET "bedsheet"
+
+#define DYE_RED "red"
+#define DYE_ORANGE "orange"
+#define DYE_YELLOW "yellow"
+#define DYE_GREEN "green"
+#define DYE_BLUE "blue"
+#define DYE_PURPLE "purple"
+#define DYE_BLACK "black"
+#define DYE_WHITE "white"
+#define DYE_RAINBOW "rainbow"
+#define DYE_MIME "mime"
+#define DYE_COSMIC "cosmic"
+#define DYE_QM "qm"
+#define DYE_LAW "law"
+#define DYE_CAPTAIN "captain"
+#define DYE_HOP "hop"
+#define DYE_HOS "hos"
+#define DYE_CE "ce"
+#define DYE_RD "rd"
+#define DYE_CMO "cmo"
+#define DYE_REDCOAT "redcoat"
+#define DYE_CLOWN "clown"
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index f0105efad5ae..bcfdfb97bfc0 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -259,6 +259,7 @@
#define TRAIT_ANOREXIC "anorexic"
#define TRAIT_SHIFTY_EYES "shifty_eyes"
#define TRAIT_ANXIOUS "anxious"
+#define TRAIT_SEE_REAGENTS "see_reagents"
// common trait sources
#define TRAIT_GENERIC "generic"
diff --git a/code/__DEFINES/{yogs_defines}/status_effects.dm b/code/__DEFINES/{yogs_defines}/status_effects.dm
index be062a00a610..2c28115d2e1b 100644
--- a/code/__DEFINES/{yogs_defines}/status_effects.dm
+++ b/code/__DEFINES/{yogs_defines}/status_effects.dm
@@ -1 +1,3 @@
#define STATUS_EFFECT_VOIDED /datum/status_effect/voided //originally the void spell where you disappear and leave an invincible shadow guy but now it's a status effect
+
+#define STATUS_EFFECT_DODGING /datum/status_effect/dodging //granted by using the dodge roll, grants 1.5 seconds of godmode to replicate invincibility frames
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 8c4dd2731dfd..647a92e08a0f 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -106,9 +106,9 @@
#define ui_mood "EAST-1:28,CENTER-3:10"
//living
-#define ui_living_pull "EAST-1:28,CENTER-2:15"
+#define ui_living_pull "EAST-1:28,CENTER-3:15"
#define ui_living_health "EAST-1:28,CENTER:15"
-#define ui_living_healthdoll "EAST-1:28,CENTER-2:13"
+#define ui_living_healthdoll "EAST-1:28,CENTER-1:15"
//borgs
#define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator.
@@ -125,6 +125,9 @@
//slimes
#define ui_slime_health "EAST,CENTER:15" //same as humans and constructs
+//Blobbernauts
+#define ui_blobbernaut_overmind_health "EAST-1:28,CENTER+0:19"
+
// AI
#define ui_ai_core "CENTER-6:-32,SOUTH:6"
diff --git a/code/_onclick/hud/blobbernauthud.dm b/code/_onclick/hud/blobbernauthud.dm
index 17d3b11a7287..1df7bf87d340 100644
--- a/code/_onclick/hud/blobbernauthud.dm
+++ b/code/_onclick/hud/blobbernauthud.dm
@@ -1,9 +1,6 @@
+/datum/hud/living/blobbernaut/New(mob/living/owner)
+ . = ..()
-/datum/hud/blobbernaut/New(mob/owner)
- ..()
-
- blobpwrdisplay = new /obj/screen/healths/blob/naut/core()
- infodisplay += blobpwrdisplay
-
- healths = new /obj/screen/healths/blob/naut()
- infodisplay += healths
+ blobpwrdisplay = new /obj/screen/healths/blob/overmind()
+ blobpwrdisplay.hud = src
+ infodisplay += blobpwrdisplay
\ No newline at end of file
diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm
index c38ca3ae2165..85e3914b8513 100644
--- a/code/_onclick/hud/radial.dm
+++ b/code/_onclick/hud/radial.dm
@@ -19,7 +19,7 @@ GLOBAL_LIST_EMPTY(radial_menus)
. = ..()
icon_state = "radial_slice_focus"
if(tooltips)
- openToolTip(usr, src, params, title = name)
+ openToolTip(usr, src, params, title = name, content = desc)
/obj/screen/radial/slice/MouseExited(location, control, params)
. = ..()
@@ -51,10 +51,16 @@ GLOBAL_LIST_EMPTY(radial_menus)
parent.finished = TRUE
/datum/radial_menu
- var/list/choices = list() //List of choice id's
- var/list/choices_icons = list() //choice_id -> icon
- var/list/choices_values = list() //choice_id -> choice
- var/list/page_data = list() //list of choices per page
+ /// List of choice IDs
+ var/list/choices = list()
+ /// choice_id -> icon
+ var/list/choices_icons = list()
+ /// choice_id -> choice
+ var/list/choices_values = list()
+ /// choice_id -> /datum/radial_menu_choice
+ var/list/choice_datums = list()
+ ///list of choices per page
+ var/list/page_data = list()
var/selected_choice
@@ -164,6 +170,7 @@ GLOBAL_LIST_EMPTY(radial_menus)
E.cut_overlays()
E.alpha = 0
E.name = "None"
+ E.desc = null
E.maptext = null
E.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
E.choice = null
@@ -188,21 +195,32 @@ GLOBAL_LIST_EMPTY(radial_menus)
E.alpha = 255
E.mouse_opacity = MOUSE_OPACITY_ICON
E.cut_overlays()
+ E.vis_contents.Cut()
if(choice_id == NEXT_PAGE_ID)
E.name = "Next Page"
+ E.desc = null
E.next_page = TRUE
E.add_overlay("radial_next")
else
if(istext(choices_values[choice_id]))
E.name = choices_values[choice_id]
+ else if(ispath(choices_values[choice_id],/atom))
+ var/atom/A = choices_values[choice_id]
+ E.name = initial(A.name)
else
var/atom/movable/AM = choices_values[choice_id] //Movables only
E.name = AM.name
+
+ if(choices_icons[choice_id])
+ E.add_overlay(choices_icons[choice_id])
+
+ var/datum/radial_menu_choice/choice_datum = choice_datums[choice_id]
+ if(choice_datum && istext(choice_datum.info))
+ E.desc = choice_datum.info
+
E.choice = choice_id
E.maptext = null
E.next_page = FALSE
- if(choices_icons[choice_id])
- E.add_overlay(choices_icons[choice_id])
/datum/radial_menu/New()
close_button = new
@@ -231,11 +249,18 @@ GLOBAL_LIST_EMPTY(radial_menus)
var/I = extract_image(new_choices[E])
if(I)
choices_icons[id] = I
+
+ if (istype(new_choices[E], /datum/radial_menu_choice))
+ choice_datums[id] = new_choices[E]
setup_menu(use_tooltips)
-/datum/radial_menu/proc/extract_image(E)
- var/mutable_appearance/MA = new /mutable_appearance(E)
+/datum/radial_menu/proc/extract_image(to_extract_from)
+ if (istype(to_extract_from, /datum/radial_menu_choice))
+ var/datum/radial_menu_choice/choice = to_extract_from
+ to_extract_from = choice.image
+
+ var/mutable_appearance/MA = new /mutable_appearance(to_extract_from)
if(MA)
MA.layer = ABOVE_HUD_LAYER
MA.appearance_flags |= RESET_TRANSFORM
@@ -315,3 +340,15 @@ GLOBAL_LIST_EMPTY(radial_menus)
if(!menu.custom_check_callback.Invoke())
return
return answer
+
+/// Can be provided to choices in radial menus if you want to provide more information
+/datum/radial_menu_choice
+ /// Required -- what to display for this button
+ var/image
+
+ /// If provided, will display an info button that will put this text in your chat
+ var/info
+
+/datum/radial_menu_choice/Destroy(force, ...)
+ . = ..()
+ QDEL_NULL(image)
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 26af2be2459c..0c1db1bd3dcc 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -607,14 +607,10 @@
screen_loc = ui_internal
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
-/obj/screen/healths/blob/naut
- name = "health"
- icon = 'icons/mob/blob.dmi'
- icon_state = "nauthealth"
-
-/obj/screen/healths/blob/naut/core
+/obj/screen/healths/blob/overmind
name = "overmind health"
- screen_loc = ui_health
+ icon = 'icons/mob/blob.dmi'
+ screen_loc = ui_blobbernaut_overmind_health
icon_state = "corehealth"
/obj/screen/healths/guardian
diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm
index 382e11b2e5b0..5dd4267d9bc8 100644
--- a/code/_onclick/hud/swarmer.dm
+++ b/code/_onclick/hud/swarmer.dm
@@ -1,68 +1,75 @@
/obj/screen/swarmer
icon = 'icons/mob/swarmer.dmi'
+/obj/screen/swarmer/MouseEntered(location, control, params)
+ . = ..()
+ openToolTip(usr, src, params, title = name, content = desc)
+
+/obj/screen/swarmer/MouseExited(location, control, params)
+ closeToolTip(usr)
+
/obj/screen/swarmer/fabricate_trap
icon_state = "ui_trap"
- name = "Create trap (Costs 4 Resources)"
- desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 4 resources)"
+ name = "Create Trap (Costs 4 Resources)"
+ desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it."
/obj/screen/swarmer/fabricate_trap/Click()
if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/S = usr
- S.create_trap()
+ var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
+ our_swarmer.create_trap()
/obj/screen/swarmer/barricade
icon_state = "ui_barricade"
- name = "Create barricade (Costs 4 Resources)"
- desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 4 resources)"
+ name = "Create Barricade (Costs 4 Resources)"
+ desc = "Creates a destructible barricade that will stop any non-swarmer from passing it. Also allows disabler beams to pass through."
/obj/screen/swarmer/barricade/Click()
if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/S = usr
- S.create_barricade()
+ var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
+ our_swarmer.create_barricade()
/obj/screen/swarmer/replicate
icon_state = "ui_replicate"
name = "Replicate (Costs 20 Resources)"
- desc = "Creates a drone."
+ desc = "Creates an autonomous melee drone that will follow you and attack all non-swamers entities in sight. They can be ordered to move to a target location by a middle-click."
/obj/screen/swarmer/replicate/Click()
if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/S = usr
- S.create_swarmer()
+ var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
+ our_swarmer.create_swarmer()
/obj/screen/swarmer/repair_self
icon_state = "ui_self_repair"
- name = "Repair self"
- desc = "Repairs damage to our body."
+ name = "Repair Self"
+ desc = "Fully repairs damage done to our body after a moderate delay."
/obj/screen/swarmer/repair_self/Click()
if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/S = usr
- S.repair_self()
+ var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
+ our_swarmer.repair_self()
/obj/screen/swarmer/toggle_light
icon_state = "ui_light"
- name = "Toggle light"
- desc = "Toggles our inbuilt light on or off."
+ name = "Toggle Light"
+ desc = "Toggles our inbuilt light on or off. Follower drones will also synchronize their lights with a master unit."
/obj/screen/swarmer/toggle_light/Click()
if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/S = usr
- S.toggle_light()
+ var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
+ our_swarmer.toggle_light()
/obj/screen/swarmer/contact_swarmers
icon_state = "ui_contact_swarmers"
- name = "Contact swarmers"
+ name = "Contact Swarmers"
desc = "Sends a message to all other swarmers, should they exist."
/obj/screen/swarmer/contact_swarmers/Click()
if(isswarmer(usr))
- var/mob/living/simple_animal/hostile/swarmer/S = usr
- S.contact_swarmers()
+ var/mob/living/simple_animal/hostile/swarmer/our_swarmer = usr
+ our_swarmer.contact_swarmers()
-/datum/hud/swarmer/New(mob/owner)
- ..()
+/datum/hud/living/swarmer/New(mob/owner)
+ . = ..()
var/obj/screen/using
using = new /obj/screen/swarmer/fabricate_trap()
diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm
index d9e137bf2299..2c50afeb811f 100644
--- a/code/controllers/subsystem/minor_mapping.dm
+++ b/code/controllers/subsystem/minor_mapping.dm
@@ -1,4 +1,4 @@
-#define REGAL_RAT_CHANCE 2
+#define REGAL_RAT_CHANCE 0
#define PLAGUE_RAT_CHANCE 0
SUBSYSTEM_DEF(minor_mapping)
name = "Minor Mapping"
diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm
index 2f4efd1b5734..06c8e6305975 100644
--- a/code/controllers/subsystem/research.dm
+++ b/code/controllers/subsystem/research.dm
@@ -73,6 +73,10 @@ SUBSYSTEM_DEF(research)
science_tech.last_bitcoins = bitcoins // Doesn't take tick drift into account
for(var/i in bitcoins)
bitcoins[i] *= income_time_difference / 10
+ if(science_tech.stored_research_points[i])
+ var/boost_amt = clamp(0, bitcoins[i], science_tech.stored_research_points[i]) //up to 2x research speed when burning stored research
+ bitcoins[i] += boost_amt
+ science_tech.remove_stored_point_type(i, boost_amt)
science_tech.add_point_list(bitcoins)
last_income = world.time
diff --git a/code/datums/components/bakeable.dm b/code/datums/components/bakeable.dm
index afaca2860d30..754a3996aacd 100644
--- a/code/datums/components/bakeable.dm
+++ b/code/datums/components/bakeable.dm
@@ -80,6 +80,7 @@
if(positive_result)
used_oven.visible_message(span_warning("You smell something great coming from [used_oven]"))
+ playsound(parent, 'sound/machines/microwave/microwave-end.ogg', 50, 1)
else
used_oven.visible_message(span_warning("You smell a burnt smell coming from [used_oven]"))
SEND_SIGNAL(parent, COMSIG_BAKE_COMPLETED, baked_result)
diff --git a/code/datums/components/crafting/weapons.dm b/code/datums/components/crafting/weapons.dm
index bac8dbfd518a..c2fc8e5c01cb 100644
--- a/code/datums/components/crafting/weapons.dm
+++ b/code/datums/components/crafting/weapons.dm
@@ -420,7 +420,7 @@
name = "Depleted Uranium Slug Shell"
result = /obj/item/ammo_casing/shotgun/uraniumpenetrator
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stack/sheet/mineral/uranium = 3,
+ /obj/item/stack/sheet/mineral/uranium = 2,
/obj/item/stack/rods = 2,
/datum/reagent/thermite = 5)
tools = list(TOOL_SCREWDRIVER)
diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm
index 370960ef7071..9e9c111f502b 100644
--- a/code/datums/martial/cqc.dm
+++ b/code/datums/martial/cqc.dm
@@ -318,7 +318,6 @@
var/hand = user.get_inactive_hand_index()
if(!user.put_in_hand(I, hand))
I.forceMove(get_turf(attacker))
- attacker.Paralyze(20)
attacker.Knockdown(60)
user.adjustStaminaLoss(10) //Can't block forever. Really, if this becomes a problem you're already screwed.
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 8b16f029f822..f73c5c0ca87a 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -102,7 +102,7 @@
span_userdanger("[A] slams your chest! You can't breathe!"))
playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1)
if(D.losebreath <= 10)
- D.losebreath = clamp(D.losebreath + 5, 0, 10)
+ D.losebreath = clamp(D.losebreath + 3, 0, 6)
D.adjustOxyLoss(10)
log_combat(A, D, "quickchoked")
return 1
diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm
index 670be33752ee..0fb6810f229d 100644
--- a/code/datums/mood_events/generic_positive_events.dm
+++ b/code/datums/mood_events/generic_positive_events.dm
@@ -62,7 +62,7 @@
special_screen_obj = "honked_nose"
special_screen_replace = FALSE
-/datum/mood_event/perform_cpr
+/datum/mood_event/saved_life
description = "It feels good to save a life.\n"
mood_change = 6
timeout = 5 MINUTES
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index 08398c1d5414..4ee8b3217a30 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -768,3 +768,20 @@
gain_text = span_danger("You feel like your blood is thin.")
lose_text = span_notice("You feel like your blood is of normal thickness once more.")
medical_record_text = "Patient appears unable to naturally form blood clots."
+
+/datum/quirk/brain_damage
+ name = "Brain Damage"
+ desc = "The shuttle ride was a bit bumpy to the station."
+ value = -7
+ gain_text = span_danger("Your head hurts.")
+ lose_text = span_notice("Your head feels good again.")
+ medical_record_text = "Patient appears to have brain damage."
+
+/datum/quirk/brain_damage/add()
+ var/mob/living/carbon/human/H = quirk_holder
+ var/datum/brain_trauma/badtimes = list(BRAIN_TRAUMA_MILD, BRAIN_TRAUMA_SEVERE)
+ var/amount = 0 // Pray you dont get fucked
+ amount = rand(1, 4)
+
+ for(var/i = 0 to amount)
+ H.gain_trauma_type(pick(badtimes), TRAUMA_RESILIENCE_ABSOLUTE) // Mr bones wild rides takes no breaks
diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm
index 1ffb866efdc8..653d910e54cb 100644
--- a/code/datums/wounds/bones.dm
+++ b/code/datums/wounds/bones.dm
@@ -241,6 +241,7 @@
if(!do_after(user, time, victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
+ playsound(victim, 'sound/effects/wounds/crack1.ogg', 25)
if(prob(65))
user.visible_message(span_danger("[user] snaps [victim]'s dislocated [limb.name] back into place!"), span_notice("You snap [victim]'s dislocated [limb.name] back into place!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] snaps your dislocated [limb.name] back into place!"))
@@ -260,6 +261,7 @@
if(!do_after(user, time, victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
+ playsound(victim, 'sound/effects/wounds/crack1.ogg', 25)
if(prob(65))
user.visible_message(span_danger("[user] snaps [victim]'s dislocated [limb.name] with a sickening crack!"), span_danger("You snap [victim]'s dislocated [limb.name] with a sickening crack!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] snaps your dislocated [limb.name] with a sickening crack!"))
@@ -280,7 +282,8 @@
if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), victim, extra_checks=CALLBACK(src, .proc/still_exists)))
return
-
+
+ playsound(I, 'sound/effects/wounds/crack1.ogg', 25)
if(victim == user)
limb.receive_damage(brute=15, wound_bonus=CANT_WOUND)
victim.visible_message(span_danger("[user] finishes resetting [victim.p_their()] [limb.name]!"), span_userdanger("You reset your [limb.name]!"))
diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm
index cab96d81f1ce..4414b9e521a2 100644
--- a/code/datums/wounds/burns.dm
+++ b/code/datums/wounds/burns.dm
@@ -190,6 +190,7 @@
/// if someone is using ointment on our burns
/datum/wound/burn/proc/ointment(obj/item/stack/medical/ointment/I, mob/user)
user.visible_message(span_notice("[user] begins applying [I] to [victim]'s [limb.name]..."), span_notice("You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]..."))
+ playsound(I, pick(I.apply_sounds), 25)
if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), extra_checks = CALLBACK(src, .proc/still_exists)))
return
@@ -210,6 +211,7 @@
to_chat(user, span_warning("You need to open [I] first."))
return
user.visible_message(span_notice("[user] begins wrapping [victim]'s [limb.name] with [I]..."), span_notice("You begin wrapping [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]..."))
+ playsound(I, pick(I.apply_sounds), 25)
if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm
index 95b2dd3d18e7..2fd461b8a889 100644
--- a/code/datums/wounds/pierce.dm
+++ b/code/datums/wounds/pierce.dm
@@ -101,8 +101,11 @@
/datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user)
var/self_penalty_mult = (user == victim ? 1.4 : 1)
user.visible_message(span_notice("[user] begins stitching [victim]'s [limb.name] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]..."))
+ playsound(I, pick(I.apply_sounds), 25)
+
if(!do_after(user, base_treat_time * self_penalty_mult * I.treatment_speed, victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
+
user.visible_message(span_green("[user] stitches up some of the bleeding on [victim]."), span_green("You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"]."))
var/blood_sutured = I.stop_bleeding / self_penalty_mult
blood_flow -= blood_sutured
@@ -120,9 +123,12 @@
var/self_penalty_mult = (user == victim ? 1.5 : 1) // 50% longer and less effective if you do it to yourself
user.visible_message(span_danger("[user] begins cauterizing [victim]'s [limb.name] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]..."))
+ playsound(I, 'sound/surgery/cautery1.ogg', 75, TRUE, falloff = 1)
+
if(!do_after(user, base_treat_time * self_penalty_mult * improv_penalty_mult, victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
-
+
+ playsound(I, 'sound/surgery/cautery2.ogg', 75, TRUE, falloff = 1)
user.visible_message(span_green("[user] cauterizes some of the bleeding on [victim]."), span_green("You cauterize some of the bleeding on [victim]."))
limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND)
if(prob(30))
diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm
index fa06fe035266..95bdbdda51d7 100644
--- a/code/datums/wounds/slash.dm
+++ b/code/datums/wounds/slash.dm
@@ -195,8 +195,12 @@
/datum/wound/slash/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user)
var/self_penalty_mult = (user == victim ? 1.25 : 1)
user.visible_message(span_warning("[user] begins aiming [lasgun] directly at [victim]'s [limb.name]..."), span_userdanger("You begin aiming [lasgun] directly at [user == victim ? "your" : "[victim]'s"] [limb.name]..."))
+ playsound(lasgun, 'sound/surgery/cautery1.ogg', 75, TRUE, falloff = 1)
+
if(!do_after(user, base_treat_time * self_penalty_mult, victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
+
+ playsound(lasgun, 'sound/surgery/cautery2.ogg', 75, TRUE, falloff = 1)
var/damage = lasgun.chambered.BB.damage
lasgun.chambered.BB.bare_wound_bonus = 0
lasgun.chambered.BB.wound_bonus -= 30
@@ -211,11 +215,13 @@
/datum/wound/slash/proc/tool_cauterize(obj/item/I, mob/user)
var/improv_penalty_mult = (I.tool_behaviour == TOOL_CAUTERY ? 1 : 1.25) // 25% longer and less effective if you don't use a real cautery
var/self_penalty_mult = (user == victim ? 1.5 : 1) // 50% longer and less effective if you do it to yourself
-
user.visible_message(span_danger("[user] begins cauterizing [victim]'s [limb.name] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]..."))
+ playsound(I, 'sound/surgery/cautery1.ogg', 75, TRUE, falloff = 1)
+
if(!do_after(user, base_treat_time * self_penalty_mult * improv_penalty_mult, victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
+ playsound(I, 'sound/surgery/cautery2.ogg', 75, TRUE, falloff = 1)
user.visible_message(span_green("[user] cauterizes some of the bleeding on [victim]."), span_green("You cauterize some of the bleeding on [victim]."))
limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND)
if(prob(30))
@@ -232,9 +238,11 @@
/datum/wound/slash/proc/suture(obj/item/stack/medical/suture/I, mob/user)
var/self_penalty_mult = (user == victim ? 1.4 : 1)
user.visible_message(span_notice("[user] begins stitching [victim]'s [limb.name] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]..."))
+ playsound(I, pick(I.apply_sounds), 25)
if(!do_after(user, base_treat_time * self_penalty_mult * I.treatment_speed, victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
+
user.visible_message(span_green("[user] stitches up some of the bleeding on [victim]."), span_green("You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"]."))
var/blood_sutured = I.stop_bleeding / self_penalty_mult
blood_flow -= blood_sutured
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 69929b66c9d1..c31bd20e18c1 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -146,7 +146,6 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
C.appearance = chosen_prof.appearance_list[slot]
C.name = chosen_prof.name_list[slot]
C.flags_cover = chosen_prof.flags_cover_list[slot]
- C.item_color = chosen_prof.item_color_list[slot]
C.item_state = chosen_prof.item_state_list[slot]
if(equip)
user.equip_to_slot_or_del(C, GLOB.slot2slot[slot])
@@ -172,4 +171,4 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
round_credits += "
"
round_credits += ..()
- return round_credits
\ No newline at end of file
+ return round_credits
diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm
index a2cd924fa114..5e806bcc4beb 100644
--- a/code/game/gamemodes/clown_ops/clown_weapons.dm
+++ b/code/game/gamemodes/clown_ops/clown_weapons.dm
@@ -65,7 +65,7 @@
attack_verb_on = list("slipped")
clumsy_check = FALSE
sharpness = SHARP_NONE
- item_color = "yellow"
+ saber_color = "yellow"
heat = 0
light_color = "#ffff00"
var/next_trombone_allowed = 0
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index 53931fd84e3f..fd9d50c1d6f1 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -302,6 +302,11 @@
/obj/machinery/button/crematorium/indestructible
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+/obj/machinery/button/holosign
+ name = "holosign button"
+ desc = "A remote control switch for a holosign."
+ device_type = /obj/item/assembly/control/holosign
+
/obj/item/wallframe/button
name = "button frame"
desc = "Used for building buttons."
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 731e13eb6886..5de9280cc0a4 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -378,7 +378,9 @@ GLOBAL_VAR_INIT(cryopods_enabled, FALSE)
R.contents -= R.mmi
qdel(R.mmi)
- mob_occupant.ghostize(FALSE)
+ var/mob/dead/observer/ghost = mob_occupant.ghostize(FALSE)
+ if(ghost)
+ ghost.mind = null
handle_objectives()
QDEL_NULL(occupant)
for(var/obj/item/I in get_turf(src))
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 86d8e41a9d61..b6d11deeb55e 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -126,8 +126,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
if(D)
D.adjust_money(point_gain)
- linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, point_gain)
- say("Explosion details and mixture analyzed and sold to the highest bidder for $[point_gain], with a reward of [point_gain] points.")
+ linked_techweb.add_stored_point_type(TECHWEB_POINT_TYPE_DEFAULT, point_gain)
+ say("Explosion details and mixture analyzed and sold to the highest bidder for $[point_gain], with a reward of [point_gain] points to be processed by research servers.")
else //you've made smaller bombs
say("Data already captured. Aborting.")
@@ -136,4 +136,4 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
/obj/machinery/doppler_array/research/science/Initialize()
. = ..()
- linked_techweb = SSresearch.science_tech
\ No newline at end of file
+ linked_techweb = SSresearch.science_tech
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index 78111c409f8e..2b0a10a0bc17 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -99,17 +99,7 @@
if(!LAZYLEN(operation_order)) //The list is empty, so we're done here
end_harvesting()
return
- var/turf/target
- for(var/adir in list(EAST,NORTH,SOUTH,WEST))
- var/turf/T = get_step(src,adir)
- if(!T)
- continue
- if(istype(T, /turf/closed))
- continue
- target = T
- break
- if(!target)
- target = get_turf(src)
+ var/turf/target = get_turf(src)
for(var/obj/item/bodypart/BP in operation_order) //first we do non-essential limbs
BP.drop_limb()
C.emote("scream")
@@ -144,6 +134,11 @@
return
return FALSE
+/obj/machinery/harvester/wrench_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(default_change_direction_wrench(user, I))
+ return TRUE
+
/obj/machinery/harvester/crowbar_act(mob/living/user, obj/item/I)
if(default_pry_open(I))
return TRUE
diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm
new file mode 100644
index 000000000000..70b15d62e138
--- /dev/null
+++ b/code/game/machinery/holosign.dm
@@ -0,0 +1,35 @@
+////////////////////HOLOSIGN///////////////////////////////////////
+/obj/machinery/holosign
+ name = "holosign"
+ desc = "Small wall-mounted holographic projector"
+ icon = 'icons/obj/holosign.dmi'
+ icon_state = "sign_off"
+ layer = 4
+ var/lit = FALSE
+ var/id = null
+ var/on_icon = "sign_on"
+
+/obj/machinery/holosign/proc/toggle()
+ if(!is_operational())
+ lit = FALSE
+ else
+ lit = !lit
+ update_icon()
+
+/obj/machinery/holosign/update_icon()
+ if(!lit)
+ icon_state = initial(icon_state)
+ set_light(0)
+ else
+ icon_state = on_icon
+ set_light(1, 0.5, l_color = COLOR_BLUE_LIGHT)
+
+/obj/machinery/holosign/power_change()
+ if(!is_operational())
+ lit = FALSE
+ update_icon()
+
+/obj/machinery/holosign/surgery
+ name = "surgery holosign"
+ desc = "Small wall-mounted holographic projector. This one reads SURGERY."
+ on_icon = "surgery"
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 030f98a503f1..f5be6a2e1645 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -1,3 +1,110 @@
+//dye registry, add dye colors and their resulting output here if you want the sprite to change instead of just the color.
+GLOBAL_LIST_INIT(dye_registry, list(
+ DYE_REGISTRY_UNDER = list(
+ DYE_RED = /obj/item/clothing/under/color/red,
+ DYE_ORANGE = /obj/item/clothing/under/color/orange,
+ DYE_YELLOW = /obj/item/clothing/under/color/yellow,
+ DYE_GREEN = /obj/item/clothing/under/color/green,
+ DYE_BLUE = /obj/item/clothing/under/color/blue,
+ DYE_PURPLE = /obj/item/clothing/under/color/lightpurple,
+ DYE_BLACK = /obj/item/clothing/under/color/black,
+ DYE_WHITE = /obj/item/clothing/under/color/white,
+ DYE_RAINBOW = /obj/item/clothing/under/color/rainbow,
+ DYE_MIME = /obj/item/clothing/under/rank/mime,
+ DYE_CLOWN = /obj/item/clothing/under/rank/clown,
+ DYE_QM = /obj/item/clothing/under/rank/chief_medical_officer,
+ DYE_LAW = /obj/item/clothing/under/lawyer/blacksuit,
+ DYE_CAPTAIN = /obj/item/clothing/under/rank/captain,
+ DYE_HOP = /obj/item/clothing/under/rank/head_of_personnel,
+ DYE_HOS = /obj/item/clothing/under/rank/head_of_security,
+ DYE_CE = /obj/item/clothing/under/rank/chief_engineer,
+ DYE_RD = /obj/item/clothing/under/rank/research_director,
+ DYE_CMO = /obj/item/clothing/under/rank/chief_medical_officer,
+ DYE_REDCOAT = /obj/item/clothing/under/redcoat
+ ),
+ DYE_REGISTRY_JUMPSKIRT = list(
+ DYE_RED = /obj/item/clothing/under/skirt/color/red,
+ DYE_ORANGE = /obj/item/clothing/under/skirt/color/orange,
+ DYE_YELLOW = /obj/item/clothing/under/skirt/color/yellow,
+ DYE_GREEN = /obj/item/clothing/under/skirt/color/green,
+ DYE_BLUE = /obj/item/clothing/under/skirt/color/blue,
+ DYE_PURPLE = /obj/item/clothing/under/skirt/color/lightpurple,
+ DYE_BLACK = /obj/item/clothing/under/skirt/color/black,
+ DYE_WHITE = /obj/item/clothing/under/skirt/color/white
+ ),
+ DYE_REGISTRY_GLOVES = list(
+ DYE_RED = /obj/item/clothing/gloves/color/red,
+ DYE_ORANGE = /obj/item/clothing/gloves/color/orange,
+ DYE_YELLOW = /obj/item/clothing/gloves/color/yellow,
+ DYE_GREEN = /obj/item/clothing/gloves/color/green,
+ DYE_BLUE = /obj/item/clothing/gloves/color/blue,
+ DYE_PURPLE = /obj/item/clothing/gloves/color/purple,
+ DYE_BLACK = /obj/item/clothing/gloves/color/black,
+ DYE_WHITE = /obj/item/clothing/gloves/color/white,
+ DYE_RAINBOW = /obj/item/clothing/gloves/color/rainbow,
+ DYE_MIME = /obj/item/clothing/gloves/color/white,
+ DYE_CLOWN = /obj/item/clothing/gloves/color/rainbow,
+ DYE_QM = /obj/item/clothing/gloves/color/brown,
+ DYE_CAPTAIN = /obj/item/clothing/gloves/color/captain,
+ DYE_HOP = /obj/item/clothing/gloves/color/grey,
+ DYE_HOS = /obj/item/clothing/gloves/color/black,
+ DYE_CE = /obj/item/clothing/gloves/color/black,
+ DYE_RD = /obj/item/clothing/gloves/color/grey,
+ DYE_CMO = /obj/item/clothing/gloves/color/latex/nitrile,
+ DYE_REDCOAT = /obj/item/clothing/gloves/color/white
+ ),
+ DYE_REGISTRY_SNEAKERS = list(
+ DYE_RED = /obj/item/clothing/shoes/sneakers/red,
+ DYE_ORANGE = /obj/item/clothing/shoes/sneakers/orange,
+ DYE_YELLOW = /obj/item/clothing/shoes/sneakers/yellow,
+ DYE_GREEN = /obj/item/clothing/shoes/sneakers/green,
+ DYE_BLUE = /obj/item/clothing/shoes/sneakers/blue,
+ DYE_PURPLE = /obj/item/clothing/shoes/sneakers/purple,
+ DYE_BLACK = /obj/item/clothing/shoes/sneakers/black,
+ DYE_WHITE = /obj/item/clothing/shoes/sneakers/white,
+ DYE_RAINBOW = /obj/item/clothing/shoes/sneakers/rainbow,
+ DYE_MIME = /obj/item/clothing/shoes/sneakers/black,
+ DYE_QM = /obj/item/clothing/shoes/sneakers/brown,
+ DYE_CAPTAIN = /obj/item/clothing/shoes/sneakers/brown,
+ DYE_HOP = /obj/item/clothing/shoes/sneakers/brown,
+ DYE_CE = /obj/item/clothing/shoes/sneakers/brown,
+ DYE_RD = /obj/item/clothing/shoes/sneakers/brown,
+ DYE_CMO = /obj/item/clothing/shoes/sneakers/brown
+ ),
+ DYE_REGISTRY_FANNYPACK = list(
+ DYE_RED = /obj/item/storage/belt/fannypack/red,
+ DYE_ORANGE = /obj/item/storage/belt/fannypack/orange,
+ DYE_YELLOW = /obj/item/storage/belt/fannypack/yellow,
+ DYE_GREEN = /obj/item/storage/belt/fannypack/green,
+ DYE_BLUE = /obj/item/storage/belt/fannypack/blue,
+ DYE_PURPLE = /obj/item/storage/belt/fannypack/purple,
+ DYE_BLACK = /obj/item/storage/belt/fannypack/black,
+ DYE_WHITE = /obj/item/storage/belt/fannypack/white
+ ),
+ DYE_REGISTRY_BEDSHEET = list(
+ DYE_RED = /obj/item/bedsheet/red,
+ DYE_ORANGE = /obj/item/bedsheet/orange,
+ DYE_YELLOW = /obj/item/bedsheet/yellow,
+ DYE_GREEN = /obj/item/bedsheet/green,
+ DYE_BLUE = /obj/item/bedsheet/blue,
+ DYE_PURPLE = /obj/item/bedsheet/purple,
+ DYE_BLACK = /obj/item/bedsheet/black,
+ DYE_WHITE = /obj/item/bedsheet,
+ DYE_RAINBOW = /obj/item/bedsheet/rainbow,
+ DYE_MIME = /obj/item/bedsheet/mime,
+ DYE_CLOWN = /obj/item/bedsheet/clown,
+ DYE_QM = /obj/item/bedsheet/qm,
+ DYE_LAW = /obj/item/bedsheet/black,
+ DYE_CAPTAIN = /obj/item/bedsheet/captain,
+ DYE_HOP = /obj/item/bedsheet/hop,
+ DYE_HOS = /obj/item/bedsheet/hos,
+ DYE_CE = /obj/item/bedsheet/ce,
+ DYE_RD = /obj/item/bedsheet/rd,
+ DYE_CMO = /obj/item/bedsheet/cmo,
+ DYE_COSMIC = /obj/item/bedsheet/cosmos
+ )
+))
+
/obj/machinery/washing_machine
name = "washing machine"
desc = "Gets rid of those pesky bloodstains, or your money back!"
@@ -12,23 +119,18 @@
/obj/machinery/washing_machine/examine(mob/user)
. = ..()
- . += span_notice("Alt-click it to start a wash cycle.")
+ if(!busy)
+ . += span_notice("Alt-click it to start a wash cycle.")
/obj/machinery/washing_machine/AltClick(mob/user)
- if(!user.canUseTopic(src, !issilicon(user)))
- return
-
- if(busy)
+ if(!user.canUseTopic(src, !issilicon(user)) || busy)
return
-
if(state_open)
to_chat(user, span_notice("Close the door first"))
return
-
if(bloody_mess)
to_chat(user, span_warning("[src] must be cleaned up first."))
return
-
busy = TRUE
update_icon()
addtimer(CALLBACK(src, .proc/wash_cycle), 200)
@@ -71,6 +173,29 @@
color_source = null
update_icon()
+/obj/item/proc/dye_item(dye_color)
+ if(undyeable)
+ return FALSE
+ if(dying_key)
+ if(!GLOB.dye_registry[dying_key])
+ log_runtime("Item just tried to be dyed with an invalid registry key: [dying_key]")
+ return FALSE
+ var/obj/item/target_type = GLOB.dye_registry[dying_key][dye_color]
+ if(target_type)
+ icon = initial(target_type.icon)
+ icon_state = initial(target_type.icon_state)
+ lefthand_file = initial(target_type.lefthand_file)
+ righthand_file = initial(target_type.righthand_file)
+ item_state = initial(target_type.item_state)
+ mob_overlay_icon = initial(target_type.mob_overlay_icon)
+ inhand_x_dimension = initial(target_type.inhand_x_dimension)
+ inhand_y_dimension = initial(target_type.inhand_y_dimension)
+ name = initial(target_type.name)
+ desc = "[initial(target_type.desc)] The colors look a little dodgy."
+ return target_type //successfully "appearance copy" dyed something; returns the target type as a hacky way of extending
+ add_atom_colour(dye_color, FIXED_COLOUR_PRIORITY)
+ return FALSE
+
//what happens to this object when washed inside a washing machine
/atom/movable/proc/machine_wash(obj/machinery/washing_machine/WM)
return
@@ -83,137 +208,33 @@
new /obj/item/reagent_containers/food/snacks/meat/slab/corgi(loc)
qdel(src)
-/obj/item/paper/machine_wash(obj/machinery/washing_machine/WM)
- if(WM.color_source)
- if(istype(WM.color_source, /obj/item/toy/crayon))
- var/obj/item/toy/crayon/CR = WM.color_source
- add_atom_colour(CR.paint_color, WASHABLE_COLOUR_PRIORITY)
- else
- if(istype(WM.color_source, /obj/item/reagent_containers/food/snacks/grown/rainbow_flower/))
- var/obj/item/reagent_containers/food/snacks/grown/rainbow_flower/RF = WM.color_source
- add_atom_colour(RF.color, WASHABLE_COLOUR_PRIORITY)
-
/mob/living/simple_animal/pet/dog/corgi/machine_wash(obj/machinery/washing_machine/WM)
WM.bloody_mess = TRUE
gib()
+/obj/item/machine_wash(obj/machinery/washing_machine/WM)
+ if(WM.color_source)
+ dye_item(WM.color_source.dye_color)
+
+/obj/item/clothing/under/dye_item(dye_color, dye_key)
+ . = ..()
+ if(.)
+ var/obj/item/clothing/under/U = .
+ can_adjust = initial(U.can_adjust)
+ if(!can_adjust && adjusted) //we deadjust the uniform if it's now unadjustable
+ toggle_jumpsuit_adjust()
+
/obj/item/clothing/under/machine_wash(obj/machinery/washing_machine/WM)
freshly_laundered = TRUE
addtimer(VARSET_CALLBACK(src, freshly_laundered, FALSE), 5 MINUTES, TIMER_UNIQUE | TIMER_OVERRIDE)
-
-/obj/item/clothing/under/color/machine_wash(obj/machinery/washing_machine/WM)
- ..()
- jumpsuit_wash(WM)
-
-/obj/item/clothing/under/rank/machine_wash(obj/machinery/washing_machine/WM)
..()
- jumpsuit_wash(WM)
-
-/obj/item/clothing/under/proc/jumpsuit_wash(obj/machinery/washing_machine/WM)
-
- if(WM.color_source)
- var/wash_color = WM.color_source.item_color
- var/obj/item/clothing/under/U
- for(var/T in typesof(/obj/item/clothing/under/color))
- var/obj/item/clothing/under/color/J = T
- if(wash_color == initial(J.item_color))
- U = J
- break
- if(!U)
- for(var/T in typesof(/obj/item/clothing/under/rank))
- var/obj/item/clothing/under/rank/R = T
- if(wash_color == initial(R.item_color))
- U = R
- break
- if(U)
- item_state = initial(U.item_state)
- icon_state = initial(U.icon_state)
- item_color = wash_color
- name = initial(U.name)
- dodgy_colours = TRUE
- can_adjust = initial(U.can_adjust)
- if(!can_adjust && adjusted) //we deadjust the uniform if it's now unadjustable
- toggle_jumpsuit_adjust()
-
-//dyed clothing results//
-
-/obj/item/storage/belt/fannypack/machine_wash(obj/machinery/washing_machine/WM)
- if(WM.color_source)
- var/wash_color = WM.color_source.item_color
- for(var/T in typesof(/obj/item/storage/belt/fannypack))
- var/obj/item/storage/belt/fannypack/FP = T
- if(wash_color == initial(FP.item_color))
- item_state = initial(FP.item_state)
- icon_state = initial(FP.icon_state)
- item_color = wash_color
- name = initial(FP.name)
- desc = "The colors are a bit dodgy."
- break
-
-/obj/item/clothing/gloves/color/machine_wash(obj/machinery/washing_machine/WM)
- if(WM.color_source)
- var/wash_color = WM.color_source.item_color
- for(var/T in typesof(/obj/item/clothing/gloves/color))
- var/obj/item/clothing/gloves/color/G = T
- if(wash_color == initial(G.item_color))
- item_state = initial(G.item_state)
- icon_state = initial(G.icon_state)
- item_color = wash_color
- name = initial(G.name)
- desc = "The colors are a bit dodgy."
/obj/item/clothing/shoes/sneakers/machine_wash(obj/machinery/washing_machine/WM)
if(chained)
chained = 0
slowdown = SHOES_SLOWDOWN
new /obj/item/restraints/handcuffs(loc)
- if(WM.color_source)
- var/wash_color = WM.color_source.item_color
- for(var/T in typesof(/obj/item/clothing/shoes/sneakers))
- var/obj/item/clothing/shoes/sneakers/S = T
- if(wash_color == initial(S.item_color))
- icon_state = initial(S.icon_state)
- item_color = wash_color
- name = initial(S.name)
- desc = "The colors are a bit dodgy."
- break
-
-/obj/item/bedsheet/machine_wash(obj/machinery/washing_machine/WM)
- if(WM.color_source)
- var/wash_color = WM.color_source.item_color
- for(var/T in typesof(/obj/item/bedsheet))
- var/obj/item/bedsheet/B = T
- if(wash_color == initial(B.item_color))
- icon_state = initial(B.icon_state)
- item_color = wash_color
- name = initial(B.name)
- desc = "The colors are a bit dodgy."
- break
-
-/obj/item/clothing/neck/scarf/machine_wash(obj/machinery/washing_machine/WM)
- if(WM.color_source)
- if(istype(WM.color_source, /obj/item/toy/crayon))
- var/obj/item/toy/crayon/CR = WM.color_source
- add_atom_colour(CR.paint_color, WASHABLE_COLOUR_PRIORITY)
- else
- if(istype(WM.color_source, /obj/item/reagent_containers/food/snacks/grown/rainbow_flower/))
- var/obj/item/reagent_containers/food/snacks/grown/rainbow_flower/RF = WM.color_source
- add_atom_colour(RF.color, WASHABLE_COLOUR_PRIORITY)
- name = "dyed scarf"
- desc = "The colors are a bit dodgy."
-
-/obj/item/clothing/head/beanie/machine_wash(obj/machinery/washing_machine/WM)
- if(WM.color_source)
- if(istype(WM.color_source, /obj/item/toy/crayon))
- var/obj/item/toy/crayon/CR = WM.color_source
- add_atom_colour(CR.paint_color, WASHABLE_COLOUR_PRIORITY)
- else
- if(istype(WM.color_source, /obj/item/reagent_containers/food/snacks/grown/rainbow_flower/))
- var/obj/item/reagent_containers/food/snacks/grown/rainbow_flower/RF = WM.color_source
- add_atom_colour(RF.color, WASHABLE_COLOUR_PRIORITY)
- name = "dyed beanie"
- desc = "The colors are a bit dodgy."
-
+ ..()
/obj/machinery/washing_machine/relaymove(mob/user)
container_resist(user)
@@ -223,8 +244,6 @@
add_fingerprint(user)
open_machine()
-
-
/obj/machinery/washing_machine/update_icon()
cut_overlays()
if(busy)
@@ -249,21 +268,21 @@
if (!state_open)
to_chat(user, span_warning("Open the door first!"))
- return 1
+ return TRUE
if(bloody_mess)
to_chat(user, span_warning("[src] must be cleaned up first."))
- return 1
+ return TRUE
if(contents.len >= max_wash_capacity)
to_chat(user, span_warning("The washing machine is full!"))
- return 1
+ return TRUE
if(!user.transferItemToLoc(W, src))
to_chat(user, span_warning("\The [W] is stuck to your hand, you cannot put it in the washing machine!"))
- return 1
+ return TRUE
- if(istype(W, /obj/item/toy/crayon) || istype(W, /obj/item/stamp) || istype(W, /obj/item/reagent_containers/food/snacks/grown/rainbow_flower) || istype(W, /obj/item/stack/ore/bluespace_crystal))
+ if(W.dye_color)
color_source = W
update_icon()
diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm
index e9f151fc1748..c1e5fbb34288 100644
--- a/code/game/objects/effects/glowshroom.dm
+++ b/code/game/objects/effects/glowshroom.dm
@@ -1,20 +1,42 @@
-//separate dm since hydro is getting bloated already
+
+#define GLOWSHROOM_SPREAD_BASE_DIMINISH_FACTOR 10
+#define GLOWSHROOM_SPREAD_DIMINISH_FACTOR_PER_GLOWSHROOM 0.2
+#define GLOWSHROOM_BASE_INTEGRITY 60
+
+GLOBAL_VAR_INIT(glowshrooms, 0)
/obj/structure/glowshroom
name = "glowshroom"
desc = "Mycena Bregprox, a species of mushroom that glows in the dark."
anchored = TRUE
- opacity = 0
+ opacity = FALSE
density = FALSE
icon = 'icons/obj/lighting.dmi'
icon_state = "glowshroom" //replaced in New
layer = ABOVE_NORMAL_TURF_LAYER
- max_integrity = 30
- var/delay = 1200
+ max_integrity = GLOWSHROOM_BASE_INTEGRITY
+ ///Cooldown for when next to try to spread.
+ COOLDOWN_DECLARE(spread_cooldown)
+ /// Min time interval between glowshroom "spreads"
+ var/min_delay_spread = 20 SECONDS
+ /// Max time interval between glowshroom "spreads"
+ var/max_delay_spread = 30 SECONDS
+ /// Boolean to indicate if the shroom is on the floor/wall
var/floor = 0
+ /// Mushroom generation number
var/generation = 1
- var/spreadIntoAdjacentChance = 60
+ /// Chance to spread into adjacent tiles (0-100)
+ var/spread_into_adjacent_chance = 75
+ ///Amount of decay when decay happens on process.
+ var/idle_decay_min = 1
+ ///Amount of decay when decay happens on process
+ var/idle_decay_max = 2
+ ///Amount of percentage decay affects endurance.max_integrity =
+ var/endurance_decay_rate = 0.1
+ /// Internal seed of the glowshroom, stats are stored here
var/obj/item/seeds/myseed = /obj/item/seeds/glowshroom
+
+ /// Turfs where the glowshroom cannot spread to
var/static/list/blacklisted_glowshroom_turfs = typecacheof(list(
/turf/open/lava,
/turf/open/floor/plating/beach/water))
@@ -38,33 +60,33 @@
. = ..()
. += "This is a [generation]\th generation [name]!"
-/obj/structure/glowshroom/Destroy()
- if(myseed)
- QDEL_NULL(myseed)
- return ..()
+/**
+ * Creates a new glowshroom structure.
+ *
+ * Arguments:
+ * * newseed - Seed of the shroom
+ */
+
-/obj/structure/glowshroom/New(loc, obj/item/seeds/newseed, mutate_stats)
- ..()
+
+/obj/structure/glowshroom/Initialize(mapload, obj/item/seeds/newseed)
+ . = ..()
+ GLOB.glowshrooms++
if(newseed)
- myseed = newseed.Copy()
+ myseed = newseed
myseed.forceMove(src)
else
myseed = new myseed(src)
- if(mutate_stats) //baby mushrooms have different stats :3
- myseed.adjust_potency(rand(-3,6))
- myseed.adjust_yield(rand(-1,2))
- myseed.adjust_production(rand(-3,6))
- myseed.adjust_endurance(rand(-3,6))
- delay = delay - myseed.production * 100 //So the delay goes DOWN with better stats instead of up. :I
- obj_integrity = myseed.endurance
- max_integrity = myseed.endurance
+
+ modify_max_integrity(GLOWSHROOM_BASE_INTEGRITY + ((100 - GLOWSHROOM_BASE_INTEGRITY) / 100 * myseed.endurance)) //goes up to 100 with peak endurance
+
var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow)
if(ispath(G)) // Seeds were ported to initialize so their genes are still typepaths here, luckily their initializer is smart enough to handle us doing this
myseed.genes -= G
G = new G
myseed.genes += G
set_light(G.glow_range(myseed), G.glow_power(myseed), G.glow_color)
- setDir(CalcDir())
+ setDir(calc_dir())
var/base_icon_state = initial(icon_state)
if(!floor)
switch(dir) //offset to make it be on the wall rather than on the floor
@@ -80,62 +102,92 @@
else //if on the floor, glowshroom on-floor sprite
icon_state = base_icon_state
- addtimer(CALLBACK(src, .proc/Spread), delay)
+ COOLDOWN_START(src, spread_cooldown, rand(min_delay_spread, max_delay_spread))
+
+ START_PROCESSING(SSobj, src)
+
+/obj/structure/glowshroom/Destroy()
+ . = ..()
+ GLOB.glowshrooms--
+ STOP_PROCESSING(SSobj, src)
+
+/**
+ * Causes glowshroom spreading across the floor/walls.
+ */
+
+/obj/structure/glowshroom/process(delta_time)
+ if(COOLDOWN_FINISHED(src, spread_cooldown))
+ COOLDOWN_START(src, spread_cooldown, rand(min_delay_spread, max_delay_spread))
+ Spread()
+
+ Decay(rand(idle_decay_min, idle_decay_max) * delta_time)
+
+
/obj/structure/glowshroom/proc/Spread()
var/turf/ownturf = get_turf(src)
- var/shrooms_planted = 0
+ if(!TURF_SHARES(ownturf)) //If we are in a 1x1 room
+ return //Deal with it not now
+
+ var/list/possible_locs = list()
+ //Lets collect a list of possible viewable turfs BEFORE we iterate for yield so we don't call view multiple
+ //times when there's no real chance of the viewable range changing, really you could do this once on item
+ //spawn and most people probably would not notice.
+ for(var/turf/open/floor/earth in oview(2,src))
+ if(is_type_in_typecache(earth, blacklisted_glowshroom_turfs))
+ continue
+ if(!TURF_SHARES(earth))
+ continue
+ possible_locs += earth
+
+ //Lets not even try to spawn again if somehow we have ZERO possible locations
+ if(!possible_locs.len)
+ return
+
+ var/chance_generation = 100 * (NUM_E ** -((GLOWSHROOM_SPREAD_BASE_DIMINISH_FACTOR + GLOWSHROOM_SPREAD_DIMINISH_FACTOR_PER_GLOWSHROOM * GLOB.glowshrooms) / myseed.potency * (generation - 1))) //https://www.desmos.com/calculator/istvjvcelz
+
for(var/i in 1 to myseed.yield)
- if(prob(1/(generation * generation) * 100))//This formula gives you diminishing returns based on generation. 100% with 1st gen, decreasing to 25%, 11%, 6, 4, 2...
- var/list/possibleLocs = list()
- var/spreadsIntoAdjacent = FALSE
-
- if(prob(spreadIntoAdjacentChance))
- spreadsIntoAdjacent = TRUE
-
- for(var/turf/open/floor/earth in view(3,src))
- if(is_type_in_typecache(earth, blacklisted_glowshroom_turfs))
- continue
- if(!ownturf.CanAtmosPass(earth))
- continue
- if(spreadsIntoAdjacent || !locate(/obj/structure/glowshroom) in view(1,earth))
- possibleLocs += earth
- CHECK_TICK
-
- if(!possibleLocs.len)
+ if(!prob(chance_generation))
+ continue
+ var/spreads_into_adjacent = prob(spread_into_adjacent_chance)
+ var/turf/new_loc = null
+
+ //Try three random locations to spawn before giving up tradeoff
+ //between running view(1, earth) on every single collected possibleLoc
+ //and failing to spread if we get 3 bad picks, which should only be a problem
+ //if there's a lot of glow shroom clustered about
+ for(var/iterator in 1 to 3)
+ var/turf/possibleLoc = pick(possible_locs)
+ if(spreads_into_adjacent || !locate(/obj/structure/glowshroom) in view(1,possibleLoc))
+ new_loc = possibleLoc
break
- var/turf/newLoc = pick(possibleLocs)
+ //We failed to find any location, skip trying to yield
+ if(new_loc == null)
+ break
- var/shroomCount = 0 //hacky
- var/placeCount = 1
- for(var/obj/structure/glowshroom/shroom in newLoc)
- shroomCount++
- for(var/wallDir in GLOB.cardinals)
- var/turf/isWall = get_step(newLoc,wallDir)
- if(isWall.density)
- placeCount++
- if(shroomCount >= placeCount)
- continue
- var/obj/structure/glowshroom/child = new type(newLoc, myseed, TRUE)
- child.generation = generation + 1
- shrooms_planted++
+ var/shroom_count = 0
+ var/place_count = 1
+ for(var/obj/structure/glowshroom/shroom in new_loc)
+ shroom_count++
+ for(var/wall_dir in GLOB.cardinals)
+ var/turf/potential_wall = get_step(new_loc,wall_dir)
+ if(potential_wall.density)
+ place_count++
+ if(shroom_count >= place_count)
+ continue
- CHECK_TICK
- else
- shrooms_planted++ //if we failed due to generation, don't try to plant one later
- if(shrooms_planted < myseed.yield) //if we didn't get all possible shrooms planted, try again later
- myseed.yield -= shrooms_planted
- addtimer(CALLBACK(src, .proc/Spread), delay)
+ var/obj/structure/glowshroom/child = new type(new_loc, myseed.Copy())
+ child.generation = generation + 1
-/obj/structure/glowshroom/proc/CalcDir(turf/location = loc)
+/obj/structure/glowshroom/proc/calc_dir(turf/location = loc)
var/direction = 16
- for(var/wallDir in GLOB.cardinals)
- var/turf/newTurf = get_step(location,wallDir)
- if(newTurf.density)
- direction |= wallDir
+ for(var/wall_dir in GLOB.cardinals)
+ var/turf/new_turf = get_step(location,wall_dir)
+ if(new_turf.density)
+ direction |= wall_dir
for(var/obj/structure/glowshroom/shroom in location)
if(shroom == src)
@@ -145,33 +197,60 @@
else
direction &= ~shroom.dir
- var/list/dirList = list()
+ var/list/dir_list = list()
for(var/i=1,i<=16,i <<= 1)
if(direction & i)
- dirList += i
+ dir_list += i
- if(dirList.len)
- var/newDir = pick(dirList)
- if(newDir == 16)
+ if(dir_list.len)
+ var/new_dir = pick(dir_list)
+ if(new_dir == 16)
floor = 1
- newDir = 1
- return newDir
+ new_dir = 1
+ return new_dir
floor = 1
return 1
+/**
+ * Causes the glowshroom to decay by decreasing its endurance, destroying it when it gets too low.
+ *
+ * Arguments:
+ * * amount - Amount of endurance to be reduced due to spread decay.
+ */
+/obj/structure/glowshroom/proc/Decay(amount)
+ myseed.adjust_endurance(-amount * endurance_decay_rate)
+ take_damage(amount)
+ if (myseed.endurance <= 10) // Plant is gone
+ qdel(src)
+
/obj/structure/glowshroom/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
if(damage_type == BURN && damage_amount)
- playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
+ playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE)
-/obj/structure/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(exposed_temperature > 300)
- take_damage(5, BURN, 0, 0)
/obj/structure/glowshroom/acid_act(acidpwr, acid_volume)
- . = 1
visible_message(span_danger("[src] melts away!"))
var/obj/effect/decal/cleanable/molten_object/I = new (get_turf(src))
I.desc = "Looks like this was \an [src] some time ago."
qdel(src)
+ return TRUE
+
+/obj/structure/glowshroom/extreme/Initialize(mapload, obj/item/seeds/newseed)
+ . = ..()
+ if(generation == 1)
+ myseed.potency = 100
+ myseed.endurance = 100
+ myseed.yield = 10
+
+/obj/structure/glowshroom/medium/Initialize(mapload, obj/item/seeds/newseed)
+ . = ..()
+ if(generation == 1)
+ myseed.potency = 50
+ myseed.endurance = 50
+ myseed.yield = 5
+
+#undef GLOWSHROOM_SPREAD_BASE_DIMINISH_FACTOR
+#undef GLOWSHROOM_SPREAD_DIMINISH_FACTOR_PER_GLOWSHROOM
+#undef GLOWSHROOM_BASE_INTEGRITY
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index da14f1ca0d32..0a17ec74325a 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -224,7 +224,7 @@
name = "pirate hat or bandana spawner"
loot = list(
/obj/item/clothing/head/pirate = 1,
- /obj/item/clothing/head/bandana = 1)
+ /obj/item/clothing/head/pirate/bandana = 1)
/obj/effect/spawner/lootdrop/minor/twentyfive_percent_cyborg_mask
name = "25% cyborg mask spawner"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 00a77dccffd0..da76aef280f6 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -8,10 +8,19 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
name = "item"
icon = 'icons/obj/misc.dmi'
blocks_emissive = EMISSIVE_BLOCK_GENERIC
+ ///icon state name for inhand overlays
var/item_state = null
+ ///Icon file for left hand inhand overlays
var/lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ ///Icon file for right inhand overlays
var/righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+ ///Icon file for mob worn overlays.
+ ///no var for state because it should *always* be the same as icon_state
+ var/icon/mob_overlay_icon
+ //Forced mob worn layer instead of the standard preferred ssize.
+ var/alternate_worn_layer
+
//Dimensions of the icon file used when this item is worn, eg: hats.dmi
//eg: 32x32 sprite, 64x64 sprite, etc.
//allows inhands/worn sprites to be of any size, but still centered on a mob properly
@@ -21,10 +30,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/inhand_x_dimension = 32
var/inhand_y_dimension = 32
- //Not on /clothing because for some reason any /obj/item can technically be "worn" with enough fuckery.
- var/icon/alternate_worn_icon = null//If this is set, update_icons() will find on mob (WORN, NOT INHANDS) states in this file instead, primary use: badminnery/events
- var/alternate_worn_layer = null//If this is set, update_icons() will force the on mob state (WORN, NOT INHANDS) onto this layer, instead of it's default
-
max_integrity = 200
obj_flags = NONE
@@ -62,8 +67,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/interaction_flags_item = INTERACT_ITEM_ATTACK_HAND_PICKUP
- var/item_color = null //this needs deprecating, soonish
-
var/body_parts_covered = 0 //see setup.dm for appropriate bit flags
var/gas_transfer_coefficient = 1 // for leaking gas from turf to mask and vice-versa (for masks right now, but at some point, i'd like to include space helmets)
var/permeability_coefficient = 1 // for chemicals/diseases
@@ -116,6 +119,13 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/trigger_guard = TRIGGER_GUARD_NONE
+ ///Used as the dye color source in the washing machine only (at the moment). Can be a hex color or a key corresponding to a registry entry, see washing_machine.dm
+ var/dye_color
+ ///Whether the item is unaffected by standard dying.
+ var/undyeable = FALSE
+ ///What dye registry should be looked at when dying this item; see washing_machine.dm
+ var/dying_key
+
//Grinder vars
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!
@@ -878,6 +888,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
if(ismob(loc))
var/mob/mob_loc = loc
mob_loc.regenerate_icons()
+
/**
* Called when this object is first embedded into a carbon
*/
diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm
index 458fd4f5f981..da0e1b9891fb 100644
--- a/code/game/objects/items/RCL.dm
+++ b/code/game/objects/items/RCL.dm
@@ -190,7 +190,7 @@
return //If we've run out, display message and exit
else
last = null
- loaded.item_color = colors[current_color_index]
+ loaded.color = colors[current_color_index]
last = loaded.place_turf(get_turf(src), user, turn(user.dir, 180))
is_empty(user) //If we've run out, display message
update_icon()
@@ -266,7 +266,7 @@
if(T.intact || !T.can_have_cabling())
return
- loaded.item_color = colors[current_color_index]
+ loaded.color = colors[current_color_index]
var/obj/structure/cable/linkingCable = findLinkingCable(user)
if(linkingCable)
@@ -300,7 +300,7 @@
var/cwname = colors[current_color_index]
to_chat(user, "Color changed to [cwname]!")
if(loaded)
- loaded.item_color= colors[current_color_index]
+ loaded.color = colors[current_color_index]
if(wiring_gui_menu)
wiringGuiUpdate(user)
else if(istype(action, /datum/action/item_action/rcl_gui))
diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm
index f7972e3aeb15..54083c27b8f4 100644
--- a/code/game/objects/items/RSF.dm
+++ b/code/game/objects/items/RSF.dm
@@ -29,6 +29,7 @@ RSF
/obj/item/storage/pill_bottle/dice = 200,
/obj/item/pen = 50,
/obj/item/clothing/mask/cigarette = 10,
+ /obj/item/plate = 25,
)
var/list/allowed_surfaces = list(/obj/structure/table) ///A list of surfaces that we are allowed to place things on.
var/action_type = "Dispensing" ///The verb that describes what we're doing, for use in text
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index bf9e6ab616d7..32ee802d8443 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -352,6 +352,8 @@
/obj/item/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_SCREWDRIVER)
+ if(build_path == /obj/machinery/computer/rdconsole/production)
+ return
if(build_path == /obj/machinery/computer/rdconsole/core)
name = "R&D Console - Robotics (Computer Board)"
build_path = /obj/machinery/computer/rdconsole/robotics
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index f69e5f72c2aa..13fff3cb5fd8 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -26,7 +26,7 @@
var/icon_uncapped
var/use_overlays = FALSE
- item_color = "red"
+ var/crayon_color = "red"
w_class = WEIGHT_CLASS_TINY
attack_verb = list("attacked", "coloured")
grind_results = list()
@@ -80,7 +80,9 @@
. = ..()
// Makes crayons identifiable in things like grinders
if(name == "crayon")
- name = "[item_color] crayon"
+ name = "[crayon_color] crayon"
+
+ dye_color = crayon_color
drawtype = pick(all_drawables)
@@ -262,12 +264,8 @@
var/mob/living/carbon/human/H = user
if (HAS_TRAIT(H, TRAIT_TAGGER))
cost *= 0.5
- /* yogs start -- moved to the end of the proc, after the crayon is actually used.
- var/charges_used = use_charges(user, cost)
- if(!charges_used)
+ if(check_empty(user, cost))
return
- . = charges_used
- yogs end */
if(istype(target, /obj/effect/decal/cleanable))
target = target.loc
@@ -352,6 +350,11 @@
if(!instant)
if(!do_after(user, 5 SECONDS, target))
return
+
+ var/charges_used = use_charges(user, cost)
+ if(!charges_used)
+ return
+ . = charges_used
if(length(text_buffer))
drawing = text_buffer[1]
@@ -397,12 +400,6 @@
if(post_noise)
audible_message(span_notice("You hear spraying."))
playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
- // yogs start -- using changes moved to the end of the proc, so it won't use charges if the spraying fails for any reason.
- var/charges_used = use_charges(user, cost)
- if(!charges_used)
- return
- . = charges_used
- // yogs end
var/fraction = min(1, . / reagents.maximum_volume)
if(affected_turfs.len)
fraction /= affected_turfs.len
@@ -427,67 +424,77 @@
/obj/item/toy/crayon/red
icon_state = "crayonred"
paint_color = "#DA0000"
- item_color = "red"
+ crayon_color = "red"
reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/red = 1)
+ dye_color = DYE_RED
/obj/item/toy/crayon/orange
icon_state = "crayonorange"
paint_color = "#FF9300"
- item_color = "orange"
+ crayon_color = "orange"
reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/orange = 1)
+ dye_color = DYE_ORANGE
/obj/item/toy/crayon/yellow
icon_state = "crayonyellow"
paint_color = "#FFF200"
- item_color = "yellow"
+ crayon_color = "yellow"
reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/yellow = 1)
+ dye_color = DYE_YELLOW
/obj/item/toy/crayon/green
icon_state = "crayongreen"
paint_color = "#A8E61D"
- item_color = "green"
+ crayon_color = "green"
reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/green = 1)
+ dye_color = DYE_GREEN
/obj/item/toy/crayon/blue
icon_state = "crayonblue"
paint_color = "#00B7EF"
- item_color = "blue"
+ crayon_color = "blue"
reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/blue = 1)
+ dye_color = DYE_BLUE
/obj/item/toy/crayon/purple
icon_state = "crayonpurple"
paint_color = "#DA00FF"
- item_color = "purple"
+ crayon_color = "purple"
reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/purple = 1)
+ dye_color = DYE_PURPLE
/obj/item/toy/crayon/black
icon_state = "crayonblack"
paint_color = "#1C1C1C" //Not completely black because total black looks bad. So Mostly Black.
- item_color = "black"
+ crayon_color = "black"
reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/black = 1)
+ dye_color = DYE_BLACK
/obj/item/toy/crayon/white
icon_state = "crayonwhite"
paint_color = "#FFFFFF"
- item_color = "white"
+ crayon_color = "white"
reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/white = 1)
+ dye_color = DYE_WHITE
/obj/item/toy/crayon/mime
icon_state = "crayonmime"
desc = "A very sad-looking crayon."
paint_color = "#FFFFFF"
- item_color = "mime"
+ crayon_color = "mime"
reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/invisible = 1)
charges = -1
+ dye_color = DYE_MIME
/obj/item/toy/crayon/rainbow
icon_state = "crayonrainbow"
paint_color = "#FFF000"
- item_color = "rainbow"
+ crayon_color = "rainbow"
reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent = 1)
drawtype = RANDOM_ANY // just the default starter.
charges = -1
+ dye_color = DYE_RAINBOW
/obj/item/toy/crayon/rainbow/afterattack(atom/target, mob/user, proximity, params)
paint_color = rgb(rand(0,255), rand(0,255), rand(0,255))
@@ -523,12 +530,12 @@
/obj/item/storage/crayons/update_icon()
cut_overlays()
for(var/obj/item/toy/crayon/crayon in contents)
- add_overlay(mutable_appearance('icons/obj/crayons.dmi', crayon.item_color))
+ add_overlay(mutable_appearance('icons/obj/crayons.dmi', crayon.crayon_color))
/obj/item/storage/crayons/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/toy/crayon))
var/obj/item/toy/crayon/C = W
- switch(C.item_color)
+ switch(C.crayon_color)
if("mime")
to_chat(usr, "This crayon is too sad to be contained in this box.")
return
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 3adaf0c62e96..4106eb536d0e 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -624,6 +624,7 @@
H.emote("gasp")
H.Jitter(100)
SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "saved_life", /datum/mood_event/saved_life)
log_combat(user, H, "revived", defib)
if(req_defib)
defib.deductcharge(revivecost)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index df8189300b4b..0bd89342e677 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -91,6 +91,7 @@ GLOBAL_LIST_EMPTY(PDAs)
var/overlays_x_offset = 0 //x offset to use for certain overlays
var/underline_flag = TRUE //flag for underline
+ var/beep_cooldown = 0
/obj/item/pda/suicide_act(mob/living/carbon/user)
var/deathMessage = msg_input(user)
@@ -1025,6 +1026,9 @@ GLOBAL_LIST_EMPTY(PDAs)
switch(scanmode)
if(PDA_SCANNER_MEDICAL)
+ if(beep_cooldown < world.time)
+ playsound(src, 'sound/effects/fastbeep.ogg', 20)
+ beep_cooldown = world.time + 40
C.visible_message(span_alert("[user] has analyzed [C]'s vitals!"))
healthscan(user, C, 1)
add_fingerprint(user)
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index 24f20ceda78c..48b372487724 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -82,6 +82,9 @@ effective or pretty fucking useless.
if(!irradiate || !is_syndicate(user)) // only syndicates are aware of this being a rad laser and know how to use it.
return
if(!used)
+ if(beep_cooldown < world.time)
+ playsound(src, 'sound/effects/fastbeep.ogg', 20)
+ beep_cooldown = world.time + 40
log_combat(user, M, "irradiated", src)
var/cooldown = get_cooldown()
used = TRUE
diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm
index ccf94f34b4b7..d39186f4e327 100644
--- a/code/game/objects/items/documents.dm
+++ b/code/game/objects/items/documents.dm
@@ -51,8 +51,8 @@
to_chat(user, span_warning("You have already forged a seal on [src]!"))
else
var/obj/item/toy/crayon/C = O
- name = "[C.item_color] secret documents"
- icon_state = "docs_[C.item_color]"
- forgedseal = C.item_color
- to_chat(user, span_notice("You forge the official seal with a [C.item_color] crayon. No one will notice... right?"))
- update_icon()
\ No newline at end of file
+ name = "[C.crayon_color] secret documents"
+ icon_state = "docs_[C.crayon_color]"
+ forgedseal = C.crayon_color
+ to_chat(user, span_notice("You forge the official seal with a [C.crayon_color] crayon. No one will notice... right?"))
+ update_icon()
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 69fa372d66cf..498fe1ae8d01 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -1,6 +1,7 @@
/obj/item/restraints
icon = 'icons/obj/handcuffs.dmi'
breakouttime = 600
+ mob_overlay_icon = 'icons/mob/restraints.dmi'
var/break_strength = 2 // Minimum strength required for a holopara to break it
/obj/item/restraints/suicide_act(mob/living/carbon/user)
@@ -27,6 +28,7 @@
desc = "Use this to keep prisoners in line."
gender = PLURAL
icon_state = "handcuff"
+ item_state = "handcuff"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
flags_1 = CONDUCT_1
@@ -104,18 +106,14 @@
desc = "A pair of restraints fashioned from long strands of flesh."
icon = 'icons/obj/mining.dmi'
icon_state = "sinewcuff"
- item_state = "sinewcuff"
materials = null
- item_color = "white"
- color = "#000000"
+ color = null
/obj/item/restraints/handcuffs/cable
name = "cable restraints"
desc = "Looks like some cables tied together. Could be used to tie something up."
- icon_state = "cuff"
- item_state = "coil"
- item_color = "red"
- color = "#ff0000"
+ icon_state = "zipties"
+ item_state = "zipties"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
materials = list(/datum/material/iron=150, /datum/material/glass=75)
@@ -123,49 +121,29 @@
break_strength = 2
cuffsound = 'sound/weapons/cablecuff.ogg'
-/obj/item/restraints/handcuffs/cable/Initialize(mapload, param_color)
- . = ..()
-
- var/list/cable_colors = GLOB.cable_colors
- item_color = param_color || item_color || pick(cable_colors)
- if(cable_colors[item_color])
- item_color = cable_colors[item_color]
- update_icon()
-
-/obj/item/restraints/handcuffs/cable/update_icon()
- color = null
- add_atom_colour(item_color, FIXED_COLOUR_PRIORITY)
-
/obj/item/restraints/handcuffs/cable/red
- item_color = "red"
color = "#ff0000"
/obj/item/restraints/handcuffs/cable/yellow
- item_color = "yellow"
color = "#ffff00"
/obj/item/restraints/handcuffs/cable/blue
- item_color = "blue"
color = "#1919c8"
/obj/item/restraints/handcuffs/cable/green
- item_color = "green"
color = "#00aa00"
/obj/item/restraints/handcuffs/cable/pink
- item_color = "pink"
color = "#ff3ccd"
/obj/item/restraints/handcuffs/cable/orange
- item_color = "orange"
color = "#ff8000"
/obj/item/restraints/handcuffs/cable/cyan
- item_color = "cyan"
color = "#00ffff"
/obj/item/restraints/handcuffs/cable/white
- item_color = "white"
+ color = null
/obj/item/restraints/handcuffs/alien
icon_state = "handcuffAlien"
@@ -210,19 +188,17 @@
/obj/item/restraints/handcuffs/cable/zipties
name = "zipties"
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
- icon_state = "cuff"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
materials = list()
breakouttime = 450 //Deciseconds = 45s
trashtype = /obj/item/restraints/handcuffs/cable/zipties/used
- item_color = "white"
+ color = null
break_strength = 3
/obj/item/restraints/handcuffs/cable/zipties/used
desc = "A pair of broken zipties."
- icon_state = "cuff_used"
- item_state = "cuff"
+ icon_state = "zipties_used"
/obj/item/restraints/handcuffs/cable/zipties/used/attack()
return
@@ -234,6 +210,7 @@
desc = "Use this to keep prisoners in line."
gender = PLURAL
icon_state = "handcuff"
+ item_state = "legcuff"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
flags_1 = CONDUCT_1
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 7f36c23ab028..f729e0a393ff 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -134,7 +134,7 @@
/obj/item/clothing/head/helmet/chaplain/cage
name = "cage"
desc = "A cage that restrains the will of the self, allowing one to see the profane world for what it is."
- alternate_worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
+ mob_overlay_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
icon_state = "cage"
item_state = "cage"
worn_x_dimension = 64
diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm
index 182a674bcce5..fd79c112c9b1 100644
--- a/code/game/objects/items/implants/implant.dm
+++ b/code/game/objects/items/implants/implant.dm
@@ -5,7 +5,7 @@
actions_types = list(/datum/action/item_action/hands_free/activate)
var/activated = TRUE //1 for implant types that can be activated, 0 for ones that are "always on" like mindshield implants
var/mob/living/imp_in = null
- item_color = "b"
+ var/implant_color = "b"
var/allow_multiple = FALSE
var/uses = -1
item_flags = DROPDEL
diff --git a/code/game/objects/items/implants/implant_freedom.dm b/code/game/objects/items/implants/implant_freedom.dm
index f3e66d2c08b7..280fbb7cd33a 100644
--- a/code/game/objects/items/implants/implant_freedom.dm
+++ b/code/game/objects/items/implants/implant_freedom.dm
@@ -2,7 +2,7 @@
name = "freedom implant"
desc = "Use this to escape from those evil Red Shirts."
icon_state = "freedom"
- item_color = "r"
+ implant_color = "r"
uses = 4
diff --git a/code/game/objects/items/implants/implant_storage.dm b/code/game/objects/items/implants/implant_storage.dm
index 84c23f875f30..c0f1a7af7540 100644
--- a/code/game/objects/items/implants/implant_storage.dm
+++ b/code/game/objects/items/implants/implant_storage.dm
@@ -2,7 +2,7 @@
name = "storage implant"
desc = "Stores up to two big items in a bluespace pocket."
icon_state = "storage"
- item_color = "r"
+ implant_color = "r"
var/max_slot_stacking = 4
/obj/item/implant/storage/activate()
diff --git a/code/game/objects/items/implants/implantcase.dm b/code/game/objects/items/implants/implantcase.dm
index 25c3a12cda61..17db84ab385e 100644
--- a/code/game/objects/items/implants/implantcase.dm
+++ b/code/game/objects/items/implants/implantcase.dm
@@ -16,7 +16,7 @@
/obj/item/implantcase/update_icon()
if(imp)
- icon_state = "implantcase-[imp.item_color]"
+ icon_state = "implantcase-[imp.implant_color]"
reagents = imp.reagents
else
icon_state = "implantcase-0"
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index f9dbc90fef4f..dd54d5b450d1 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -106,7 +106,9 @@
AddComponent(/datum/component/butchering, 80 - force, 100, force - 10) //bonus chance increases depending on force
/obj/item/kitchen/knife/attack(mob/living/carbon/M, mob/living/carbon/user)
- if(user.zone_selected == BODY_ZONE_PRECISE_EYES)
+ if(!user.a_intent == INTENT_HARM && attempt_initiate_surgery(src, M, user))
+ return
+ else if(user.zone_selected == BODY_ZONE_PRECISE_EYES)
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
M = user
return eyestab(M,user)
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index ab91c4d90f4c..4d4c49230a00 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -6,6 +6,7 @@
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
resistance_flags = FIRE_PROOF
var/brightness_on = 3
+ var/saber_color = null
/obj/item/melee/transforming/energy/Initialize()
. = ..()
@@ -36,8 +37,8 @@
. = ..()
if(.)
if(active)
- if(item_color)
- icon_state = "sword[item_color]"
+ if(saber_color)
+ icon_state = "sword[saber_color]"
START_PROCESSING(SSobj, src)
set_light(brightness_on)
else
@@ -101,11 +102,12 @@
embedding = list("embed_chance" = 75, "embedded_impact_pain_multiplier" = 10)
armour_penetration = 35
block_chance = 50
+ saber_color = "green"
/obj/item/melee/transforming/energy/sword/transform_weapon(mob/living/user, supress_message_text)
. = ..()
- if(. && active && item_color)
- icon_state = "sword[item_color]"
+ if(. && active && saber_color)
+ icon_state = "sword[saber_color]"
/obj/item/melee/transforming/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(active)
@@ -113,7 +115,7 @@
return 0
/obj/item/melee/transforming/energy/sword/cyborg
- item_color = "red"
+ saber_color = "red"
var/hitcost = 50
/obj/item/melee/transforming/energy/sword/cyborg/attack(mob/M, var/mob/living/silicon/robot/R)
@@ -134,7 +136,7 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "esaw_0"
icon_state_on = "esaw_1"
- item_color = null //stops icon from breaking when turned on.
+ saber_color = null //stops icon from breaking when turned on.
hitcost = 75 //Costs more than a standard cyborg esword
w_class = WEIGHT_CLASS_NORMAL
sharpness = SHARP_EDGED
@@ -157,7 +159,7 @@
. = ..()
if(LAZYLEN(possible_colors))
var/set_color = pick(possible_colors)
- item_color = set_color
+ saber_color = set_color
light_color = possible_colors[set_color]
/obj/item/melee/transforming/energy/sword/saber/process()
@@ -183,7 +185,7 @@
if(W.tool_behaviour == TOOL_MULTITOOL)
if(!hacked)
hacked = TRUE
- item_color = "rainbow"
+ saber_color = "rainbow"
to_chat(user, span_warning("RNBW_ENGAGE"))
if(active)
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 15835611af2f..fbadae796073 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -64,15 +64,18 @@
/obj/item/melee/cutlass
name = "cutlass"
- desc = "A true pirates weapon, seems somewhat dull though"
+ desc = "YAAAAAR! A fine weapon for a pirate, fit for slicing land-lubbers." //All pirate weapons must have pirate quips from now on it is non-negotiable
icon = 'icons/obj/weapons/swords.dmi'
icon_state = "metalcutlass"
item_state = "metalcutlass"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- force = 16
- throwforce = 5
- w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BELT
+ force = 18
+ throwforce = 10
+ w_class = WEIGHT_CLASS_HUGE
+ block_chance = 30
+ sharpness = SHARP_EDGED
attack_verb = list("slashed", "cut")
hitsound = 'sound/weapons/rapierhit.ogg'
materials = list(/datum/material/iron = 1000)
diff --git a/code/game/objects/items/paint.dm b/code/game/objects/items/paint.dm
index 8f79ec14bd66..b1b5124b2827 100644
--- a/code/game/objects/items/paint.dm
+++ b/code/game/objects/items/paint.dm
@@ -7,7 +7,7 @@
desc = "Used to recolor floors and walls. Can be removed by the janitor."
icon = 'icons/obj/artstuff.dmi'
icon_state = "paint_neutral"
- item_color = "FFFFFF"
+ var/paint_color = "FFFFFF"
item_state = "paintcan"
w_class = WEIGHT_CLASS_NORMAL
resistance_flags = FLAMMABLE
@@ -16,37 +16,37 @@
/obj/item/paint/red
name = "red paint"
- item_color = "C73232" //"FF0000"
+ paint_color = "C73232" //"FF0000"
icon_state = "paint_red"
/obj/item/paint/green
name = "green paint"
- item_color = "2A9C3B" //"00FF00"
+ paint_color = "2A9C3B" //"00FF00"
icon_state = "paint_green"
/obj/item/paint/blue
name = "blue paint"
- item_color = "5998FF" //"0000FF"
+ paint_color = "5998FF" //"0000FF"
icon_state = "paint_blue"
/obj/item/paint/yellow
name = "yellow paint"
- item_color = "CFB52B" //"FFFF00"
+ paint_color = "CFB52B" //"FFFF00"
icon_state = "paint_yellow"
/obj/item/paint/violet
name = "violet paint"
- item_color = "AE4CCD" //"FF00FF"
+ paint_color = "AE4CCD" //"FF00FF"
icon_state = "paint_violet"
/obj/item/paint/black
name = "black paint"
- item_color = "333333"
+ paint_color = "333333"
icon_state = "paint_black"
/obj/item/paint/white
name = "white paint"
- item_color = "FFFFFF"
+ paint_color = "FFFFFF"
icon_state = "paint_white"
@@ -61,19 +61,19 @@
return
switch(t1)
if("red")
- item_color = "C73232"
+ paint_color = "C73232"
if("blue")
- item_color = "5998FF"
+ paint_color = "5998FF"
if("green")
- item_color = "2A9C3B"
+ paint_color = "2A9C3B"
if("yellow")
- item_color = "CFB52B"
+ paint_color = "CFB52B"
if("violet")
- item_color = "AE4CCD"
+ paint_color = "AE4CCD"
if("white")
- item_color = "FFFFFF"
+ paint_color = "FFFFFF"
if("black")
- item_color = "333333"
+ paint_color = "333333"
icon_state = "paint_[t1]"
add_fingerprint(user)
@@ -87,7 +87,7 @@
return
if(!isturf(target) || isspaceturf(target))
return
- var/newcolor = "#" + item_color
+ var/newcolor = "#" + paint_color
target.add_atom_colour(newcolor, WASHABLE_COLOUR_PRIORITY)
/obj/item/paint/paint_remover
diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm
index 46ad5ae11cd8..6a5c616cbc9e 100644
--- a/code/game/objects/items/religion.dm
+++ b/code/game/objects/items/religion.dm
@@ -280,7 +280,7 @@
/obj/item/clothing/head/helmet/plate/crusader/prophet
name = "Prophet's Hat"
desc = "A religious-looking hat."
- alternate_worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
+ mob_overlay_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
flags_1 = 0
armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 50, BOMB = 70, BIO = 50, RAD = 50, FIRE = 60, ACID = 60) //religion protects you from disease and radiation, honk.
worn_x_dimension = 64
diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm
index 05c043b9a2eb..bf942bb8e7e7 100644
--- a/code/game/objects/items/stacks/bscrystal.dm
+++ b/code/game/objects/items/stacks/bscrystal.dm
@@ -4,8 +4,8 @@
desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate."
icon = 'icons/obj/telescience.dmi'
icon_state = "bluespace_crystal"
- item_color = "cosmos"
singular_name = "bluespace crystal"
+ dye_color = DYE_COSMIC
w_class = WEIGHT_CLASS_TINY
materials = list(/datum/material/bluespace=MINERAL_MATERIAL_AMOUNT)
points = 75
@@ -31,6 +31,10 @@
new /obj/effect/particle_effect/sparks(loc)
playsound(loc, "sparks", 50, 1)
blink_mob(user)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.adjust_disgust(30) //Won't immediately make you vomit, just dont use more than one or two at a time
+ C.confused += 7
use(1)
/obj/item/stack/ore/bluespace_crystal/proc/blink_mob(mob/living/L)
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 668528d0587c..c3da29b197dd 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -170,9 +170,13 @@
user.visible_message(span_warning("[user] begins wrapping the wounds on [M]'s [limb.name] with [src]..."), span_warning("You begin wrapping the wounds on [user == M ? "your" : "[M]'s"] [limb.name] with [src]..."))
+ playsound(src, 'sound/effects/rip2.ogg', 25)
+
if(!do_after(user, (user == M ? self_delay : other_delay), M))
return
+ playsound(src, 'sound/effects/rip1.ogg', 25)
+
user.visible_message(span_green("[user] applies [src] to [M]'s [limb.name]."), span_green("You bandage the wounds on [user == M ? "yourself" : "[M]'s"] [limb.name]."))
limb.apply_gauze(src)
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index f64389e32490..a7d30ed70cd2 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -218,7 +218,7 @@
else if(istype(O, /obj/item/restraints/handcuffs/cable))
var/obj/item/cuffs = O
- cuffs.item_color = item_color
+ cuffs.color = color
cuffs.update_icon()
if (QDELETED(O))
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 8b37fef12dae..cd919ab581b1 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -651,6 +651,7 @@
new /obj/item/clothing/suit/armor/vest/rurmcoat(src)
new /obj/item/clothing/suit/armor/vest/sovietcoat(src)
new /obj/item/clothing/under/yogs/hopcasual(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/hop(src)
/obj/item/storage/backpack/duffelbag/clothing/rd
name = "Research Directors clothing duffelbag"
@@ -666,6 +667,7 @@
new /obj/item/clothing/under/rank/research_director/alt/skirt(src)
new /obj/item/clothing/under/rank/research_director/turtleneck(src)
new /obj/item/clothing/under/rank/research_director/turtleneck/skirt(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/science/rd(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/clothing/under/yogs/rdema(src)
@@ -688,6 +690,7 @@
new /obj/item/clothing/under/yogs/cecasual(src)
new /obj/item/clothing/head/beret/ce(src)
new /obj/item/clothing/suit/hazardvest(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/engineering/ce(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/glasses/meson/engine(src)
@@ -759,6 +762,7 @@
new /obj/item/clothing/under/yogs/hoslatenight(src)
new /obj/item/clothing/under/yogs/hoscasual(src)
new /obj/item/clothing/suit/armor/vest/hosjacket(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/security/hos(src)
/obj/item/storage/backpack/duffelbag/clothing/med/chief
name = "Chief Medical Officer's clothing duffelbag"
@@ -774,3 +778,4 @@
new /obj/item/clothing/under/rank/chief_medical_officer/skirt(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/clothing/head/beret/cmo(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/medical/cmo(src)
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index ee311128efa2..ffe980727038 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -228,13 +228,14 @@
desc = "Can hold security gear like handcuffs and flashes."
icon_state = "securitybelt"
item_state = "security"//Could likely use a better one.
- w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_BULKY
content_overlays = TRUE
/obj/item/storage/belt/security/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 6
+ STR.max_combined_w_class = 18
STR.max_w_class = WEIGHT_CLASS_NORMAL
STR.set_holdable(list(
/obj/item/melee/baton,
@@ -246,6 +247,10 @@
/obj/item/clothing/glasses,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_box,
+ /obj/item/storage/box/rubbershot,
+ /obj/item/storage/box/lethalshot,
+ /obj/item/storage/box/breacherslug,
+ /obj/item/storage/box/beanbag,
/obj/item/reagent_containers/food/snacks/donut,
/obj/item/kitchen/knife/combat,
/obj/item/flashlight/seclite,
@@ -254,6 +259,7 @@
/obj/item/clothing/gloves,
/obj/item/restraints/legcuffs/bola,
/obj/item/holosign_creator/security,
+ /obj/item/shield/riot/tele,
/obj/item/barrier_taperoll/police
))
@@ -272,6 +278,12 @@
icon_state = "securitybelt_hos"
item_state = "security_hos"
+/obj/item/storage/belt/security/chief/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_items = 7
+ STR.max_combined_w_class = 21
+
/obj/item/storage/belt/security/chief/full/PopulateContents()
new /obj/item/reagent_containers/spray/pepper(src)
new /obj/item/restraints/handcuffs(src)
@@ -279,6 +291,7 @@
new /obj/item/assembly/flash/handheld(src)
new /obj/item/melee/baton/loaded(src)
new /obj/item/barrier_taperoll/police(src)
+ new /obj/item/shield/riot/tele(src)
update_icon()
/obj/item/storage/belt/security/webbing
@@ -287,12 +300,13 @@
icon_state = "securitywebbing"
item_state = "securitywebbing"
w_class = WEIGHT_CLASS_BULKY
- custom_premium_price = 800
+ custom_premium_price = 200
/obj/item/storage/belt/security/webbing/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_items = 6
+ STR.max_items = 7
+ STR.max_combined_w_class = 21
/obj/item/storage/belt/mining
name = "explorer's webbing"
@@ -303,9 +317,9 @@
/obj/item/storage/belt/mining/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_items = 6
+ STR.max_items = 8
STR.max_w_class = WEIGHT_CLASS_BULKY
- STR.max_combined_w_class = 20
+ STR.max_combined_w_class = 24
STR.set_holdable(list(
/obj/item/crowbar,
/obj/item/screwdriver,
@@ -332,12 +346,14 @@
/obj/item/stack/medical,
/obj/item/kitchen/knife,
/obj/item/reagent_containers/hypospray,
+ /obj/item/lazarus_injector,
/obj/item/gps,
/obj/item/storage/bag/ore,
/obj/item/survivalcapsule,
/obj/item/t_scanner/adv_mining_scanner,
/obj/item/reagent_containers/pill,
/obj/item/storage/pill_bottle,
+ /obj/item/reagent_containers/food/drinks/bottle/whiskey,
/obj/item/stack/ore,
/obj/item/reagent_containers/food/drinks,
/obj/item/hivelordstabilizer,
@@ -347,8 +363,7 @@
/obj/item/stack/marker_beacon,
/obj/item/handdrill,
/obj/item/jawsoflife,
- /obj/item/restraints/legcuffs/bola/watcher,
- /obj/item/claymore/bone
+ /obj/item/restraints/legcuffs/bola/watcher
))
@@ -368,7 +383,7 @@
/obj/item/storage/belt/mining/primitive/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_items = 5
+ STR.max_items = 6
/obj/item/storage/belt/soulstone
name = "soul stone belt"
@@ -545,11 +560,6 @@
icon_state = "assaultbelt"
item_state = "security"
-/obj/item/storage/belt/military/assault/ComponentInitialize()
- . = ..()
- var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_items = 6
-
/obj/item/storage/belt/grenade
name = "grenadier belt"
desc = "A belt for holding grenades."
@@ -657,7 +667,8 @@
/obj/item/storage/belt/bandolier/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_items = 18
+ STR.max_items = 24
+ STR.max_combined_w_class = 24
STR.display_numerical_stacking = TRUE
STR.set_holdable(list(
/obj/item/ammo_casing/shotgun
@@ -668,6 +679,7 @@
desc = "A holster to carry a handgun and ammo. WARNING: Badasses only."
icon_state = "holster"
item_state = "holster"
+ w_class = WEIGHT_CLASS_NORMAL
alternate_worn_layer = UNDER_SUIT_LAYER
/obj/item/storage/belt/holster/ComponentInitialize()
@@ -730,7 +742,7 @@
desc = "A dorky fannypack for keeping small items in."
icon_state = "fannypack_leather"
item_state = "fannypack_leather"
- item_color = "fannypackleather"
+ dying_key = DYE_REGISTRY_FANNYPACK
custom_price = 15
/obj/item/storage/belt/fannypack/ComponentInitialize()
@@ -743,61 +755,51 @@
name = "black fannypack"
icon_state = "fannypack_black"
item_state = "fannypack_black"
- item_color = "black"
/obj/item/storage/belt/fannypack/red
name = "red fannypack"
icon_state = "fannypack_red"
item_state = "fannypack_red"
- item_color = "red"
/obj/item/storage/belt/fannypack/purple
name = "purple fannypack"
icon_state = "fannypack_purple"
item_state = "fannypack_purple"
- item_color = "purple"
/obj/item/storage/belt/fannypack/blue
name = "blue fannypack"
icon_state = "fannypack_blue"
item_state = "fannypack_blue"
- item_color = "blue"
/obj/item/storage/belt/fannypack/orange
name = "orange fannypack"
icon_state = "fannypack_orange"
item_state = "fannypack_orange"
- item_color = "orange"
/obj/item/storage/belt/fannypack/white
name = "white fannypack"
icon_state = "fannypack_white"
item_state = "fannypack_white"
- item_color = "white"
/obj/item/storage/belt/fannypack/green
name = "green fannypack"
icon_state = "fannypack_green"
item_state = "fannypack_green"
- item_color = "green"
/obj/item/storage/belt/fannypack/pink
name = "pink fannypack"
icon_state = "fannypack_pink"
item_state = "fannypack_pink"
- item_color = "pink"
/obj/item/storage/belt/fannypack/cyan
name = "cyan fannypack"
icon_state = "fannypack_cyan"
item_state = "fannypack_cyan"
- item_color = "cyan"
/obj/item/storage/belt/fannypack/yellow
name = "yellow fannypack"
icon_state = "fannypack_yellow"
item_state = "fannypack_yellow"
- item_color = "yellow"
/obj/item/storage/belt/sabre
name = "sabre sheath"
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index c9d5eb16ddda..7ae8e84d389d 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -802,42 +802,66 @@
/obj/item/storage/box/rubbershot
name = "box of rubber shots"
- desc = "A box full of rubber shots, designed for riot shotguns."
+ desc = "A box full of rubber shots designed for shotguns. The box itself is designed for holding any kind of shotgun shell."
icon_state = "rubbershot_box"
illustration = null
+/obj/item/storage/box/rubbershot/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_items = 7
+ STR.set_holdable(list(/obj/item/ammo_casing/shotgun))
+
/obj/item/storage/box/rubbershot/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/ammo_casing/shotgun/rubbershot(src)
/obj/item/storage/box/lethalshot
name = "box of lethal shotgun shots"
- desc = "A box full of lethal shots, designed for riot shotguns."
+ desc = "A box full of lethal shots designed for shotguns. The box itself is designed for holding any kind of shotgun shell."
icon_state = "lethalshot_box"
illustration = null
+/obj/item/storage/box/lethalshot/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_items = 7
+ STR.set_holdable(list(/obj/item/ammo_casing/shotgun))
+
/obj/item/storage/box/lethalshot/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/ammo_casing/shotgun/buckshot(src)
/obj/item/storage/box/breacherslug
name = "box of breaching shotgun shells"
- desc = "A box full of breaching slugs, designed for rapid entry."
+ desc = "A box full of breaching slugs designed for rapid entry. The box itself is designed for holding any kind of shotgun shell."
icon_state = "breachershot_box"
illustration = null
+/obj/item/storage/box/breacherslug/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_items = 7
+ STR.set_holdable(list(/obj/item/ammo_casing/shotgun))
+
/obj/item/storage/box/breacherslug/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/ammo_casing/shotgun/breacher(src)
/obj/item/storage/box/beanbag
name = "box of beanbags"
- desc = "A box full of beanbag shells."
+ desc = "A box full of beanbag shells designed for shotguns. The box itself is designed for holding any kind of shotgun shell."
icon_state = "rubbershot_box"
illustration = null
+/obj/item/storage/box/beanbag/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_items = 7
+ STR.set_holdable(list(/obj/item/ammo_casing/shotgun))
+
/obj/item/storage/box/beanbag/PopulateContents()
- for(var/i in 1 to 6)
+ for(var/i in 1 to 7)
new /obj/item/ammo_casing/shotgun/beanbag(src)
/obj/item/storage/box/actionfigure
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index b51c7ee06dab..76f50774436b 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -15,7 +15,8 @@
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 80, ACID = 80)
var/cooldown_check = 0
-
+ /// if the baton is on cooldown from being dropped
+ var/dropcheck = FALSE
///how long we can't use this baton for after slapping someone with it. Does not account for melee attack cooldown (default of 0.8 seconds).
var/cooldown = 1.2 SECONDS
///how long a clown stuns themself for, or someone is stunned for if they are hit to >90 stamina damage
@@ -23,7 +24,7 @@
///how much stamina damage we deal per hit, this is combatted by energy armor
var/stamina_damage = 70
///are we turned on
- var/status = TRUE
+ var/status = FALSE
///the cell used by the baton
var/obj/item/stock_parts/cell/cell
///how much charge is deducted from the cell when we slap someone while on
@@ -34,6 +35,10 @@
var/preload_cell_type
///used for passive discharge
var/cell_last_used = 0
+ var/makeshift = FALSE
+ var/obj/item/firing_pin/pin = /obj/item/firing_pin
+ var/obj/item/batonupgrade/upgrade
+ var/thrown = FALSE
/obj/item/melee/baton/get_cell()
return cell
@@ -44,13 +49,31 @@
/obj/item/melee/baton/Initialize()
. = ..()
+ status = FALSE
if(preload_cell_type)
if(!ispath(preload_cell_type,/obj/item/stock_parts/cell))
log_mapping("[src] at [AREACOORD(src)] had an invalid preload_cell_type: [preload_cell_type].")
else
cell = new preload_cell_type(src)
+ if(pin)
+ pin = new pin(src)
+ RegisterSignal(src, COMSIG_MOVABLE_PRE_DROPTHROW, .proc/throwbaton)
update_icon()
+/obj/item/melee/baton/Destroy()
+ . = ..()
+ if(isobj(pin)) //Can still be the initial path, then we skip
+ QDEL_NULL(pin)
+ if(isobj(upgrade)) //Can still be the initial path, then we skip
+ QDEL_NULL(upgrade)
+
+/obj/item/melee/baton/handle_atom_del(atom/A)
+ . = ..()
+ if(A == pin)
+ pin = null
+ if(A == upgrade)
+ upgrade = null
+
/obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(..())
return
@@ -58,6 +81,22 @@
if(status && prob(throw_hit_chance) && iscarbon(hit_atom))
baton_stun(hit_atom)
+/obj/item/melee/baton/proc/throwbaton()
+ thrown = TRUE
+
+/obj/item/melee/baton/dropped(mob/user, silent)
+ if(loc != user.loc)
+ return
+ . = ..()
+ if(!thrown)
+ dropcheck = TRUE
+ status = FALSE
+ visible_message(span_warning("The safety strap on [src] is pulled as it is dropped, triggering its emergency shutoff!"))
+ addtimer(VARSET_CALLBACK(src, dropcheck, FALSE), 8 SECONDS)
+ update_icon()
+ else
+ thrown = FALSE
+
/obj/item/melee/baton/loaded //this one starts with a cell pre-installed.
preload_cell_type = /obj/item/stock_parts/cell/high
@@ -110,7 +149,45 @@
cell = W
to_chat(user, span_notice("You install a cell in [src]."))
update_icon()
-
+ else if(istype(W, /obj/item/firing_pin))
+ if(makeshift)
+ return
+ if(upgrade)
+ if(W.type != /obj/item/firing_pin)
+ to_chat("You are unable to add a non default firing pin whilst [src] has an upgrade. Remove the upgrade first with a crowbar.")
+ return
+ if(pin)
+ to_chat(user, span_notice("[src] already has a firing pin. You can remove it with crowbar."))
+ else
+ W.forceMove(src)
+ pin = W
+ else if(istype(W, /obj/item/batonupgrade))
+ if(makeshift)
+ return
+ if(pin)
+ if(pin.type != /obj/item/firing_pin)
+ to_chat("You are unable to upgrade the baton whilst it has a non default firing pin.")
+ return
+ if(upgrade)
+ to_chat(user, span_notice("[src] already has an upgrade installed. You can remove it with crowbar"))
+ else
+ to_chat(user, span_notice("You apply the [W.name] to the [src]"))
+ W.forceMove(src)
+ upgrade = W
+ else if(W.tool_behaviour == TOOL_CROWBAR)
+ if(makeshift)
+ return
+ if(pin)
+ pin.forceMove(get_turf(src))
+ pin = null
+ status = FALSE
+ to_chat(user, span_notice("You remove the firing pin from [src]."))
+ if(upgrade)
+ upgrade.forceMove(get_turf(src))
+ upgrade = null
+ status = FALSE
+ to_chat(user, span_notice("You remove the upgrade from [src]."))
+ update_icon()
else if(W.tool_behaviour == TOOL_SCREWDRIVER)
if(cell)
cell.update_icon()
@@ -118,12 +195,17 @@
cell = null
to_chat(user, span_notice("You remove the cell from [src]."))
status = FALSE
- update_icon()
STOP_PROCESSING(SSobj, src) // no cell, no charge; stop processing for on because it cant be on
+ update_icon()
else
return ..()
/obj/item/melee/baton/attack_self(mob/user)
+ if(!handle_pins(user))
+ return FALSE
+ if(dropcheck)
+ to_chat(user, "[src]'s emergency shutoff is still active!")
+ return
if(cell && cell.charge > hitcost)
status = !status
to_chat(user, span_notice("[src] is now [status ? "on" : "off"]."))
@@ -164,7 +246,6 @@
..()
return
-
if(ishuman(M))
var/mob/living/carbon/human/L = M
var/datum/martial_art/A = L.check_block()
@@ -191,6 +272,13 @@
/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user)
+ if(!handle_pins(user))
+ return FALSE
+ if(upgrade)
+ stamina_damage = initial(stamina_damage)*2
+ hitcost = initial(hitcost)*1.5
+ else
+ stamina_damage = initial(stamina_damage)
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that
@@ -209,6 +297,8 @@
var/obj/item/bodypart/affecting = L.get_bodypart(user? user.zone_selected : BODY_ZONE_CHEST)
var/armor_block = L.run_armor_check(affecting, ENERGY) //check armor on the limb because that's where we are slapping...
L.apply_damage(stamina_damage, STAMINA, BODY_ZONE_CHEST, armor_block) //...then deal damage to chest so we can't do the old hit-a-disabled-limb-200-times thing, batons are electrical not directed.
+
+
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
var/current_stamina_damage = L.getStaminaLoss()
@@ -276,6 +366,7 @@
hitcost = 2000
throw_hit_chance = 10
slot_flags = ITEM_SLOT_BACK
+ makeshift = TRUE
var/obj/item/assembly/igniter/sparkler = 0
/obj/item/melee/baton/cattleprod/Initialize()
@@ -291,3 +382,20 @@
desc = "A cost-effective, mass-produced, tactical stun prod."
preload_cell_type = /obj/item/stock_parts/cell/high/plus // comes with a cell
color = "#aeb08c" // super tactical
+
+/obj/item/melee/baton/proc/handle_pins(mob/living/user)
+ if(pin)
+ if(pin.pin_auth(user) || (pin.obj_flags & EMAGGED))
+ return TRUE
+ else
+ pin.auth_fail(user)
+ return FALSE
+ else
+ to_chat(user, span_warning("[src]'s trigger is locked. This weapon doesn't have a firing pin installed!"))
+ return FALSE
+
+/obj/item/batonupgrade
+ name = "baton power upgrade"
+ desc = "A new power management circuit which enables stun batons to instantly stun, at the cost of double power usage."
+ icon = 'icons/obj/module.dmi'
+ icon_state = "cyborg_upgrade3"
diff --git a/code/game/objects/items/syndicateReverseCard.dm b/code/game/objects/items/syndicateReverseCard.dm
index 656582f7bb92..165642ef518b 100644
--- a/code/game/objects/items/syndicateReverseCard.dm
+++ b/code/game/objects/items/syndicateReverseCard.dm
@@ -4,7 +4,7 @@
name = "Red Reverse"
icon = 'icons/obj/toy.dmi'
icon_state = "sc_Red Reverse_uno"
- desc = "a card."
+ desc = "A card."
w_class = WEIGHT_CLASS_TINY
var/used = FALSE //has this been used before? If not, give no hints about it's nature
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index c4e0c4483489..bbb6ccbf7112 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -20,6 +20,10 @@
toolspeed = 1
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30)
+/obj/item/crowbar/attack(mob/living/M, mob/user)
+ if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user))
+ ..()
+
/obj/item/crowbar/suicide_act(mob/user)
user.visible_message(span_suicide("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index 52e90d6bece8..f3fecffcfc4a 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -74,6 +74,8 @@
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state)
/obj/item/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
+ if(!user.a_intent == INTENT_HARM && attempt_initiate_surgery(src, M, user))
+ return
if(!istype(M))
return ..()
if(user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_HEAD)
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index 3bd3fa8f26fe..c1102c83554c 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -95,6 +95,10 @@
dyn_explosion(T, plasmaAmount/5)//20 plasma in a standard welder has a 4 power explosion. no breaches, but enough to kill/dismember holder
qdel(src)
+/obj/item/weldingtool/attack(mob/living/M, mob/user)
+ if(!isOn() || user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user))
+ ..()
+
/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity)
. = ..()
if(!proximity)
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index 52e9fd2f2a3c..3dc2a749b2da 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -60,6 +60,8 @@
if(do_after(user, 1.5 SECONDS, C))
to_chat(C, span_notice("You succesfuly remove the durathread strand."))
C.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
+ else if(!user.a_intent == INTENT_HARM && attempt_initiate_surgery(src, C, user))
+ return
else
..()
diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
index 08585cf4ef53..77d1584505ba 100644
--- a/code/game/objects/items/tools/wrench.dm
+++ b/code/game/objects/items/tools/wrench.dm
@@ -20,6 +20,10 @@
toolspeed = 1
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30)
+/obj/item/wrench/attack(mob/living/M, mob/user)
+ if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user))
+ ..()
+
/obj/item/wrench/suicide_act(mob/user)
user.visible_message(span_suicide("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 0b611dc6cdce..2de7ac154b19 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -260,18 +260,15 @@
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "struck", "hit")
var/hacked = FALSE
+ var/saber_color = "blue"
/obj/item/toy/sword/attack_self(mob/user)
active = !( active )
if (active)
to_chat(user, span_notice("You extend the plastic blade with a quick flick of your wrist."))
playsound(user, 'sound/weapons/saberon.ogg', 20, 1)
- if(hacked)
- icon_state = "swordrainbow"
- item_state = "swordrainbow"
- else
- icon_state = "swordblue"
- item_state = "swordblue"
+ icon_state = "sword[saber_color]"
+ item_state = "sword[saber_color]"
w_class = WEIGHT_CLASS_BULKY
else
to_chat(user, span_notice("You push the plastic blade back down into the handle."))
@@ -292,13 +289,13 @@
var/obj/item/twohanded/dualsaber/toy/newSaber = new /obj/item/twohanded/dualsaber/toy(user.loc)
if(hacked) // That's right, we'll only check the "original" "sword".
newSaber.hacked = TRUE
- newSaber.item_color = "rainbow"
+ newSaber.saber_color = "rainbow"
qdel(W)
qdel(src)
else if(W.tool_behaviour == TOOL_MULTITOOL)
if(!hacked)
hacked = TRUE
- item_color = "rainbow"
+ saber_color = "rainbow"
to_chat(user, span_warning("RNBW_ENGAGE"))
if(active)
@@ -944,7 +941,7 @@
/obj/item/toy/cards/singlecard
name = "card"
- desc = "a card"
+ desc = "A card."
icon = 'icons/obj/toy.dmi'
icon_state = "singlecard_down_nanotrasen"
w_class = WEIGHT_CLASS_TINY
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index c955ff525274..91984b0bf09d 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -308,7 +308,7 @@
unwieldsound = 'sound/weapons/saberoff.ogg'
hitsound = "swing_hit"
armour_penetration = 35
- item_color = "green"
+ var/saber_color = "green"
light_color = "#00ff00"//green
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 75
@@ -349,8 +349,8 @@
/obj/item/twohanded/dualsaber/Initialize()
. = ..()
if(LAZYLEN(possible_colors))
- item_color = pick(possible_colors)
- switch(item_color)
+ saber_color = pick(possible_colors)
+ switch(saber_color)
if("red")
light_color = LIGHT_COLOR_RED
if("green")
@@ -366,7 +366,7 @@
/obj/item/twohanded/dualsaber/update_icon()
if(wielded)
- icon_state = "dualsaber[item_color][wielded]"
+ icon_state = "dualsaber[saber_color][wielded]"
else
icon_state = "dualsaber0"
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_TYPE_BLOOD)
@@ -473,7 +473,7 @@
if(!hacked)
hacked = TRUE
to_chat(user, span_warning("2XRNBW_ENGAGE"))
- item_color = "rainbow"
+ saber_color = "rainbow"
update_icon()
else
to_chat(user, span_warning("It's starting to look like a triple rainbow - no, nevermind."))
@@ -543,7 +543,7 @@
force += 1
throwforce += 1
righthand_file = 'yogstation/icons/mob/inhands/weapons/polearms_righthand.dmi' //yogs
- alternate_worn_icon = 'yogstation/icons/mob/back.dmi' //yogs
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/back.dmi' //yogs
icon_prefix = "spearplasma"
update_icon()
qdel(tip)
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 78ab39afe075..a028326a5442 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -231,14 +231,16 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/katana/cursed/basalt
name = "basalt katana"
- desc = "a katana made out of hardened basalt. Deals more damage to lavaland mobs."
+ desc = "a katana made out of hardened basalt. Particularly damaging to lavaland fauna. (Activate this item in hand to dodge roll in the direction you're facing)"
icon_state = "basalt_katana"
item_state = "basalt_katana"
- force = 25
+ force = 18
block_chance = 20
- var/fauna_damage_bonus = 35
- var/fauna_damage_type = BURN
+ var/fauna_damage_bonus = 52
+ var/fauna_damage_type = BRUTE
+ var/next_roll
+ var/roll_dist = 3
/obj/item/katana/cursed/basalt/afterattack(atom/target, mob/user, proximity)
. = ..()
@@ -250,6 +252,33 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
L.apply_damage(fauna_damage_bonus,fauna_damage_type)
playsound(L, 'sound/weapons/sear.ogg', 100, 1)
+/obj/item/katana/cursed/basalt/attack_self(mob/living/user)
+ if(world.time > next_roll)
+ var/stam_cost = 15
+ var/turf/T = get_turf(user)
+ if(is_mining_level(T.z))
+ stam_cost = 5
+ var/turf/landing_turf = get_ranged_target_turf(user, user.dir, roll_dist)
+ var/spin_direction = FALSE
+ user.adjustStaminaLoss(stam_cost)
+ if (user.getStaminaLoss() >= 100)
+ user.throw_at(landing_turf, 2, 2)
+ user.Paralyze(4 SECONDS)
+ user.visible_message(span_warning("You're too tired tired to finish the roll!"))
+ else
+ playsound(user, 'yogstation/sound/items/dodgeroll.ogg', 50, TRUE)
+ user.apply_status_effect(STATUS_EFFECT_DODGING)
+ if(user.dir == EAST || user.dir == NORTH)
+ spin_direction = TRUE
+ passtable_on(user, src)
+ user.setMovetype(user.movement_type | FLYING)
+ user.safe_throw_at(landing_turf, 4, 1, spin = FALSE)
+ user.SpinAnimation(speed = 3, loops = 1, clockwise = spin_direction, segments = 3, parallel = TRUE)
+ passtable_off(user, src)
+ user.setMovetype(user.movement_type & ~FLYING)
+ next_roll = world.time + 1 SECONDS
+ else
+ to_chat(user, span_notice("You need to catch your breath before you can roll again!"))
/obj/item/katana/suicide_act(mob/user)
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index df88298597f9..b4210e5ea00d 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -10,6 +10,7 @@ LINEN BINS
icon = 'icons/obj/bedsheets.dmi'
lefthand_file = 'icons/mob/inhands/misc/bedsheet_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/bedsheet_righthand.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/neck/sheets.dmi'
icon_state = "sheetwhite"
item_state = "sheetwhite"
slot_flags = ITEM_SLOT_NECK
@@ -18,8 +19,8 @@ LINEN BINS
throw_speed = 1
throw_range = 2
w_class = WEIGHT_CLASS_TINY
- item_color = "white"
resistance_flags = FLAMMABLE
+ dying_key = DYE_REGISTRY_BEDSHEET
var/newbedpath = null
dog_fashion = /datum/dog_fashion/head/ghost
@@ -36,7 +37,6 @@ LINEN BINS
sheet.name = name
sheet.icon_state = icon_state
sheet.item_state = item_state
- sheet.item_color = item_color
sheet.dream_messages = dream_messages
qdel(src)
user.put_in_active_hand(sheet)
@@ -76,34 +76,29 @@ LINEN BINS
/obj/item/bedsheet/blue
icon_state = "sheetblue"
item_state = "sheetblue"
- item_color = "blue"
dream_messages = list("blue")
newbedpath = /obj/item/bedsheet/adjusted/blue
/obj/item/bedsheet/green
icon_state = "sheetgreen"
item_state = "sheetgreen"
- item_color = "green"
dream_messages = list("green")
newbedpath = /obj/item/bedsheet/adjusted/green
/obj/item/bedsheet/grey
icon_state = "sheetgrey"
item_state = "sheetgrey"
- item_color = "grey"
dream_messages = list("grey")
/obj/item/bedsheet/orange
icon_state = "sheetorange"
item_state = "sheetorange"
- item_color = "orange"
dream_messages = list("orange")
newbedpath = /obj/item/bedsheet/adjusted/orange
/obj/item/bedsheet/purple
icon_state = "sheetpurple"
item_state = "sheetpurple"
- item_color = "purple"
dream_messages = list("purple")
newbedpath = /obj/item/bedsheet/adjusted/purple
@@ -112,7 +107,6 @@ LINEN BINS
desc = "You've never felt more free than when sleeping on this."
icon_state = "sheetUSA"
item_state = "sheetUSA"
- item_color = "sheetUSA"
dream_messages = list("America", "freedom", "fireworks", "bald eagles")
/obj/item/bedsheet/rainbow
@@ -120,21 +114,18 @@ LINEN BINS
desc = "A multicolored blanket. It's actually several different sheets cut up and sewn together."
icon_state = "sheetrainbow"
item_state = "sheetrainbow"
- item_color = "rainbow"
dream_messages = list("red", "orange", "yellow", "green", "blue", "purple", "a rainbow")
newbedpath = /obj/item/bedsheet/adjusted/rainbow
/obj/item/bedsheet/red
icon_state = "sheetred"
item_state = "sheetred"
- item_color = "red"
dream_messages = list("red")
newbedpath = /obj/item/bedsheet/adjusted/red
/obj/item/bedsheet/yellow
icon_state = "sheetyellow"
item_state = "sheetyellow"
- item_color = "yellow"
dream_messages = list("yellow")
newbedpath = /obj/item/bedsheet/adjusted/yellow
@@ -143,7 +134,6 @@ LINEN BINS
desc = "A very soothing striped blanket. All the noise just seems to fade out when you're under the covers in this."
icon_state = "sheetmime"
item_state = "sheetmime"
- item_color = "mime"
dream_messages = list("silence", "gestures", "a pale face", "a gaping mouth", "the mime")
newbedpath = /obj/item/bedsheet/adjusted/mime
@@ -152,7 +142,6 @@ LINEN BINS
desc = "A rainbow blanket with a clown mask woven in. It smells faintly of bananas."
icon_state = "sheetclown"
item_state = "sheetrainbow"
- item_color = "clown"
dream_messages = list("honk", "laughter", "a prank", "a joke", "a smiling face", "the clown")
newbedpath = /obj/item/bedsheet/adjusted/clown
@@ -161,7 +150,6 @@ LINEN BINS
desc = "It has a Nanotrasen symbol on it, and was woven with a revolutionary new kind of thread guaranteed to have 0.01% permeability for most non-chemical substances, popular among most modern captains."
icon_state = "sheetcaptain"
item_state = "sheetcaptain"
- item_color = "captain"
dream_messages = list("authority", "a golden ID", "sunglasses", "a green disc", "an antique gun", "the captain")
newbedpath = /obj/item/bedsheet/adjusted/captain
@@ -170,7 +158,6 @@ LINEN BINS
desc = "It appears to have a beaker emblem, and is made out of fire-resistant material, although it probably won't protect you in the event of fires you're familiar with every day."
icon_state = "sheetrd"
item_state = "sheetrd"
- item_color = "director"
dream_messages = list("authority", "a silvery ID", "a bomb", "a mech", "a facehugger", "maniacal laughter", "the research director")
newbedpath = /obj/item/bedsheet/adjusted/rd
@@ -185,7 +172,6 @@ LINEN BINS
desc = "It's a sterilized* blanket commonly used in the Medbay. *Sterilization is voided if a virologist is present onboard the station."
icon_state = "sheetmedical"
item_state = "sheetmedical"
- item_color = "medical"
dream_messages = list("healing", "life", "surgery", "a doctor")
newbedpath = /obj/item/bedsheet/adjusted/medical
@@ -194,7 +180,6 @@ LINEN BINS
desc = "It's a sterilized blanket that has a cross emblem. There's some cat fur on it, likely from Runtime."
icon_state = "sheetcmo"
item_state = "sheetcmo"
- item_color = "cmo"
dream_messages = list("authority", "a silvery ID", "healing", "life", "surgery", "a cat", "the chief medical officer")
/obj/item/bedsheet/hos
@@ -202,7 +187,6 @@ LINEN BINS
desc = "It is decorated with a shield emblem. While crime doesn't sleep, you do, but you are still THE LAW!"
icon_state = "sheethos"
item_state = "sheethos"
- item_color = "hosred"
dream_messages = list("authority", "a silvery ID", "handcuffs", "a baton", "a flashbang", "sunglasses", "the head of security")
newbedpath = /obj/item/bedsheet/adjusted/hos
@@ -211,7 +195,6 @@ LINEN BINS
desc = "It is decorated with a key emblem. For those rare moments when you can rest and cuddle with Ian without someone screaming for you over the radio."
icon_state = "sheethop"
item_state = "sheethop"
- item_color = "hop"
dream_messages = list("authority", "a silvery ID", "obligation", "a computer", "an ID", "a corgi", "the head of personnel")
newbedpath = /obj/item/bedsheet/adjusted/hop
@@ -220,7 +203,6 @@ LINEN BINS
desc = "It is decorated with a wrench emblem. It's highly reflective and stain resistant, so you don't need to worry about ruining it with oil."
icon_state = "sheetce"
item_state = "sheetce"
- item_color = "chief"
dream_messages = list("authority", "a silvery ID", "the engine", "power tools", "an APC", "a parrot", "the chief engineer")
newbedpath = /obj/item/bedsheet/adjusted/ce
@@ -229,20 +211,17 @@ LINEN BINS
desc = "It is decorated with a crate emblem in silver lining. It's rather tough, and just the thing to lie on after a hard day of pushing paper."
icon_state = "sheetqm"
item_state = "sheetqm"
- item_color = "qm"
dream_messages = list("a grey ID", "a shuttle", "a crate", "a sloth", "the quartermaster")
/obj/item/bedsheet/brown
icon_state = "sheetbrown"
item_state = "sheetbrown"
- item_color = "cargo"
dream_messages = list("brown")
newbedpath = /obj/item/bedsheet/adjusted/brown
/obj/item/bedsheet/black
icon_state = "sheetblack"
item_state = "sheetblack"
- item_color = "black"
dream_messages = list("black")
/obj/item/bedsheet/centcom
@@ -250,7 +229,6 @@ LINEN BINS
desc = "Woven with advanced nanothread for warmth as well as being very decorated, essential for all officials."
icon_state = "sheetcentcom"
item_state = "sheetcentcom"
- item_color = "centcom"
dream_messages = list("a unique ID", "authority", "artillery", "an ending")
/obj/item/bedsheet/syndie
@@ -258,7 +236,6 @@ LINEN BINS
desc = "It has a syndicate emblem and it has an aura of evil."
icon_state = "sheetsyndie"
item_state = "sheetsyndie"
- item_color = "syndie"
dream_messages = list("a green disc", "a red crystal", "a glowing blade", "a wire-covered ID")
/obj/item/bedsheet/cult
@@ -266,7 +243,6 @@ LINEN BINS
desc = "You might dream of Nar'Sie if you sleep with this. It seems rather tattered and glows of an eldritch presence."
icon_state = "sheetcult"
item_state = "sheetcult"
- item_color = "cult"
dream_messages = list("a tome", "a floating red crystal", "a glowing sword", "a bloody symbol", "a massive humanoid figure")
/obj/item/bedsheet/wiz
@@ -274,7 +250,6 @@ LINEN BINS
desc = "A special fabric enchanted with magic so you can have an enchanted night. It even glows!"
icon_state = "sheetwiz"
item_state = "sheetwiz"
- item_color = "wiz"
dream_messages = list("a book", "an explosion", "lightning", "a staff", "a skeleton", "a robe", "magic")
/obj/item/bedsheet/nanotrasen
@@ -282,13 +257,11 @@ LINEN BINS
desc = "It has the Nanotrasen logo on it and has an aura of duty."
icon_state = "sheetNT"
item_state = "sheetNT"
- item_color = "nanotrasen"
dream_messages = list("authority", "an ending")
/obj/item/bedsheet/ian
icon_state = "sheetian"
item_state = "sheetian"
- item_color = "ian"
dream_messages = list("a dog", "a corgi", "woof", "bark", "arf")
/obj/item/bedsheet/cosmos
@@ -296,14 +269,12 @@ LINEN BINS
desc = "Made from the dreams of those who wonder at the stars."
icon_state = "sheetcosmos"
item_state = "sheetcosmos"
- item_color = "cosmos"
dream_messages = list("the infinite cosmos", "Hans Zimmer music", "a flight through space", "the galaxy", "being fabulous", "shooting stars")
light_power = 2
light_range = 1.4
/obj/item/bedsheet/random
icon_state = "random_bedsheet"
- item_color = "rainbow"
name = "random bedsheet"
desc = "If you're reading this description ingame, something has gone wrong! Honk!"
@@ -315,7 +286,6 @@ LINEN BINS
/obj/item/bedsheet/dorms
icon_state = "random_bedsheet"
- item_color = "rainbow"
name = "random dorms bedsheet"
desc = "If you're reading this description ingame, something has gone wrong! Honk!"
diff --git a/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm b/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm
index 9e2fadc69dd4..ef96e171cc75 100644
--- a/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm
+++ b/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm
@@ -151,7 +151,7 @@
/obj/structure/closet/bluespace/external/Destroy()
SSbluespace_locker.external_locker = null
- SSbluespace_locker.bluespaceify_random_locker()
+ SSbluespace_locker.redistribute_locker()
return ..()
/obj/structure/closet/bluespace/external/can_open()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 9884994003bd..bd1c9d023d0e 100755
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -63,8 +63,9 @@
new /obj/item/storage/lockbox/loyalty(src)
new /obj/item/clothing/mask/gas/sechailer/swat(src)
new /obj/item/storage/box/flashbangs(src)
- new /obj/item/shield/riot/tele(src)
- new /obj/item/storage/belt/security/full(src)
+ new /obj/item/restraints/handcuffs(src)
+ new /obj/item/assembly/flash/handheld(src)
+ new /obj/item/melee/baton/loaded(src)
new /obj/item/gun/energy/e_gun/hos(src)
new /obj/item/flashlight/seclite(src)
new /obj/item/pinpointer/nuke(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index 51cdaebed9fa..ea1884677873 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -171,5 +171,5 @@
/obj/structure/closet/ammunitionlocker/PopulateContents()
..()
- for(var/i in 1 to 8)
- new /obj/item/ammo_casing/shotgun/beanbag(src)
+ for(var/i in 1 to 3)
+ new /obj/item/storage/box/beanbag(src)
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 01034c9dd052..dbac46894c5f 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -179,7 +179,7 @@
notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACKORBIT, flashwindow = FALSE, ignore_key = POLL_IGNORE_GOLEM)
if(has_owner && creator)
short_desc = "You are a Golem."
- flavour_text = "You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. \
+ flavour_text = "You move slowly and are unable to wear clothes, but can still use most tools. Depending on the material you were made of, you will have different strengths and weaknesses \
Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost."
owner = creator
@@ -638,6 +638,7 @@
/obj/effect/mob_spawn/human/pirate/gunner
rank = "Gunner"
+ outfit = /datum/outfit/pirate/space/gunner
//The Innkeeper, a iceplanet ghostrole for peacefully operating a rest stop complete with food and drinks.
/obj/effect/mob_spawn/human/innkeeper
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 3276d2be9ee4..b54880c5725e 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -516,7 +516,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
/turf/AllowDrop()
return TRUE
-/turf/proc/add_vomit_floor(mob/living/M, toxvomit = NONE)
+/turf/proc/add_vomit_floor(mob/living/M, toxvomit = NONE, purge_ratio = 0.1)
var/obj/effect/decal/cleanable/vomit/V = new /obj/effect/decal/cleanable/vomit(src, M.get_static_viruses())
@@ -525,19 +525,21 @@ GLOBAL_LIST_EMPTY(station_turfs)
V = locate() in src
if(!V)
return
- // Make toxins and blazaam vomit look different
+ // Apply the proper icon set based on vomit type
if(toxvomit == VOMIT_PURPLE)
V.icon_state = "vomitpurp_[pick(1,4)]"
else if (toxvomit == VOMIT_TOXIC)
V.icon_state = "vomittox_[pick(1,4)]"
- if (iscarbon(M))
- var/mob/living/carbon/C = M
- if(C.reagents)
- clear_reagents_to_vomit_pool(C,V)
-
-/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V)
- M.reagents.trans_to(V, M.reagents.total_volume / 10, transfered_by = M)
- for(var/datum/reagent/R in M.reagents.reagent_list) //clears the stomach of anything that might be digested as food
+ if (purge_ratio && iscarbon(M))
+ clear_reagents_to_vomit_pool(M, V, purge_ratio)
+
+/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V, purge_ratio = 0.1)
+ var/chemicals_lost = M.reagents.total_volume * purge_ratio
+ if(V.reagents.total_volume + chemicals_lost > V.reagents.maximum_volume)
+ V.reagents.total_volume -= chemicals_lost
+ M.reagents.trans_to(V, chemicals_lost, transfered_by = M)
+ //clear the stomach of anything even not food
+ for(var/datum/reagent/R in M.reagents.reagent_list)
if(istype(R, /datum/reagent/consumable))
var/datum/reagent/consumable/nutri_check = R
if(nutri_check.nutriment_factor >0)
diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm
index c3e2ba6810f6..73435f41c8d4 100644
--- a/code/modules/admin/fun_balloon.dm
+++ b/code/modules/admin/fun_balloon.dm
@@ -166,3 +166,6 @@
name = "The Arena"
has_gravity = STANDARD_GRAVITY
requires_power = FALSE
+ hidden = TRUE
+ mood_bonus = 25
+ mood_message = span_nicegreen("NO TIME TO THINK, JUST RIP AND TEAR!!/n")
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 09cb56932745..781db60b883d 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1984,7 +1984,14 @@
SD.r_code = code
message_admins("[key_name_admin(usr)] has set the self-destruct \
code to \"[code]\".")
-
+ else if(href_list["set_beer_code"])
+ if(!check_rights(R_ADMIN))
+ return
+ var/code = random_nukecode()
+ for(var/obj/machinery/nuclearbomb/beer/BN in GLOB.nuke_list)
+ BN.r_code = code
+ message_admins("[key_name_admin(usr)] has set the beer nuke \
+ code to \"[code]\".")
else if(href_list["add_station_goal"])
if(!check_rights(R_ADMIN))
return
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index ec7263b903e2..a7b6a915de2f 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -200,6 +200,8 @@
//omg this is dumb, just fill in both their tickets
// yogs start - Yog Tickets
admin_ticket_log(src, msg, FALSE)
+ if(!recipient.current_ticket && !current_ticket) // creates a ticket if there is no ticket of either user
+ new /datum/admin_help(msg, recipient, TRUE) // yogs - Yog Tickets
if(recipient.current_ticket && !recipient.current_ticket.handling_admin)
recipient.current_ticket.Administer()
// yogs end - Yog Tickets
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 0c3803da7d49..073d2e666950 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -72,7 +72,7 @@
/// Used by communications consoles to request the nuclear launch codes
/proc/nuke_request(text, mob/sender)
var/msg = copytext_char(sanitize(text), 1, MAX_MESSAGE_LEN)
- msg = span_adminnotice("NUKE CODE REQUEST:[ADMIN_FULLMONTY(sender)] [ADMIN_CENTCOM_REPLY(sender)] [ADMIN_SET_SD_CODE]: [msg]")
+ msg = span_adminnotice("NUKE CODE REQUEST:[ADMIN_FULLMONTY(sender)] [ADMIN_CENTCOM_REPLY(sender)] [ADMIN_SET_SD_CODE] [ADMIN_SET_BC_CODE]: [msg]")
to_chat(GLOB.admins, msg, confidential = TRUE)
for(var/obj/machinery/computer/communications/console in GLOB.machines)
console.override_cooldown()
diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm
index fd46dd784e39..0f1f4e0bc40b 100644
--- a/code/modules/antagonists/blob/blob_mobs.dm
+++ b/code/modules/antagonists/blob/blob_mobs.dm
@@ -249,7 +249,7 @@
force_threshold = 10
pressure_resistance = 50
mob_size = MOB_SIZE_LARGE
- hud_type = /datum/hud/blobbernaut
+ hud_type = /datum/hud/living/blobbernaut
/mob/living/simple_animal/hostile/blob/blobbernaut/Life()
if(..())
@@ -285,15 +285,6 @@
I.color = overmind.blobstrain.complementary_color
flick_overlay_view(I, src, 8)
-/mob/living/simple_animal/hostile/blob/blobbernaut/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = ..()
- if(updating_health)
- update_health_hud()
-
-/mob/living/simple_animal/hostile/blob/blobbernaut/update_health_hud()
- if(hud_used)
- hud_used.healths.maptext = "
[round((health / maxHealth) * 100, 0.5)]%
"
-
/mob/living/simple_animal/hostile/blob/blobbernaut/AttackingTarget()
. = ..()
if(. && isliving(target) && overmind)
diff --git a/code/modules/antagonists/blob/blobstrains/blazing_oil.dm b/code/modules/antagonists/blob/blobstrains/blazing_oil.dm
index 09a0abce24eb..fdc0451b99e9 100644
--- a/code/modules/antagonists/blob/blobstrains/blazing_oil.dm
+++ b/code/modules/antagonists/blob/blobstrains/blazing_oil.dm
@@ -14,7 +14,7 @@
reagent = /datum/reagent/blob/blazing_oil
/datum/blobstrain/reagent/blazing_oil/extinguish_reaction(obj/structure/blob/B)
- B.take_damage(1.5, BURN, ENERGY)
+ B.take_damage(1, BURN, ENERGY)
/datum/blobstrain/reagent/blazing_oil/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_type == BURN && damage_flag != ENERGY)
@@ -38,4 +38,4 @@
if(M)
M.apply_damage(0.8*reac_volume, BURN, wound_bonus=CANT_WOUND)
if(iscarbon(M))
- M.emote("scream")
\ No newline at end of file
+ M.emote("scream")
diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm
index 4be0c9c35df1..9cc0c8df26a9 100644
--- a/code/modules/antagonists/blob/overmind.dm
+++ b/code/modules/antagonists/blob/overmind.dm
@@ -116,6 +116,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
set_security_level("delta")
max_blob_points = INFINITY
blob_points = INFINITY
+ blob_core.max_integrity = 999999
addtimer(CALLBACK(src, .proc/victory), 450)
else if(!free_strain_rerolls && (last_reroll_time + BLOB_REROLL_TIMEYou have gained another free strain re-roll.")
@@ -205,14 +206,15 @@ GLOBAL_LIST_EMPTY(blob_nodes)
/mob/camera/blob/update_health_hud()
if(blob_core)
- hud_used.healths.maptext = "[round(blob_core.obj_integrity)]
"
+ var/current_health = round((blob_core.obj_integrity / blob_core.max_integrity) * 100)
+ hud_used.healths.maptext = "[current_health]%
"
for(var/mob/living/simple_animal/hostile/blob/blobbernaut/B in blob_mobs)
if(B.hud_used && B.hud_used.blobpwrdisplay)
- B.hud_used.blobpwrdisplay.maptext = "[round(blob_core.obj_integrity)]
"
+ B.hud_used.blobpwrdisplay.maptext = "[current_health]%
"
/mob/camera/blob/proc/add_points(points)
blob_points = clamp(blob_points + points, 0, max_blob_points)
- hud_used.blobpwrdisplay.maptext = "[round(blob_points)]
"
+ hud_used.blobpwrdisplay.maptext = "[round(blob_points)]
"
/mob/camera/blob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
if (!message)
diff --git a/code/modules/antagonists/bloodsuckers/bloodsucker_daylight.dm b/code/modules/antagonists/bloodsuckers/bloodsucker_daylight.dm
index 5960ff7569ba..ca02ccc0c14f 100644
--- a/code/modules/antagonists/bloodsuckers/bloodsucker_daylight.dm
+++ b/code/modules/antagonists/bloodsuckers/bloodsucker_daylight.dm
@@ -106,15 +106,15 @@
if(bloodsucker_minds.current)
switch(danger_level)
if(1)
- bloodsucker_minds.current.playsound_local(null, 'sound/effects/griffin_3.ogg', 50 + danger_level, 1)
+ bloodsucker_minds.current.playsound_local(null, 'sound/effects/griffin_3.ogg', 50 + danger_level, TRUE)
if(2)
- bloodsucker_minds.current.playsound_local(null, 'sound/effects/griffin_5.ogg', 50 + danger_level, 1)
+ bloodsucker_minds.current.playsound_local(null, 'sound/effects/griffin_5.ogg', 50 + danger_level, TRUE)
if(3)
- bloodsucker_minds.current.playsound_local(null, 'sound/effects/alert.ogg', 75, 1)
+ bloodsucker_minds.current.playsound_local(null, 'sound/effects/alert.ogg', 75, TRUE)
if(4)
- bloodsucker_minds.current.playsound_local(null, 'sound/ambience/ambimystery.ogg', 100, 1)
+ bloodsucker_minds.current.playsound_local(null, 'sound/ambience/ambimystery.ogg', 100, TRUE)
if(5)
- bloodsucker_minds.current.playsound_local(null, 'sound/spookoween/ghosty_wind.ogg', 90, 1)
+ bloodsucker_minds.current.playsound_local(null, 'sound/spookoween/ghosty_wind.ogg', 90, TRUE)
if(vassalwarn != "")
for(var/datum/mind/vassal_minds as anything in get_antag_minds(/datum/antagonist/vassal))
if(!istype(vassal_minds))
@@ -136,7 +136,7 @@
var/datum/antagonist/bloodsucker/bloodsuckerdatum = bloodsucker_minds.has_antag_datum(/datum/antagonist/bloodsucker)
if(!istype(bloodsuckerdatum))
continue
- if(istype(bloodsucker_minds.current.loc, /obj/structure))
+ if(isstructure(bloodsucker_minds.current.loc))
if(istype(bloodsucker_minds.current.loc, /obj/structure/closet/crate/coffin)) // Coffins offer the BEST protection
SEND_SIGNAL(bloodsucker_minds.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/coffinsleep)
continue
diff --git a/code/modules/antagonists/bloodsuckers/bloodsucker_frenzy.dm b/code/modules/antagonists/bloodsuckers/bloodsucker_frenzy.dm
index dead5c58c35d..007580846cd5 100644
--- a/code/modules/antagonists/bloodsuckers/bloodsucker_frenzy.dm
+++ b/code/modules/antagonists/bloodsuckers/bloodsucker_frenzy.dm
@@ -59,6 +59,8 @@
// Give the other Frenzy effects
ADD_TRAIT(owner, TRAIT_MUTE, FRENZY_TRAIT)
ADD_TRAIT(owner, TRAIT_DEAF, FRENZY_TRAIT)
+ ADD_TRAIT(owner, TRAIT_REDUCED_DAMAGE_SLOWDOWN, FRENZY_TRAIT)
+ ADD_TRAIT(owner, TRAIT_STUNIMMUNE, FRENZY_TRAIT)
if(user.IsAdvancedToolUser())
was_tooluser = TRUE
ADD_TRAIT(owner, TRAIT_MONKEYLIKE, SPECIES_TRAIT)
@@ -80,6 +82,8 @@
to_chat(owner, span_warning("You come back to your senses."))
REMOVE_TRAIT(owner, TRAIT_MUTE, FRENZY_TRAIT)
REMOVE_TRAIT(owner, TRAIT_DEAF, FRENZY_TRAIT)
+ REMOVE_TRAIT(owner, TRAIT_REDUCED_DAMAGE_SLOWDOWN, FRENZY_TRAIT)
+ REMOVE_TRAIT(owner, TRAIT_STUNIMMUNE, FRENZY_TRAIT)
if(was_tooluser)
REMOVE_TRAIT(owner, TRAIT_MONKEYLIKE, SPECIES_TRAIT)
was_tooluser = FALSE
diff --git a/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm b/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm
index 041cc91e9a9c..52426c6fae00 100644
--- a/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm
+++ b/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm
@@ -37,8 +37,8 @@
var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(/datum/antagonist/bloodsucker)
if(bloodsuckerdatum)
. += ""
- . += "Current Frenzy Enter: [FRENZY_THRESHOLD_ENTER + (bloodsuckerdatum.humanity_lost * 10)]"
- . += "Current Frenzy Leave: [FRENZY_THRESHOLD_EXIT + (bloodsuckerdatum.humanity_lost * 10)]"
+ . += "Current Frenzy Enter: [FRENZY_THRESHOLD_ENTER + bloodsuckerdatum.humanity_lost * 10]"
+ . += "Current Frenzy Leave: [FRENZY_THRESHOLD_EXIT + bloodsuckerdatum.humanity_lost * 10]"
. += "Blood Drank: [bloodsuckerdatum.total_blood_drank]"
if(bloodsuckerdatum.current_task)
. += "Task Blood Drank: [bloodsuckerdatum.task_blood_drank]"
diff --git a/code/modules/antagonists/bloodsuckers/bloodsucker_mobs.dm b/code/modules/antagonists/bloodsuckers/bloodsucker_mobs.dm
index 30c76e233163..0e32b2da38ec 100644
--- a/code/modules/antagonists/bloodsuckers/bloodsucker_mobs.dm
+++ b/code/modules/antagonists/bloodsuckers/bloodsucker_mobs.dm
@@ -196,7 +196,8 @@
if(bloodsucker)
if(ishuman(bloodsucker))
var/mob/living/carbon/human/user = bloodsucker
- if(user.blood_volume < 560)
+ var/datum/antagonist/bloodsucker/bloodsuckerdatum = src.mind.has_antag_datum(/datum/antagonist/bloodsucker)
+ if(user.blood_volume < FRENZY_THRESHOLD_EXIT + bloodsuckerdatum.humanity_lost * 10)
user.blood_volume += 10
adjustFireLoss(2.5)
updatehealth() //3 minutes to die
diff --git a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm
index e7137503c513..4210c1dfadb5 100644
--- a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm
+++ b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm
@@ -24,8 +24,6 @@
var/humanity_lost = 0
///Have we been broken the Masquerade?
var/broke_masquerade = FALSE
- ///Blood required to enter Frenzy
- var/frenzy_threshold = FRENZY_THRESHOLD_ENTER
///If we are currently in a Frenzy
var/frenzied = FALSE
///If we have a task assigned
diff --git a/code/modules/antagonists/bloodsuckers/powers/cloak.dm b/code/modules/antagonists/bloodsuckers/powers/cloak.dm
index 7d119a9a9bf6..409a133e23a4 100644
--- a/code/modules/antagonists/bloodsuckers/powers/cloak.dm
+++ b/code/modules/antagonists/bloodsuckers/powers/cloak.dm
@@ -88,7 +88,7 @@
name = "cloak of shadows"
desc = "Fancy stuff."
icon = 'icons/obj/vamp_obj.dmi'
- alternate_worn_icon = 'icons/obj/vamp_obj.dmi'
+ mob_overlay_icon = 'icons/obj/vamp_obj.dmi'
icon_state = "cloak"
item_state = "cloak"
armor = list("melee" = 0, "bullet" = 0, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 100) //good if you haven nothing
@@ -118,4 +118,4 @@
. = ..()
var/obj/item/I = owner.get_item_by_slot(SLOT_NECK)
if(istype(I, /obj/item/clothing/neck/yogs/sith_cloak/cloak))
- qdel(I)
\ No newline at end of file
+ qdel(I)
diff --git a/code/modules/antagonists/bloodsuckers/powers/fortitude.dm b/code/modules/antagonists/bloodsuckers/powers/fortitude.dm
index a95d92a3114b..e3a881831f13 100644
--- a/code/modules/antagonists/bloodsuckers/powers/fortitude.dm
+++ b/code/modules/antagonists/bloodsuckers/powers/fortitude.dm
@@ -24,7 +24,7 @@
ADD_TRAIT(owner, TRAIT_PIERCEIMMUNE, BLOODSUCKER_TRAIT)
ADD_TRAIT(owner, TRAIT_NODISMEMBER, BLOODSUCKER_TRAIT)
ADD_TRAIT(owner, TRAIT_PUSHIMMUNE, BLOODSUCKER_TRAIT)
- if(level_current >= 4)
+ if(level_current >= 2)
ADD_TRAIT(owner, TRAIT_STUNIMMUNE, BLOODSUCKER_TRAIT) // They'll get stun resistance + this, who cares.
var/mob/living/carbon/human/bloodsucker_user = owner
if(IS_BLOODSUCKER(owner) || IS_VASSAL(owner))
diff --git a/code/modules/antagonists/bloodsuckers/powers/gangrel.dm b/code/modules/antagonists/bloodsuckers/powers/gangrel.dm
index 4a3cdca1cc1a..9d3850ac4bc4 100644
--- a/code/modules/antagonists/bloodsuckers/powers/gangrel.dm
+++ b/code/modules/antagonists/bloodsuckers/powers/gangrel.dm
@@ -42,9 +42,9 @@
if(DIGITIGRADE in user_species.species_traits)
user_species.species_traits -= DIGITIGRADE
minortransformdone = TRUE
- user_species.punchdamagelow += 5.0
- user_species.punchdamagehigh += 5.0 //stronk
- user_species.armor += 30
+ user.dna.species.punchdamagelow += 5.0
+ user.dna.species.punchdamagehigh += 5.0 //stronk
+ user.dna.species.armor += 30
to_chat(user, span_notice("You aren't strong enough to morph into something stronger! But you do certainly feel more feral and stronger than before."))
else
to_chat(user, span_notice("You still haven't evolved your ability yet."))
@@ -56,9 +56,9 @@
if(DIGITIGRADE in user_species.species_traits)
user_species.species_traits -= DIGITIGRADE
mediumtransformdone = TRUE
- user_species.punchdamagelow += 7.5
- user_species.punchdamagehigh += 7.5 //very stronk
- user_species.armor += 35
+ user.dna.species.punchdamagelow += 7.5
+ user.dna.species.punchdamagehigh += 7.5 //very stronk
+ user.dna.species.armor += 35
to_chat(owner, span_notice("You transform into a gorrila-ey beast, you feel stronger!"))
else
to_chat(owner, span_notice("You still haven't evolved your ability yet."))
@@ -540,7 +540,7 @@
icon_state = "collar"
item_state = "collar"
icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
- alternate_worn_icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
+ mob_overlay_icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
armor = list("melee" = 0, "bullet" = 0, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 100)
body_parts_covered = NECK
@@ -550,7 +550,7 @@
icon_state = "ears"
item_state = "ears"
icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
- alternate_worn_icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
+ mob_overlay_icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
armor = list("melee" = 0, "bullet" = 0, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 100)
flags_inv = HIDEHAIR|HIDEFACE
alternate_worn_layer = ABOVE_BODY_FRONT_LAYER
@@ -561,7 +561,7 @@
icon_state = "claws"
item_state = "claws"
icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
- alternate_worn_icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
+ mob_overlay_icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
body_parts_covered = ARMS|HANDS
flags_inv = HIDEJUMPSUIT
var/datum/action/bloodsucker/targeted/tear/tearaction = new
@@ -572,7 +572,7 @@
icon_state = "legs"
item_state = "legs"
icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
- alternate_worn_icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
+ mob_overlay_icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
slowdown = SHOES_SLOWDOWN - 0.5
body_parts_covered = GROIN|LEGS|FEET
@@ -582,7 +582,7 @@
icon_state = "digilegs"
item_state = "digilegs"
icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
- alternate_worn_icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
+ mob_overlay_icon = 'icons/mob/actions/actions_gangrel_bloodsucker.dmi'
slowdown = SHOES_SLOWDOWN - 0.5
xenoshoe = YES_DIGIT
body_parts_covered = GROIN|LEGS|FEET
diff --git a/code/modules/antagonists/bloodsuckers/powers/gohome.dm b/code/modules/antagonists/bloodsuckers/powers/gohome.dm
index e82d4475b61b..d0b86fa0d0eb 100644
--- a/code/modules/antagonists/bloodsuckers/powers/gohome.dm
+++ b/code/modules/antagonists/bloodsuckers/powers/gohome.dm
@@ -57,6 +57,7 @@
if(GOHOME_FLICKER_TWO)
INVOKE_ASYNC(src, .proc/flicker_lights, 4, 60)
if(GOHOME_TELEPORT)
+ do_mob(user, user, 1 SECONDS, TRUE)
INVOKE_ASYNC(src, .proc/teleport_to_coffin, user)
teleporting_stage++
@@ -64,24 +65,24 @@
. = ..()
if(!.)
return FALSE
- if(!isturf(owner.loc))
+ if(!isturf(user.loc))
return FALSE
if(!bloodsuckerdatum_power.coffin)
- to_chat(owner, span_warning("Your coffin has been destroyed! You no longer have a destination."))
+ to_chat(user, span_warning("Your coffin has been destroyed! You no longer have a destination."))
return FALSE
return TRUE
/datum/action/bloodsucker/gohome/proc/flicker_lights(flicker_range, beat_volume)
for(var/obj/machinery/light/nearby_lights in view(flicker_range, get_turf(owner)))
nearby_lights.flicker(5)
- playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', beat_volume, 1)
+ playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', beat_volume, TRUE)
/datum/action/bloodsucker/gohome/proc/teleport_to_coffin(mob/living/carbon/user)
var/drop_item = FALSE
- var/turf/current_turf = get_turf(owner)
+ var/turf/current_turf = get_turf(user)
// If we aren't in the dark, anyone watching us will cause us to drop out stuff
if(current_turf && current_turf.lighting_object && current_turf.get_lumcount() >= 0.2)
- for(var/mob/living/watchers in viewers(world.view, get_turf(owner)) - owner)
+ for(var/mob/living/watchers in viewers(world.view, get_turf(user)) - user)
if(!watchers.client)
continue
if(watchers.has_unlimited_silicon_privilege)
@@ -99,10 +100,10 @@
var/obj/item/legcuffs = user.legcuffed
user.dropItemToGround(legcuffs)
if(drop_item)
- for(var/obj/item/literally_everything in owner)
- owner.dropItemToGround(literally_everything, TRUE)
+ for(var/obj/item/literally_everything in user)
+ user.dropItemToGround(literally_everything, TRUE)
- playsound(current_turf, 'sound/magic/summon_karp.ogg', 60, 1)
+ playsound(current_turf, 'sound/magic/summon_karp.ogg', 60, TRUE)
var/datum/effect_system/steam_spread/bloodsucker/puff = new /datum/effect_system/steam_spread/bloodsucker()
puff.set_up(3, 0, current_turf)
puff.start()
@@ -112,13 +113,13 @@
new new_mob(current_turf)
/// TELEPORT: Move to Coffin & Close it!
user.set_resting(TRUE, TRUE, FALSE)
- do_teleport(owner, bloodsuckerdatum_power.coffin, no_effects = TRUE, forced = TRUE, channel = TELEPORT_CHANNEL_QUANTUM)
+ do_teleport(user, bloodsuckerdatum_power.coffin, no_effects = TRUE, forced = TRUE, channel = TELEPORT_CHANNEL_QUANTUM)
user.Stun(3 SECONDS, TRUE)
// Puts me inside.
- if(!bloodsuckerdatum_power.coffin.insert(owner))
+ if(!bloodsuckerdatum_power.coffin.close(user))
// CLOSE LID: If fail, force me in.
- bloodsuckerdatum_power.coffin.close(owner)
- playsound(bloodsuckerdatum_power.coffin.loc, bloodsuckerdatum_power.coffin.close_sound, 15, 1, -3)
+ bloodsuckerdatum_power.coffin.insert(user)
+ playsound(bloodsuckerdatum_power.coffin.loc, bloodsuckerdatum_power.coffin.close_sound, 15, TRUE, -3)
DeactivatePower()
diff --git a/code/modules/antagonists/bloodsuckers/powers/targeted/brawn.dm b/code/modules/antagonists/bloodsuckers/powers/targeted/brawn.dm
index fb7331e8c56c..fcb5dc33d384 100644
--- a/code/modules/antagonists/bloodsuckers/powers/targeted/brawn.dm
+++ b/code/modules/antagonists/bloodsuckers/powers/targeted/brawn.dm
@@ -45,8 +45,8 @@
if(!istype(closet))
return FALSE
closet.visible_message(
- span_warning("closet] tears apart as [user] bashes it open from within!"),
- span_warning("closet] tears apart as you bash it open from within!"),
+ span_warning("[closet] tears apart as [user] bashes it open from within!"),
+ span_warning("[closet] tears apart as you bash it open from within!"),
)
to_chat(user, span_warning("We bash [closet] wide open!"))
addtimer(CALLBACK(src, .proc/break_closet, user, closet), 1)
@@ -80,7 +80,7 @@
// Did we end up using our ability? If so, play the sound effect and return TRUE
if(used)
- playsound(get_turf(user), 'sound/effects/grillehit.ogg', 80, 1, -1)
+ playsound(get_turf(user), 'sound/effects/grillehit.ogg', 80, TRUE, -1)
return used
// This is its own proc because its done twice, to repeat code copypaste.
@@ -96,7 +96,7 @@
return FALSE
var/mob/pulled_mob = owner.pulledby
var/pull_power = pulled_mob.grab_state
- playsound(get_turf(pulled_mob), 'sound/effects/woodhit.ogg', 75, 1, -1)
+ playsound(get_turf(pulled_mob), 'sound/effects/woodhit.ogg', 75, TRUE, -1)
// Knock Down (if Living)
if(isliving(pulled_mob))
var/mob/living/hit_target = pulled_mob
@@ -133,7 +133,7 @@
target.Knockdown(min(5, rand(10, 10 * powerlevel)))
// Attack!
to_chat(owner, span_warning("You punch [target]!"))
- playsound(get_turf(target), 'sound/weapons/punch4.ogg', 60, 1, -1)
+ playsound(get_turf(target), 'sound/weapons/punch4.ogg', 60, TRUE, -1)
user.do_attack_animation(target, ATTACK_EFFECT_SMASH)
var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(target.zone_selected))
target.apply_damage(hitStrength, BRUTE, affecting)
@@ -153,11 +153,11 @@
return FALSE
target_closet.visible_message(span_danger("[target_closet] breaks open as [user] bashes it!"))
addtimer(CALLBACK(src, .proc/break_closet, user, target_closet), 1)
- playsound(get_turf(user), 'sound/effects/grillehit.ogg', 80, 1, -1)
+ playsound(get_turf(user), 'sound/effects/grillehit.ogg', 80, TRUE, -1)
// Target Type: Door
else if(istype(target_atom, /obj/machinery/door) && level_current >= 4)
var/obj/machinery/door/target_airlock = target_atom
- playsound(get_turf(user), 'sound/machines/airlock_alien_prying.ogg', 40, 1, -1)
+ playsound(get_turf(user), 'sound/machines/airlock_alien_prying.ogg', 40, TRUE, -1)
to_chat(owner, span_warning("You prepare to tear open [target_airlock]..."))
if(!do_mob(user, target_airlock, 2.5 SECONDS))
return FALSE
@@ -165,7 +165,7 @@
target_airlock.visible_message(span_danger("[target_airlock] breaks open as [user] bashes it!"))
user.Stun(10)
user.do_attack_animation(target_airlock, ATTACK_EFFECT_SMASH)
- playsound(get_turf(target_airlock), 'sound/effects/bang.ogg', 30, 1, -1)
+ playsound(get_turf(target_airlock), 'sound/effects/bang.ogg', 30, TRUE, -1)
target_airlock.open(2) // open(2) is like a crowbar or jaws of life.
/datum/action/bloodsucker/targeted/brawn/CheckValidTarget(atom/target_atom)
diff --git a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm
index 7f99c1fb1208..4a94505bec52 100644
--- a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm
+++ b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm
@@ -36,7 +36,7 @@
to_chat(owner.current, span_warning("You hit the maximum amount of lost Humanity, you are far from Human."))
return
humanity_lost += value
- to_chat(owner.current, span_warning("You feel as if you lost some of your humanity, you will now enter Frenzy at [FRENZY_THRESHOLD_ENTER + (humanity_lost * 10)] Blood."))
+ to_chat(owner.current, span_warning("You feel as if you lost some of your humanity, you will now enter Frenzy at [FRENZY_THRESHOLD_ENTER + humanity_lost * 10] Blood."))
/// mult: SILENT feed is 1/3 the amount
/datum/antagonist/bloodsucker/proc/HandleFeeding(mob/living/carbon/target, mult=1, power_level)
@@ -236,7 +236,7 @@
// BLOOD_VOLUME_GOOD: [336] - Pale
// handled in bloodsucker_integration.dm
// BLOOD_VOLUME_EXIT: [560] - Exit Frenzy (If in one) This is high because we want enough to kill the poor soul they feed off of.
- if(owner.current.blood_volume >= FRENZY_THRESHOLD_EXIT && frenzied)
+ if(owner.current.blood_volume >= (FRENZY_THRESHOLD_EXIT + humanity_lost * 10) && frenzied)
owner.current.remove_status_effect(STATUS_EFFECT_FRENZY)
// BLOOD_VOLUME_BAD: [224] - Jitter
if(owner.current.blood_volume < BLOOD_VOLUME_BAD(owner.current) && prob(0.5) && !HAS_TRAIT(owner.current, TRAIT_NODEATH) && !HAS_TRAIT(owner.current, TRAIT_MASQUERADE))
@@ -246,7 +246,7 @@
owner.current.blur_eyes(8 - 8 * (owner.current.blood_volume / BLOOD_VOLUME_BAD(owner.current)))
// The more blood, the better the Regeneration, get too low blood, and you enter Frenzy.
- if(owner.current.blood_volume < (FRENZY_THRESHOLD_ENTER + (humanity_lost * 10)) && !frenzied)
+ if(owner.current.blood_volume < (FRENZY_THRESHOLD_ENTER + humanity_lost * 10) && !frenzied)
if(!iscarbon(owner.current))
return
if(owner.current.stat == DEAD)
@@ -276,18 +276,18 @@
owner.current.apply_status_effect(STATUS_EFFECT_FRENZY)
return
if(2 to INFINITY)
- AddBloodVolume(560 - user.blood_volume) //so it doesn't happen multiple times and refills your blood when you get out again
+ AddBloodVolume(FRENZY_THRESHOLD_EXIT + humanity_lost * 10 - user.blood_volume) //so it doesn't happen multiple times and refills your blood when you get out again
if(!do_mob(user, user, 2 SECONDS, TRUE))
return
- playsound(user.loc, 'sound/weapons/slash.ogg', 25, 1)
+ playsound(user.loc, 'sound/weapons/slash.ogg', 25, TRUE)
to_chat(user, span_warning("You skin rips and tears."))
if(!do_mob(user, user, 1 SECONDS, TRUE))
return
- playsound(user.loc, 'sound/weapons/slashmiss.ogg', 25, 1)
+ playsound(user.loc, 'sound/weapons/slashmiss.ogg', 25, TRUE)
to_chat(user, span_warning("You heart pumps blackened blood into your veins as your skin turns into fur."))
if(!do_mob(user, user, 1 SECONDS, TRUE))
return
- playsound(user.loc, 'sound/weapons/slice.ogg', 25, 1)
+ playsound(user.loc, 'sound/weapons/slice.ogg', 25, TRUE)
to_chat(user, span_boldnotice("YOU HAVE AWOKEN."))
var/mob/living/simple_animal/hostile/bloodsucker/werewolf/ww
if(!ww || ww.stat == DEAD)
diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm
index db5c4a6e474b..2646459bd0c3 100644
--- a/code/modules/antagonists/changeling/changeling.dm
+++ b/code/modules/antagonists/changeling/changeling.dm
@@ -310,7 +310,6 @@
prof.name_list[slot] = I.name
prof.appearance_list[slot] = I.appearance
prof.flags_cover_list[slot] = I.flags_cover
- prof.item_color_list[slot] = I.item_color
prof.item_state_list[slot] = I.item_state
prof.exists_list[slot] = 1
else
diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm
index f3b95767f025..813a3dd1d0fe 100644
--- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm
+++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm
@@ -15,7 +15,7 @@
var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES)
if (E)
E.flash_protect = 2 //Adjust the user's eyes' flash protection
- if(istype(E, /obj/item/organ/eyes/preternis))
+ if(istype(E, /obj/item/organ/eyes/robotic/preternis))
E.Remove(user, 1)
var/obj/item/organ/eyes/neweyes = new(user)
neweyes.Insert(user, 1)
@@ -54,4 +54,4 @@
else
E.flash_protect = 0
user.update_sight()
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm
index 234b195b24d2..8eeb9b14795b 100644
--- a/code/modules/antagonists/changeling/powers/panacea.dm
+++ b/code/modules/antagonists/changeling/powers/panacea.dm
@@ -15,7 +15,7 @@
H.leave_victim()
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.vomit(0, toxic = TRUE)
+ C.vomit(0)
to_chat(user, span_notice("A parasite exits our form."))
..()
var/list/bad_organs = list(
@@ -30,7 +30,7 @@
O.Remove(user)
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.vomit(0, toxic = TRUE)
+ C.vomit(0)
O.forceMove(get_turf(user))
user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 10)
diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
index 8c4e1b3a2f1c..5a5afc1d9088 100644
--- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
+++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
@@ -72,6 +72,7 @@
name = "replicant manacles"
desc = "Heavy manacles made out of freezing-cold metal. It looks like brass, but feels much more solid."
icon_state = "brass_manacles"
+ item_state = "brass_manacles"
item_flags = DROPDEL
/obj/item/restraints/handcuffs/clockwork/dropped(mob/user)
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
index 96a2abb6aa27..4836613e3e6c 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
@@ -125,7 +125,6 @@
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_gauntlets"
item_state = "clockwork_gauntlets"
- item_color = null //So they don't wash.
strip_delay = 50
equip_delay_other = 30
body_parts_covered = ARMS
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 27309d78240e..4467f2edd586 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -177,7 +177,7 @@
/datum/action/innate/cult/blood_spell/construction
name = "Twisted Construction"
- desc = "Empowers your hand to corrupt certain metalic objects.
Converts:
Plasteel into runed metal
50 metal into a construct shell
Living cyborgs into constructs after a delay
Cyborg shells into construct shells
Airlocks into brittle runed airlocks after a delay (harm intent)"
+ desc = "Empowers your hand to corrupt certain metalic objects.
Converts:
Plasteel into runed metal
50 metal into a construct shell
Airlocks into brittle runed airlocks after a delay (harm intent)"
button_icon_state = "transmute"
magic_path = "/obj/item/melee/blood_magic/construction"
health_cost = 12
@@ -600,8 +600,6 @@
. += {"A sinister spell used to convert:\n
Plasteel into runed metal\n
[METAL_TO_CONSTRUCT_SHELL_CONVERSION] metal into a construct shell\n
- Living cyborgs into constructs after a delay\n
- Cyborg shells into construct shells\n
Airlocks into brittle runed airlocks after a delay (harm intent)"}
/obj/item/melee/blood_magic/construction/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
diff --git a/code/modules/antagonists/devil/true_devil/inventory.dm b/code/modules/antagonists/devil/true_devil/inventory.dm
index 33e2777d8c1b..a3d0dbdf582b 100644
--- a/code/modules/antagonists/devil/true_devil/inventory.dm
+++ b/code/modules/antagonists/devil/true_devil/inventory.dm
@@ -12,12 +12,7 @@
var/obj/item/r_hand = get_item_for_held_index(2)
if(r_hand)
-
- var/r_state = r_hand.item_state
- if(!r_state)
- r_state = r_hand.icon_state
-
- var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
+ var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
hands_overlays += r_hand_overlay
@@ -28,12 +23,7 @@
client.screen |= r_hand
if(l_hand)
-
- var/l_state = l_hand.item_state
- if(!l_state)
- l_state = l_hand.icon_state
-
- var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
+ var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
hands_overlays += l_hand_overlay
diff --git a/code/modules/antagonists/horror/horror_datums.dm b/code/modules/antagonists/horror/horror_datums.dm
index d309fe1c9dc7..cf0e836a1d4e 100644
--- a/code/modules/antagonists/horror/horror_datums.dm
+++ b/code/modules/antagonists/horror/horror_datums.dm
@@ -14,6 +14,15 @@
var/mob/living/simple_animal/horror/H = owner.current
H.update_horror_hud()
+/datum/antagonist/horror/antag_listing_name()
+ . = ..()
+ var/mob/living/simple_animal/horror/H = owner.current
+ if(!istype(H) || !H.victim)
+ return
+ if(H.host_brain)
+ return ..() + ", controlling [H.host_brain.real_name]"
+ return ..() + ", inside [H.victim.real_name]"
+
/datum/antagonist/horror/proc/give_objectives()
if(summoner)
var/datum/objective/newobjective = new
diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm
index 8315f1d32043..e5ecfd125797 100644
--- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm
+++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm
@@ -32,13 +32,9 @@
START_PROCESSING(SSprocessing, src)
if(ishuman(owner.current))
- //Gives Cyanide/death pill dental implant
- var/obj/item/reagent_containers/pill/iaa/death = new
- owner.current.transferItemToLoc(death, owner, TRUE)
- var/datum/action/item_action/hands_free/activate_pill/P = new(death)
- P.button.name = "Activate [death.name]"
- P.target = death
- P.Grant(owner.current)//The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it
+ var/mob/living/carbon/human/H = owner.current
+ var/obj/item/implant/dusting/E = new/obj/item/implant/dusting(H)
+ E.implant(H)
company = /datum/corporation/mi13
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index 659ca975daed..6c51aa62314d 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -332,12 +332,6 @@
item_path = /obj/item/gun/magic/staff/locker
category = "Defensive"
-/datum/spellbook_entry/item/scryingorb
- name = "Scrying Orb"
- desc = "An incandescent orb of crackling energy. Using it will allow you to release your ghost while alive, allowing you to spy upon the station and talk to the deceased. In addition, buying it will permanently grant you X-ray vision."
- item_path = /obj/item/scrying
- category = "Defensive"
-
/datum/spellbook_entry/item/soulstones
name = "Six Soul Stone Shards and the spell Artificer"
desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot."
diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm
index e578faa77e43..908c91926919 100644
--- a/code/modules/assembly/doorcontrol.dm
+++ b/code/modules/assembly/doorcontrol.dm
@@ -145,3 +145,18 @@
C.cremate(usr)
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50)
+
+
+/obj/item/assembly/control/holosign
+ name = "holosign controller"
+ desc = "A remote controller for a holosign."
+
+/obj/item/assembly/control/holosign/activate()
+ if(cooldown)
+ return
+ cooldown = TRUE
+ for(var/obj/machinery/holosign/H in GLOB.machines)
+ if(H.id == id)
+ H.toggle()
+
+ addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50)
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index 5c4d2ad7e2ee..66ce4ad7cc74 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -219,8 +219,7 @@
if(isitem(target))
var/obj/item/I = target
I.item_state = initial(picked_item.item_state)
- I.item_color = initial(picked_item.item_color)
- I.alternate_worn_icon = initial(picked_item.alternate_worn_icon)
+ I.mob_overlay_icon = initial(picked_item.mob_overlay_icon)
if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing))
var/obj/item/clothing/CL = I
var/obj/item/clothing/PCL = picked_item
@@ -263,7 +262,6 @@
name = "black jumpsuit"
icon_state = "black"
item_state = "bl_suit"
- item_color = "black"
desc = "It's a plain jumpsuit. It has a small dial on the wrist."
sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle??
random_sensor = FALSE
@@ -281,7 +279,6 @@
desc = "A tough jumpsuit woven from alloy threads. It can take on the appearance of other jumpsuits."
icon_state = "engine"
item_state = "engi_suit"
- item_color = "engine"
/obj/item/clothing/under/chameleon/Initialize()
. = ..()
@@ -408,7 +405,6 @@
name = "grey cap"
desc = "It's a baseball hat in a tasteful grey colour."
icon_state = "greysoft"
- item_color = "grey"
resistance_flags = NONE
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50)
@@ -519,7 +515,6 @@
/obj/item/clothing/shoes/chameleon
name = "black shoes"
icon_state = "black"
- item_color = "black"
desc = "A pair of black shoes."
permeability_coefficient = 0.05
resistance_flags = NONE
@@ -550,7 +545,6 @@
/obj/item/clothing/shoes/chameleon/noslip
name = "black shoes"
icon_state = "black"
- item_color = "black"
desc = "A pair of black shoes."
clothing_flags = NOSLIP
can_be_bloody = FALSE
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 4391e3621f34..129f457954ea 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -293,13 +293,13 @@ BLIND // can't see anything
/proc/generate_female_clothing(index,t_color,icon,type) //In a shellnut, blends the uniform sprite with a pre-made sprite in uniform.dmi that's mostly white pixels with a few empty ones to trim off the pixels in the empty spots
var/icon/female_clothing_icon = icon(icon, t_color) // and make the uniform the "female" shape. female_s is either the top-only one (for jumpskirts and the like) or the full one (for jumpsuits)
- var/icon/female_s = icon('icons/mob/uniform.dmi', "[(type == FEMALE_UNIFORM_FULL) ? "female_full" : "female_top"]")
+ var/icon/female_s = icon('icons/effects/clothing.dmi', "[(type == FEMALE_UNIFORM_FULL) ? "female_full" : "female_top"]")
female_clothing_icon.Blend(female_s, ICON_MULTIPLY)
GLOB.female_clothing_icons[index] = fcopy_rsc(female_clothing_icon) //Then it saves the icon in a global list so it doesn't have to make it again
/proc/generate_skinny_clothing(index,t_color,icon,type) //Works the exact same as above but for skinny people
var/icon/skinny_clothing_icon = icon(icon, t_color)
- var/icon/skinny_s = icon('icons/mob/uniform.dmi', "[(type == FEMALE_UNIFORM_FULL) ? "skinny_full" : "skinny_top"]") //Hooks into same check to see if it's eligible
+ var/icon/skinny_s = icon('icons/effects/clothing.dmi', "[(type == FEMALE_UNIFORM_FULL) ? "skinny_full" : "skinny_top"]") //Hooks into same check to see if it's eligible
skinny_clothing_icon.Blend(skinny_s, ICON_MULTIPLY)
GLOB.skinny_clothing_icons[index] = fcopy_rsc(skinny_clothing_icon)
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index f2be9aff8c6e..a3f273bbcc09 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -322,7 +322,7 @@
. = list()
if(!isinhands && ishuman(loc) && !colored_before)
var/mob/living/carbon/human/H = loc
- var/mutable_appearance/M = mutable_appearance('icons/mob/eyes.dmi', "blindfoldwhite")
+ var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/eyes/eyes.dmi', "blindfoldwhite")
M.appearance_flags |= RESET_COLOR
M.color = "#[H.eye_color]"
. += M
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 891d72d95e61..ed9be54ef292 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -1,3 +1,7 @@
+/obj/item/clothing/gloves/color
+ dying_key = DYE_REGISTRY_GLOVES
+
+/obj/item/clothing/gloves/color/yellow
/obj/item/clothing/gloves/color/yellow
desc = "These gloves will protect the wearer from electric shock."
name = "insulated gloves"
@@ -5,7 +9,6 @@
item_state = "ygloves"
siemens_coefficient = 0
permeability_coefficient = 0.05
- item_color="yellow"
resistance_flags = NONE
/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
@@ -15,7 +18,6 @@
item_state = "ygloves"
siemens_coefficient = 0
permeability_coefficient = 0.05
- item_color = "yellow"
resistance_flags = NONE
var/damaged = FALSE
@@ -37,7 +39,6 @@
name = "black gloves"
icon_state = "black"
item_state = "blackgloves"
- item_color="black"
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
@@ -51,12 +52,6 @@
icon_state = "forensic"
can_be_cut = 0
-/obj/item/clothing/gloves/color/black/hos
- item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way.
-
-/obj/item/clothing/gloves/color/black/ce
- item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way.
-
/obj/item/clothing/gloves/color/black/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_WIRECUTTER)
if(can_be_cut && icon_state == initial(icon_state))//only if not dyed
@@ -86,14 +81,12 @@
desc = "A pair of gloves, they don't look special in any way."
icon_state = "orange"
item_state = "orangegloves"
- item_color="orange"
/obj/item/clothing/gloves/color/red
name = "red gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "red"
item_state = "redgloves"
- item_color = "red"
/obj/item/clothing/gloves/color/red/insulated
@@ -108,68 +101,48 @@
desc = "A pair of gloves, they don't look special in any way."
icon_state = "rainbow"
item_state = "rainbowgloves"
- item_color = "rainbow"
-
-/obj/item/clothing/gloves/color/rainbow/clown
- item_color = "clown"
/obj/item/clothing/gloves/color/blue
name = "blue gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "blue"
item_state = "bluegloves"
- item_color="blue"
/obj/item/clothing/gloves/color/purple
name = "purple gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "purple"
item_state = "purplegloves"
- item_color="purple"
/obj/item/clothing/gloves/color/green
name = "green gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "green"
item_state = "greengloves"
- item_color="green"
/obj/item/clothing/gloves/color/grey
name = "grey gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "gray"
item_state = "graygloves"
- item_color="grey"
-
-/obj/item/clothing/gloves/color/grey/rd
- item_color = "director" //Exists for washing machines. Is not different from gray gloves in any way.
-
-/obj/item/clothing/gloves/color/grey/hop
- item_color = "hop" //Exists for washing machines. Is not different from gray gloves in any way.
/obj/item/clothing/gloves/color/light_brown
name = "light brown gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "lightbrown"
item_state = "lightbrowngloves"
- item_color="light brown"
/obj/item/clothing/gloves/color/brown
name = "brown gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "brown"
item_state = "browngloves"
- item_color="brown"
-
-/obj/item/clothing/gloves/color/brown/cargo
- item_color = "cargo" //Exists for washing machines. Is not different from brown gloves in any way.
/obj/item/clothing/gloves/color/captain
desc = "Regal blue gloves, with a nice gold trim, a diamond anti-shock coating, and an integrated thermal barrier. Swanky."
name = "captain's gloves"
icon_state = "captain"
item_state = "egloves"
- item_color = "captain"
siemens_coefficient = 0
permeability_coefficient = 0.05
cold_protection = HANDS
@@ -198,7 +171,6 @@
item_state = "lgloves"
siemens_coefficient = 0.3
permeability_coefficient = 0.01
- item_color="mime"
transfer_prints = TRUE
resistance_flags = NONE
var/carrytrait = TRAIT_QUICK_CARRY
@@ -208,7 +180,6 @@
desc = "Pricey sterile gloves that are stronger than latex. Transfers intimate paramedic knowledge into the user via nanochips."
icon_state = "nitrile"
item_state = "nitrilegloves"
- item_color = "cmo"
transfer_prints = FALSE
carrytrait = TRAIT_QUICKER_CARRY
@@ -226,10 +197,6 @@
desc = "These look pretty fancy."
icon_state = "white"
item_state = "wgloves"
- item_color="white"
-
-/obj/item/clothing/gloves/color/white/redcoat
- item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way.
/obj/effect/spawner/lootdrop/gloves
name = "random gloves"
diff --git a/code/modules/clothing/gloves/knifeboxing.dm b/code/modules/clothing/gloves/knifeboxing.dm
index 938e322bdae0..c42616477c44 100644
--- a/code/modules/clothing/gloves/knifeboxing.dm
+++ b/code/modules/clothing/gloves/knifeboxing.dm
@@ -2,6 +2,6 @@
name = "knife gloves"
desc = "I'm here to punch people in the face with knives."
icon = 'icons/obj/clothing/gloves.dmi'
- alternate_worn_icon = 'icons/mob/hands.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/hands/hands.dmi'
icon_state = "knife_boxing"
item_state = "knife_boxing"
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 619c6fa3c982..45552336cccd 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -4,13 +4,13 @@
desc = "Plain black gloves without fingertips for the hard working."
icon_state = "fingerless"
item_state = "fingerless"
- item_color = null //So they don't wash.
transfer_prints = TRUE
strip_delay = 40
equip_delay_other = 20
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
custom_price = 10
+ undyeable = TRUE
/obj/item/clothing/gloves/botanic_leather
name = "botanist's leather gloves"
@@ -45,7 +45,6 @@
desc = "For when you're expecting to get slapped on the wrist. Offers modest protection to your arms."
icon_state = "bracers"
item_state = "bracers"
- item_color = null //So they don't wash.
transfer_prints = TRUE
strip_delay = 40
equip_delay_other = 20
@@ -95,7 +94,7 @@
/obj/item/clothing/gloves/bracer/cuffs
name = "rabid cuffs"
- desc = "Chainless manacles fashioned after one of the hungriest slaughter demons. Wearing these invokes a hunger in the wearer that can only be sated by bloodshed."
+ desc = "Wristbands fashioned after one of the hungriest slaughter demons. Wearing these invokes a hunger in the wearer that can only be sated by bloodshed."
icon_state = "cuff"
item_state = "cuff"
var/obj/effect/proc_holder/swipe/swipe_ability
@@ -116,7 +115,7 @@
obj/effect/proc_holder/swipe
name = "Swipe"
- desc = "Swipe at a target area, dealing damage and consuming dead entities to heal yourself. Creatures take 30 damage while people and cyborgs take 10 damage. Consumed creatures explode into gibs and give the most healing, and people and cyborgs heal for the least. People and cyborgs who have been thoroughly burned and bruised heal you for slightly more! People are ineligible for total consumption."
+ desc = "Swipe at a target area, dealing damage to heal yourself. Creatures take 60 damage while people and cyborgs take 20 damage. Living creatures hit with this ability will heal the user for 13 brute/burn/poison while dead ones heal for 20 and get butchered, while killing a creature with a swipe will heal the user for 33. People and cyborgs hit will heal for 5."
action_background_icon_state = "bg_demon"
action_icon = 'icons/mob/actions/actions_items.dmi'
action_icon_state = "cuff"
@@ -154,32 +153,33 @@ obj/effect/proc_holder/swipe
return
if(!istype(T))
return
+ if(!(T in range(9, caller)))
+ to_chat(caller, warning("The target is too far!"))
+ return
new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T)
new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T)
- to_chat(L, span_userdanger("A claw swipes at you!"))
+ to_chat(L, span_userdanger("Claws reach out from the floor and maul you!"))
to_chat(ranged_ability_user, "You summon claws at [L]'s location!")
+ L.visible_message(span_warning("[caller] rends [L]!"))
for(L in range(0,T))
playsound(T, 'sound/magic/demon_attack1.ogg', 80, 5, -1)
if(isanimal(L))
- L.adjustBruteLoss(30)
+ L.adjustBruteLoss(60)
+ if(L.stat != DEAD)
+ caller.adjustBruteLoss(-13)
+ caller.adjustFireLoss(-13)
+ caller.adjustToxLoss(-13)
if(L.stat == DEAD)
L.gib()
+ to_chat(caller, span_notice("You're able to consume the body entirely!"))
caller.adjustBruteLoss(-20)
caller.adjustFireLoss(-20)
caller.adjustToxLoss(-20)
- caller.blood_volume = BLOOD_VOLUME_NORMAL(caller)*1.10
- L.adjustBruteLoss(10)
- if(L.getBruteLoss()+L.getFireLoss() >= 299)
- to_chat(caller, span_notice("You're able to consume a bit more of the body, as it was previously softened up!"))
- caller.adjustBruteLoss(-15)
- caller.adjustFireLoss(-15)
- caller.adjustToxLoss(-15)
- caller.blood_volume = BLOOD_VOLUME_NORMAL(caller)*1.05
- if(L.stat == DEAD)
+ if(iscarbon(L))
+ L.adjustBruteLoss(20)
caller.adjustBruteLoss(-5)
caller.adjustFireLoss(-5)
caller.adjustToxLoss(-5)
- caller.blood_volume = BLOOD_VOLUME_NORMAL(caller)*1.01
COOLDOWN_START(src, scan_cooldown, cooldown)
addtimer(CALLBACK(src, .proc/cooldown_over, ranged_ability_user), cooldown)
remove_ranged_ability()
diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm
index da676d9d763f..ed06e0202670 100644
--- a/code/modules/clothing/head/beanie.dm
+++ b/code/modules/clothing/head/beanie.dm
@@ -7,7 +7,6 @@
name = "white beanie"
desc = "A stylish beanie. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their heads."
icon_state = "beanie" //Default white
- item_color = "beanie"
custom_price = 10
/obj/item/clothing/head/beanie/black
@@ -55,39 +54,32 @@
/obj/item/clothing/head/beanie/christmas
name = "christmas beanie"
icon_state = "beaniechristmas"
- item_color = "beaniechristmas"
/obj/item/clothing/head/beanie/striped
name = "striped beanie"
icon_state = "beaniestriped"
- item_color = "beaniestriped"
/obj/item/clothing/head/beanie/stripedred
name = "red striped beanie"
icon_state = "beaniestripedred"
- item_color = "beaniestripedred"
/obj/item/clothing/head/beanie/stripedblue
name = "blue striped beanie"
icon_state = "beaniestripedblue"
- item_color = "beaniestripedblue"
/obj/item/clothing/head/beanie/stripedgreen
name = "green striped beanie"
icon_state = "beaniestripedgreen"
- item_color = "beaniestripedgreen"
/obj/item/clothing/head/beanie/durathread
name = "durathread beanie"
desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer."
icon_state = "beaniedurathread"
- item_color = null
armor = list(MELEE = 15, BULLET = 5, LASER = 15, ENERGY = 5, BOMB = 10, BIO = 0, RAD = 0, FIRE = 30, ACID = 5)
/obj/item/clothing/head/beanie/waldo
name = "red striped bobble hat"
desc = "If you're going on a worldwide hike, you'll need some cold protection."
icon_state = "waldo_hat"
- item_color = "waldo_hat"
//No dog fashion sprites yet :( poor Ian can't be dope like the rest of us yet
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index bc4f6bebb8cb..ef8239f0dfc8 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -3,9 +3,11 @@
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight."
icon_state = "hardhat0_yellow"
item_state = "hardhat0_yellow"
+ mob_overlay_icon = 'icons/mob/clothing/head/head.dmi'
var/brightness_on = 4 //luminosity when on
var/on = FALSE
- item_color = "yellow" //Determines used sprites: hardhat[on]_[item_color] and hardhat[on]_[item_color]2 (lying down sprite)
+ //Determines used sprites: hardhat[on]_[hat_type]
+ var/hat_type = "yellow"
armor = list(MELEE = 15, BULLET = 5, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 10, RAD = 20, FIRE = 100, ACID = 50, WOUND = 10)
flags_inv = 0
actions_types = list(/datum/action/item_action/toggle_helmet_light)
@@ -26,8 +28,8 @@
update_icon()
/obj/item/clothing/head/hardhat/update_icon()
- icon_state = "hardhat[on]_[item_color]"
- item_state = "hardhat[on]_[item_color]"
+ icon_state = "hardhat[on]_[hat_type]"
+ item_state = "hardhat[on]_[hat_type]"
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.update_inv_head()
@@ -45,13 +47,13 @@
/obj/item/clothing/head/hardhat/orange
icon_state = "hardhat0_orange"
item_state = "hardhat0_orange"
- item_color = "orange"
+ hat_type = "orange"
dog_fashion = null
/obj/item/clothing/head/hardhat/red
icon_state = "hardhat0_red"
item_state = "hardhat0_red"
- item_color = "red"
+ hat_type = "red"
dog_fashion = null
name = "firefighter helmet"
clothing_flags = STOPSPRESSUREDAMAGE
@@ -63,7 +65,7 @@
/obj/item/clothing/head/hardhat/white
icon_state = "hardhat0_white"
item_state = "hardhat0_white"
- item_color = "white"
+ hat_type = "white"
clothing_flags = STOPSPRESSUREDAMAGE
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
@@ -74,13 +76,13 @@
/obj/item/clothing/head/hardhat/dblue
icon_state = "hardhat0_dblue"
item_state = "hardhat0_dblue"
- item_color = "dblue"
+ hat_type = "dblue"
dog_fashion = null
/obj/item/clothing/head/hardhat/atmos
icon_state = "hardhat0_atmos"
item_state = "hardhat0_atmos"
- item_color = "atmos"
+ hat_type = "atmos"
dog_fashion = null
name = "atmospheric technician's firefighting helmet"
desc = "A firefighter's helmet, able to keep the user cool in any situation."
@@ -124,9 +126,9 @@
/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands)
. = ..()
if(!isinhands)
- . += mutable_appearance('icons/mob/head.dmi', "weldhelmet")
+ . += mutable_appearance(mob_overlay_icon, "weldhelmet")
if(!up)
- . += mutable_appearance('icons/mob/head.dmi', "weldvisor")
+ . += mutable_appearance(mob_overlay_icon, "weldvisor")
/obj/item/clothing/head/hardhat/weldhat/update_icon()
cut_overlays()
@@ -137,14 +139,14 @@
/obj/item/clothing/head/hardhat/weldhat/orange
icon_state = "hardhat0_orange"
item_state = "hardhat0_orange"
- item_color = "orange"
+ hat_type = "orange"
/obj/item/clothing/head/hardhat/weldhat/white
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield!" //This bulb is not smaller
icon_state = "hardhat0_white"
item_state = "hardhat0_white"
brightness_on = 4 //Boss always takes the best stuff
- item_color = "white"
+ hat_type = "white"
clothing_flags = STOPSPRESSUREDAMAGE
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
@@ -154,4 +156,4 @@
/obj/item/clothing/head/hardhat/weldhat/dblue
icon_state = "hardhat0_dblue"
item_state = "hardhat0_dblue"
- item_color = "dblue"
\ No newline at end of file
+ hat_type = "dblue"
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index e6cdf9b9dfac..1aceaaae6ceb 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -173,7 +173,6 @@
name = "durathread beret"
desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer."
icon_state = "beretdurathread"
- item_color = null
armor = list(MELEE = 15, BULLET = 5, LASER = 15, ENERGY = 5, BOMB = 10, BIO = 0, RAD = 0, FIRE = 30, ACID = 5, WOUND = 5)
//Security
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 34709a41f34f..b1677b6c1980 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -135,7 +135,7 @@
/obj/item/clothing/head/pirate
name = "pirate hat"
- desc = "Yarr."
+ desc = "Ahoy! This hat inspires you to take arms to scourge the several seas."
icon_state = "pirate"
item_state = "pirate"
dog_fashion = /datum/dog_fashion/head/pirate
@@ -161,13 +161,14 @@
to_chat(user, "You can no longer speak like a pirate.")
/obj/item/clothing/head/pirate/captain
- name = "pirate captain"
+ name = "pirate captain hat"
+ desc = "Ahoy! A hat befit only for the greatest pirates. May your exploits be legendary and your treasure hoard safe!"
icon_state = "hgpiratecap"
item_state = "hgpiratecap"
-/obj/item/clothing/head/bandana
+/obj/item/clothing/head/pirate/bandana
name = "pirate bandana"
- desc = "Yarr."
+ desc = "Ahoy! A colorful wrap to collect and wipe up sweat after long days at sea."
icon_state = "bandana"
item_state = "bandana"
dynamic_hair_suffix = ""
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 0ca986a8f82f..db7a591f4b45 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -41,7 +41,7 @@
desc = "You put the cake on your head. Brilliant."
icon_state = "hardhat0_cakehat"
item_state = "hardhat0_cakehat"
- item_color = "cakehat"
+ hat_type = "cakehat"
hitsound = 'sound/weapons/tap.ogg'
flags_inv = HIDEEARS|HIDEHAIR
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
@@ -112,7 +112,7 @@
desc = "A jack o' lantern! Believed to ward off evil spirits."
icon_state = "hardhat0_pumpkin"
item_state = "hardhat0_pumpkin"
- item_color = "pumpkin"
+ hat_type = "pumpkin"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
brightness_on = 2 //luminosity when on
@@ -161,7 +161,7 @@
desc = "Some fake antlers and a very fake red nose."
icon_state = "hardhat0_reindeer"
item_state = "hardhat0_reindeer"
- item_color = "reindeer"
+ hat_type = "reindeer"
flags_inv = 0
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
brightness_on = 1 //luminosity when on
@@ -361,3 +361,9 @@
icon_state = "halo"
item_state = "halo"
layer = EARS_LAYER
+
+/obj/item/clothing/head/rainbow_flower
+ name = "Rainbow Flower"
+ desc = "A cute, multicoloured flower. Makes you feel all warm and fuzzy inside."
+ icon_state = "rflower"
+ item_state = "rflower"
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index e6bb71b023f8..e4f808741a00 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -3,15 +3,16 @@
desc = "It's a baseball hat in a tasteless yellow colour."
icon_state = "cargosoft"
item_state = "helmet"
- item_color = "cargo"
+ //Determines used sprites: [soft_type]soft
+ var/soft_type = "cargo"
dog_fashion = /datum/dog_fashion/head/cargo_tech
- var/flipped = 0
+ var/flipped = FALSE
/obj/item/clothing/head/soft/dropped()
- src.icon_state = "[item_color]soft"
- src.flipped=0
+ icon_state = "[soft_type]soft"
+ flipped = FALSE
..()
/obj/item/clothing/head/soft/verb/flipcap()
@@ -31,12 +32,12 @@
/obj/item/clothing/head/soft/proc/flip(mob/user)
if(!user.incapacitated())
- src.flipped = !src.flipped
- if(src.flipped)
- icon_state = "[item_color]soft_flipped"
+ flipped = !flipped
+ if(flipped)
+ icon_state = "[soft_type]soft_flipped"
to_chat(user, span_notice("You flip the hat backwards."))
else
- icon_state = "[item_color]soft"
+ icon_state = "[soft_type]soft"
to_chat(user, span_notice("You flip the hat back in normal position."))
usr.update_inv_head() //so our mob-overlays update
@@ -48,77 +49,77 @@
name = "red cap"
desc = "It's a baseball hat in a tasteless red colour."
icon_state = "redsoft"
- item_color = "red"
+ soft_type = "red"
dog_fashion = null
/obj/item/clothing/head/soft/blue
name = "blue cap"
desc = "It's a baseball hat in a tasteless blue colour."
icon_state = "bluesoft"
- item_color = "blue"
+ soft_type = "blue"
dog_fashion = null
/obj/item/clothing/head/soft/green
name = "green cap"
desc = "It's a baseball hat in a tasteless green colour."
icon_state = "greensoft"
- item_color = "green"
+ soft_type = "green"
dog_fashion = null
/obj/item/clothing/head/soft/yellow
name = "yellow cap"
desc = "It's a baseball hat in a tasteless yellow colour."
icon_state = "yellowsoft"
- item_color = "yellow"
+ soft_type = "yellow"
dog_fashion = null
/obj/item/clothing/head/soft/grey
name = "grey cap"
desc = "It's a baseball hat in a tasteful grey colour."
icon_state = "greysoft"
- item_color = "grey"
+ soft_type = "grey"
dog_fashion = null
/obj/item/clothing/head/soft/orange
name = "orange cap"
desc = "It's a baseball hat in a tasteless orange colour."
icon_state = "orangesoft"
- item_color = "orange"
+ soft_type = "orange"
dog_fashion = null
/obj/item/clothing/head/soft/mime
name = "white cap"
desc = "It's a baseball hat in a tasteless white colour."
icon_state = "mimesoft"
- item_color = "mime"
+ soft_type = "mime"
dog_fashion = null
/obj/item/clothing/head/soft/purple
name = "purple cap"
desc = "It's a baseball hat in a tasteless purple colour."
icon_state = "purplesoft"
- item_color = "purple"
+ soft_type = "purple"
dog_fashion = null
/obj/item/clothing/head/soft/black
name = "black cap"
desc = "It's a baseball hat in a tasteless black colour."
icon_state = "blacksoft"
- item_color = "black"
+ soft_type = "black"
dog_fashion = null
/obj/item/clothing/head/soft/rainbow
name = "rainbow cap"
desc = "It's a baseball hat in a bright rainbow of colors."
icon_state = "rainbowsoft"
- item_color = "rainbow"
+ soft_type = "rainbow"
dog_fashion = null
/obj/item/clothing/head/soft/sec
name = "security cap"
desc = "It's a robust baseball hat in tasteful red colour."
icon_state = "secsoft"
- item_color = "sec"
+ soft_type = "sec"
armor = list(MELEE = 30, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 50)
strip_delay = 60
dog_fashion = null
@@ -127,12 +128,12 @@
name = "EMT cap"
desc = "It's a baseball hat with a dark turquoise color and a reflective cross on the top."
icon_state = "emtsoft"
- item_color = "emt"
+ soft_type = "emt"
dog_fashion = null
/obj/item/clothing/head/soft/emt/green
name = "green EMT cap"
desc = "It's a baseball hat with a green color and a reflective cross on the top."
icon_state = "emtgrsoft"
- item_color = "emtgr"
+ soft_type = "emtgr"
dog_fashion = null
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index e1cf59877f98..3b6f7a655cfd 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -54,6 +54,7 @@
clothing_flags = MASKINTERNALS
icon_state = "clown"
item_state = "clown_hat"
+ dye_color = "clown"
flags_cover = MASKCOVERSEYES
resistance_flags = FLAMMABLE
actions_types = list(/datum/action/item_action/adjust)
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 9579b29d7426..4a1a60dc047f 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -137,7 +137,7 @@
/obj/item/clothing/mask/cowmask
name = "cow mask"
- icon = 'icons/mob/mask.dmi'
+ icon = 'icons/mob/clothing/mask/mask.dmi'
icon_state = "cowmask"
item_state = "cowmask"
clothing_flags = VOICEBOX_TOGGLABLE
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index f4deb64f030c..c3e2087faafb 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -21,42 +21,35 @@
icon = 'icons/obj/clothing/neck.dmi'
icon_state = "bluetie"
item_state = "" //no inhands
- item_color = "bluetie"
w_class = WEIGHT_CLASS_SMALL
custom_price = 15
/obj/item/clothing/neck/tie/blue
name = "blue tie"
icon_state = "bluetie"
- item_color = "bluetie"
/obj/item/clothing/neck/tie/red
name = "red tie"
icon_state = "redtie"
- item_color = "redtie"
/obj/item/clothing/neck/tie/black
name = "black tie"
icon_state = "blacktie"
- item_color = "blacktie"
/obj/item/clothing/neck/tie/horrible
name = "horrible tie"
desc = "A neosilk clip-on tie. This one is disgusting."
icon_state = "horribletie"
- item_color = "horribletie"
/obj/item/clothing/neck/tie/detective
name = "loose tie"
desc = "A loosely tied necktie, a perfect accessory for the over-worked detective."
icon_state = "detective"
- item_color = "detective"
/obj/item/clothing/neck/stethoscope
name = "stethoscope"
desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing."
icon_state = "stethoscope"
- item_color = "stethoscope"
/obj/item/clothing/neck/stethoscope/suicide_act(mob/living/carbon/user)
user.visible_message(span_suicide("[user] puts \the [src] to [user.p_their()] chest! It looks like [user.p_they()] wont hear much!"))
@@ -99,61 +92,51 @@
name = "white scarf"
icon_state = "scarf"
desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks."
- item_color = "white"
dog_fashion = /datum/dog_fashion/head
custom_price = 10
/obj/item/clothing/neck/scarf/black
name = "black scarf"
- item_color = "black"
icon_state = "scarf"
color = "#4A4A4B" //Grey but it looks black
/obj/item/clothing/neck/scarf/pink
name = "pink scarf"
- item_color = "pink"
icon_state = "scarf"
color = "#F699CD" //Pink
/obj/item/clothing/neck/scarf/red
name = "red scarf"
- item_color = "red"
icon_state = "scarf"
color = "#D91414" //Red
/obj/item/clothing/neck/scarf/green
name = "green scarf"
- item_color = "green"
icon_state = "scarf"
color = "#5C9E54" //Green
/obj/item/clothing/neck/scarf/darkblue
name = "dark blue scarf"
- item_color = "blue"
icon_state = "scarf"
color = "#1E85BC" //Blue
/obj/item/clothing/neck/scarf/purple
name = "purple scarf"
- item_color = "purple"
icon_state = "scarf"
color = "#9557C5" //Purple
/obj/item/clothing/neck/scarf/yellow
name = "yellow scarf"
- item_color = "yellow"
icon_state = "scarf"
color = "#E0C14F" //Yellow
/obj/item/clothing/neck/scarf/orange
name = "orange scarf"
- item_color = "orange"
icon_state = "scarf"
color = "#C67A4B" //Orange
/obj/item/clothing/neck/scarf/cyan
name = "cyan scarf"
- item_color = "cyan"
icon_state = "scarf"
color = "#54A3CE" //Cyan
@@ -163,12 +146,10 @@
/obj/item/clothing/neck/scarf/zebra
name = "zebra scarf"
icon_state = "zebrascarf"
- item_color = "zebrascarf"
/obj/item/clothing/neck/scarf/christmas
name = "christmas scarf"
icon_state = "christmasscarf"
- item_color = "christmasscarf"
//The three following scarves don't have the scarf subtype
//This is because Ian can equip anything from that subtype
@@ -176,26 +157,22 @@
/obj/item/clothing/neck/stripedredscarf
name = "striped red scarf"
icon_state = "stripedredscarf"
- item_color = "stripedredscarf"
custom_price = 10
/obj/item/clothing/neck/stripedgreenscarf
name = "striped green scarf"
icon_state = "stripedgreenscarf"
- item_color = "stripedgreenscarf"
custom_price = 10
/obj/item/clothing/neck/stripedbluescarf
name = "striped blue scarf"
icon_state = "stripedbluescarf"
- item_color = "stripedbluescarf"
custom_price = 10
/obj/item/clothing/neck/petcollar
name = "pet collar"
desc = "It has a little bell!"
icon_state = "petcollar"
- item_color = "petcollar"
var/tagname = null
/obj/item/clothing/neck/petcollar/Initialize()
@@ -215,7 +192,6 @@
/obj/item/clothing/neck/artist
name = "post-modern scarf"
icon_state = "artist"
- item_color = "artist"
custom_price = 10
//////////////
@@ -227,7 +203,6 @@
desc = "Damn, it feels good to be a gangster."
icon = 'icons/obj/clothing/neck.dmi'
icon_state = "bling"
- item_color = "bling"
/obj/item/clothing/neck/neckerchief
icon = 'icons/obj/clothing/masks.dmi' //In order to reuse the bandana sprite
@@ -237,7 +212,7 @@
/obj/item/clothing/neck/neckerchief/worn_overlays(isinhands)
. = ..()
if(!isinhands)
- var/mutable_appearance/realOverlay = mutable_appearance('icons/mob/mask.dmi', icon_state)
+ var/mutable_appearance/realOverlay = mutable_appearance(mob_overlay_icon, icon_state)
realOverlay.pixel_y = -3
. += realOverlay
diff --git a/code/modules/clothing/neck/skillcapes/skillcapes.dm b/code/modules/clothing/neck/skillcapes/skillcapes.dm
index cca75227deb8..d7db45e67750 100644
--- a/code/modules/clothing/neck/skillcapes/skillcapes.dm
+++ b/code/modules/clothing/neck/skillcapes/skillcapes.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/clothing/skillcapes.dmi'
icon_state = "ghost-skillcape"
item_state = "ghost-skillcape"
+ mob_overlay_icon = 'icons/mob/clothing/neck/skillcapes.dmi'
w_class = WEIGHT_CLASS_SMALL
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDESUITSTORAGE
diff --git a/code/modules/clothing/outfits/amber.dm b/code/modules/clothing/outfits/amber.dm
index 581dbc90be04..d5e2a63d128e 100644
--- a/code/modules/clothing/outfits/amber.dm
+++ b/code/modules/clothing/outfits/amber.dm
@@ -6,7 +6,7 @@
name = "amber medic beret"
desc = "A white beret for the mundane life of an amber task force medic."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "beret_ce"
diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm
index 7669d1c86b02..36804d866293 100644
--- a/code/modules/clothing/outfits/plasmaman.dm
+++ b/code/modules/clothing/outfits/plasmaman.dm
@@ -629,7 +629,7 @@
uniform = /obj/item/clothing/under/plasmaman/chief_engineer
shoes = /obj/item/clothing/shoes/sneakers/brown
ears = /obj/item/radio/headset/heads/ce
- gloves = /obj/item/clothing/gloves/color/black/ce
+ gloves = /obj/item/clothing/gloves/color/black
belt = /obj/item/storage/belt/utility/chief/full
backpack = /obj/item/storage/backpack/industrial
satchel = /obj/item/storage/backpack/satchel/eng
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index 9c4b7ddf951c..70feb1afced8 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -83,10 +83,11 @@
uniform = /obj/item/clothing/under/pirate
shoes = /obj/item/clothing/shoes/sneakers/brown
suit = /obj/item/clothing/suit/pirate
- head = /obj/item/clothing/head/bandana
+ head = /obj/item/clothing/head/pirate/bandana
glasses = /obj/item/clothing/glasses/eyepatch
/datum/outfit/pirate/space
+ uniform = /obj/item/clothing/under/pirate/space
suit = /obj/item/clothing/suit/space/pirate
head = /obj/item/clothing/head/helmet/space/pirate/bandana
mask = /obj/item/clothing/mask/breath
@@ -94,9 +95,13 @@
ears = /obj/item/radio/headset/syndicate
id = /obj/item/card/id
-/datum/outfit/pirate/space/captain
+/datum/outfit/pirate/space/gunner
head = /obj/item/clothing/head/helmet/space/pirate
+/datum/outfit/pirate/space/captain
+ suit = /obj/item/clothing/suit/space/pirate/captain
+ head = /obj/item/clothing/head/helmet/space/pirate/captain
+
/datum/outfit/pirate/post_equip(mob/living/carbon/human/H)
H.faction |= "pirate"
diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm
index 6437a42b751e..ba87098095a6 100644
--- a/code/modules/clothing/shoes/colour.dm
+++ b/code/modules/clothing/shoes/colour.dm
@@ -1,9 +1,9 @@
/obj/item/clothing/shoes/sneakers
+ dying_key = DYE_REGISTRY_SNEAKERS
/obj/item/clothing/shoes/sneakers/black
name = "black shoes"
icon_state = "black"
- item_color = "black"
desc = "A pair of black shoes."
custom_price = 20
@@ -12,80 +12,49 @@
heat_protection = FEET
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
-/obj/item/clothing/shoes/sneakers/black/redcoat
- item_color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way.
-
/obj/item/clothing/shoes/sneakers/brown
name = "brown shoes"
desc = "A pair of brown shoes."
icon_state = "brown"
- item_color = "brown"
-
-/obj/item/clothing/shoes/sneakers/brown/captain
- item_color = "captain" //Exists for washing machines. Is not different from brown shoes in any way.
-
-/obj/item/clothing/shoes/sneakers/brown/hop
- item_color = "hop" //Exists for washing machines. Is not different from brown shoes in any way.
-
-/obj/item/clothing/shoes/sneakers/brown/ce
- item_color = "chief" //Exists for washing machines. Is not different from brown shoes in any way.
-
-/obj/item/clothing/shoes/sneakers/brown/rd
- item_color = "director" //Exists for washing machines. Is not different from brown shoes in any way.
-
-/obj/item/clothing/shoes/sneakers/brown/cmo
- item_color = "medical" //Exists for washing machines. Is not different from brown shoes in any way.
-
-/obj/item/clothing/shoes/sneakers/brown/qm
- item_color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way.
/obj/item/clothing/shoes/sneakers/blue
name = "blue shoes"
icon_state = "blue"
- item_color = "blue"
/obj/item/clothing/shoes/sneakers/green
name = "green shoes"
icon_state = "green"
- item_color = "green"
/obj/item/clothing/shoes/sneakers/yellow
name = "yellow shoes"
icon_state = "yellow"
- item_color = "yellow"
/obj/item/clothing/shoes/sneakers/purple
name = "purple shoes"
icon_state = "purple"
- item_color = "purple"
/obj/item/clothing/shoes/sneakers/brown
name = "brown shoes"
icon_state = "brown"
- item_color = "brown"
/obj/item/clothing/shoes/sneakers/red
name = "red shoes"
desc = "Stylish red shoes."
icon_state = "red"
- item_color = "red"
/obj/item/clothing/shoes/sneakers/white
name = "white shoes"
icon_state = "white"
permeability_coefficient = 0.01
- item_color = "white"
/obj/item/clothing/shoes/sneakers/rainbow
name = "rainbow shoes"
desc = "Very colorful shoes."
icon_state = "rain_bow"
- item_color = "rainbow"
/obj/item/clothing/shoes/sneakers/orange
name = "orange shoes"
icon_state = "orange"
- item_color = "orange"
/obj/item/clothing/shoes/sneakers/orange/attack_self(mob/user)
if (src.chained)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 33f26ea16013..be968d49111e 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -4,7 +4,6 @@
/obj/item/clothing/shoes/sneakers/mime
name = "mime shoes"
icon_state = "mime"
- item_color = "mime"
/obj/item/clothing/shoes/combat //basic syndicate combat boots for nuke ops and mob corpses
name = "combat boots"
@@ -78,7 +77,6 @@
icon_state = "clown"
item_state = "clown_shoes"
slowdown = SHOES_SLOWDOWN+1
- item_color = "clown"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes/clown
var/datum/component/waddle
var/enabled_waddle = TRUE
@@ -132,7 +130,6 @@
item_state = "jackboots"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
- item_color = "hosred"
strip_delay = 50
equip_delay_other = 50
resistance_flags = NONE
@@ -195,7 +192,6 @@
desc = "A pair of boots worn by the followers of Nar'Sie."
icon_state = "cult"
item_state = "cult"
- item_color = "cult"
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
@@ -244,7 +240,6 @@
desc = "A specialized pair of combat boots with a built-in propulsion system for rapid foward movement."
icon_state = "jetboots"
item_state = "jetboots"
- item_color = "hosred"
resistance_flags = FIRE_PROOF
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
actions_types = list(/datum/action/item_action/bhop)
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 5c428394d912..0fa42b442ba8 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -10,7 +10,8 @@
var/brightness_on = 4 //luminosity when on
var/on = FALSE
var/obj/item/clothing/suit/space/hardsuit/suit
- item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite)
+ //Determines used sprites: hardsuit[on]-[hardsuit_type]
+ var/hardsuit_type = "engineering"
actions_types = list(/datum/action/item_action/toggle_helmet_light)
var/rad_count = 0
var/rad_record = 0
@@ -29,7 +30,7 @@
/obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user)
on = !on
- icon_state = "[basestate][on]-[item_color]"
+ icon_state = "[basestate][on]-[hardsuit_type]"
user.update_inv_head() //so our mob-overlays update
if(on)
@@ -102,6 +103,7 @@
actions_types = list(/datum/action/item_action/toggle_helmet)
var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit
var/obj/item/tank/jetpack/suit/jetpack = null
+ var/hardsuit_type
/obj/item/clothing/suit/space/hardsuit/Initialize()
if(jetpack && ispath(jetpack))
@@ -166,8 +168,8 @@
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
+ hardsuit_type = "engineering"
armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 75, FIRE = 100, ACID = 75, WOUND = 10)
- item_color = "engineering"
resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/space/hardsuit/engine
@@ -185,7 +187,7 @@
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has thermal shielding."
icon_state = "hardsuit0-atmospherics"
item_state = "atmo_helm"
- item_color = "atmospherics"
+ hardsuit_type = "atmospherics"
armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 25, FIRE = 100, ACID = 75, WOUND = 10)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -207,7 +209,7 @@
desc = "An advanced helmet designed for work in a hazardous, low pressure environment. Shines with a high polish."
icon_state = "hardsuit0-white"
item_state = "ce_helm"
- item_color = "white"
+ hardsuit_type = "white"
armor = list(MELEE = 40, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 90, WOUND = 10)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -217,7 +219,7 @@
name = "advanced hardsuit"
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
item_state = "ce_hardsuit"
- armor = list(MELEE = 40, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 50, BIO = 100, RAD = 90, FIRE = 100, ACID = 90, WOUND = 10)
+ armor = list(MELEE = 40, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 90, WOUND = 10)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
@@ -229,7 +231,7 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has reinforced plating for wildlife encounters and dual floodlights."
icon_state = "hardsuit0-mining"
item_state = "mining_helm"
- item_color = "mining"
+ hardsuit_type = "mining"
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
heat_protection = HEAD
@@ -264,7 +266,7 @@
alt_desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
- item_color = "syndi"
+ hardsuit_type = "syndi"
armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, WOUND = 25)
on = TRUE
var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null
@@ -273,7 +275,7 @@
visor_flags = STOPSPRESSUREDAMAGE
/obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon()
- icon_state = "hardsuit[on]-[item_color]"
+ icon_state = "hardsuit[on]-[hardsuit_type]"
/obj/item/clothing/head/helmet/space/hardsuit/syndi/Initialize()
. = ..()
@@ -329,7 +331,7 @@
linkedsuit.clothing_flags &= ~STOPSPRESSUREDAMAGE
linkedsuit.cold_protection &= ~(CHEST | GROIN | LEGS | FEET | ARMS | HANDS)
- linkedsuit.icon_state = "hardsuit[on]-[item_color]"
+ linkedsuit.icon_state = "hardsuit[on]-[hardsuit_type]"
linkedsuit.update_icon()
user.update_inv_wear_suit()
user.update_inv_w_uniform()
@@ -341,7 +343,7 @@
alt_desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
- item_color = "syndi"
+ hardsuit_type = "syndi"
w_class = WEIGHT_CLASS_NORMAL
armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, WOUND = 25)
allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
@@ -354,7 +356,7 @@
desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in EVA mode. Property of Gorlex Marauders."
alt_desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in combat mode. Property of Gorlex Marauders."
icon_state = "hardsuit0-syndielite"
- item_color = "syndielite"
+ hardsuit_type = "syndielite"
armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 25, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, WOUND = 25)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -365,7 +367,7 @@
desc = "An elite version of the syndicate hardsuit, with improved armour and fireproofing. It is in travel mode."
alt_desc = "An elite version of the syndicate hardsuit, with improved armour and fireproofing. It is in combat mode."
icon_state = "hardsuit0-syndielite"
- item_color = "syndielite"
+ hardsuit_type = "syndielite"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 25, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, WOUND = 25)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -379,7 +381,7 @@
alt_desc = "A dual-mode advanced helmet designed for any crime-fighting situation. It is in combat mode."
icon_state = "hardsuit1-owl"
item_state = "s_helmet"
- item_color = "owl"
+ hardsuit_type = "owl"
visor_flags_inv = 0
visor_flags = 0
on = FALSE
@@ -390,7 +392,7 @@
alt_desc = "A dual-mode advanced hardsuit designed for any crime-fighting situation. It is in combat mode."
icon_state = "hardsuit1-owl"
item_state = "s_suit"
- item_color = "owl"
+ hardsuit_type = "owl"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/owl
//Carp hardsuit
@@ -455,7 +457,7 @@
desc = "A bizarre gem-encrusted helmet that radiates magical energies."
icon_state = "hardsuit0-wiz"
item_state = "wiz_helm"
- item_color = "wiz"
+ hardsuit_type = "wiz"
resistance_flags = FIRE_PROOF | ACID_PROOF //No longer shall our kind be foiled by lone chemists with spray bottles!
armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 25, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30)
heat_protection = HEAD //Uncomment to enable firesuit protection
@@ -486,7 +488,7 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort, but does not protect the eyes from intense light."
icon_state = "hardsuit0-medical"
item_state = "medical_helm"
- item_color = "medical"
+ hardsuit_type = "medical"
flash_protect = 0
armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 60, FIRE = 60, ACID = 75, WOUND = 10)
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SCAN_REAGENTS
@@ -506,7 +508,7 @@
name = "prototype hardsuit helmet"
desc = "A prototype helmet designed for research in a hazardous, low pressure environment. Scientific data flashes across the visor."
icon_state = "hardsuit0-rd"
- item_color = "rd"
+ hardsuit_type = "rd"
resistance_flags = ACID_PROOF | FIRE_PROOF
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 100, BIO = 100, RAD = 60, FIRE = 60, ACID = 80, WOUND = 15)
@@ -559,7 +561,7 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
icon_state = "hardsuit0-sec"
item_state = "sec_helm"
- item_color = "sec"
+ hardsuit_type = "sec"
armor = list(MELEE = 35, BULLET = 25, LASER = 30,ENERGY = 10, BOMB = 10, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, WOUND = 20)
@@ -580,7 +582,7 @@
name = "head of security's hardsuit helmet"
desc = "A special bulky helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
icon_state = "hardsuit0-hos"
- item_color = "hos"
+ hardsuit_type = "hos"
armor = list(MELEE = 45, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 100, RAD = 50, FIRE = 95, ACID = 95, WOUND = 25)
@@ -642,8 +644,8 @@
desc = "A special helmet designed for work in a hazardous, low-humor environment. Has radiation shielding."
icon_state = "hardsuit0-clown"
item_state = "hardsuit0-clown"
+ hardsuit_type = "clown"
armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, BIO = 100, RAD = 75, FIRE = 60, ACID = 30)
- item_color = "clown"
/obj/item/clothing/suit/space/hardsuit/clown
name = "cosmohonk hardsuit"
@@ -669,7 +671,7 @@
desc = "The integrated helmet of an ERT hardsuit, this one has blue highlights."
icon_state = "hardsuit0-ert_commander"
item_state = "hardsuit0-ert_commander"
- item_color = "ert_commander"
+ hardsuit_type = "ert_commander"
armor = list(MELEE = 65, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 80)
strip_delay = 130
brightness_on = 7
@@ -699,7 +701,7 @@
desc = "The integrated helmet of an ERT hardsuit, this one has red highlights."
icon_state = "hardsuit0-ert_security"
item_state = "hardsuit0-ert_security"
- item_color = "ert_security"
+ hardsuit_type = "ert_security"
/obj/item/clothing/suit/space/hardsuit/ert/sec
name = "emergency response team security hardsuit"
@@ -714,7 +716,7 @@
desc = "The integrated helmet of an ERT hardsuit, this one has orange highlights."
icon_state = "hardsuit0-ert_engineer"
item_state = "hardsuit0-ert_engineer"
- item_color = "ert_engineer"
+ hardsuit_type = "ert_engineer"
/obj/item/clothing/suit/space/hardsuit/ert/engi
name = "emergency response team engineering hardsuit"
@@ -729,7 +731,7 @@
desc = "The integrated helmet of an ERT hardsuit, this one has white highlights."
icon_state = "hardsuit0-ert_medical"
item_state = "hardsuit0-ert_medical"
- item_color = "ert_medical"
+ hardsuit_type = "ert_medical"
/obj/item/clothing/suit/space/hardsuit/ert/med
name = "emergency response team medical hardsuit"
@@ -744,7 +746,7 @@
desc = "The integrated helmet of an ERT hardsuit, this one has purple highlights."
icon_state = "hardsuit0-ert_janitor"
item_state = "hardsuit0-ert_janitor"
- item_color = "ert_janitor"
+ hardsuit_type = "ert_janitor"
/obj/item/clothing/suit/space/hardsuit/ert/jani
name = "emergency response team janitorial hardsuit"
@@ -760,7 +762,7 @@
desc = "A helmet worn by those who deal with paranormal threats for a living."
icon_state = "hardsuit0-prt"
item_state = "hardsuit0-prt"
- item_color = "knight_grey"
+ hardsuit_type = "knight_grey"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
actions_types = list()
resistance_flags = FIRE_PROOF
@@ -813,8 +815,8 @@
desc = "Early prototype RIG hardsuit helmet, designed to quickly shift over a user's head. Design constraints of the helmet mean it has no inbuilt cameras, thus it restricts the users visability."
icon_state = "hardsuit0-ancient"
item_state = "anc_helm"
+ hardsuit_type = "ancient"
armor = list(MELEE = 30, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 75)
- item_color = "ancient"
resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/space/hardsuit/ancient
@@ -933,7 +935,7 @@
desc = "Standard issue hardsuit for playing capture the flag."
icon_state = "ctf-white"
item_state = null
- item_color = "ctf-white"
+ hardsuit_type = "ctf-white"
// Adding TRAIT_NODROP is done when the CTF spawner equips people
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf
armor = list(MELEE = 0, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 50, BIO = 100, RAD = 100, FIRE = 95, ACID = 95)
@@ -944,7 +946,7 @@
name = "red team armor"
icon_state = "ctf-red"
item_state = null
- item_color = "ert_security"
+ hardsuit_type = "ert_security"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf/red
shield_state = "shield-red"
shield_on = "shield-red"
@@ -962,7 +964,7 @@
desc = "Standard issue hardsuit helmet for playing capture the flag."
icon_state = "hardsuit0-ctf_white"
item_state = null
- item_color = "ert_medical"
+ hardsuit_type = "ert_medical"
armor = list(MELEE = 0, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 50, BIO = 100, RAD = 100, FIRE = 95, ACID = 95)
@@ -970,14 +972,14 @@
name = "red team helmet"
icon_state = "hardsuit0-ctf_red"
item_state = null
- item_color = "ert_security"
+ hardsuit_type = "ert_security"
/obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf/blue
name = "blue team helmet"
desc = "Standard issue hardsuit helmet for playing capture the flag."
icon_state = "hardsuit0-ctf_blue"
item_state = null
- item_color = "ert_commander"
+ hardsuit_type = "ert_commander"
@@ -990,7 +992,7 @@
desc = "An advanced hardsuit with built in energy shielding."
icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
- item_color = "syndi"
+ hardsuit_type = "syndi"
armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30)
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
@@ -1006,7 +1008,7 @@
desc = "An advanced hardsuit helmet with built in energy shielding."
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
- item_color = "syndi"
+ hardsuit_type = "syndi"
armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30)
///Deathsquad version
@@ -1044,7 +1046,7 @@
desc = "An advanced hardsuit favored by commandos for use in special operations."
icon_state = "deathsquad"
item_state = "swat_suit"
- item_color = "syndi"
+ hardsuit_type = "syndi"
max_charges = 4
current_charges = 4
recharge_delay = 15
@@ -1059,7 +1061,7 @@
desc = "A tactical helmet with built in energy shielding."
icon_state = "deathsquad"
item_state = "deathsquad"
- item_color = "syndi"
+ hardsuit_type = "syndi"
armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100)
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -1070,7 +1072,7 @@
desc = "A hilarious hardsuit favored by HONK squad troopers for use in special pranks."
icon_state = "hardsuit-clown"
item_state = "clown_hardsuit"
- item_color = "clown"
+ hardsuit_type = "clown"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/swat/honk
/obj/item/clothing/head/helmet/space/hardsuit/shielded/swat/honk
@@ -1078,7 +1080,7 @@
desc = "A hilarious helmet with built-in anti-mime propaganda shielding."
icon_state = "hardsuit0-clown"
item_state = "hardsuit0-clown"
- item_color = "clown"
+ hardsuit_type = "clown"
//POWERARMORS
//Currently are no different from normal hardsuits, except maybe for the higher armor ratings.
@@ -1088,8 +1090,8 @@
desc = "It's some barely-functional power armor helmet from a by-gone age."
icon_state = "hardsuit0-t45b"
item_state = "t45b_helm"
+ hardsuit_type = "t45b"
armor = list(MELEE = 50, BULLET = 48, LASER = 25, ENERGY = 25, BOMB = 48, BIO = 100, RAD = 50, FIRE = 50, ACID = 25)
- item_color = "t45b"
/obj/item/clothing/suit/space/hardsuit/powerarmor_t45b
name = "Salvaged T-45b power armor"
@@ -1098,15 +1100,15 @@
item_state = "t45b_hardsuit"
armor = list(MELEE = 50, BULLET = 48, LASER = 25, ENERGY = 25, BOMB = 48, BIO = 0, RAD = 0, FIRE = 0, ACID = 25)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/powerarmor_t45b
- item_color = "t45b"
+ hardsuit_type = "t45b"
/obj/item/clothing/head/helmet/space/hardsuit/powerarmor_advanced
name = "Advanced power helmet"
desc = "It's an advanced power armor Mk I helmet. It looks somewhat threatening."
icon_state = "hardsuit0-advpa1"
item_state = "advpa1_helm"
+ hardsuit_type = "advpa1"
armor = list(MELEE = 50, BULLET = 48, LASER = 25, ENERGY = 25, BOMB = 48, BIO = 0, RAD = 0, FIRE = 0, ACID = 25)
- item_color = "advpa1"
/obj/item/clothing/suit/space/hardsuit/powerarmor_advanced
name = "Advanced power armor"
@@ -1115,14 +1117,14 @@
item_state = "advpa1_hardsuit"
armor = list(MELEE = 50, BULLET = 48, LASER = 25, ENERGY = 25, BOMB = 48, BIO = 0, RAD = 0, FIRE = 0, ACID = 25)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/powerarmor_advanced
- item_color = "advancedpa1"
+ hardsuit_type = "advancedpa1"
/obj/item/clothing/head/helmet/space/hardsuit/syndi/debug // reused code so I dont have to make new procs
name = "debug hardsuit helmet"
desc = "A debug hardsuit helmet. It is in EVA mode."
alt_desc = "A debug hardsuit helmet. It is in combat mode."
icon_state = "hardsuit0-syndielite"
- item_color = "syndielite"
+ hardsuit_type = "syndielite"
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -1133,7 +1135,7 @@
desc = "A debug hardsuit. It is in travel mode."
alt_desc = "A debug hardsuit. It is in combat mode."
icon_state = "hardsuit0-syndielite"
- item_color = "syndielite"
+ hardsuit_type = "syndielite"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/debug
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 46d9d14f7ed1..0e978e4eb681 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -107,34 +107,51 @@ Contains:
//Space pirate outfit
/obj/item/clothing/head/helmet/space/pirate
- name = "pirate hat"
- desc = "Yarr."
+ name = "syndicate pirate hat"
+ desc = "Ahoy! A reinforced hat worn by space privateers who thrill in stealing fine booty."
icon_state = "pirate"
item_state = "pirate"
- armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75)
+ armor = list(MELEE = 30, BULLET = 50, LASER = 30, ENERGY = 25, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75)
flags_inv = HIDEHAIR
strip_delay = 40
equip_delay_other = 20
flags_cover = HEADCOVERSEYES
/obj/item/clothing/head/helmet/space/pirate/bandana
- name = "pirate bandana"
+ name = "syndicate pirate bandana"
+ desc = "Ahoy! Worn by typical maties who sail out to terrorize ships and stations alike. The bandana is reinforced."
icon_state = "bandana"
item_state = "bandana"
+/obj/item/clothing/head/helmet/space/pirate/captain
+ name = "syndicate pirate captain hat"
+ desc = "Ahoy! The pinnacle of terror of hardened Syndicate captains who lead violent crews to plunder and glory. Reinforced to keep your skull on your skeleton."
+ armor = list(MELEE = 40, BULLET = 60, LASER = 40, ENERGY = 25, BOMB = 50, BIO = 30, RAD = 30, FIRE = 100, ACID = 100, WOUND = 10)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ icon_state = "hgpiratecap"
+ item_state = "hgpiratecap"
+
/obj/item/clothing/suit/space/pirate
- name = "pirate coat"
- desc = "Yarr."
+ name = "syndicate pirate coat"
+ desc = "Argh! The standard armor of freelance forces contracted by the Syndicate to terrorize and disrupt commercial operations."
icon_state = "pirate"
item_state = "pirate"
w_class = WEIGHT_CLASS_NORMAL
flags_inv = 0
- allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum)
+ allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/melee/transforming/energy/sword/pirate, /obj/item/melee/cutlass, /obj/item/reagent_containers/food/drinks/bottle/rum)
slowdown = 0
- armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75)
+ armor = list(MELEE = 30, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75)
strip_delay = 40
equip_delay_other = 20
+/obj/item/clothing/suit/space/pirate/captain
+ name = "syndicate pirate captain coat"
+ desc = "Argh! Adorned with immeasurable protection, this coat serves the most fearsome Syndicate pirates in their neverending quest of loot."
+ armor = list(MELEE = 40, BULLET = 60, LASER = 40, ENERGY = 25, BOMB = 50, BIO = 30, RAD = 30, FIRE = 100, ACID = 100, WOUND = 10)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ icon_state = "hgpirate"
+ item_state = "hgpirate"
+
/obj/item/clothing/suit/space/paramedic
name = "medical space suit"
desc = "A suit that protects against low pressure environments. Has a big cross on the back."
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 48b456ae3dd8..444450905f98 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -161,7 +161,7 @@
/obj/item/clothing/suit/armor/pathfinder
name = "pathfinder cloak"
desc = "A thick cloak woven from sinew and hides meant to protect its wearer from hazardous weather."
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
icon_state = "pathcloak"
item_state = "pathcloak"
armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 50, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 15)
@@ -331,7 +331,7 @@
name = "goliath cloak"
icon_state = "goliath_cloak"
desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits."
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
resistance_flags = FIRE_PROOF
hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
@@ -367,7 +367,7 @@
name = "drake armour"
icon_state = "dragon"
desc = "A suit of armour fashioned from the remains of an ash drake."
- 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, /obj/item/twohanded/spear)
+ 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, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
armor = list(MELEE = 70, BULLET = 30, LASER = 50, ENERGY = 40, BOMB = 70, BIO = 60, RAD = 50, FIRE = 100, ACID = 100)
hoodtype = /obj/item/clothing/head/hooded/cloakhood/drake
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index e8e8b09a6bd9..1fb1ba641237 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -1,7 +1,6 @@
/obj/item/clothing/suit/toggle/labcoat
name = "labcoat"
desc = "A suit that protects against minor chemical spills."
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi' //yogs - labcoat sprite tweaks
icon_state = "labcoat"
item_state = "labcoat"
blood_overlay_type = "coat"
@@ -26,14 +25,12 @@
/obj/item/clothing/suit/toggle/labcoat/emt
name = "\improper EMT's jacket"
desc = "A dark blue jacket with reflective strips for emergency medical technicians."
- alternate_worn_icon = 'icons/mob/suit.dmi' //yogs - subtype of labcoat, retains worn sprite
icon_state = "labcoat_emt"
item_state = "labcoat_cmo"
/obj/item/clothing/suit/toggle/labcoat/emt/green
name = "\improper green EMT's jacket"
desc = "A green jacket with reflective strips for emergency medical technicians."
- alternate_worn_icon = 'icons/mob/suit.dmi' //yogs - subtype of labcoat, retains worn sprite
icon_state = "labcoat_emtgr"
item_state = "labcoat_cmo"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 22345cb8829e..51fa084733ad 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -51,14 +51,14 @@
/obj/item/clothing/suit/pirate
name = "pirate coat"
- desc = "Yarr."
+ desc = "Arrrgh! A bulky coat worn by the terrors of the seas."
icon_state = "pirate"
item_state = "pirate"
- allowed = list(/obj/item/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum)
+ allowed = list(/obj/item/melee/transforming/energy/sword/pirate, /obj/item/melee/cutlass, /obj/item/reagent_containers/food/drinks/bottle/rum, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
/obj/item/clothing/suit/pirate/captain
name = "pirate captain coat"
- desc = "Yarr."
+ desc = "Arrrgh! This treacherous garb of a seaworthy captain instills great fear in those who gaze upon it."
icon_state = "hgpirate"
item_state = "hgpirate"
@@ -561,6 +561,20 @@
/obj/item/clothing/head/hooded/winterhood/captain
icon_state = "winterhood_captain"
+/obj/item/clothing/suit/hooded/wintercoat/hop
+ name = "head of personnel's winter coat"
+ desc = "A cozy winter coat, covered in thick fur. The breast features a proud yellow chevron, reminding everyone that you're the second banana."
+ icon_state = "coathop"
+ item_state = "coathop"
+ armor = list(MELEE = 10, BULLET = 15, LASER = 15, ENERGY = 25, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 35)
+ allowed = list(
+ /obj/item/melee/classic_baton,
+ )
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/hop
+
+/obj/item/clothing/head/hooded/winterhood/hop
+ icon_state = "winterhood_hop"
+
/obj/item/clothing/suit/hooded/wintercoat/security
name = "security winter coat"
icon_state = "coatsecurity"
@@ -575,6 +589,19 @@
/obj/item/clothing/head/hooded/winterhood/security
icon_state = "winterhood_security"
+/obj/item/clothing/suit/hooded/wintercoat/security/hos
+ name = "head of security's winter coat"
+ desc = "A red, armour-padded winter coat, lovingly woven with a Kevlar interweave and reinforced with semi-ablative polymers and a silver azide fill material. The zipper tab looks like a tiny replica of Beepsky."
+ icon_state = "coathos"
+ item_state = "coathos"
+ armor = list(MELEE = 35, BULLET = 25, LASER = 40, ENERGY = 20, BOMB = 35, BIO = 0, RAD = 0, FIRE = 0, ACID = 55)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/security/hos
+
+/obj/item/clothing/head/hooded/winterhood/security/hos
+ desc = "A red, armour-padded winter hood, lovingly woven with a Kevlar interweave. Definitely not bulletproof, especially not the part where your face goes."
+ icon_state = "winterhood_hos"
+ armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 5, BIO = 0, RAD = 0, FIRE = 0, ACID = 55)
+
/obj/item/clothing/suit/hooded/wintercoat/medical
name = "medical winter coat"
icon_state = "coatmedical"
@@ -586,6 +613,25 @@
/obj/item/clothing/head/hooded/winterhood/medical
icon_state = "winterhood_medical"
+/obj/item/clothing/suit/hooded/wintercoat/medical/cmo
+ name = "chief medical officer's winter coat"
+ desc = "A winter coat in a vibrant shade of blue with a small silver caduceus instead of a plastic zipper tab. The normal liner is replaced with an exceptionally thick, soft layer of fur."
+ icon_state = "coatcmo"
+ item_state = "coatcmo"
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 20, ACID = 30)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/medical/cmo
+
+/obj/item/clothing/suit/hooded/wintercoat/medical/cmo/Initialize(mapload)
+ . = ..()
+ allowed += list(
+ /obj/item/melee/classic_baton,
+ )
+
+/obj/item/clothing/head/hooded/winterhood/medical/cmo
+ desc = "A blue winter coat hood."
+ icon_state = "winterhood_cmo"
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 20, ACID = 30)
+
/obj/item/clothing/suit/hooded/wintercoat/science
name = "science winter coat"
icon_state = "coatscience"
@@ -597,6 +643,25 @@
/obj/item/clothing/head/hooded/winterhood/science
icon_state = "winterhood_science"
+/obj/item/clothing/suit/hooded/wintercoat/science/rd
+ name = "research director's advanced thermal insulator"
+ desc = "A thick arctic winter coat with an outdated atomic model instead of a plastic zipper tab. Most in the know are heavily aware that Bohr's model of the atom was outdated by the time of the 1930s when the Heisenbergian and Schrodinger models were generally accepted for true. Nevertheless, we still see its use in anachronism, roleplaying, and, in this case, as a zipper tab. At least it should keep you warm on your ivory pillar."
+ icon_state = "coatrd"
+ item_state = "coatrd"
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 20, BIO = 0, RAD = 0, FIRE = 30, ACID = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/science/rd
+
+/obj/item/clothing/suit/hooded/wintercoat/science/rd/Initialize(mapload)
+ . = ..()
+ allowed += list(
+ /obj/item/melee/classic_baton,
+ )
+
+/obj/item/clothing/head/hooded/winterhood/science/rd
+ desc = "A white winter coat hood. It smells faintly of hair gel."
+ icon_state = "winterhood_rd"
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 20, BIO = 0, RAD = 0, FIRE = 30, ACID = 0)
+
/obj/item/clothing/suit/hooded/wintercoat/engineering
name = "engineering winter coat"
icon_state = "coatengineer"
@@ -607,6 +672,26 @@
/obj/item/clothing/head/hooded/winterhood/engineering
icon_state = "winterhood_engineer"
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 20, ACID = 10)
+
+/obj/item/clothing/suit/hooded/wintercoat/engineering/ce
+ name = "chief engineer's winter coat"
+ desc = "A white winter coat with reflective green and yellow stripes made for the truly insane. Stuffed with asbestos, treated with fire retardant PBDE, lined with a micro thin sheet of lead foil and snugly fitted to your body's measurements. This baby's ready to save you from anything except the thyroid cancer and systemic fibrosis you'll get from wearing it. The zipper tab is a tiny golden wrench."
+ icon_state = "coatce"
+ item_state = "coatce"
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 30, FIRE = 40, ACID = 10)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/ce
+
+/obj/item/clothing/suit/hooded/wintercoat/engineering/ce/Initialize(mapload)
+ . = ..()
+ allowed += list(
+ /obj/item/melee/classic_baton,
+ )
+
+/obj/item/clothing/head/hooded/winterhood/engineering/ce
+ desc = "A white winter coat hood. Feels surprisingly heavy. The tag says that it's not child safe."
+ icon_state = "winterhood_ce"
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 15, FIRE = 30, ACID = 10)
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos
name = "atmospherics winter coat"
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index fab3abb651e1..55d79f0841c4 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -20,7 +20,6 @@
var/mutable_appearance/accessory_overlay
var/mutantrace_variation = NO_MUTANTRACE_VARIATION //Are there special sprites for specific situations? Don't use this unless you need to.
var/freshly_laundered = FALSE
- var/dodgy_colours = FALSE
tearable = TRUE //all jumpsuits can be torn down and used for cloth in an emergency | yogs
/obj/item/clothing/under/worn_overlays(isinhands = FALSE)
@@ -137,10 +136,8 @@
if(user && notifyAttach)
to_chat(user, span_notice("You attach [I] to [src]."))
- var/accessory_color = attached_accessory.item_color
- if(!accessory_color)
- accessory_color = attached_accessory.icon_state
- accessory_overlay = mutable_appearance('icons/mob/accessories.dmi', "[accessory_color]")
+ var/accessory_color = attached_accessory.icon_state
+ accessory_overlay = mutable_appearance(attached_accessory.mob_overlay_icon, "[accessory_color]")
accessory_overlay.alpha = attached_accessory.alpha
accessory_overlay.color = attached_accessory.color
@@ -178,8 +175,6 @@
/obj/item/clothing/under/examine(mob/user)
. = ..()
- if(dodgy_colours)
- . += "The colours are a bit dodgy."
if(freshly_laundered)
. += "It looks fresh and clean."
if(can_adjust)
@@ -201,3 +196,6 @@
. += "Its vital tracker and tracking beacon appear to be enabled."
if(attached_accessory)
. += "\A [attached_accessory] is attached to it."
+
+/obj/item/clothing/under/rank
+ dying_key = DYE_REGISTRY_UNDER
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 01057516b5ea..9446af1c47b9 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/clothing/accessories.dmi'
icon_state = "plasma"
item_state = "" //no inhands
- item_color = "plasma" //On accessories, this controls the worn sprite. That's a bit weird.
+ mob_overlay_icon = 'icons/mob/clothing/accessories.dmi'
slot_flags = 0
w_class = WEIGHT_CLASS_SMALL
var/above_suit = FALSE
@@ -91,7 +91,6 @@
desc = "For some classy, murderous fun."
icon_state = "waistcoat"
item_state = "waistcoat"
- item_color = "waistcoat"
minimize_when_attached = FALSE
attachment_slot = null
@@ -100,10 +99,10 @@
desc = "The best part of a maid costume."
icon_state = "maidapron"
item_state = "maidapron"
- item_color = "maidapron"
minimize_when_attached = FALSE
attachment_slot = null
+
//////////
//Medals//
//////////
@@ -112,7 +111,6 @@
name = "bronze medal"
desc = "A bronze medal."
icon_state = "bronze"
- item_color = "bronze"
materials = list(/datum/material/iron=1000)
resistance_flags = FIRE_PROOF
var/medaltype = "medal" //Sprite used for medalbox
@@ -173,7 +171,6 @@
name = "ribbon"
desc = "A ribbon"
icon_state = "cargo"
- item_color = "cargo"
/obj/item/clothing/accessory/medal/ribbon/cargo
name = "\"cargo tech of the shift\" award"
@@ -183,7 +180,6 @@
name = "silver medal"
desc = "A silver medal."
icon_state = "silver"
- item_color = "silver"
medaltype = "medal-silver"
materials = list(/datum/material/silver=1000)
@@ -211,7 +207,6 @@
name = "gold medal"
desc = "A prestigious golden medal."
icon_state = "gold"
- item_color = "gold"
medaltype = "medal-gold"
materials = list(/datum/material/gold=1000)
@@ -228,7 +223,6 @@
name = "plasma medal"
desc = "An eccentric medal made of plasma."
icon_state = "plasma"
- item_color = "plasma"
medaltype = "medal-plasma"
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = -10, ACID = 0) //It's made of plasma. Of course it's flammable.
materials = list(/datum/material/plasma=1000)
@@ -243,6 +237,7 @@
name = "nobel sciences award"
desc = "A plasma medal which represents significant contributions to the field of science or robotics."
+
////////////
//Armbands//
////////////
@@ -251,7 +246,6 @@
name = "red armband"
desc = "An fancy red armband!"
icon_state = "redband"
- item_color = "redband"
attachment_slot = null
above_suit = TRUE
above_suit_adjustable = TRUE
@@ -264,43 +258,37 @@
name = "cargo bay guard armband"
desc = "An armband, worn by engineers and security members to display which department they're assigned to. This one is brown."
icon_state = "cargoband"
- item_color = "cargoband"
/obj/item/clothing/accessory/armband/engine
name = "engineering guard armband"
desc = "An armband, worn by security members to display which department they're assigned to. This one is orange with a reflective strip!"
icon_state = "engieband"
- item_color = "engieband"
/obj/item/clothing/accessory/armband/science
name = "science guard armband"
desc = "An armband, worn by engineers and security members to display which department they're assigned to. This one is purple."
icon_state = "rndband"
- item_color = "rndband"
/obj/item/clothing/accessory/armband/service
name = "service guard armband"
desc = "An armband, worn by engineers and security members to display which department they're assigned to. This one is green."
icon_state = "serviceband"
- item_color = "serviceband"
/obj/item/clothing/accessory/armband/hydro
name = "hydroponics guard armband"
desc = "An armband, worn by engineers and security members to display which department they're assigned to. This one is green and blue."
icon_state = "hydroband"
- item_color = "hydroband"
/obj/item/clothing/accessory/armband/med
name = "medical guard armband"
desc = "An armband, worn by engineers and security members to display which department they're assigned to. This one is white."
icon_state = "medband"
- item_color = "medband"
/obj/item/clothing/accessory/armband/medblue
name = "medical guard armband"
desc = "An armband, worn by engineers and security members to display which department they're assigned to. This one is white and blue."
icon_state = "medblueband"
- item_color = "medblueband"
+
//////////////
//OBJECTION!//
@@ -310,7 +298,6 @@
name = "attorney's badge"
desc = "Fills you with the conviction of JUSTICE. Lawyers tend to want to show it to everyone they meet."
icon_state = "lawyerbadge"
- item_color = "lawyerbadge"
/obj/item/clothing/accessory/lawyers_badge/attack_self(mob/user)
if(prob(1))
@@ -327,14 +314,15 @@
if(L)
L.bubble_icon = initial(L.bubble_icon)
+
////////////////
//HA HA! NERD!//
////////////////
+
/obj/item/clothing/accessory/pocketprotector
name = "pocket protector"
desc = "Can protect your clothing from ink stains, but you'll look like a nerd if you're using one."
icon_state = "pocketprotector"
- item_color = "pocketprotector"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/pocketprotector
/obj/item/clothing/accessory/pocketprotector/full/Initialize()
@@ -348,6 +336,7 @@
for(var/i in 1 to 3)
new /obj/item/lipstick/random(src)
+
////////////////
//OONGA BOONGA//
////////////////
@@ -356,7 +345,6 @@
name = "bone talisman"
desc = "A hunter's talisman, some say the old gods smile on those who wear it."
icon_state = "talisman"
- item_color = "talisman"
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25)
attachment_slot = null
above_suit = TRUE
@@ -366,7 +354,6 @@
name = "skull codpiece"
desc = "A skull shaped ornament, intended to protect the important things in life."
icon_state = "skull"
- item_color = "skull"
above_suit = TRUE
above_suit_adjustable = TRUE
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25)
@@ -376,7 +363,6 @@
name = "Sinew Skirt"
desc = "For the last time. IT'S A KILT not a skirt."
icon_state = "skilt"
- item_color = "skilt"
above_suit_adjustable = TRUE
minimize_when_attached = FALSE
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25)
@@ -386,13 +372,13 @@
name = "resin armband"
desc = "A smooth amber colored armband made of solid resin, generally worn by tribal aristocracy."
icon_state = "resinband"
- item_color = "resinband"
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25)
attachment_slot = null
above_suit = TRUE
above_suit_adjustable = TRUE
+
/////////////
//Poppy Pin//
/////////////
@@ -401,7 +387,6 @@
name = "Poppy pins"
desc = "A poppy pin that is meant to commemorate the fallen soldiers in wars. It symbolizes the gunshot that killed the soldiers."
icon_state = "poppy"
- item_color = "poppy"
//////////////
@@ -412,7 +397,6 @@
name = "singularity shard necklace"
desc = "The gem mounted inside seems to glow with an unearthly, pulsing light. It is bitter cold to the touch."
icon_state = "sing_necklace"
- item_color = "sing_necklace"
above_suit = TRUE
above_suit_adjustable = TRUE
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = -5, FIRE = 0, ACID = 0) //It IS radioactive after all. Watch me get yelled at for powergaming because I'm making this my """donator""" item - Mqiib
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 481a9b15513b..6222b76adf91 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -1,5 +1,6 @@
/obj/item/clothing/under/color
desc = "A standard issue colored jumpsuit. Variety is the spice of life!"
+ dying_key = DYE_REGISTRY_UNDER
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/under/skirt/color
@@ -37,14 +38,12 @@
name = "black jumpsuit"
icon_state = "black"
item_state = "bl_suit"
- item_color = "black"
resistance_flags = NONE
/obj/item/clothing/under/skirt/color/black
name = "black jumpskirt"
icon_state = "black_skirt"
item_state = "bl_suit"
- item_color = "black_skirt"
/obj/item/clothing/under/color/black/ghost
item_flags = DROPDEL
@@ -58,14 +57,12 @@
desc = "A tasteful grey jumpsuit that reminds you of the good old days."
icon_state = "grey"
item_state = "gy_suit"
- item_color = "grey"
/obj/item/clothing/under/skirt/color/grey
name = "grey jumpskirt"
desc = "A tasteful grey jumpskirt that reminds you of the good old days."
icon_state = "grey_skirt"
item_state = "gy_suit"
- item_color = "grey_skirt"
/obj/item/clothing/under/color/grey/glorf
name = "ancient jumpsuit"
@@ -79,177 +76,148 @@
name = "blue jumpsuit"
icon_state = "blue"
item_state = "b_suit"
- item_color = "blue"
/obj/item/clothing/under/skirt/color/blue
name = "blue jumpskirt"
icon_state = "blue_skirt"
item_state = "b_suit"
- item_color = "blue_skirt"
/obj/item/clothing/under/color/green
name = "green jumpsuit"
icon_state = "green"
item_state = "g_suit"
- item_color = "green"
/obj/item/clothing/under/skirt/color/green
name = "green jumpskirt"
icon_state = "green_skirt"
item_state = "g_suit"
- item_color = "green_skirt"
/obj/item/clothing/under/color/orange
name = "orange jumpsuit"
desc = "Don't wear this near paranoid security officers."
icon_state = "orange"
item_state = "o_suit"
- item_color = "orange"
/obj/item/clothing/under/skirt/color/orange
name = "orange jumpskirt"
icon_state = "orange_skirt"
item_state = "o_suit"
- item_color = "orange_skirt"
/obj/item/clothing/under/color/pink
name = "pink jumpsuit"
icon_state = "pink"
desc = "Just looking at this makes you feel fabulous."
item_state = "p_suit"
- item_color = "pink"
/obj/item/clothing/under/skirt/color/pink
name = "pink jumpskirt"
icon_state = "pink_skirt"
item_state = "p_suit"
- item_color = "pink_skirt"
/obj/item/clothing/under/color/red
name = "red jumpsuit"
icon_state = "red"
item_state = "r_suit"
- item_color = "red"
/obj/item/clothing/under/skirt/color/red
name = "red jumpskirt"
icon_state = "red_skirt"
item_state = "r_suit"
- item_color = "red_skirt"
/obj/item/clothing/under/color/white
name = "white jumpsuit"
icon_state = "white"
item_state = "w_suit"
- item_color = "white"
/obj/item/clothing/under/skirt/color/white
name = "white jumpskirt"
icon_state = "white_skirt"
item_state = "w_suit"
- item_color = "white_skirt"
/obj/item/clothing/under/color/yellow
name = "yellow jumpsuit"
icon_state = "yellow"
item_state = "y_suit"
- item_color = "yellow"
/obj/item/clothing/under/skirt/color/yellow
name = "yellow jumpskirt"
icon_state = "yellow_skirt"
item_state = "y_suit"
- item_color = "yellow_skirt"
/obj/item/clothing/under/color/darkblue
name = "darkblue jumpsuit"
icon_state = "darkblue"
item_state = "b_suit"
- item_color = "darkblue"
/obj/item/clothing/under/skirt/color/darkblue
name = "darkblue jumpskirt"
icon_state = "darkblue_skirt"
item_state = "b_suit"
- item_color = "darkblue_skirt"
/obj/item/clothing/under/color/teal
name = "teal jumpsuit"
icon_state = "teal"
item_state = "b_suit"
- item_color = "teal"
/obj/item/clothing/under/skirt/color/teal
name = "teal jumpskirt"
icon_state = "teal_skirt"
item_state = "b_suit"
- item_color = "teal_skirt"
/obj/item/clothing/under/color/lightpurple
name = "purple jumpsuit"
icon_state = "lightpurple"
item_state = "p_suit"
- item_color = "lightpurple"
/obj/item/clothing/under/skirt/color/lightpurple
name = "lightpurple jumpskirt"
icon_state = "lightpurple_skirt"
item_state = "p_suit"
- item_color = "lightpurple_skirt"
/obj/item/clothing/under/color/darkgreen
name = "darkgreen jumpsuit"
icon_state = "darkgreen"
item_state = "g_suit"
- item_color = "darkgreen"
/obj/item/clothing/under/skirt/color/darkgreen
name = "darkgreen jumpskirt"
icon_state = "darkgreen_skirt"
item_state = "g_suit"
- item_color = "darkgreen_skirt"
/obj/item/clothing/under/color/lightbrown
name = "lightbrown jumpsuit"
icon_state = "lightbrown"
item_state = "lb_suit"
- item_color = "lightbrown"
/obj/item/clothing/under/skirt/color/lightbrown
name = "lightbrown jumpskirt"
icon_state = "lightbrown_skirt"
item_state = "lb_suit"
- item_color = "lightbrown_skirt"
/obj/item/clothing/under/color/brown
name = "brown jumpsuit"
icon_state = "brown"
item_state = "lb_suit"
- item_color = "brown"
/obj/item/clothing/under/skirt/color/brown
name = "brown jumpskirt"
icon_state = "brown_skirt"
item_state = "lb_suit"
- item_color = "brown_skirt"
/obj/item/clothing/under/color/maroon
name = "maroon jumpsuit"
icon_state = "maroon"
item_state = "r_suit"
- item_color = "maroon"
/obj/item/clothing/under/skirt/color/maroon
name = "maroon jumpskirt"
icon_state = "maroon_skirt"
item_state = "r_suit"
- item_color = "maroon_skirt"
/obj/item/clothing/under/color/rainbow
name = "rainbow jumpsuit"
desc = "A multi-colored jumpsuit!"
icon_state = "rainbow"
item_state = "rainbow"
- item_color = "rainbow"
can_adjust = FALSE
diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
index 68d49875632a..f21dee003f5d 100644
--- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
+++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
@@ -3,21 +3,18 @@
desc = "A joint envirosuit used by plasmamen cargo techs, due to the logistical problems of differenciating the two with the length of their pant legs."
icon_state = "cargo_envirosuit"
item_state = "cargo_envirosuit"
- item_color = "cargo_envirosuit"
/obj/item/clothing/under/plasmaman/qm
name = "quartermaster's envirosuit"
desc = "A joint envirosuit used by plasmamen quartermasters due to the logistical problems of differenciating the two with the length of their pant legs."
icon_state = "qm_envirosuit"
item_state = "qm_envirosuit"
- item_color = "qm_envirosuit"
/obj/item/clothing/under/plasmaman/mining
name = "mining envirosuit"
desc = "An air-tight grey suit designed for operations on lavaland by plasmamen."
icon_state = "explorer_envirosuit"
item_state = "explorer_envirosuit"
- item_color = "explorer_envirosuit"
/obj/item/clothing/under/plasmaman/chef
@@ -25,42 +22,36 @@
desc = "A white plasmaman envirosuit designed for cullinary practices. One might question why a member of a species that doesn't need to eat would become a chef."
icon_state = "chef_envirosuit"
item_state = "chef_envirosuit"
- item_color = "chef_envirosuit"
/obj/item/clothing/under/plasmaman/enviroslacks
name = "enviroslacks"
desc = "The pet project of a particularly posh plasmaman, this custom suit was quickly appropriated by Nano-Trasen for it's detectives, lawyers, and bar-tenders alike."
icon_state = "enviroslacks"
item_state = "enviroslacks"
- item_color = "enviroslacks"
/obj/item/clothing/under/plasmaman/chaplain
name = "chaplain's envirosuit"
desc = "An envirosuit specially designed for only the most pious of plasmamen."
icon_state = "chap_envirosuit"
item_state = "chap_envirosuit"
- item_color = "chap_envirosuit"
/obj/item/clothing/under/plasmaman/curator
name = "prototype envirosuit"
desc = "Made out of a modified voidsuit, this suit was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Due to the modifications, the suit is no longer space-worthy. Despite their limitations, these suits are still in used by historian and old-styled plasmamen alike."
icon_state = "plasmaman_OLD"
item_state = "plasmaman_OLD"
- item_color = "plasmaman_OLD"
/obj/item/clothing/under/plasmaman/janitor
name = "janitorial envirosuit"
desc = "A purple envirosuit designated for plasmamen janitors."
icon_state = "janitor_envirosuit"
item_state = "janitor_envirosuit"
- item_color = "janitor_envirosuit"
/obj/item/clothing/under/plasmaman/botany
name = "botanical envirosuit"
desc = "A green envirosuit designed to protect plasmamen from minor plant-related injuries."
icon_state = "botany_envirosuit"
item_state = "botany_envirosuit"
- item_color = "botany_envirosuit"
/obj/item/clothing/under/plasmaman/mime
@@ -68,14 +59,12 @@
desc = "It's not very colourful."
icon_state = "mime_envirosuit"
item_state = "mime_envirosuit"
- item_color = "mime_envirosuit"
/obj/item/clothing/under/plasmaman/clown
name = "clown's envirosuit"
desc = "'HONK!'"
icon_state = "clown_envirosuit"
item_state = "clown_envirosuit"
- item_color = "clown_envirosuit"
/obj/item/clothing/under/plasmaman/clown/Extinguish(mob/living/carbon/human/H)
if(!istype(H))
@@ -90,4 +79,4 @@
H.visible_message(span_warning("[H]'s suit spews out a tonne of space lube!"),span_warning("Your suit spews out a tonne of space lube!"))
H.ExtinguishMob()
new /obj/effect/particle_effect/foam(loc) //Truely terrifying.
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm
index 7fccfb17772a..6d18682507dd 100644
--- a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm
+++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm
@@ -3,7 +3,6 @@
desc = "An air-tight suit given to plasmamen insane enough to achieve the rank of \"Chief Engineer\". It protects the user from fire and acid damage."
icon_state = "ce_envirosuit"
item_state = "ce_envirosuit"
- item_color = "ce_envirosuit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 95, "acid" = 95)
/obj/item/clothing/under/plasmaman/engineering
@@ -11,7 +10,6 @@
desc = "An air-tight suit designed to be used by plasmamen employed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage."
icon_state = "engineer_envirosuit"
item_state = "engineer_envirosuit"
- item_color = "engineer_envirosuit"
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 95, ACID = 95)
/obj/item/clothing/under/plasmaman/atmospherics
@@ -19,5 +17,4 @@
desc = "An air-tight suit designed to be used by plasmamen exployed as atmos technicians, the usual purple stripes being replaced by atmos's blue."
icon_state = "atmos_envirosuit"
item_state = "atmos_envirosuit"
- item_color = "atmos_envirosuit"
diff --git a/code/modules/clothing/under/jobs/Plasmaman/medsci.dm b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm
index 3058e7e1fc57..9f3c257482ee 100644
--- a/code/modules/clothing/under/jobs/Plasmaman/medsci.dm
+++ b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm
@@ -3,7 +3,6 @@
desc = "A plasmaman envirosuit worn by those with the know-how to achieve the position of \"Research Director\"."
icon_state = "rd_envirosuit"
item_state = "rd_envirosuit"
- item_color = "rd_envirosuit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 35)
/obj/item/clothing/under/plasmaman/medical
@@ -11,39 +10,33 @@
desc = "A suit designed for the station's more plasma-based doctors."
icon_state = "doctor_envirosuit"
item_state = "doctor_envirosuit"
- item_color = "doctor_envirosuit"
/obj/item/clothing/under/plasmaman/science
name = "scientific envirosuit"
desc = "A plasmaman envirosuit designed for scientists."
icon_state = "scientist_envirosuit"
item_state = "scientist_envirosuit"
- item_color = "scientist_envirosuit"
/obj/item/clothing/under/plasmaman/robotics
name = "robotics envirosuit"
desc = "A plasmaman envirosuit designed for roboticists."
icon_state = "roboticist_envirosuit"
item_state = "roboticist_envirosuit"
- item_color = "roboticist_envirosuit"
/obj/item/clothing/under/plasmaman/viro
name = "virology envirosuit"
desc = "The suit worn by the safest people on the station, those who are almost completely immune to the monstrosities they create."
icon_state = "virologist_envirosuit"
item_state = "virologist_envirosuit"
- item_color = "virologist_envirosuit"
/obj/item/clothing/under/plasmaman/genetics
name = "genetics envirosuit"
desc = "A plasmaman envirosuit designed for geneticists."
icon_state = "geneticist_envirosuit"
item_state = "geneticist_envirosuit"
- item_color = "geneticist_envirosuit"
/obj/item/clothing/under/plasmaman/chemist
name = "chemistry envirosuit"
desc = "A plasmaman envirosuit designed for chemists."
icon_state = "chemist_envirosuit"
item_state = "chemist_envirosuit"
- item_color = "chemist_envirosuit"
diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm
index 070a30e3c5b1..848084c55679 100644
--- a/code/modules/clothing/under/jobs/Plasmaman/security.dm
+++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm
@@ -3,7 +3,6 @@
desc = "A plasmaman containment suit designed for security officers, offering a limited amount of protection."
icon_state = "deathcurity_envirosuit"
item_state = "deathcurity_envirosuit"
- item_color = "deathcurity_envirosuit"
armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95)
/obj/item/clothing/under/plasmaman/security/warden
@@ -11,4 +10,3 @@
desc = "A plasmaman containment suit designed for the warden, white stripes being added to differeciate them from other members of security."
icon_state = "warden_envirosuit"
item_state = "warden_envirosuit"
- item_color = "warden_envirosuit"
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index 7ff11cf15cbd..ac1ba98b267e 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -5,7 +5,6 @@
name = "bartender's uniform"
icon_state = "barman"
item_state = "bar_suit"
- item_color = "barman"
alt_covers_chest = TRUE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -14,7 +13,6 @@
name = "purple bartender's uniform"
icon_state = "purplebartender"
item_state = "purplebartender"
- item_color = "purplebartender"
can_adjust = FALSE
/obj/item/clothing/under/rank/bartender/skirt
@@ -22,7 +20,6 @@
desc = "It looks like it could use some more flair."
icon_state = "barman_skirt"
item_state = "bar_suit"
- item_color = "barman_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -33,7 +30,6 @@
name = "captain's jumpsuit"
icon_state = "captain"
item_state = "b_suit"
- item_color = "captain"
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 15)
@@ -44,7 +40,6 @@
desc = "It's a blue jumpskirt with some gold markings denoting the rank of \"Captain\"."
icon_state = "captain_skirt"
item_state = "b_suit"
- item_color = "captain_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -55,7 +50,6 @@
desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
icon_state = "qm"
item_state = "lb_suit"
- item_color = "qm"
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/under/rank/cargo/skirt
@@ -63,7 +57,6 @@
desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
icon_state = "qm_skirt"
item_state = "lb_suit"
- item_color = "qm_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -74,7 +67,6 @@
desc = "Shooooorts! They're comfy and easy to wear!"
icon_state = "cargotech"
item_state = "lb_suit"
- item_color = "cargo"
body_parts_covered = CHEST|GROIN|ARMS
mutantrace_variation = MUTANTRACE_VARIATION
alt_covers_chest = TRUE
@@ -85,7 +77,6 @@
desc = "Skiiiiirts! They're comfy and easy to wear!"
icon_state = "cargo_skirt"
item_state = "lb_suit"
- item_color = "cargo_skirt"
body_parts_covered = CHEST|GROIN|ARMS
mutantrace_variation = NO_MUTANTRACE_VARIATION
can_adjust = FALSE
@@ -97,7 +88,6 @@
name = "chaplain's jumpsuit"
icon_state = "chaplain"
item_state = "bl_suit"
- item_color = "chapblack"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -106,7 +96,6 @@
desc = "It's a black jumpskirt, often worn by religious folk."
icon_state = "chapblack_skirt"
item_state = "bl_suit"
- item_color = "chapblack_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -116,7 +105,6 @@
name = "cook's suit"
desc = "A suit which is given only to the most hardcore cooks in space."
icon_state = "chef"
- item_color = "chef"
alt_covers_chest = TRUE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -124,7 +112,6 @@
name = "cook's skirt"
desc = "A skirt which is given only to the most hardcore cooks in space."
icon_state = "chef_skirt"
- item_color = "chef_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -134,7 +121,6 @@
desc = "'HONK!'"
icon_state = "clown"
item_state = "clown"
- item_color = "clown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -144,7 +130,6 @@
desc = "'BLUE HONK!'"
icon_state = "blueclown"
item_state = "blueclown"
- item_color = "blueclown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -154,7 +139,6 @@
desc = "'GREEN HONK!'"
icon_state = "greenclown"
item_state = "greenclown"
- item_color = "greenclown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -164,7 +148,6 @@
desc = "'YELLOW HONK!'"
icon_state = "yellowclown"
item_state = "yellowclown"
- item_color = "yellowclown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -174,7 +157,6 @@
desc = "'PURPLE HONK!'"
icon_state = "purpleclown"
item_state = "purpleclown"
- item_color = "purpleclown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -184,7 +166,6 @@
desc = "'ORANGE HONK!'"
icon_state = "orangeclown"
item_state = "orangeclown"
- item_color = "orangeclown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -194,7 +175,6 @@
desc = "'R A I N B O W HONK!'"
icon_state = "rainbowclown"
item_state = "rainbowclown"
- item_color = "rainbowclown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -208,7 +188,6 @@
name = "head of personnel's jumpsuit"
icon_state = "hop"
item_state = "b_suit"
- item_color = "hop"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -217,7 +196,6 @@
desc = "It's a jumpskirt worn by someone who works in the position of \"Head of Personnel\"."
icon_state = "hop_skirt"
item_state = "b_suit"
- item_color = "hop_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -228,7 +206,6 @@
name = "botanist's jumpsuit"
icon_state = "hydroponics"
item_state = "g_suit"
- item_color = "hydroponics"
permeability_coefficient = 0.5
mutantrace_variation = MUTANTRACE_VARIATION
@@ -237,7 +214,6 @@
desc = "It's a jumpskirt designed to protect against minor plant-related hazards."
icon_state = "hydroponics_skirt"
item_state = "g_suit"
- item_color = "hydroponics_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -247,7 +223,6 @@
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
name = "janitor's jumpsuit"
icon_state = "janitor"
- item_color = "janitor"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0)
mutantrace_variation = MUTANTRACE_VARIATION
@@ -255,7 +230,6 @@
name = "janitor's jumpskirt"
desc = "It's the official skirt of the station's janitor. It has minor protection from biohazards."
icon_state = "janitor_skirt"
- item_color = "janitor_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -269,48 +243,41 @@
/obj/item/clothing/under/lawyer/black
icon_state = "lawyer_black"
item_state = "lawyer_black"
- item_color = "lawyer_black"
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/under/lawyer/black/skirt
name = "Lawyer black suitskirt"
icon_state = "lawyer_black_skirt"
item_state = "lawyer_black"
- item_color = "lawyer_black_skirt"
fitted = FEMALE_UNIFORM_TOP
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/lawyer/female
icon_state = "black_suit_fem"
item_state = "black_suit_fem"
- item_color = "black_suit_fem"
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/under/lawyer/red
icon_state = "lawyer_red"
item_state = "lawyer_red"
- item_color = "lawyer_red"
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/under/lawyer/red/skirt
name = "Lawyer red suitskirt"
icon_state = "lawyer_red_skirt"
item_state = "lawyer_red"
- item_color = "lawyer_red_skirt"
fitted = FEMALE_UNIFORM_TOP
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/lawyer/blue
icon_state = "lawyer_blue"
item_state = "lawyer_blue"
- item_color = "lawyer_blue"
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/under/lawyer/blue/skirt
name = "Lawyer blue suitskirt"
icon_state = "lawyer_blue_skirt"
item_state = "lawyer_blue"
- item_color = "lawyer_blue_skirt"
fitted = FEMALE_UNIFORM_TOP
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -319,7 +286,6 @@
desc = "A classy suit and tie."
icon_state = "bluesuit"
item_state = "bluesuit"
- item_color = "bluesuit"
can_adjust = TRUE
alt_covers_chest = TRUE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -329,7 +295,6 @@
desc = "A classy suitskirt and tie."
icon_state = "bluesuit_skirt"
item_state = "bluesuit"
- item_color = "bluesuit_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -339,7 +304,6 @@
name = "purple suit"
icon_state = "lawyer_purp"
item_state = "lawyer_purp"
- item_color = "lawyer_purp"
fitted = NO_FEMALE_UNIFORM
can_adjust = TRUE
alt_covers_chest = TRUE
@@ -349,7 +313,6 @@
name = "purple suitskirt"
icon_state = "lawyer_purp_skirt"
item_state = "lawyer_purp"
- item_color = "lawyer_purp_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -360,7 +323,6 @@
desc = "A professional black suit. Nanotrasen Investigation Bureau approved!"
icon_state = "blacksuit"
item_state = "bar_suit"
- item_color = "blacksuit"
can_adjust = TRUE
alt_covers_chest = TRUE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -370,7 +332,6 @@
desc = "A professional black suitskirt. Nanotrasen Investigation Bureau approved!"
icon_state = "reallyblack_suit_skirt"
item_state = "bar_suit"
- item_color = "reallyblack_suit_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -381,7 +342,6 @@
desc = "It's very... sensible."
icon_state = "red_suit"
item_state = "red_suit"
- item_color = "red_suit"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -390,7 +350,6 @@
desc = "It's very... sensible."
icon_state = "red_suit_skirt"
item_state = "red_suit"
- item_color = "red_suit_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -401,14 +360,12 @@
desc = "A rugged uniform suitable for treasure hunting."
icon_state = "curator"
item_state = "curator"
- item_color = "curator"
/obj/item/clothing/under/rank/mime
name = "mime's outfit"
desc = "It's not very colourful."
icon_state = "mime"
item_state = "mime"
- item_color = "mime"
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/under/rank/mime/skirt
@@ -416,7 +373,6 @@
desc = "It's not very colourful."
icon_state = "mime_skirt"
item_state = "mime"
- item_color = "mime_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -427,7 +383,6 @@
desc = "Only the most modern of folk have the right to wear this suit."
icon_state = "artist"
item_state = "artist"
- item_color = "artist"
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
mutantrace_variation = MUTANTRACE_VARIATION
@@ -437,7 +392,6 @@
desc = "Only the most modern of folk have the right to wear this suit."
icon_state = "artist_skirt"
item_state = "artist"
- item_color = "artist_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -449,7 +403,6 @@
name = "shaft miner's jumpsuit"
icon_state = "miner"
item_state = "miner"
- item_color = "miner"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 0, WOUND = 10)
mutantrace_variation = MUTANTRACE_VARIATION
@@ -458,5 +411,4 @@
name = "shaft miner's jumpsuit"
icon_state = "explorer"
item_state = "explorer"
- item_color = "explorer"
can_adjust = FALSE
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index ca53682f9c9c..28b004872720 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -4,7 +4,6 @@
name = "chief engineer's jumpsuit"
icon_state = "chiefengineer"
item_state = "gy_suit"
- item_color = "chief"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 80, ACID = 40)
resistance_flags = NONE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -14,7 +13,6 @@
desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief Engineer\". It has minor radiation shielding."
icon_state = "chief_skirt"
item_state = "gy_suit"
- item_color = "chief_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -25,7 +23,6 @@
name = "atmospheric technician's jumpsuit"
icon_state = "atmos"
item_state = "atmos_suit"
- item_color = "atmos"
resistance_flags = NONE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -34,7 +31,6 @@
desc = "It's a jumpskirt worn by atmospheric technicians."
icon_state = "atmos_skirt"
item_state = "atmos_suit"
- item_color = "atmos_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -45,7 +41,6 @@
name = "engineer's jumpsuit"
icon_state = "engine"
item_state = "engi_suit"
- item_color = "engine"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 60, ACID = 20)
resistance_flags = NONE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -55,7 +50,6 @@
desc = "A high visibility jumpsuit made from heat and radiation resistant materials."
icon_state = "hazard"
item_state = "suit-orange"
- item_color = "hazard"
alt_covers_chest = TRUE
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -64,7 +58,6 @@
desc = "It's an orange high visibility jumpskirt worn by engineers."
icon_state = "engine_skirt"
item_state = "engi_suit"
- item_color = "engine_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -75,7 +68,6 @@
name = "roboticist's jumpsuit"
icon_state = "robotics"
item_state = "robotics"
- item_color = "robotics"
resistance_flags = NONE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -84,7 +76,6 @@
desc = "It's a slimming black with reinforced seams; great for industrial work."
icon_state = "robotics_skirt"
item_state = "robotics"
- item_color = "robotics_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm
index 925612e052ae..ad4671d90671 100644
--- a/code/modules/clothing/under/jobs/medsci.dm
+++ b/code/modules/clothing/under/jobs/medsci.dm
@@ -6,7 +6,6 @@
name = "research director's vest suit"
icon_state = "director"
item_state = "lb_suit"
- item_color = "director"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 35)
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -16,7 +15,6 @@
desc = "It's a suitskirt worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants."
icon_state = "director_skirt"
item_state = "lb_suit"
- item_color = "director_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -27,7 +25,6 @@
name = "research director's tan suit"
icon_state = "rdwhimsy"
item_state = "rdwhimsy"
- item_color = "rdwhimsy"
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0)
can_adjust = TRUE
alt_covers_chest = TRUE
@@ -37,7 +34,6 @@
desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants."
icon_state = "rdwhimsy_skirt"
item_state = "rdwhimsy"
- item_color = "rdwhimsy_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -48,7 +44,6 @@
name = "research director's turtleneck"
icon_state = "rdturtle"
item_state = "p_suit"
- item_color = "rdturtle"
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0)
can_adjust = TRUE
alt_covers_chest = TRUE
@@ -58,7 +53,6 @@
desc = "A dark purple turtleneck and tan khaki skirt, for a director with a superior sense of style."
icon_state = "rdturtle_skirt"
item_state = "p_suit"
- item_color = "rdturtle_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -69,7 +63,6 @@
name = "scientist's jumpsuit"
icon_state = "toxins"
item_state = "w_suit"
- item_color = "toxinswhite"
permeability_coefficient = 0.5
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
mutantrace_variation = MUTANTRACE_VARIATION
@@ -79,7 +72,6 @@
desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist."
icon_state = "toxinswhite_skirt"
item_state = "w_suit"
- item_color = "toxinswhite_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -90,7 +82,6 @@
name = "chemist's jumpsuit"
icon_state = "chemistry"
item_state = "w_suit"
- item_color = "chemistrywhite"
permeability_coefficient = 0.5
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 50, ACID = 65)
mutantrace_variation = MUTANTRACE_VARIATION
@@ -100,7 +91,6 @@
desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
icon_state = "chemistrywhite_skirt"
item_state = "w_suit"
- item_color = "chemistrywhite_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -114,7 +104,6 @@
name = "chief medical officer's jumpsuit"
icon_state = "cmo"
item_state = "w_suit"
- item_color = "cmo"
permeability_coefficient = 0.5
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0)
mutantrace_variation = MUTANTRACE_VARIATION
@@ -124,7 +113,6 @@
desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
icon_state = "cmo_skirt"
item_state = "w_suit"
- item_color = "cmo_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -135,7 +123,6 @@
name = "geneticist's jumpsuit"
icon_state = "genetics"
item_state = "w_suit"
- item_color = "geneticswhite"
permeability_coefficient = 0.5
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0)
mutantrace_variation = MUTANTRACE_VARIATION
@@ -145,7 +132,6 @@
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
icon_state = "geneticswhite_skirt"
item_state = "w_suit"
- item_color = "geneticswhite_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -156,7 +142,6 @@
name = "virologist's jumpsuit"
icon_state = "virology"
item_state = "w_suit"
- item_color = "virologywhite"
permeability_coefficient = 0.5
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0)
mutantrace_variation = MUTANTRACE_VARIATION
@@ -166,7 +151,6 @@
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
icon_state = "virologywhite_skirt"
item_state = "w_suit"
- item_color = "virologywhite_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -177,7 +161,6 @@
name = "nurse's suit"
icon_state = "nursesuit"
item_state = "w_suit"
- item_color = "nursesuit"
permeability_coefficient = 0.5
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0)
body_parts_covered = CHEST|GROIN|ARMS
@@ -189,7 +172,6 @@
name = "medical doctor's jumpsuit"
icon_state = "medical"
item_state = "w_suit"
- item_color = "medical"
permeability_coefficient = 0.5
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0)
mutantrace_variation = MUTANTRACE_VARIATION
@@ -198,21 +180,18 @@
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue."
icon_state = "scrubsblue"
- item_color = "scrubsblue"
can_adjust = FALSE
/obj/item/clothing/under/rank/medical/green
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green."
icon_state = "scrubsgreen"
- item_color = "scrubsgreen"
can_adjust = FALSE
/obj/item/clothing/under/rank/medical/purple
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple."
icon_state = "scrubspurple"
- item_color = "scrubspurple"
can_adjust = FALSE
/obj/item/clothing/under/rank/medical/skirt
@@ -220,7 +199,6 @@
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
icon_state = "medical_skirt"
item_state = "w_suit"
- item_color = "medical_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 0c0b093951e4..4906f2377ca9 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -14,7 +14,6 @@
desc = "A tactical security jumpsuit for officers. Complete with Nanotrasen belt buckle."
icon_state = "rsecurity"
item_state = "r_suit"
- item_color = "rsecurity"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, WOUND = 10)
strip_delay = 50
alt_covers_chest = TRUE
@@ -27,14 +26,12 @@
desc = "A tactical relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood."
icon_state = "security"
item_state = "gy_suit"
- item_color = "security"
/obj/item/clothing/under/rank/security/skirt
name = "security jumpskirt"
desc = "A \"tactical\" security jumpsuit with the legs replaced by a skirt."
icon_state = "secskirt"
item_state = "r_suit"
- item_color = "secskirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE //you know now that i think of it if you adjust the skirt and the sprite disappears isn't that just like flashing everyone
fitted = FEMALE_UNIFORM_TOP
@@ -46,7 +43,6 @@
desc = "A formal security suit for officers. Complete with Nanotrasen belt buckle."
icon_state = "rwarden"
item_state = "r_suit"
- item_color = "rwarden"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, WOUND = 10)
strip_delay = 50
alt_covers_chest = TRUE
@@ -59,14 +55,12 @@
desc = "A formal relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood."
icon_state = "warden"
item_state = "gy_suit"
- item_color = "warden"
/obj/item/clothing/under/rank/warden/skirt
name = "warden's suitskirt"
desc = "A formal security suitskirt for officers. Complete with Nanotrasen belt buckle."
icon_state = "rwarden_skirt"
item_state = "r_suit"
- item_color = "rwarden_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -80,7 +74,6 @@
desc = "Someone who wears this means business."
icon_state = "detective"
item_state = "det"
- item_color = "detective"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, WOUND = 10)
strip_delay = 50
alt_covers_chest = TRUE
@@ -93,7 +86,6 @@
desc = "Someone who wears this means business."
icon_state = "detective_skirt"
item_state = "det"
- item_color = "detective_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -104,7 +96,6 @@
desc = "A hard-boiled private investigator's grey suit, complete with tie clip."
icon_state = "greydet"
item_state = "greydet"
- item_color = "greydet"
alt_covers_chest = TRUE
/obj/item/clothing/under/rank/det/grey/skirt
@@ -112,7 +103,6 @@
desc = "A hard-boiled private investigator's grey suitskirt, complete with tie clip."
icon_state = "greydet_skirt"
item_state = "greydet"
- item_color = "greydet_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -126,7 +116,6 @@
desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security."
icon_state = "rhos"
item_state = "r_suit"
- item_color = "rhos"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10)
strip_delay = 60
alt_covers_chest = TRUE
@@ -139,7 +128,6 @@
desc = "A security jumpskirt decorated for those few with the dedication to achieve the position of Head of Security."
icon_state = "rhos_skirt"
item_state = "r_suit"
- item_color = "rhos_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -150,21 +138,18 @@
desc = "There are old men, and there are bold men, but there are very few old, bold men."
icon_state = "hos"
item_state = "gy_suit"
- item_color = "hos"
/obj/item/clothing/under/rank/head_of_security/alt
name = "head of security's turtleneck"
desc = "A stylish alternative to the normal head of security jumpsuit, complete with tactical pants."
icon_state = "hosalt"
item_state = "bl_suit"
- item_color = "hosalt"
/obj/item/clothing/under/rank/head_of_security/alt/skirt
name = "head of security's turtleneck skirt"
desc = "A stylish alternative to the normal head of security jumpsuit, complete with a tactical skirt."
icon_state = "hosalt_skirt"
item_state = "bl_suit"
- item_color = "hosalt_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -179,7 +164,6 @@
desc = "The latest in fashionable security outfits."
icon_state = "officerblueclothes"
item_state = "officerblueclothes"
- item_color = "officerblueclothes"
alt_covers_chest = TRUE
/obj/item/clothing/under/rank/head_of_security/navyblue
@@ -187,7 +171,6 @@
name = "head of security's formal uniform"
icon_state = "hosblueclothes"
item_state = "hosblueclothes"
- item_color = "hosblueclothes"
alt_covers_chest = TRUE
/obj/item/clothing/under/rank/warden/navyblue
@@ -195,7 +178,6 @@
name = "warden's formal uniform"
icon_state = "wardenblueclothes"
item_state = "wardenblueclothes"
- item_color = "wardenblueclothes"
alt_covers_chest = TRUE
/*
@@ -207,7 +189,6 @@
desc = "I'm a little busy right now, Calhoun."
icon_state = "blueshift"
item_state = "blueshift"
- item_color = "blueshift"
can_adjust = FALSE
/*
@@ -219,5 +200,4 @@
desc = "Space not controlled by megacorporations, planets, or pirates is under the jurisdiction of Spacepol."
icon_state = "spacepol"
item_state = "spacepol"
- item_color = "spacepol"
can_adjust = FALSE
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 51a317cfc8d7..99a47ccdc42d 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -2,7 +2,6 @@
name = "red pj's"
desc = "Sleepwear."
icon_state = "red_pyjamas"
- item_color = "red_pyjamas"
item_state = "w_suit"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -11,7 +10,6 @@
name = "blue pj's"
desc = "Sleepwear."
icon_state = "blue_pyjamas"
- item_color = "blue_pyjamas"
item_state = "w_suit"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -21,7 +19,6 @@
desc = "Motorcycle not included."
icon_state = "ek"
item_state = "ek"
- item_color = "ek"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -30,7 +27,6 @@
desc = "A white suit, suitable for an excellent host."
icon_state = "scratch"
item_state = "scratch"
- item_color = "scratch"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -39,7 +35,6 @@
desc = "A white suitskirt, suitable for an excellent host."
icon_state = "white_suit_skirt"
item_state = "scratch"
- item_color = "white_suit_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -49,7 +44,6 @@
desc = "It's a very amish looking suit."
name = "amish suit"
icon_state = "sl_suit"
- item_color = "sl_suit"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -57,7 +51,6 @@
name = "\improper Roman armor"
desc = "Ancient Roman armor. Made of metallic and leather straps."
icon_state = "roman"
- item_color = "roman"
item_state = "armor"
can_adjust = FALSE
strip_delay = 100
@@ -68,7 +61,6 @@
desc = "It's a very smart uniform with a special pocket for tips."
icon_state = "waiter"
item_state = "waiter"
- item_color = "waiter"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -77,7 +69,6 @@
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
icon_state = "prisoner"
item_state = "o_suit"
- item_color = "prisoner"
has_sensor = LOCKED_SENSORS
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
@@ -88,7 +79,6 @@
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
icon_state = "prisoner_skirt"
item_state = "o_suit"
- item_color = "prisoner_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -99,23 +89,22 @@
desc = "'Special delivery!'"
icon_state = "mailman"
item_state = "b_suit"
- item_color = "mailman"
mutantrace_variation = MUTANTRACE_VARIATION
+
/* Commented out in favor of yogstation custom content
/obj/item/clothing/under/rank/psyche
name = "psychedelic jumpsuit"
desc = "Groovy!"
icon_state = "psyche"
item_state = "p_suit"
- item_color = "psyche"
mutantrace_variation = MUTANTRACE_VARIATION
*/
+
/obj/item/clothing/under/rank/clown/sexy
name = "sexy-clown suit"
desc = "It makes you look HONKable!"
icon_state = "sexyclown"
item_state = "sexyclown"
- item_color = "sexyclown"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -124,7 +113,6 @@
desc = "The leather club is two sectors down."
icon_state = "darkholme"
item_state = "darkholme"
- item_color = "darkholme"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -133,7 +121,6 @@
desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision."
icon_state = "vice"
item_state = "gy_suit"
- item_color = "vice"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -142,7 +129,6 @@
name = "\improper CentCom officer's jumpsuit"
icon_state = "officer"
item_state = "g_suit"
- item_color = "officer"
alt_covers_chest = TRUE
/obj/item/clothing/under/rank/centcom_commander
@@ -150,7 +136,6 @@
name = "\improper CentCom officer's jumpsuit"
icon_state = "centcom"
item_state = "dg_suit"
- item_color = "centcom"
alt_covers_chest = TRUE
mutantrace_variation = MUTANTRACE_VARIATION
can_adjust = TRUE //too important to look unimportant.
@@ -173,7 +158,6 @@
desc = "It has a NASA logo on it and is made of space-proofed materials."
icon_state = "black"
item_state = "bl_suit"
- item_color = "black"
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
@@ -190,7 +174,6 @@
name = "administrative cybernetic jumpsuit"
icon_state = "syndicate"
item_state = "bl_suit"
- item_color = "syndicate"
desc = "A cybernetically enhanced jumpsuit used for administrative duties."
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
@@ -208,7 +191,6 @@
name = "owl uniform"
desc = "A soft brown jumpsuit made of synthetic feathers and strong conviction."
icon_state = "owl"
- item_color = "owl"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -216,7 +198,6 @@
name = "griffon uniform"
desc = "A soft brown jumpsuit with a white feather collar made of synthetic feathers and a lust for mayhem."
icon_state = "griffin"
- item_color = "griffin"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -224,7 +205,6 @@
name = "cloud"
desc = "cloud"
icon_state = "cloud"
- item_color = "cloud"
can_adjust = FALSE
/obj/item/clothing/under/gimmick/rank/captain/suit
@@ -232,7 +212,6 @@
desc = "A green suit and yellow necktie. Exemplifies authority."
icon_state = "green_suit"
item_state = "dg_suit"
- item_color = "green_suit"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -241,7 +220,6 @@
desc = "A green suitskirt and yellow necktie. Exemplifies authority."
icon_state = "green_suit_skirt"
item_state = "dg_suit"
- item_color = "green_suit_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -252,7 +230,6 @@
desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble."
icon_state = "teal_suit"
item_state = "g_suit"
- item_color = "teal_suit"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -261,7 +238,6 @@
desc = "A teal suitskirt and yellow necktie. An authoritative yet tacky ensemble."
icon_state = "teal_suit_skirt"
item_state = "g_suit"
- item_color = "teal_suit_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -272,7 +248,6 @@
desc = "A black suit and red tie. Very formal."
icon_state = "black_suit"
item_state = "bl_suit"
- item_color = "black_suit"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -281,21 +256,18 @@
desc = "A formal black suit and red tie, intended for the station's finest."
icon_state = "really_black_suit"
item_state = "bl_suit"
- item_color = "really_black_suit"
/obj/item/clothing/under/suit_jacket/female
name = "executive suit"
desc = "A formal trouser suit for women, intended for the station's finest."
icon_state = "black_suit_fem"
item_state = "black_suit_fem"
- item_color = "black_suit_fem"
/obj/item/clothing/under/suit_jacket/green
name = "green suit"
desc = "A green suit and yellow necktie. Baller."
icon_state = "green_suit"
item_state = "dg_suit"
- item_color = "green_suit"
can_adjust = FALSE
/obj/item/clothing/under/suit_jacket/red
@@ -303,56 +275,48 @@
desc = "A red suit and blue tie. Somewhat formal."
icon_state = "red_suit"
item_state = "r_suit"
- item_color = "red_suit"
/obj/item/clothing/under/suit_jacket/charcoal
name = "charcoal suit"
desc = "A charcoal suit and red tie. Very professional."
icon_state = "charcoal_suit"
item_state = "charcoal_suit"
- item_color = "charcoal_suit"
/obj/item/clothing/under/suit_jacket/navy
name = "navy suit"
desc = "A navy suit and red tie, intended for the station's finest."
icon_state = "navy_suit"
item_state = "navy_suit"
- item_color = "navy_suit"
/obj/item/clothing/under/suit_jacket/burgundy
name = "burgundy suit"
desc = "A burgundy suit and black tie. Somewhat formal."
icon_state = "burgundy_suit"
item_state = "burgundy_suit"
- item_color = "burgundy_suit"
/obj/item/clothing/under/suit_jacket/checkered
name = "checkered suit"
desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?"
icon_state = "checkered_suit"
item_state = "checkered_suit"
- item_color = "checkered_suit"
/obj/item/clothing/under/suit_jacket/tan
name = "tan suit"
desc = "A tan suit with a yellow tie. Smart, but casual."
icon_state = "tan_suit"
item_state = "tan_suit"
- item_color = "tan_suit"
/obj/item/clothing/under/suit_jacket/white
name = "white suit"
desc = "A white suit and jacket with a blue shirt. You wanna play rough? OKAY!"
icon_state = "white_suit"
item_state = "white_suit"
- item_color = "white_suit"
/obj/item/clothing/under/burial
name = "burial garments"
desc = "Traditional burial garments from the early 22nd century."
icon_state = "burial"
item_state = "burial"
- item_color = "burial"
has_sensor = NO_SENSORS
mutantrace_variation = MUTANTRACE_VARIATION
@@ -360,7 +324,6 @@
name = "black skirt"
desc = "A black skirt, very fancy!"
icon_state = "blackskirt"
- item_color = "blackskirt"
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -369,7 +332,6 @@
name = "blue skirt"
desc = "A blue, casual skirt."
icon_state = "blueskirt"
- item_color = "blueskirt"
item_state = "b_suit"
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
@@ -380,7 +342,6 @@
name = "red skirt"
desc = "A red, casual skirt."
icon_state = "redskirt"
- item_color = "redskirt"
item_state = "r_suit"
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
@@ -391,7 +352,6 @@
name = "purple skirt"
desc = "A purple, casual skirt."
icon_state = "purpleskirt"
- item_color = "purpleskirt"
item_state = "p_suit"
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
@@ -404,7 +364,6 @@
desc = "It's just like one of my Japanese animes!"
icon_state = "schoolgirl"
item_state = "schoolgirl"
- item_color = "schoolgirl"
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -413,45 +372,45 @@
name = "red schoolgirl uniform"
icon_state = "schoolgirlred"
item_state = "schoolgirlred"
- item_color = "schoolgirlred"
/obj/item/clothing/under/schoolgirl/green
name = "green schoolgirl uniform"
icon_state = "schoolgirlgreen"
item_state = "schoolgirlgreen"
- item_color = "schoolgirlgreen"
/obj/item/clothing/under/schoolgirl/orange
name = "orange schoolgirl uniform"
icon_state = "schoolgirlorange"
item_state = "schoolgirlorange"
- item_color = "schoolgirlorange"
/obj/item/clothing/under/overalls
name = "laborer's overalls"
desc = "A set of durable overalls for getting the job done."
icon_state = "overalls"
item_state = "lb_suit"
- item_color = "overalls"
can_adjust = FALSE
custom_price = 20
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/under/pirate
name = "pirate outfit"
- desc = "Yarr."
+ desc = "Yarr! A fine shirt and pants for the enterprising corsair."
icon_state = "pirate"
item_state = "pirate"
- item_color = "pirate"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
+/obj/item/clothing/under/pirate/space
+ name = "syndicate pirate outfit"
+ desc = "Yarr! A set of reinforced pirate clothing worn by boney Syndicate privateers."
+ has_sensor = NO_SENSORS
+ armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40)
+
/obj/item/clothing/under/soviet
name = "soviet uniform"
desc = "For the Motherland!"
icon_state = "soviet"
item_state = "soviet"
- item_color = "soviet"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -460,7 +419,6 @@
desc = "Looks old."
icon_state = "redcoat"
item_state = "redcoat"
- item_color = "redcoat"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -469,7 +427,6 @@
desc = "Includes shoes and plaid."
icon_state = "kilt"
item_state = "kilt"
- item_color = "kilt"
body_parts_covered = CHEST|GROIN|LEGS|FEET
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -487,7 +444,6 @@
desc = "The only time when you DON'T enjoy looking at someone's rack."
icon_state = "sexymime"
item_state = "sexymime"
- item_color = "sexymime"
body_parts_covered = CHEST|GROIN|LEGS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -498,7 +454,6 @@
desc = "Are you not entertained? Is that not why you are here?"
icon_state = "gladiator"
item_state = "gladiator"
- item_color = "gladiator"
body_parts_covered = CHEST|GROIN|ARMS
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
@@ -513,7 +468,6 @@
desc = "Makes you want to frolic in a field of daisies."
icon_state = "sundress"
item_state = "sundress"
- item_color = "sundress"
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -523,7 +477,6 @@
desc = "A captain's luxury-wear, for special occasions."
icon_state = "captain_parade"
item_state = "by_suit"
- item_color = "captain_parade"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -532,7 +485,6 @@
desc = "A male head of security's luxury-wear, for special occasions."
icon_state = "hos_parade_male"
item_state = "r_suit"
- item_color = "hos_parade_male"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -541,7 +493,6 @@
desc = "A female head of security's luxury-wear, for special occasions."
icon_state = "hos_parade_fem"
item_state = "r_suit"
- item_color = "hos_parade_fem"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -551,7 +502,6 @@
desc = "An assistant's formal-wear. Why an assistant needs formal-wear is still unknown."
icon_state = "assistant_formal"
item_state = "gy_suit"
- item_color = "assistant_formal"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -560,7 +510,6 @@
desc = "Filled with Latin fire."
icon_state = "black_tango"
item_state = "wcoat"
- item_color = "black_tango"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -569,7 +518,6 @@
desc = "Fashion in space."
icon_state = "striped_dress"
item_state = "stripeddress"
- item_color = "striped_dress"
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_FULL
can_adjust = FALSE
@@ -579,7 +527,6 @@
desc = "Formal wear for a leading lady."
icon_state = "sailor_dress"
item_state = "sailordress"
- item_color = "sailor_dress"
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -589,7 +536,6 @@
desc = "Fancy dress for space bar singers."
icon_state = "red_evening_gown"
item_state = "redeveninggown"
- item_color = "red_evening_gown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -598,7 +544,6 @@
desc = "Maid in China."
icon_state = "maid"
item_state = "maid"
- item_color = "maid"
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -613,7 +558,6 @@
desc = "A simple maid uniform for housekeeping."
icon_state = "janimaid"
item_state = "janimaid"
- item_color = "janimaid"
body_parts_covered = CHEST|GROIN|FEET|LEGS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -623,7 +567,6 @@
desc = "A preppy red skirt with a white blouse."
icon_state = "plaid_red"
item_state = "plaid_red"
- item_color = "plaid_red"
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
@@ -634,7 +577,6 @@
desc = "A preppy blue skirt with a white blouse."
icon_state = "plaid_blue"
item_state = "plaid_blue"
- item_color = "plaid_blue"
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
@@ -644,7 +586,6 @@
desc = "A preppy purple skirt with a white blouse."
icon_state = "plaid_purple"
item_state = "plaid_purple"
- item_color = "plaid_purple"
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
@@ -654,7 +595,6 @@
desc = "Just looking at this makes you want to sing."
icon_state = "ysing"
item_state = "ysing"
- item_color = "ysing"
body_parts_covered = CHEST|GROIN|ARMS
fitted = NO_FEMALE_UNIFORM
alternate_worn_layer = ABOVE_SHOES_LAYER
@@ -666,7 +606,6 @@
desc = "Just looking at this makes you want to sing."
icon_state = "bsing"
item_state = "bsing"
- item_color = "bsing"
body_parts_covered = CHEST|GROIN|ARMS
alternate_worn_layer = ABOVE_SHOES_LAYER
fitted = FEMALE_UNIFORM_TOP
@@ -678,7 +617,6 @@
desc = "A preppy green skirt with a white blouse."
icon_state = "plaid_green"
item_state = "plaid_green"
- item_color = "plaid_green"
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
@@ -687,14 +625,12 @@
name = "jester suit"
desc = "A jolly dress, well suited to entertain your master, nuncle."
icon_state = "jester"
- item_color = "jester"
can_adjust = FALSE
/obj/item/clothing/under/geisha
name = "geisha suit"
desc = "Cute space ninja senpai not included."
icon_state = "geisha"
- item_color = "geisha"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
@@ -702,7 +638,6 @@
name = "villain suit"
desc = "A change of wardrobe is necessary if you ever want to catch a real superhero."
icon_state = "villain"
- item_color = "villain"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -711,7 +646,6 @@
desc = "Skipper's in the wardroom drinkin' gin."
icon_state = "sailor"
item_state = "b_suit"
- item_color = "sailor"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -720,7 +654,6 @@
desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy."
icon_state = "plasmaman"
item_state = "plasmaman"
- item_color = "plasmaman"
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95)
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
can_adjust = FALSE
@@ -770,7 +703,6 @@
desc = "The latest in fashionable Russian outfits."
icon_state = "hostanclothes"
item_state = "hostanclothes"
- item_color = "hostanclothes"
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/under/mummy
@@ -778,7 +710,6 @@
desc = "Return the slab or suffer my stale references."
icon_state = "mummy"
item_state = "mummy"
- item_color = "mummy"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
@@ -790,7 +721,6 @@
desc = "Perfect camouflage for hiding in botany."
icon_state = "scarecrow"
item_state = "scarecrow"
- item_color = "scarecrow"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
@@ -802,7 +732,6 @@
desc = "A dress inspired by the ancient \"Victorian\" era."
icon_state = "draculass"
item_state = "draculass"
- item_color = "draculass"
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -812,7 +741,6 @@
desc = "A modified scientist jumpsuit to look extra cool."
icon_state = "drfreeze"
item_state = "drfreeze"
- item_color = "drfreeze"
can_adjust = FALSE
/obj/item/clothing/under/lobster
@@ -820,7 +748,6 @@
desc = "Who beheaded the college mascot?"
icon_state = "lobster"
item_state = "lobster"
- item_color = "lobster"
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
@@ -829,7 +756,6 @@
desc = "Now you're cooking."
icon_state = "gondola"
item_state = "lb_suit"
- item_color = "gondola"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -838,7 +764,6 @@
desc = "A black jumpsuit with a white bone pattern printed on it. Spooky!"
icon_state = "skeleton"
item_state = "skeleton"
- item_color = "skeleton"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
@@ -850,7 +775,6 @@
desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer."
icon_state = "durathread"
item_state = "durathread"
- item_color = "durathread"
can_adjust = FALSE
armor = list(MELEE = 10, LASER = 10, FIRE = 40, ACID = 10, BOMB = 5)
mutantrace_variation = MUTANTRACE_VARIATION
@@ -885,7 +809,6 @@
desc = "A peculier garment woven in silk; under the lower dress appears to be a lamp and a switch."
icon_state = "lampskirt_male"
item_state = "lampskirt_male"
- item_color = "lampskirt_male"
body_parts_covered = CHEST|GROIN|LEGS|FEET
can_adjust = FALSE
var/brightness_on = 1 //luminosity when the light is on
@@ -911,7 +834,6 @@
/obj/item/clothing/under/lampskirt/female
icon_state = "lampskirt_female"
item_state = "lampskirt_female"
- item_color = "lampskirt_female"
body_parts_covered = CHEST|GROIN|LEGS|FEET
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -921,7 +843,6 @@
desc = "The meat part of a hot dog costume. People may think you're trying to compensate for something."
icon_state = "weiner"
item_state = "weiner"
- item_color = "weiner"
can_adjust = FALSE
// Ashwalker Clothes
@@ -937,7 +858,6 @@
desc = "A porly made outfit made of scrapped materials."
icon_state = "raider_leather"
item_state = "raider_leather"
- item_color = "raider_leather"
armor = list(MELEE = 5, FIRE = 5)
has_sensor = NO_SENSORS
can_adjust = FALSE
@@ -948,7 +868,6 @@
desc = "Thin metal bolted over poorly tanned leather."
icon_state = "tribal"
item_state = "tribal"
- item_color = "tribal"
body_parts_covered = CHEST|GROIN|ARMS
armor = list(MELEE = 5)
has_sensor = NO_SENSORS
@@ -959,49 +878,43 @@
desc = "A robe from the ashlands. This one seems to be for common tribespeople."
icon_state = "robe_liz"
item_state = "robe_liz"
- item_color = "robe_liz"
+ fitted = NO_FEMALE_UNIFORM
body_parts_covered = CHEST|GROIN
has_sensor = NO_SENSORS
can_adjust = FALSE
+ fitted = NO_FEMALE_UNIFORM
/obj/item/clothing/under/ash_robe/young
name = "tribal rags"
desc = "Rags from Lavaland, coated with light ash. This one seems to be for the juniors of a tribe."
icon_state = "tribalrags"
- item_state = "tribalrags"
- item_color = "tribalrags"
/obj/item/clothing/under/ash_robe/hunter
name = "hunter tribal rags"
desc = "A robe from the ashlands. This one seems to be for hunters."
icon_state = "hhunterrags"
item_state = "hhunterrags"
- item_color = "hhunterrags"
/obj/item/clothing/under/ash_robe/chief
name = "chief tribal rags"
desc = "Rags from Lavaland, coated with heavy ash. This one seems to be for the elders of a tribe."
icon_state = "chiefrags"
item_state = "chiefrags"
- item_color = "chiefrags"
/obj/item/clothing/under/ash_robe/shaman
name = "shaman tribal rags"
desc = "Rags from Lavaland, drenched with ash, it has fine jewel coated bones sewn around the neck. This one seems to be for the shaman of a tribe."
icon_state = "shamanrags"
item_state = "shamanrags"
- item_color = "shamanrags"
/obj/item/clothing/under/ash_robe/tunic
name = "tribal tunic"
desc = "A tattered red tunic of reddened fabric."
icon_state = "caesar_clothes"
item_state = "caesar_clothes"
- item_color = "caesar_clothes"
/obj/item/clothing/under/ash_robe/dress
name = "tribal dress"
desc = "A tattered dress of white fabric."
icon_state = "cheongsam_s"
item_state = "cheongsam_s"
- item_color = "cheongsam_s"
diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm
index de07b1761c86..8b2befafdc95 100644
--- a/code/modules/clothing/under/pants.dm
+++ b/code/modules/clothing/under/pants.dm
@@ -10,71 +10,59 @@
name = "classic jeans"
desc = "You feel cooler already."
icon_state = "jeansclassic"
- item_color = "jeansclassic"
/obj/item/clothing/under/pants/mustangjeans
name = "Must Hang jeans"
desc = "Made in the finest space jeans factory this side of Alpha Centauri."
icon_state = "jeansmustang"
- item_color = "jeansmustang"
custom_price = 75
/obj/item/clothing/under/pants/blackjeans
name = "black jeans"
desc = "Only for those who can pull it off."
icon_state = "jeansblack"
- item_color = "jeansblack"
/obj/item/clothing/under/pants/youngfolksjeans
name = "Young Folks jeans"
desc = "For those tired of boring old jeans. Relive the passion of your youth!"
icon_state = "jeansyoungfolks"
- item_color = "jeansyoungfolks"
/obj/item/clothing/under/pants/white
name = "white pants"
desc = "Plain white pants. Boring."
icon_state = "whitepants"
- item_color = "whitepants"
/obj/item/clothing/under/pants/red
name = "red pants"
desc = "Bright red pants. Overflowing with personality."
icon_state = "redpants"
- item_color = "redpants"
/obj/item/clothing/under/pants/black
name = "black pants"
desc = "These pants are dark, like your soul."
icon_state = "blackpants"
- item_color = "blackpants"
/obj/item/clothing/under/pants/tan
name = "tan pants"
desc = "Some tan pants. You look like a white collar worker with these on."
icon_state = "tanpants"
- item_color = "tanpants"
/obj/item/clothing/under/pants/track
name = "track pants"
desc = "A pair of track pants, for the athletic."
icon_state = "trackpants"
- item_color = "trackpants"
/obj/item/clothing/under/pants/jeans
name = "jeans"
desc = "A nondescript pair of tough blue jeans."
icon_state = "jeans"
- item_color = "jeans"
/obj/item/clothing/under/pants/khaki
name = "khaki pants"
desc = "A pair of dust beige khaki pants."
icon_state = "khaki"
- item_color = "khaki"
/obj/item/clothing/under/pants/camo
name = "camo pants"
desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station."
icon_state = "camopants"
- item_color = "camopants"
diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm
index 91a1b42f1e5e..bf8556e29d72 100644
--- a/code/modules/clothing/under/shorts.dm
+++ b/code/modules/clothing/under/shorts.dm
@@ -10,29 +10,23 @@
/obj/item/clothing/under/shorts/red
name = "red athletic shorts"
icon_state = "redshorts"
- item_color = "redshorts"
/obj/item/clothing/under/shorts/green
name = "green athletic shorts"
icon_state = "greenshorts"
- item_color = "greenshorts"
/obj/item/clothing/under/shorts/blue
name = "blue athletic shorts"
icon_state = "blueshorts"
- item_color = "blueshorts"
/obj/item/clothing/under/shorts/black
name = "black athletic shorts"
icon_state = "blackshorts"
- item_color = "blackshorts"
/obj/item/clothing/under/shorts/grey
name = "grey athletic shorts"
icon_state = "greyshorts"
- item_color = "greyshorts"
/obj/item/clothing/under/shorts/purple
name = "purple athletic shorts"
icon_state = "purpleshorts"
- item_color = "purpleshorts"
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 13c6b7b6e474..c23b239bee92 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -3,7 +3,6 @@
desc = "A non-descript and slightly suspicious looking turtleneck with digital camouflage cargo pants."
icon_state = "syndicate"
item_state = "bl_suit"
- item_color = "syndicate"
has_sensor = NO_SENSORS
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40)
alt_covers_chest = TRUE
@@ -14,7 +13,6 @@
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
icon_state = "tactifool"
item_state = "bl_suit"
- item_color = "tactifool"
has_sensor = HAS_SENSORS
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40)
@@ -23,7 +21,6 @@
desc = "A double seamed tactical turtleneck disguised as a civilian grade silk suit. Intended for the most formal operator. The collar is really sharp."
icon_state = "really_black_suit"
item_state = "bl_suit"
- item_color = "black_suit"
can_adjust = FALSE
/obj/item/clothing/under/syndicate/camo
@@ -31,14 +28,12 @@
desc = "A green military camouflage uniform."
icon_state = "camogreen"
item_state = "g_suit"
- item_color = "camogreen"
can_adjust = FALSE
/obj/item/clothing/under/syndicate/soviet
name = "Ratnik 5 tracksuit"
desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in."
icon_state = "trackpants"
- item_color = "trackpants"
can_adjust = FALSE
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
resistance_flags = NONE
@@ -47,14 +42,12 @@
name = "combat uniform"
desc = "With a suit lined with this many pockets, you are ready to operate."
icon_state = "syndicate_combat"
- item_color = "syndicate_combat"
can_adjust = FALSE
/obj/item/clothing/under/syndicate/rus_army
name = "advanced military tracksuit"
desc = "Military grade tracksuits for frontline squatting."
icon_state = "rus_under"
- item_color = "rus_under"
can_adjust = FALSE
armor = list(MELEE = 5, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
resistance_flags = NONE
diff --git a/code/modules/clothing/under/trek.dm b/code/modules/clothing/under/trek.dm
index d948449e7f22..37826d5ec294 100644
--- a/code/modules/clothing/under/trek.dm
+++ b/code/modules/clothing/under/trek.dm
@@ -11,14 +11,12 @@
name = "command uniform"
desc = "The uniform worn by command officers."
icon_state = "trek_command"
- item_color = "trek_command"
item_state = "y_suit"
/obj/item/clothing/under/trek/engsec
name = "engsec uniform"
desc = "The uniform worn by engineering/security officers."
icon_state = "trek_engsec"
- item_color = "trek_engsec"
item_state = "r_suit"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) //more sec than eng, but w/e.
strip_delay = 50
@@ -27,40 +25,33 @@
name = "medsci uniform"
desc = "The uniform worn by medical/science officers."
icon_state = "trek_medsci"
- item_color = "trek_medsci"
item_state = "b_suit"
//TNG
/obj/item/clothing/under/trek/command/next
icon_state = "trek_next_command"
- item_color = "trek_next_command"
item_state = "r_suit"
/obj/item/clothing/under/trek/engsec/next
icon_state = "trek_next_engsec"
- item_color = "trek_next_engsec"
item_state = "y_suit"
/obj/item/clothing/under/trek/medsci/next
icon_state = "trek_next_medsci"
- item_color = "trek_next_medsci"
//ENT
/obj/item/clothing/under/trek/command/ent
icon_state = "trek_ent_command"
- item_color = "trek_ent_command"
item_state = "bl_suit"
/obj/item/clothing/under/trek/engsec/ent
icon_state = "trek_ent_engsec"
- item_color = "trek_ent_engsec"
item_state = "bl_suit"
/obj/item/clothing/under/trek/medsci/ent
icon_state = "trek_ent_medsci"
- item_color = "trek_ent_medsci"
item_state = "bl_suit"
@@ -69,5 +60,4 @@
name = "french marshall's uniform"
desc = "Something about it feels off..."
icon_state = "trek_Q"
- item_color = "trek_Q"
item_state = "r_suit"
diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm
index cab2d87fab75..5f96b5b052f8 100644
--- a/code/modules/events/shuttle_loan.dm
+++ b/code/modules/events/shuttle_loan.dm
@@ -6,6 +6,7 @@
#define PIZZA_DELIVERY 6
#define ITS_HIP_TO 7
#define MY_GOD_JC 8
+#define PETA 9
/datum/round_event_control/shuttle_loan
@@ -24,7 +25,7 @@
var/thanks_msg = "The cargo shuttle should return in five minutes. Have some supply points for your trouble."
/datum/round_event/shuttle_loan/setup()
- dispatch_type = pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY, ANTIDOTE_NEEDED, PIZZA_DELIVERY, ITS_HIP_TO, MY_GOD_JC)
+ dispatch_type = pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY, ANTIDOTE_NEEDED, PIZZA_DELIVERY, ITS_HIP_TO, MY_GOD_JC, PETA)
/datum/round_event/shuttle_loan/announce(fake)
SSshuttle.shuttle_loan = src
@@ -52,6 +53,10 @@
priority_announce("Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it.", "CentCom Security Division")
thanks_msg = "Live explosive ordnance incoming via supply shuttle. Evacuating cargo bay is recommended."
bonus_points = 45000 //If you mess up, people die and the shuttle gets turned into swiss cheese
+ if(PETA)
+ priority_announce("Cargo: A group calling themselves PETA whatever that means is asking to inspect your station. Do you want to check it out?", "CentCom Diplomatic Corps")
+ thanks_msg = "Inspectors Incoming."
+ bonus_points = 10000 // Funny hostile mobs
/datum/round_event/shuttle_loan/proc/loan_shuttle()
priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.")
@@ -83,6 +88,8 @@
SSshuttle.centcom_message += "Biohazard cleanup incoming."
if(MY_GOD_JC)
SSshuttle.centcom_message += "Live explosive ordnance incoming. Exercise extreme caution."
+ if(PETA)
+ SSshuttle.centcom_message += "Inspectors Incoming."
/datum/round_event/shuttle_loan/tick()
if(dispatched)
@@ -227,6 +234,17 @@
else
shuttle_spawns.Add(/obj/item/paper/fluff/cargo/bomb/allyourbase)
+ if(PETA)
+ for(var/i in 1 to 20)
+ if(prob(50))
+ shuttle_spawns.Add(/mob/living/simple_animal/hostile/rat/loan)
+ if(prob(40))
+ shuttle_spawns.Add(/mob/living/simple_animal/hostile/carp/loan)
+ if(prob(20))
+ shuttle_spawns.Add(/mob/living/simple_animal/hostile/bear/loan)
+ if(prob(30))
+ shuttle_spawns.Add(/mob/living/simple_animal/hostile/feral_cat/loan)
+
var/false_positive = 0
while(shuttle_spawns.len && empty_shuttle_turfs.len)
var/turf/T = pick_n_take(empty_shuttle_turfs)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 0fea05dee27f..d355c8e00a57 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -469,6 +469,18 @@
list_reagents = list(/datum/reagent/consumable/space_cola = 30)
foodtype = SUGAR
+/obj/item/reagent_containers/food/drinks/soda_cans/rootbeer
+ name = "Root Beer"
+ desc = "A soft drink made from roots. Non-Alcoholic."
+ custom_price = 10
+ icon_state = "Rootbeer_Mug"
+ list_reagents = list(/datum/reagent/consumable/rootbeer = 30)
+ foodtype = SUGAR
+
+/obj/item/reagent_containers/food/drinks/soda_cans/rootbeer/Initialize()
+ icon_state = pick("Rootbeer_Mug","Rootbeer_AW","Rootbeer_Barq")
+ . = ..()
+
/obj/item/reagent_containers/food/drinks/soda_cans/tonic
name = "T-Borg's tonic water"
desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm
index c4e344692950..31fa3fe15dbd 100644
--- a/code/modules/food_and_drinks/food/snacks_egg.dm
+++ b/code/modules/food_and_drinks/food/snacks_egg.dm
@@ -56,7 +56,7 @@
/obj/item/reagent_containers/food/snacks/egg/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/toy/crayon))
var/obj/item/toy/crayon/C = W
- var/clr = C.item_color
+ var/clr = C.crayon_color
if(!(clr in list("blue", "green", "mime", "orange", "purple", "rainbow", "red", "yellow")))
to_chat(usr, span_notice("[src] refuses to take on this colour!"))
@@ -64,7 +64,6 @@
to_chat(usr, span_notice("You colour [src] with [W]."))
icon_state = "egg-[clr]"
- item_color = clr
else if(istype(W, /obj/item/stamp/clown))
var/clowntype = pick("grock", "grimaldi", "rainbow", "chaos", "joker", "sexy", "standard", "bobble", "krusty", "bozo", "pennywise", "ronald", "jacobs", "kelly", "popov", "cluwne")
icon_state = "egg-clown-[clowntype]"
@@ -75,35 +74,27 @@
/obj/item/reagent_containers/food/snacks/egg/blue
icon_state = "egg-blue"
- item_color = "blue"
/obj/item/reagent_containers/food/snacks/egg/green
icon_state = "egg-green"
- item_color = "green"
/obj/item/reagent_containers/food/snacks/egg/mime
icon_state = "egg-mime"
- item_color = "mime"
/obj/item/reagent_containers/food/snacks/egg/orange
icon_state = "egg-orange"
- item_color = "orange"
/obj/item/reagent_containers/food/snacks/egg/purple
icon_state = "egg-purple"
- item_color = "purple"
/obj/item/reagent_containers/food/snacks/egg/rainbow
icon_state = "egg-rainbow"
- item_color = "rainbow"
/obj/item/reagent_containers/food/snacks/egg/red
icon_state = "egg-red"
- item_color = "red"
/obj/item/reagent_containers/food/snacks/egg/yellow
icon_state = "egg-yellow"
- item_color = "yellow"
/obj/item/reagent_containers/food/snacks/friedegg
name = "fried egg"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 331ec7de7c35..aec53977e89d 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -113,6 +113,11 @@ God bless America.
var/turf/T = get_turf(src)
new /obj/item/syndicate_basket(T)
return
+ if(istype(I, /obj/item/organ/brain))
+ var/safety = alert(user, "Warning! This brain might still contain a life in it.", "Proceed anyways?" ,"No.", "FRY ANYWAY")
+ if(safety != "FRY ANYWAY")
+ to_chat(user, span_warning("You decided not to fry this brain..."))
+ return
if(default_unfasten_wrench(user, I))
return
else if(default_deconstruction_screwdriver(user, "fryer_off", "fryer_off" ,I)) //where's the open maint panel icon?!
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
index c513dd802e36..ee44baed7cb0 100644
--- a/code/modules/holiday/easter.dm
+++ b/code/modules/holiday/easter.dm
@@ -113,7 +113,6 @@
. = ..()
var/eggcolor = pick("blue","green","mime","orange","purple","rainbow","red","yellow")
icon_state = "egg-[eggcolor]"
- item_color = "[eggcolor]"
/obj/item/reagent_containers/food/snacks/egg/proc/dispensePrize(turf/where)
var/won = pick(/obj/item/clothing/head/bunnyhead,
diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm
index 3509072a7ce5..8b1c1c8871f1 100644
--- a/code/modules/holodeck/items.dm
+++ b/code/modules/holodeck/items.dm
@@ -24,34 +24,35 @@
w_class = WEIGHT_CLASS_SMALL
hitsound = "swing_hit"
armour_penetration = 50
- var/active = 0
+ var/active = FALSE
+ var/saber_color
/obj/item/holo/esword/green/Initialize()
. = ..()
- item_color = "green"
+ saber_color = "green"
/obj/item/holo/esword/red/Initialize()
. = ..()
- item_color = "red"
+ saber_color = "red"
/obj/item/holo/esword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(active)
return ..()
- return 0
+ return FALSE
/obj/item/holo/esword/attack(target as mob, mob/user as mob)
..()
/obj/item/holo/esword/Initialize()
. = ..()
- item_color = pick("red","blue","green","purple")
+ saber_color = pick("red","blue","green","purple")
/obj/item/holo/esword/attack_self(mob/living/user as mob)
active = !active
if (active)
force = 30
- icon_state = "sword[item_color]"
+ icon_state = "sword[saber_color]"
w_class = WEIGHT_CLASS_BULKY
hitsound = 'sound/weapons/blade1.ogg'
playsound(user, 'sound/weapons/saberon.ogg', 20, 1)
@@ -104,7 +105,8 @@
density = TRUE
/obj/structure/holohoop/attackby(obj/item/W as obj, mob/user as mob, params)
- if(get_dist(src,user)<2)
+ var/dist = get_dist(src,user)
+ if(dist<2 || (islizard(user) && dist<4))
if(user.transferItemToLoc(W, drop_location()))
visible_message(span_warning(" [user] dunks [W] into \the [src]!"))
diff --git a/code/modules/hydroponics/grown/rainbow_bunch.dm b/code/modules/hydroponics/grown/rainbow_bunch.dm
index 44e8ced977bf..fb63763aa62c 100644
--- a/code/modules/hydroponics/grown/rainbow_bunch.dm
+++ b/code/modules/hydroponics/grown/rainbow_bunch.dm
@@ -36,42 +36,42 @@
var/flower_color = rand(1,8)
switch(flower_color)
if(1)
- item_color = "red"
color = "#DA0000"
list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/red = 3)
+ dye_color = DYE_RED
desc += " This one is in a bright red color."
if(2)
- item_color = "orange"
color = "#FF9300"
list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/orange = 3)
+ dye_color = DYE_ORANGE
desc += " This one is in a citrus orange color."
if(3)
- item_color = "yellow"
color = "#FFF200"
list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/yellow = 3)
+ dye_color = DYE_YELLOW
desc += " This one is in a bright yellow color."
if(4)
- item_color = "green"
color = "#A8E61D"
list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/green = 3)
+ dye_color = DYE_GREEN
desc += " This one is in a grassy green color."
if(5)
- item_color = "blue"
color = "#00B7EF"
list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/blue = 3)
+ dye_color = DYE_BLUE
desc += " This one is in a soothing blue color."
if(6)
- item_color = "purple"
color = "#DA00FF"
list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/purple = 3)
+ dye_color = DYE_PURPLE
desc += " This one is in a vibrant purple color."
if(7)
- item_color = "black"
color = "#1C1C1C"
list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/black = 3)
+ dye_color = DYE_BLACK
desc += " This one is in a midnight black color."
if(8)
- item_color = "white"
color = "#FFFFFF"
list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/white = 3)
+ dye_color = DYE_WHITE
desc += " This one is in a pure white color."
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index 65675db9e43c..2902ce96937e 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -118,6 +118,7 @@
new V(podman)
podman.hardset_dna(null,null,null,podman.real_name,blood_type, new /datum/species/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
podman.set_cloned_appearance()
+ podman.dna.species.exotic_blood = max(reagents_add) || /datum/reagent/water
log_cloning("[key_name(mind)] cloned as a podman via [src] in [parent] at [AREACOORD(parent)].")
to_chat(podman, span_notice("You do not remember your death, how you died, or who killed you. See rule 1.6.")) //yogs
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index be0c53203fef..c85904d4a217 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -219,13 +219,11 @@
var/uniform_skirt = null
+ /// Which slot the PDA defaults to
var/pda_slot = SLOT_BELT
- var/alt_shoes = /obj/item/clothing/shoes/xeno_wraps // Default digitgrade shoes assignment variable
- var/alt_shoes_s = /obj/item/clothing/shoes/xeno_wraps/jackboots // Digitigrade shoes for Sec assignment variable
- var/alt_shoes_c = /obj/item/clothing/shoes/xeno_wraps/command // command footwraps.
- var/alt_shoes_e = /obj/item/clothing/shoes/xeno_wraps/engineering // Engineering footwraps
- var/alt_shoes_ca = /obj/item/clothing/shoes/xeno_wraps/cargo // Cargo Footwraps
- var/alt_shoes_m = /obj/item/clothing/shoes/xeno_wraps/medical // Medical Footwraps
+
+ /// What shoes digitgrade crew should wear
+ var/digitigrade_shoes
/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
switch(H.backbag)
@@ -249,17 +247,9 @@
if (isplasmaman(H) && !(visualsOnly)) //this is a plasmaman fix to stop having two boxes
box = null
- if(DIGITIGRADE in H.dna.species.species_traits)
- if(IS_COMMAND(H)) // command gets snowflake shoes too.
- shoes = alt_shoes_c
- else if(IS_SECURITY(H) || find_job(H) == "Brig Physician") // Special shoes for sec and brig phys, roll first to avoid defaulting
- shoes = alt_shoes_s
- else if(IS_ENGINEERING(H)) // Now engineers and miners get their department specific shoes, rather than generic ones.
- shoes = alt_shoes_e
- else if(find_job(H) == "Shaft Miner")
- shoes = alt_shoes_ca
- else if(find_job(H) == "Mining Medic")
- shoes = alt_shoes_m
+
+ if((DIGITIGRADE in H.dna.species.species_traits) && digitigrade_shoes)
+ shoes = digitigrade_shoes
/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
@@ -278,10 +268,7 @@
C.assignment = H.mind.role_alt_title
else
C.assignment = J.title
- if(H.mind?.assigned_role)
- C.originalassignment = H.mind.assigned_role
- else
- C.originalassignment = J.title
+ C.originalassignment = J.title
if(H.age)
C.registered_age = H.age
C.update_label()
diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm
index caa631b92d8a..bab00b284e3e 100644
--- a/code/modules/jobs/job_types/atmospheric_technician.dm
+++ b/code/modules/jobs/job_types/atmospheric_technician.dm
@@ -39,6 +39,7 @@
belt = /obj/item/storage/belt/utility/atmostech
ears = /obj/item/radio/headset/headset_eng
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/engineering
uniform = /obj/item/clothing/under/rank/atmospheric_technician
uniform_skirt = /obj/item/clothing/under/rank/atmospheric_technician/skirt
r_pocket = /obj/item/analyzer
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index ea7af7bf7931..dd5753b08fe4 100755
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -49,6 +49,7 @@
uniform_skirt = /obj/item/clothing/under/rank/captain/skirt
suit = /obj/item/clothing/suit/armor/vest/capcarapace
shoes = /obj/item/clothing/shoes/sneakers/brown
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/command
head = /obj/item/clothing/head/caphat
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/station_charter=1, /obj/item/gun/energy/e_gun=1, /obj/item/modular_computer/tablet/phone/preset/advanced/command=1) //yogs - adds egun/removes civ budget
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index 98ebcd319395..f1cb874cbe7c 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -44,9 +44,9 @@
uniform = /obj/item/clothing/under/rank/chief_engineer
uniform_skirt = /obj/item/clothing/under/rank/chief_engineer/skirt
shoes = /obj/item/clothing/shoes/sneakers/brown
- alt_shoes = /obj/item/clothing/shoes/xeno_wraps/command // Provides Command shoes to digitigrade species
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/command
head = /obj/item/clothing/head/hardhat/white
- gloves = /obj/item/clothing/gloves/color/black/ce
+ gloves = /obj/item/clothing/gloves/color/black
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/phone/preset/advanced/command/atmos=1) //yogs - removes eng budget
glasses = /obj/item/clothing/glasses/meson/sunglasses
diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm
index 1e7d35b8760b..ca224c820c02 100644
--- a/code/modules/jobs/job_types/chief_medical_officer.dm
+++ b/code/modules/jobs/job_types/chief_medical_officer.dm
@@ -47,7 +47,7 @@
uniform = /obj/item/clothing/under/rank/chief_medical_officer
uniform_skirt = /obj/item/clothing/under/rank/chief_medical_officer/skirt
shoes = /obj/item/clothing/shoes/sneakers/brown
- alt_shoes = /obj/item/clothing/shoes/xeno_wraps/command // Provides Command shoes to digitigrade species
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/command
suit = /obj/item/clothing/suit/toggle/labcoat/cmo
l_hand = /obj/item/storage/firstaid/medical
suit_store = /obj/item/flashlight/pen/paramedic
diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm
index 303bad9936bf..3f05e98f36b0 100644
--- a/code/modules/jobs/job_types/detective.dm
+++ b/code/modules/jobs/job_types/detective.dm
@@ -47,6 +47,7 @@
uniform_skirt = /obj/item/clothing/under/rank/det/skirt
neck = /obj/item/clothing/neck/tie/detective
shoes = /obj/item/clothing/shoes/sneakers/brown
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/jackboots
suit = /obj/item/clothing/suit/det_suit
gloves = /obj/item/clothing/gloves/color/black/forensic
head = /obj/item/clothing/head/fedora/det_hat
diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm
index 4c485d68ac9d..f8cb701dc1ce 100644
--- a/code/modules/jobs/job_types/head_of_personnel.dm
+++ b/code/modules/jobs/job_types/head_of_personnel.dm
@@ -55,6 +55,7 @@
uniform = /obj/item/clothing/under/rank/head_of_personnel
uniform_skirt = /obj/item/clothing/under/rank/head_of_personnel/skirt
shoes = /obj/item/clothing/shoes/sneakers/brown
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/command
head = /obj/item/clothing/head/hopcap
backpack_contents = list(/obj/item/storage/box/ids=1,\
/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/phone/preset/advanced/command=1) //yogs - removes serv budget
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index 509b5150224c..ba91d38f13bd 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -51,9 +51,9 @@
uniform = /obj/item/clothing/under/rank/head_of_security
uniform_skirt = /obj/item/clothing/under/rank/head_of_security/skirt
shoes = /obj/item/clothing/shoes/jackboots
- alt_shoes = /obj/item/clothing/shoes/xeno_wraps/jackboots // Provides Command shoes to digitigrade species
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/jackboots
suit = /obj/item/clothing/suit/armor/hos/trenchcoat
- gloves = /obj/item/clothing/gloves/color/black/hos
+ gloves = /obj/item/clothing/gloves/color/black
head = /obj/item/clothing/head/HoS/beret
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
suit_store = /obj/item/gun/energy/e_gun
diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm
index edea5b86ea19..4a1e2044d7e3 100644
--- a/code/modules/jobs/job_types/research_director.dm
+++ b/code/modules/jobs/job_types/research_director.dm
@@ -52,7 +52,7 @@
uniform = /obj/item/clothing/under/rank/research_director
uniform_skirt = /obj/item/clothing/under/rank/research_director/skirt
shoes = /obj/item/clothing/shoes/sneakers/brown
- alt_shoes = /obj/item/clothing/shoes/xeno_wraps/command // Provides Command shoes to digitigrade species
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/command
suit = /obj/item/clothing/suit/toggle/labcoat
l_hand = /obj/item/clipboard
l_pocket = /obj/item/laser_pointer
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index ca50a3384b9a..f81bfd71e423 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -147,6 +147,7 @@ GLOBAL_LIST_INIT(available_depts_sec, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICA
head = /obj/item/clothing/head/helmet/sec
suit = /obj/item/clothing/suit/armor/vest/alt
shoes = /obj/item/clothing/shoes/jackboots
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/jackboots
l_pocket = /obj/item/restraints/handcuffs
r_pocket = /obj/item/assembly/flash/handheld
suit_store = /obj/item/gun/energy/disabler
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index 700e715620d0..22537ff4708b 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -35,12 +35,14 @@
/datum/outfit/job/miner
name = "Shaft Miner"
+ var/static/gps_number = 1
jobtype = /datum/job/mining
pda_type = /obj/item/pda/shaftminer
ears = /obj/item/radio/headset/headset_cargo/mining
shoes = /obj/item/clothing/shoes/workboots/mining
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/cargo
gloves = /obj/item/clothing/gloves/color/black
uniform = /obj/item/clothing/under/rank/miner/lavaland
neck = /obj/item/clothing/neck/bodycam/miner
@@ -59,6 +61,16 @@
chameleon_extras = /obj/item/gun/energy/kinetic_accelerator
+/datum/outfit/job/miner/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ ..()
+ if(visualsOnly)
+ return
+ if(H.stat == DEAD)
+ return
+ for(var/obj/item/gps/G in H.contents)
+ G.gpstag = "MINE[gps_number]"
+ gps_number ++
+
/datum/outfit/job/miner/equipped
name = "Shaft Miner (Equipment)"
suit = /obj/item/clothing/suit/hooded/explorer
diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm
index f6c7bc09cdad..ce70670ea03c 100644
--- a/code/modules/jobs/job_types/station_engineer.dm
+++ b/code/modules/jobs/job_types/station_engineer.dm
@@ -98,6 +98,7 @@ GLOBAL_LIST_INIT(available_depts_eng, list(ENG_DEPT_MEDICAL, ENG_DEPT_SCIENCE, E
uniform = /obj/item/clothing/under/rank/engineer
uniform_skirt = /obj/item/clothing/under/rank/engineer/skirt
shoes = /obj/item/clothing/shoes/workboots
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/engineering
head = /obj/item/clothing/head/hardhat
r_pocket = /obj/item/t_scanner
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index f8b5e127017d..cb41dd5b5af5 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -50,6 +50,7 @@
uniform = /obj/item/clothing/under/rank/warden
uniform_skirt = /obj/item/clothing/under/rank/warden/skirt
shoes = /obj/item/clothing/shoes/jackboots
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/jackboots
suit = /obj/item/clothing/suit/armor/vest/warden/alt
gloves = /obj/item/clothing/gloves/color/black
head = /obj/item/clothing/head/warden
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 5dad1f5e2b0e..aa2151d0dd51 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -13,7 +13,7 @@
flags_prot = HIDEJUMPSUIT
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, WOUND = 10)
- 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)
+ 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, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
resistance_flags = FIRE_PROOF
mutantrace_variation = MUTANTRACE_VARIATION
@@ -88,7 +88,7 @@
resistance_flags = FIRE_PROOF | LAVA_PROOF
slowdown = 0
armor = list(MELEE = 75, BULLET = 40, LASER = 40, ENERGY = 40, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100)
- 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)
+ 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, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
/obj/item/clothing/suit/space/hostile_environment/Initialize()
. = ..()
@@ -134,6 +134,6 @@
/obj/item/clothing/head/helmet/space/hostile_environment/worn_overlays(isinhands)
. = ..()
if(!isinhands)
- var/mutable_appearance/M = mutable_appearance('icons/mob/head.dmi', "hostile_env_glass")
+ var/mutable_appearance/M = mutable_appearance(mob_overlay_icon, "hostile_env_glass")
M.appearance_flags = RESET_COLOR
. += M
diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm
index 603524253f60..9bf227c55348 100644
--- a/code/modules/mining/equipment/resonator.dm
+++ b/code/modules/mining/equipment/resonator.dm
@@ -121,5 +121,5 @@
if(!istype(M) || !M.mineralType) // so we don't end up in the ultimate chain reaction
return
for(var/turf/closed/mineral/T in orange(1, M))
- if(istype(T) && M.mineralType == T.mineralType)
+ if(istype(T) && !locate(/obj/effect/temp_visual/resonance) in T && M.mineralType == T.mineralType)
new /obj/effect/temp_visual/resonance(T, creator, null, duration) //yogs end
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index f9176b770007..2e3617c5fe58 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -580,12 +580,86 @@ GLOBAL_LIST_EMPTY(bloodmen_list)
righthand_file = 'yogstation/icons/mob/inhands/weapons/scimmy_righthand.dmi'
icon = 'yogstation/icons/obj/lavaland/artefacts.dmi'
icon_state = "rune_scimmy"
- force = 28
+ force = 20
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
damtype = BRUTE
sharpness = SHARP_EDGED
hitsound = 'yogstation/sound/weapons/rs_slash.ogg'
attack_verb = list("slashed","pk'd","atk'd")
+ var/mobs_grinded = 0
+ var/max_grind = 20
+
+/obj/item/rune_scimmy/examine(mob/living/user)
+ . = ..()
+ . += span_notice("This blade fills you with a need to 'grind'. Slay hostile fauna to increase the Scimmy's power and earn loot.")
+ . += span_notice("The blade has grinded [mobs_grinded] out of [max_grind] fauna to reach maximum power, and will deal [mobs_grinded * 5] bonus damage to fauna.")
+
+/obj/item/rune_scimmy/afterattack(atom/target, mob/user, proximity, click_parameters)
+ . = ..()
+ if(!proximity)
+ return
+ if(isliving(target))
+ var/mob/living/L = target
+ if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid)) //no loot allowed from the little skulls
+ if(!istype(L, /mob/living/simple_animal/hostile/asteroid/hivelordbrood))
+ RegisterSignal(target,COMSIG_MOB_DEATH,.proc/roll_loot, TRUE)
+ //after quite a bit of grinding, you'll be doing a total of 120 damage to fauna per hit. A lot, but i feel like the grind justifies the payoff. also this doesn't effect crew. so. go nuts.
+ L.apply_damage(mobs_grinded*5,BRUTE)
+
+///This proc handles rolling the loot on the loot table and "drops" the loot where the hostile fauna died
+/obj/item/rune_scimmy/proc/roll_loot(mob/living/target)
+ UnregisterSignal(target, COMSIG_MOB_DEATH)
+ if(mobs_grinded world.time)
+ to_chat(user, span_warning("You can't do that yet!"))
+ return
+ user.visible_message(span_warning("[user] splashes blood from the knuckles!"))
+ playsound(T, 'sound/effects/splat.ogg', 80, 5, -1)
+ for(var/i = 0 to splash_range)
+ if(T)
+ new /obj/effect/decal/cleanable/blood(T)
+ T = get_step(T,user.dir)
+ next_splash = world.time + COOLDOWN
+
/obj/item/melee/knuckles/ui_action_click(mob/living/user, action)
var/mob/living/U = user
if(istype(action, /datum/action/item_action/reach))
@@ -1178,6 +1266,8 @@ GLOBAL_LIST_EMPTY(bloodmen_list)
return
var/valid_reaching = FALSE
for(var/mob/living/L in view(7, U))
+ if(L == U)
+ continue
for(var/obj/effect/decal/cleanable/B in range(0,L))
if(istype(B, /obj/effect/decal/cleanable/blood )|| istype(B, /obj/effect/decal/cleanable/trail_holder))
valid_reaching = TRUE
@@ -1577,15 +1667,15 @@ GLOBAL_LIST_EMPTY(bloodmen_list)
/obj/item/organ/grandcore/Remove(mob/living/carbon/H, special = 0)
H.faction -= "blooded"
- H.RemoveSpell (/obj/effect/proc_holder/spell/targeted/touch/raise, /obj/effect/proc_holder/spell/aoe_turf/horde)
- H.RemoveSpell (new /obj/effect/proc_holder/spell/aoe_turf/horde)
+ H.RemoveSpell (/obj/effect/proc_holder/spell/targeted/touch/raise)
+ H.RemoveSpell (/obj/effect/proc_holder/spell/aoe_turf/horde)
..()
/datum/action/item_action/organ_action/threebloodlings
name = "Summon bloodlings"
- desc = "Summon a conjure a few bloodlings at the cost of 13% blood (8 brain damage for those without blood)."
+ desc = "Summon a conjure a few bloodlings at the cost of 6% blood or 8 brain damage for races without blood."
var/next_expulsion = 0
- var/cooldown = 10 //wheres the risk if it has a reasonable cooldown?
+ var/cooldown = 10
/datum/action/item_action/organ_action/threebloodlings/Trigger()
var/mob/living/carbon/H = owner
@@ -1598,6 +1688,6 @@ GLOBAL_LIST_EMPTY(bloodmen_list)
to_chat(H, "Your head pounds as you produce bloodlings!")
else
to_chat(H, "You spill your blood, and it comes to life as bloodlings!")
- H.blood_volume -= 70 //like 13% of your blood taken
+ H.blood_volume -= 35
spawn_atom_to_turf(/mob/living/simple_animal/hostile/asteroid/hivelordbrood/bloodling, owner, 3, TRUE) //think 1 in 4 is a good chance of not being targeted by fauna
next_expulsion = world.time + cooldown
diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm
index ba48f2d4d4cc..5be5fd20f645 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -1010,7 +1010,7 @@
// Underwear Definitions //
///////////////////////////
/datum/sprite_accessory/underwear
- icon = 'icons/mob/underwear.dmi'
+ icon = 'icons/mob/clothing/sprite_accessories/underwear.dmi'
/datum/sprite_accessory/underwear/nude
name = "Nude"
@@ -1212,7 +1212,7 @@
////////////////////////////
/datum/sprite_accessory/undershirt
- icon = 'icons/mob/underwear.dmi'
+ icon = 'icons/mob/clothing/sprite_accessories/undershirt.dmi'
/datum/sprite_accessory/undershirt/nude
name = "Nude"
@@ -1496,7 +1496,7 @@
///////////////////////
/datum/sprite_accessory/socks
- icon = 'icons/mob/underwear.dmi'
+ icon = 'icons/mob/clothing/sprite_accessories/socks.dmi'
/datum/sprite_accessory/socks/nude
name = "Nude"
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index 705381e6b8bb..256f7cdb2864 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -59,16 +59,19 @@
/mob/living/carbon/alien/humanoid/update_inv_handcuffed()
remove_overlay(HANDCUFF_LAYER)
- var/cuff_icon = "aliencuff"
- var/dmi_file = 'icons/mob/alien.dmi'
-
- if(mob_size == MOB_SIZE_LARGE)
- cuff_icon = "aliencuff_[caste]"
- dmi_file = 'icons/mob/alienqueen.dmi'
if(handcuffed)
- overlays_standing[HANDCUFF_LAYER] = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER)
- apply_overlay(HANDCUFF_LAYER)
+ var/cuff_icon = handcuffed.item_state
+ var/dmi_file = 'icons/mob/alien.dmi'
+
+ if(mob_size == MOB_SIZE_LARGE)
+ cuff_icon += "_[caste]"
+ dmi_file = 'icons/mob/alienqueen.dmi'
+
+ var/mutable_appearance/cuffs = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER)
+ cuffs.color = handcuffed.color
+
+ overlays_standing[HANDCUFF_LAYER] = cuffs
//Royals have bigger sprites, so inhand things must be handled differently.
/mob/living/carbon/alien/humanoid/royal/update_inv_hands()
@@ -91,4 +94,4 @@
hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER)
overlays_standing[HANDS_LAYER] = hands
- apply_overlay(HANDS_LAYER)
\ No newline at end of file
+ apply_overlay(HANDS_LAYER)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 438e4d107d1f..94b3d3eba86a 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -187,6 +187,7 @@
else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP))
thrown_thing = I
+ SEND_SIGNAL(thrown_thing, COMSIG_MOVABLE_PRE_DROPTHROW, src)
dropItemToGround(I, silent = TRUE)
if(HAS_TRAIT(src, TRAIT_PACIFISM) && I.throwforce)
@@ -497,8 +498,8 @@
return 0
return ..()
-/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE)
- if(HAS_TRAIT(src, TRAIT_NOHUNGER))
+/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1)
+ if((HAS_TRAIT(src, TRAIT_NOHUNGER) || HAS_TRAIT(src, TRAIT_TOXINLOVER)) && !force)
return TRUE
if(istype(src.loc, /obj/effect/dummy)) //cannot vomit while phasing/vomitcrawling
@@ -538,12 +539,9 @@
add_splatter_floor(T)
if(stun)
adjustBruteLoss(3)
- else if(src.reagents.has_reagent(/datum/reagent/consumable/ethanol/blazaam, needs_metabolizing = TRUE))
- if(T)
- T.add_vomit_floor(src, VOMIT_PURPLE)
else
if(T)
- T.add_vomit_floor(src, VOMIT_TOXIC)//toxic barf looks different
+ T.add_vomit_floor(src, vomit_type, purge_ratio) //toxic barf looks different || call purge when doing detoxicfication to pump more chems out of the stomach.
T = get_step(T, dir)
if (is_blocked_turf(T))
break
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index c989ec52a3fe..55867c347356 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -5,13 +5,23 @@
hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD)
has_limbs = 1
held_items = list(null, null)
- var/list/internal_organs = list() //List of /obj/item/organ in the mob. They don't go in the contents for some reason I don't want to know.
- var/list/internal_organs_slot= list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
- var/silent = FALSE //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
- var/dreaming = 0 //How many dream images we have left to send
-
- var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
- var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
+ /// List of /obj/item/organ in the mob.
+ /// They don't go in the contents for some reason I don't want to know.
+ var/list/internal_organs = list()
+ /// List of /obj/item/organ in the mob by slot ID for easy access.
+ /// They don't go in the contents for some reason I don't want to know.
+ var/list/internal_organs_slot= list()
+
+ /// Can't talk. Value goes down every life proc.
+ /// NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
+ var/silent = FALSE
+ /// How many dream images we have left to send
+ var/dreaming = 0
+
+ /// A reference to the current handcuff on this carbon if one is equipped.
+ var/obj/item/restraints/handcuffed = null
+ /// A reference to the current legcuff on this carbon if one is equipped. Bear traps use this.
+ var/obj/item/restraints/legcuffed = null
var/disgust = 0
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 75a3cb178ae5..f80c6c2b1939 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -78,6 +78,15 @@
msg += "[t_He] [t_is] moderately deformed!\n"
else
msg += "[t_He] [t_is] severely deformed!\n"
+
+ if(surgeries.len)
+ var/surgery_text
+ for(var/datum/surgery/S in surgeries)
+ if(!surgery_text)
+ surgery_text = "[t_He] [t_is] being operated on in \the [S.operated_bodypart]"
+ else
+ surgery_text += ", [S.operated_bodypart]"
+ msg += "[surgery_text].\n"
if(HAS_TRAIT(src, TRAIT_DUMB))
msg += "[t_He] seem[p_s()] to be clumsy and unable to think.\n"
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 324beccad878..60a34b30803d 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -206,7 +206,15 @@
msg += "[t_He] [t_has] moderate cellular damage!\n"
else
msg += "[t_He] [t_has] severe cellular damage!\n"
-
+
+ if(surgeries.len)
+ var/surgery_text
+ for(var/datum/surgery/S in surgeries)
+ if(!surgery_text)
+ surgery_text = "[t_He] [t_is] being operated on in \the [S.operated_bodypart]"
+ else
+ surgery_text += ", [S.operated_bodypart]"
+ msg += "[surgery_text].\n"
if(fire_stacks > 0)
msg += "[t_He] [t_is] covered in something flammable.\n"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 5bb356837e3e..85fc9056735c 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -627,7 +627,7 @@
return
src.visible_message("[src] performs CPR on [C.name]!", span_notice("You perform CPR on [C.name]."))
- SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "perform_cpr", /datum/mood_event/perform_cpr)
+ SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "saved_life", /datum/mood_event/saved_life)
C.cpr_time = world.time
log_combat(src, C, "CPRed")
SSachievements.unlock_achievement(/datum/achievement/cpr, client)
@@ -869,8 +869,8 @@
override = dna.species.override_float
..()
-/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = 0, stun = 1, distance = 0, message = 1, toxic = 0)
- if(blood && (NOBLOOD in dna.species.species_traits))
+/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1)
+ if(blood && (NOBLOOD in dna.species.species_traits) && !HAS_TRAIT(src, TRAIT_TOXINLOVER))
if(message)
visible_message(span_warning("[src] dry heaves!"), \
span_userdanger("You try to throw up, but there's nothing in your stomach!"))
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index b329ff9fcfcd..4dbb0d58a909 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -178,6 +178,8 @@
return TRUE
if(isclothing(wear_mask) && (wear_mask.clothing_flags & SCAN_REAGENTS))
return TRUE
+ if(HAS_TRAIT(src, TRAIT_SEE_REAGENTS))
+ return TRUE
/// When we're joining the game in [/mob/dead/new_player/proc/create_character], we increment our scar slot then store the slot in our mind datum.
/mob/living/carbon/human/proc/increment_scar_slot()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index a685a17423ce..3eca7a5c4d9a 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -286,7 +286,7 @@
if(getToxLoss() >= 45 && nutrition > 20)
lastpuke += prob(50)
if(lastpuke >= 50) // about 25 second delay I guess
- vomit(20, toxic = TRUE)
+ vomit(20)
lastpuke = 0
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index 4267667cac86..e069593fe10b 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -21,6 +21,7 @@ DISREGUARD THIS FILE IF YOU'RE INTENDING TO CHANGE ASPECTS OF PLAYER CONTROLLED
punchstunthreshold = 9 //TF2 no-crits special
payday_modifier = 0.7 //Neutrally viewed by NT
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/plant
+ exotic_blood = /datum/reagent/water
disliked_food = MEAT | DAIRY | SEAFOOD | MICE
liked_food = VEGETABLES | FRUIT | GRAIN
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 4d986a5ea931..dbb652e4f475 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -8,8 +8,8 @@
sexes = 0
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
- species_traits = list(NOBLOOD,NOEYESPRITES,NOFLASH)
- inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH)
+ species_traits = list(NOBLOOD,NOEYESPRITES,NOFLASH,)
+ inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH,TRAIT_GENELESS)
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC
mutanteyes = /obj/item/organ/eyes/night_vision
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index af62aa221bfc..99684c3c2c54 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -115,26 +115,23 @@ There are several things that need to be remembered:
if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT))
return
-
- var/t_color = U.item_color
- if(!t_color)
- t_color = U.icon_state
+ var/target_overlay = U.icon_state
if(U.adjusted == ALT_STYLE)
- t_color = "[t_color]_d"
+ target_overlay = "[target_overlay]_d"
else if(U.adjusted == DIGITIGRADE_STYLE)
- t_color = "[t_color]_l"
+ target_overlay = "[target_overlay]_l"
else if(U.adjusted == DIGIALT_STYLE) //Yogs Start: Handles when you are using an alternate style while having digi legs
- t_color = "[t_color]_d_l" //Yogs End
+ target_overlay = "[target_overlay]_d_l" //Yogs End
var/mutable_appearance/uniform_overlay
if(dna && dna.species.sexes)
var/G = (gender == FEMALE) ? "f" : "m"
if(G == "f" && U.fitted != NO_FEMALE_UNIFORM)
- uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE, femaleuniform = U.fitted)
+ uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/clothing/uniform/uniform.dmi', isinhands = FALSE, femaleuniform = U.fitted, override_state = target_overlay)
if(!uniform_overlay)
- uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/uniform.dmi', isinhands = FALSE)
+ uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/clothing/uniform/uniform.dmi', isinhands = FALSE, override_state = target_overlay)
if(OFFSET_UNIFORM in dna.species.offset_features)
@@ -162,7 +159,7 @@ There are several things that need to be remembered:
update_observer_view(wear_id)
//TODO: add an icon file for ID slot stuff, so it's less snowflakey
- id_overlay = wear_id.build_worn_icon(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi')
+ id_overlay = wear_id.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/clothing/id/id.dmi')
if(OFFSET_ID in dna.species.offset_features)
id_overlay.pixel_x += dna.species.offset_features[OFFSET_ID][1]
id_overlay.pixel_y += dna.species.offset_features[OFFSET_ID][2]
@@ -195,10 +192,7 @@ There are several things that need to be remembered:
if(hud_used.inventory_shown)
client.screen += gloves
update_observer_view(gloves,1)
- var/t_state = gloves.item_state
- if(!t_state)
- t_state = gloves.icon_state
- overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(state = t_state, default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/hands.dmi')
+ overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/clothing/hands/hands.dmi')
gloves_overlay = overlays_standing[GLOVES_LAYER]
if(OFFSET_GLOVES in dna.species.offset_features)
gloves_overlay.pixel_x += dna.species.offset_features[OFFSET_GLOVES][1]
@@ -224,7 +218,7 @@ There are several things that need to be remembered:
client.screen += glasses //Either way, add the item to the HUD
update_observer_view(glasses,1)
if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES)))
- overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/eyes.dmi')
+ overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/clothing/eyes/eyes.dmi')
var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER]
if(glasses_overlay)
@@ -251,8 +245,7 @@ There are several things that need to be remembered:
if(hud_used.inventory_shown) //if the inventory is open
client.screen += ears //add it to the client's screen
update_observer_view(ears,1)
-
- overlays_standing[EARS_LAYER] = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi')
+ overlays_standing[EARS_LAYER] = ears.build_worn_icon(default_layer = EARS_LAYER, default_icon_file = 'icons/mob/clothing/ears/ears.dmi')
var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER]
if(OFFSET_EARS in dna.species.offset_features)
ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1]
@@ -260,6 +253,27 @@ There are several things that need to be remembered:
overlays_standing[EARS_LAYER] = ears_overlay
apply_overlay(EARS_LAYER)
+/mob/living/carbon/human/update_inv_neck()
+ remove_overlay(NECK_LAYER)
+
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_NECK]
+ inv.update_icon()
+
+ if(wear_neck)
+ wear_neck.screen_loc = ui_neck
+ if(client && hud_used && hud_used.hud_shown)
+ if(hud_used.inventory_shown) //if the inventory is open
+ client.screen += wear_neck //add it to the client's screen
+ update_observer_view(wear_neck,1)
+ if(!(ITEM_SLOT_NECK in check_obscured_slots()))
+ overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = 'icons/mob/clothing/neck/neck.dmi')
+ var/mutable_appearance/neck_overlay = overlays_standing[NECK_LAYER]
+ if(OFFSET_NECK in dna.species.offset_features)
+ neck_overlay.pixel_x += dna.species.offset_features[OFFSET_NECK][1]
+ neck_overlay.pixel_y += dna.species.offset_features[OFFSET_NECK][2]
+ overlays_standing[NECK_LAYER] = neck_overlay
+ apply_overlay(NECK_LAYER)
/mob/living/carbon/human/update_inv_shoes()
remove_overlay(SHOES_LAYER)
@@ -272,17 +286,17 @@ There are several things that need to be remembered:
inv.update_icon()
if(shoes)
+ var/target_overlay = shoes.icon_state
+ if(istype(shoes, /obj/item/clothing/shoes))
+ var/obj/item/clothing/shoes/S = shoes
+ if(S.adjusted == DIGITIGRADE_STYLE)
+ target_overlay = "[target_overlay]_l"
shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc
- var/obj/item/clothing/shoes/S = shoes
- var/worn_shoes_icon = S.icon_state
- if(S.adjusted == DIGITIGRADE_STYLE)
- worn_shoes_icon = "[S.icon_state]_l" // Sets digitgrade version of a shoe if it has it
-
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown) //if the inventory is open
client.screen += shoes //add it to client's screen
update_observer_view(shoes,1)
- overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(state = worn_shoes_icon, default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/feet.dmi')
+ overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/clothing/feet/feet.dmi', override_state = target_overlay)
var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER]
if(OFFSET_SHOES in dna.species.offset_features)
shoes_overlay.pixel_x += dna.species.offset_features[OFFSET_SHOES][1]
@@ -307,7 +321,7 @@ There are several things that need to be remembered:
var/t_state = s_store.item_state
if(!t_state)
t_state = s_store.icon_state
- overlays_standing[SUIT_STORE_LAYER] = mutable_appearance('icons/mob/belt_mirror.dmi', t_state, -SUIT_STORE_LAYER)
+ overlays_standing[SUIT_STORE_LAYER] = mutable_appearance('icons/mob/clothing/suit_storage.dmi', t_state, -SUIT_STORE_LAYER)
var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_STORE_LAYER]
if(OFFSET_S_STORE in dna.species.offset_features)
s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1]
@@ -319,6 +333,9 @@ There are several things that need to be remembered:
/mob/living/carbon/human/update_inv_head()
..()
update_mutant_bodyparts()
+ if(head)
+ update_hud_head(head)
+ overlays_standing[HEAD_LAYER] = head.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/clothing/head/head.dmi')
var/mutable_appearance/head_overlay = overlays_standing[HEAD_LAYER]
if(head_overlay)
remove_overlay(HEAD_LAYER)
@@ -340,12 +357,7 @@ There are several things that need to be remembered:
if(client && hud_used && hud_used.hud_shown)
client.screen += belt
update_observer_view(belt)
-
- var/t_state = belt.item_state
- if(!t_state)
- t_state = belt.icon_state
-
- overlays_standing[BELT_LAYER] = belt.build_worn_icon(state = t_state, default_layer = BELT_LAYER, default_icon_file = 'icons/mob/belt.dmi')
+ overlays_standing[BELT_LAYER] = belt.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = 'icons/mob/clothing/belt.dmi')
var/mutable_appearance/belt_overlay = overlays_standing[BELT_LAYER]
if(OFFSET_BELT in dna.species.offset_features)
belt_overlay.pixel_x += dna.species.offset_features[OFFSET_BELT][1]
@@ -363,23 +375,18 @@ There are several things that need to be remembered:
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT]
inv.update_icon()
- if(istype(wear_suit, /obj/item/clothing/suit))
+ if(istype(wear_suit, /obj/item))
wear_suit.screen_loc = ui_oclothing
- var/obj/item/clothing/suit/S = wear_suit
- var/worn_suit_icon = S.icon_state
- if(S.adjusted == DIGITIGRADE_STYLE)
- worn_suit_icon = "[wear_suit.icon_state]_l" // Checks for digitgrade version of a suit if it has it
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown)
client.screen += wear_suit
- update_observer_view(wear_suit,1)
-
- overlays_standing[SUIT_LAYER] = wear_suit.build_worn_icon(state = worn_suit_icon, default_layer = SUIT_LAYER, default_icon_file = 'icons/mob/suit.dmi')
+ overlays_standing[SUIT_LAYER] = wear_suit.build_worn_icon(default_layer = SUIT_LAYER, default_icon_file = 'icons/mob/clothing/suit/suit.dmi')
var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER]
if(OFFSET_SUIT in dna.species.offset_features)
suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1]
suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2]
- overlays_standing[SUIT_LAYER] = suit_overlay
+ overlays_standing[SUIT_LAYER] = suit_overlay
+ update_observer_view(wear_suit,1)
update_hair()
update_mutant_bodyparts()
@@ -410,36 +417,47 @@ There are several things that need to be remembered:
/mob/living/carbon/human/update_inv_wear_mask()
- ..()
- var/mutable_appearance/mask_overlay = overlays_standing[FACEMASK_LAYER]
- if(mask_overlay)
- remove_overlay(FACEMASK_LAYER)
- if(OFFSET_FACEMASK in dna.species.offset_features)
- mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1]
- mask_overlay.pixel_y += dna.species.offset_features[OFFSET_FACEMASK][2]
- overlays_standing[FACEMASK_LAYER] = mask_overlay
+ remove_overlay(FACEMASK_LAYER)
+
+ if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated
+ return
+
+ if(client && hud_used)
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK]
+ inv.update_icon()
+
+ if(wear_mask)
+ update_hud_wear_mask(wear_mask)
+ overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/clothing/mask/mask.dmi')
+ var/mutable_appearance/mask_overlay = overlays_standing[FACEMASK_LAYER]
+ if(mask_overlay)
+ remove_overlay(FACEMASK_LAYER)
+ if(OFFSET_FACEMASK in dna.species.offset_features)
+ mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1]
+ mask_overlay.pixel_y += dna.species.offset_features[OFFSET_FACEMASK][2]
+ overlays_standing[FACEMASK_LAYER] = mask_overlay
apply_overlay(FACEMASK_LAYER)
update_mutant_bodyparts() //e.g. upgate needed because mask now hides lizard snout
/mob/living/carbon/human/update_inv_back()
- ..()
- var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER]
- if(back_overlay)
- remove_overlay(BACK_LAYER)
- if(OFFSET_BACK in dna.species.offset_features)
- back_overlay.pixel_x += dna.species.offset_features[OFFSET_BACK][1]
- back_overlay.pixel_y += dna.species.offset_features[OFFSET_BACK][2]
+ remove_overlay(BACK_LAYER)
+
+ if(client && hud_used && hud_used.inv_slots[SLOT_BACK])
+ var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BACK]
+ inv.update_icon()
+
+ if(back)
+ update_hud_back(back)
+ overlays_standing[BACK_LAYER] = back.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = 'icons/mob/clothing/back.dmi')
+ var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER]
+ if(back_overlay)
+ remove_overlay(BACK_LAYER)
+ if(OFFSET_BACK in dna.species.offset_features)
+ back_overlay.pixel_x += dna.species.offset_features[OFFSET_BACK][1]
+ back_overlay.pixel_y += dna.species.offset_features[OFFSET_BACK][2]
overlays_standing[BACK_LAYER] = back_overlay
apply_overlay(BACK_LAYER)
-/mob/living/carbon/human/update_inv_legcuffed()
- remove_overlay(LEGCUFF_LAYER)
- clear_alert("legcuffed")
- if(legcuffed)
- overlays_standing[LEGCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER)
- apply_overlay(LEGCUFF_LAYER)
- throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = src.legcuffed)
-
/proc/wear_female_version(t_color, icon, layer, type)
var/index = t_color
var/icon/female_clothing_icon = GLOB.female_clothing_icons[index]
@@ -514,7 +532,7 @@ default_layer: The layer to draw this on if no other layer is specified
default_icon_file: The icon file to draw states from if no other icon file is specified
-isinhands: If true then alternate_worn_icon is skipped so that default_icon_file is used,
+isinhands: If true then mob_overlay_icon is skipped so that default_icon_file is used,
in this situation default_icon_file is expected to match either the lefthand_ or righthand_ file var
femalueuniform: A value matching a uniform item's fitted var, if this is anything but NO_FEMALE_UNIFORM, we
@@ -522,12 +540,24 @@ generate/load female uniform sprites matching all previously decided variables
*/
-/obj/item/proc/build_worn_icon(var/state = "", var/default_layer = 0, var/default_icon_file = null, var/isinhands = FALSE, var/femaleuniform = NO_FEMALE_UNIFORM)
+/obj/item/proc/build_worn_icon(default_layer = 0, default_icon_file = null, isinhands = FALSE, femaleuniform = NO_FEMALE_UNIFORM, override_state = null)
+
+ var/t_state
+ if(override_state)
+ t_state = override_state
+ else
+ if(isinhands && item_state)
+ t_state = item_state
+ else
+ t_state = icon_state
+ var/t_icon = mob_overlay_icon
+ if(!t_icon)
+ t_icon = default_icon_file
//Find a valid icon file from variables+arguments
var/file2use
- if(!isinhands && alternate_worn_icon)
- file2use = alternate_worn_icon
+ if(!isinhands && mob_overlay_icon)
+ file2use = mob_overlay_icon
if(!file2use)
file2use = default_icon_file
@@ -542,12 +572,12 @@ generate/load female uniform sprites matching all previously decided variables
var/mutable_appearance/standing
if(femaleuniform)
if(HAS_TRAIT(H, TRAIT_SKINNY) && (H.underwear == "Nude"))
- standing = wear_skinny_version(state,file2use,layer2use,femaleuniform)
+ standing = wear_skinny_version(t_state, file2use, layer2use, femaleuniform)
else
- standing = wear_female_version(state,file2use,layer2use,femaleuniform)
+ standing = wear_female_version(t_state, file2use, layer2use, femaleuniform)
if(!standing)
- standing = mutable_appearance(file2use, state, -layer2use)
-
+ standing = mutable_appearance(file2use, t_state, -layer2use)
+
//Get the overlays for this item when it's being worn
//eg: ammo counters, primed grenade flashes, etc.
var/list/worn_overlays = worn_overlays(isinhands, file2use)
diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm
index 41d37a50217b..ed30724689dd 100644
--- a/code/modules/mob/living/carbon/monkey/update_icons.dm
+++ b/code/modules/mob/living/carbon/monkey/update_icons.dm
@@ -43,10 +43,15 @@
/mob/living/carbon/monkey/update_inv_legcuffed()
remove_overlay(LEGCUFF_LAYER)
+ clear_alert("legcuffed")
if(legcuffed)
- var/mutable_appearance/legcuff_overlay = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER)
- legcuff_overlay.pixel_y = 8
- overlays_standing[LEGCUFF_LAYER] = legcuff_overlay
+ var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER)
+ legcuffs.color = handcuffed.color
+ legcuffs.pixel_y = 8
+
+ overlays_standing[HANDCUFF_LAYER] = legcuffs
+ apply_overlay(LEGCUFF_LAYER)
+ throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
apply_overlay(LEGCUFF_LAYER)
@@ -74,4 +79,4 @@
/mob/living/carbon/monkey/update_hud_back(obj/item/I)
if(client && hud_used && hud_used.hud_shown)
I.screen_loc = ui_monkey_back
- client.screen += I
\ No newline at end of file
+ client.screen += I
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index 5dc538ee5cfa..287af24bf46c 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -77,7 +77,7 @@
if(get_held_index_of_item(I) % 2 == 0)
icon_file = I.righthand_file
- hands += I.build_worn_icon(state = t_state, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE)
+ hands += I.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE)
overlays_standing[HANDS_LAYER] = hands
apply_overlay(HANDS_LAYER)
@@ -121,7 +121,7 @@
if(wear_mask)
if(!(SLOT_WEAR_MASK in check_obscured_slots()))
- overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/mask.dmi')
+ overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/clothing/mask/mask.dmi')
update_hud_wear_mask(wear_mask)
apply_overlay(FACEMASK_LAYER)
@@ -135,7 +135,7 @@
if(wear_neck)
if(!(SLOT_NECK in check_obscured_slots()))
- overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = 'icons/mob/neck.dmi')
+ overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = 'icons/mob/clothing/neck/neck.dmi')
update_hud_neck(wear_neck)
apply_overlay(NECK_LAYER)
@@ -148,7 +148,7 @@
inv.update_icon()
if(back)
- overlays_standing[BACK_LAYER] = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = 'icons/mob/back.dmi')
+ overlays_standing[BACK_LAYER] = back.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = 'icons/mob/clothing/back.dmi')
update_hud_back(back)
apply_overlay(BACK_LAYER)
@@ -164,7 +164,7 @@
inv.update_icon()
if(head)
- overlays_standing[HEAD_LAYER] = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/head.dmi')
+ overlays_standing[HEAD_LAYER] = head.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/clothing/head/head.dmi')
update_hud_head(head)
apply_overlay(HEAD_LAYER)
@@ -173,9 +173,22 @@
/mob/living/carbon/update_inv_handcuffed()
remove_overlay(HANDCUFF_LAYER)
if(handcuffed)
- overlays_standing[HANDCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "handcuff1", -HANDCUFF_LAYER)
+ var/mutable_appearance/cuffs = mutable_appearance('icons/mob/restraints.dmi', handcuffed.item_state, -HANDCUFF_LAYER)
+ cuffs.color = handcuffed.color
+
+ overlays_standing[HANDCUFF_LAYER] = cuffs
apply_overlay(HANDCUFF_LAYER)
+/mob/living/carbon/update_inv_legcuffed()
+ remove_overlay(LEGCUFF_LAYER)
+ clear_alert("legcuffed")
+ if(legcuffed)
+ var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER)
+ legcuffs.color = handcuffed.color
+
+ overlays_standing[HANDCUFF_LAYER] = legcuffs
+ apply_overlay(LEGCUFF_LAYER)
+ throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
//mob HUD updates for items in our inventory
diff --git a/code/modules/mob/living/inhand_holder.dm b/code/modules/mob/living/inhand_holder.dm
index 0a73fdeb0303..6d3f2b90a30b 100644
--- a/code/modules/mob/living/inhand_holder.dm
+++ b/code/modules/mob/living/inhand_holder.dm
@@ -15,12 +15,6 @@
. = ..()
if(weight > MOB_SIZE_SMALL)
w_class = weight + 2 // rough conversion
- if(clothing_layer)
- alternate_worn_layer = clothing_layer
- if(held_icon)
- alternate_worn_icon = held_icon
- if(worn_state)
- item_state = worn_state
if(lh_icon)
lefthand_file = lh_icon
if(rh_icon)
@@ -83,6 +77,13 @@
/obj/item/clothing/mob_holder/container_resist()
release()
+/obj/item/clothing/mob_holder/pre_attack(atom/A, mob/living/user, params)
+ if(isobj(A) && ismachinery(A))
+ if(istype(A, /obj/machinery/deepfryer))
+ to_chat(user, span_warning("You wouldn't deepfry [name]....."))
+ return
+ . = ..()
+
/obj/item/clothing/mob_holder/drone/deposit(mob/living/L)
. = ..()
if(!isdrone(L))
@@ -112,4 +113,4 @@
held_mob = null
if(del_on_release && !destroying)
qdel(src)
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 07410fe5b7f6..6e08540bbaa4 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -533,7 +533,8 @@
livingdoll.filtered = TRUE
var/icon/mob_mask = icon(icon, icon_state)
if(mob_mask.Height() > world.icon_size || mob_mask.Width() > world.icon_size)
- mob_mask = icon('icons/mob/screen_gen.dmi', "megasprite") //swap to something that fits if they wont
+ var/health_doll_icon_state = health_doll_icon ? health_doll_icon : "megasprite"
+ mob_mask = icon('icons/mob/screen_gen.dmi', health_doll_icon_state) //swap to something generic if they have no special doll
UNLINT(livingdoll.filters += filter(type="alpha", icon = mob_mask))
livingdoll.filters += filter(type="drop_shadow", size = -1)
if(severity > 0)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index ab75a5c65977..df52c8a0f576 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -73,6 +73,8 @@
var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob.
+ var/health_doll_icon //if this exists AND the normal sprite is bigger than 32x32, this is the replacement icon state (because health doll size limitations). the icon will always be screen_gen.dmi
+
var/bubble_icon = "default" //what icon the mob uses for speechbubbles
var/last_bumped = 0
diff --git a/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm b/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm
index 763eb34c7792..617dbcf3773b 100644
--- a/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm
+++ b/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm
@@ -13,6 +13,8 @@ GLOBAL_VAR_INIT(primary_data_core, null)
idle_power_usage = 1000
use_power = IDLE_POWER_USE
+ critical_machine = TRUE
+
var/primary = FALSE
var/valid_ticks = MAX_AI_DATA_CORE_TICKS //Limited to MAX_AI_DATA_CORE_TICKS. Decrement by 1 every time we have an invalid tick, opposite when valid
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index e1ea21f51d55..fbbf8491bf89 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -687,7 +687,7 @@
else
add_overlay("ov-opencover -c")
if(hat)
- var/mutable_appearance/head_overlay = hat.build_worn_icon(state = hat.icon_state, default_layer = 20, default_icon_file = 'icons/mob/head.dmi')
+ var/mutable_appearance/head_overlay = hat.build_worn_icon(default_layer = 20, default_icon_file = 'icons/mob/clothing/head/head.dmi')
head_overlay.pixel_y += hat_offset
add_overlay(head_overlay)
update_fire()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index f1562c7ec604..df152897a3fa 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -648,8 +648,7 @@
/obj/item/bonesetter,
/obj/item/melee/transforming/energy/sword/cyborg/saw,
/obj/item/roller/robo,
- /obj/item/card/emag,
- /obj/item/crowbar/cyborg,
+ /obj/item/restraints/handcuffs/cable/zipties,
/obj/item/extinguisher/mini,
/obj/item/pinpointer/syndicate_cyborg,
/obj/item/stack/medical/gauze/cyborg,
@@ -668,6 +667,7 @@
name = "Syndicate Saboteur"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
+ /obj/item/kitchen/knife/combat/cyborg,
/obj/item/borg/sight/thermal,
/obj/item/construction/rcd/borg/syndicate,
/obj/item/pipe_dispenser,
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index 17d7530c2971..d7bc536a4768 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -85,7 +85,7 @@
uniform = /obj/item/clothing/under/pirate
shoes = /obj/item/clothing/shoes/jackboots
glasses = /obj/item/clothing/glasses/eyepatch
- head = /obj/item/clothing/head/bandana
+ head = /obj/item/clothing/head/pirate/bandana
/obj/effect/mob_spawn/human/corpse/pirate/ranged
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm
index 408edc711098..b6fe86efe0db 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm
@@ -28,12 +28,7 @@
var/y_shift = getItemPixelShiftY()
if(r_hand)
-
- var/r_state = r_hand.item_state
- if(!r_state)
- r_state = r_hand.icon_state
-
- var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
+ var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(default_layer = DRONE_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
if(y_shift)
r_hand_overlay.pixel_y += y_shift
@@ -46,12 +41,7 @@
client.screen |= r_hand
if(l_hand)
-
- var/l_state = l_hand.item_state
- if(!l_state)
- l_state = l_hand.icon_state
-
- var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
+ var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(default_layer = DRONE_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
if(y_shift)
l_hand_overlay.pixel_y += y_shift
@@ -82,10 +72,7 @@
if(client && hud_used && hud_used.hud_shown)
head.screen_loc = ui_drone_head
client.screen += head
- var/used_head_icon = 'icons/mob/head.dmi'
- if(istype(head, /obj/item/clothing/mask))
- used_head_icon = 'icons/mob/mask.dmi'
- var/mutable_appearance/head_overlay = head.build_worn_icon(state = head.icon_state, default_layer = DRONE_HEAD_LAYER, default_icon_file = used_head_icon)
+ var/mutable_appearance/head_overlay = head.build_worn_icon(default_layer = DRONE_HEAD_LAYER, default_icon_file = 'icons/mob/clothing/head/head.dmi')
head_overlay.pixel_y -= 15
drone_overlays[DRONE_HEAD_LAYER] = head_overlay
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index d87e59f03f16..ab0a0b3205c7 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -92,9 +92,9 @@ GLOBAL_VAR_INIT(mouse_killed, 0)
if(!stat)
var/mob/M = AM
to_chat(M, span_notice("[icon2html(src, M)] Squeak!"))
- if(istype(AM, /obj/item/reagent_containers/food/snacks/royalcheese))
- evolve()
- qdel(AM)
+ //if(istype(AM, /obj/item/reagent_containers/food/snacks/royalcheese))
+ // evolve()
+ // qdel(AM)
..()
/mob/living/simple_animal/mouse/handle_automated_action()
@@ -116,10 +116,10 @@ GLOBAL_VAR_INIT(mouse_killed, 0)
be_fruitful()
qdel(cheese)
return
- for(var/obj/item/reagent_containers/food/snacks/royalcheese/bigcheese in range(1, src))
- qdel(bigcheese)
- evolve()
- return
+ //for(var/obj/item/reagent_containers/food/snacks/royalcheese/bigcheese in range(1, src))
+ // qdel(bigcheese)
+ // evolve()
+ // return
/**
@@ -261,9 +261,9 @@ GLOBAL_VAR_INIT(mouse_killed, 0)
var/list/cheeses = list(/obj/item/reagent_containers/food/snacks/cheesewedge, /obj/item/reagent_containers/food/snacks/cheesewheel,
/obj/item/reagent_containers/food/snacks/store/cheesewheel, /obj/item/reagent_containers/food/snacks/customizable/cheesewheel,
/obj/item/reagent_containers/food/snacks/cheesiehonkers) //all cheeses - royal
- if(istype(F, /obj/item/reagent_containers/food/snacks/royalcheese))
- evolve()
- return
+ //if(istype(F, /obj/item/reagent_containers/food/snacks/royalcheese))
+ // evolve()
+ // return
if(istype(F, /obj/item/grown/bananapeel/bluespace))
var/obj/item/grown/bananapeel/bluespace/B
var/teleport_radius = max(round(B.seed.potency / 10), 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 7465f0b193f6..5ac2b887009e 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -6,6 +6,7 @@
icon_living = "alienh"
icon_dead = "alienh_dead"
icon_gib = "syndicate_gib"
+ health_doll_icon = "alienq"
gender = FEMALE
response_help = "pokes"
response_disarm = "shoves"
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 6c2a9bdecfc9..cf41c87b1782 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -44,6 +44,9 @@
do_footstep = TRUE
+/mob/living/simple_animal/hostile/bear/loan
+ faction = list("hostile")
+
//SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!!
/mob/living/simple_animal/hostile/bear/Hudson
name = "Hudson"
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 5a5bb3f09a5a..5548ee1aef5b 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -8,6 +8,7 @@
icon_living = "base"
icon_dead = "base_dead"
icon_gib = "carp_gib"
+ health_doll_icon = "megacarp"
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
speak_chance = 0
turns_per_move = 5
@@ -62,6 +63,9 @@
"silver" = "#fdfbf3", \
)
+/mob/living/simple_animal/hostile/carp/loan
+ faction = list("hostile")
+
/mob/living/simple_animal/hostile/carp/Initialize(mapload)
. = ..()
carp_randomify(rarechance)
diff --git a/code/modules/mob/living/simple_animal/hostile/feral_cat.dm b/code/modules/mob/living/simple_animal/hostile/feral_cat.dm
index 4067d5520898..0907140b0508 100644
--- a/code/modules/mob/living/simple_animal/hostile/feral_cat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/feral_cat.dm
@@ -26,3 +26,6 @@
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 5
pass_flags = PASSTABLE
+
+/mob/living/simple_animal/hostile/feral_cat/loan
+ faction = list("hostile")
diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
index 9423b7b05eed..1e4375d8009d 100644
--- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
+++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
@@ -9,6 +9,7 @@
icon_state = "crawling"
icon_living = "crawling"
icon_dead = "dead"
+ health_doll_icon = "crawling"
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
speak_chance = 80
maxHealth = 220
diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm
index b3e0f3b658aa..9d451748b059 100644
--- a/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm
+++ b/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm
@@ -33,14 +33,12 @@
var/obj/item/r_hand = get_item_for_held_index(2)
if(r_hand)
- var/r_state = r_hand.item_state ? r_hand.item_state : r_hand.icon_state
- var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = GORILLA_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
+ var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(default_layer = GORILLA_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
r_hand_overlay.pixel_y -= 1
hands_overlays += r_hand_overlay
if(l_hand)
- var/l_state = l_hand.item_state ? l_hand.item_state : l_hand.icon_state
- var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = GORILLA_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
+ var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(default_layer = GORILLA_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
l_hand_overlay.pixel_y -= 1
hands_overlays += l_hand_overlay
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
index 09cd436e72f8..d24767767cef 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -28,6 +28,7 @@ Difficulty: Medium
icon_state = "miner"
icon_living = "miner"
icon = 'icons/mob/broadMobs.dmi'
+ health_doll_icon = "miner"
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
light_color = "#E4C7C5"
movement_type = GROUND
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index 889829eefcb5..6f9e3f666e3f 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -19,9 +19,8 @@ It can charge at its target, and also heavily damaging anything directly hit in
If at half health it will start to charge from all sides with clones.
When Bubblegum dies, it leaves behind a H.E.C.K. mining suit as well as one of the following:
- 1.set of knuckles that can trap victims where they stand
- 2. A cursed stomach that allows the user to hop between vomit puddles
- 3.A pair of cuffs allowing the wearer to devour creatures to heal
+ 1.A set of knuckles that can trap victims where they stand
+ 2.A pair of cuffs allowing the wearer to devour creatures to heal
Difficulty: Hard
@@ -37,6 +36,7 @@ Difficulty: Hard
icon_state = "bubblegum"
icon_living = "bubblegum"
icon_dead = ""
+ health_doll_icon = "bubblegum"
friendly = "stares down"
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
speak_emote = list("gurgles")
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 4e3388e03d93..7348672f8da8 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -31,6 +31,7 @@ Difficulty: Very Hard
icon_state = "eva"
icon_living = "eva"
icon_dead = ""
+ health_doll_icon = "eva"
friendly = "stares down"
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
speak_emote = list("roars")
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 2643782d381d..b7d86dc059cc 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -41,6 +41,7 @@ Difficulty: Medium
icon_state = "dragon"
icon_living = "dragon"
icon_dead = "dragon_dead"
+ health_doll_icon = "dragon"
friendly = "stares down"
speak_emote = list("roars")
armour_penetration = 40
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index b4f731910463..405f0e8b49a1 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -43,6 +43,7 @@ Difficulty: Hard
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
icon_state = "hierophant"
icon_living = "hierophant"
+ health_doll_icon = "hierophant"
friendly = "stares down"
icon = 'icons/mob/lavaland/hierophant_new.dmi'
faction = list("boss") //asteroid mobs? get that shit out of my beautiful square house
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index 03ff750cccbf..67cda1af55be 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -22,6 +22,7 @@ Difficulty: Medium
maxHealth = 800
icon_state = "legion"
icon_living = "legion"
+ health_doll_icon = "mega_legion"
desc = "One of many."
icon = 'icons/mob/lavaland/legion.dmi'
attacktext = "chomps"
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
index 8b6f929de5e7..c4d70728079e 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -67,6 +67,7 @@
icon_living = "watcher"
icon_aggro = "watcher"
icon_dead = "watcher_dead"
+ health_doll_icon = "watcher"
pixel_x = -10
throw_message = "bounces harmlessly off of"
melee_damage_lower = 15
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
index 8d7a10054189..328b5adde542 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
@@ -25,6 +25,7 @@
icon_aggro = "broodmother"
icon_dead = "egg_sac"
icon_gib = "syndicate_gib"
+ health_doll_icon = "broodmother"
maxHealth = 800
health = 800
melee_damage_lower = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
index 684b57b29170..9b0a659f095c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
@@ -24,6 +24,7 @@
icon_aggro = "herald"
icon_dead = "herald_dying"
icon_gib = "syndicate_gib"
+ health_doll_icon = "herald"
maxHealth = 800
health = 800
melee_damage_lower = 20
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
index 0ec875f986b3..dfdd8f8f54b9 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
@@ -24,6 +24,7 @@
icon_aggro = "legionnaire"
icon_dead = "legionnaire_dead"
icon_gib = "syndicate_gib"
+ health_doll_icon = "legionnaire"
maxHealth = 800
health = 800
melee_damage_lower = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
index ebbd16777e10..62c8e0e4e7d4 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
@@ -24,6 +24,7 @@
icon_aggro = "pandora"
icon_dead = "pandora_dead"
icon_gib = "syndicate_gib"
+ health_doll_icon = "pandora"
maxHealth = 800
health = 800
melee_damage_lower = 15
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 2493bcabc9aa..4d35caf9b0e5 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -248,6 +248,7 @@
icon_state = "legion"
icon_living = "legion"
icon_dead = "legion"
+ health_doll_icon = "legion"
health = 450
maxHealth = 450
melee_damage_lower = 20
diff --git a/code/modules/mob/living/simple_animal/hostile/rat.dm b/code/modules/mob/living/simple_animal/hostile/rat.dm
index 3a36252cdc54..c2363ec25c44 100644
--- a/code/modules/mob/living/simple_animal/hostile/rat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/rat.dm
@@ -26,6 +26,9 @@
faction = list("rat")
var/body_color
+/mob/living/simple_animal/hostile/rat/loan
+ faction = list("hostile")
+
/mob/living/simple_animal/hostile/rat/Initialize()
. = ..()
if(mind)
diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm
index ac2f67960266..7e3d5c0568c6 100644
--- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm
@@ -45,6 +45,7 @@
var/title = pick("King","Lord","Prince","Emperor","Supreme","Overlord","Master","Shogun","Bojar","Tsar","Hetman")
name = "[kingdom] [title]"
language_holder += new /datum/language_holder/mouse(src)
+ qdel(src)
/mob/living/simple_animal/hostile/regalrat/handle_automated_action()
if(prob(20))
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
index 28a2832c59f7..bc95334882d3 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
@@ -1,5 +1,5 @@
/mob/living/simple_animal/hostile/retaliate/bat
- name = "Space Bat"
+ name = "space bat"
desc = "A rare breed of bat which roosts in spaceships, probably not vampiric."
icon_state = "bat"
icon_living = "bat"
@@ -15,6 +15,7 @@
health = 15
spacewalk = TRUE
see_in_dark = 10
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
harm_intent_damage = 6
melee_damage_lower = 6
melee_damage_upper = 5
@@ -32,9 +33,7 @@
var/max_co2 = 0 //to be removed once metastation map no longer use those for Sgt Araneus
var/min_oxy = 0
var/max_tox = 0
-
-
- //Space bats need no air to fly in.
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) //Space bats need no air to fly in.
minbodytemp = 0
+ can_be_held = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index 4eabe1b110f7..d80d8d4b5972 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -1,11 +1,12 @@
/mob/living/simple_animal/hostile/retaliate/clown
- name = "Clown"
+ name = "clown"
desc = "A denizen of clown planet."
icon = 'icons/mob/clown_mobs.dmi'
icon_state = "clown"
icon_living = "clown"
icon_dead = "clown_dead"
icon_gib = "clown_gib"
+ health_doll_icon = "clown" //if >32x32, it will use this generic. for all the huge clown mobs that subtype from this
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
turns_per_move = 5
response_help = "pokes"
@@ -25,7 +26,7 @@
attack_sound = 'sound/items/bikehorn.ogg'
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
- del_on_death = 1
+ del_on_death = TRUE
loot = list(/obj/effect/mob_spawn/human/clown/corpse)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
index 5b33beb5d6ce..ff6d644d7257 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
@@ -13,7 +13,7 @@
if(M.occupant)
return A
// yogs start
- else if(istype(A, /obj/spacepod))
+ else if(isspacepod(A))
var/obj/spacepod/M = A
if(M.pilot || M.passengers.len)
return A
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
index c50ace8871c5..5e9fa8d4f11c 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
@@ -1,5 +1,5 @@
/mob/living/simple_animal/hostile/retaliate/spaceman
- name = "Spaceman"
+ name = "spaceman"
desc = "What in the actual hell..?"
icon_state = "old"
icon_living = "old"
@@ -22,7 +22,6 @@
attack_sound = 'sound/weapons/punch1.ogg'
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
- del_on_death = 0
do_footstep = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 04825893a59d..9b9376dfe924 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -6,6 +6,7 @@
icon_living = "pine_1"
icon_dead = "pine_1"
icon_gib = "pine_1"
+ health_doll_icon = "pine_1"
gender = NEUTER
speak_chance = 0
turns_per_move = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
index 4e077a84bb10..4766d6af0b19 100644
--- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
+++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
@@ -8,6 +8,7 @@
icon_aggro = "Fugu0"
icon_dead = "Fugu_dead"
icon_gib = "syndicate_gib"
+ health_doll_icon = "Fugu0"
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
mouse_opacity = MOUSE_OPACITY_ICON
move_to_delay = 5
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index a62719306970..e8d378d62144 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -483,7 +483,9 @@
var/mob/dead/observer/C = pick(candidates)
to_chat(M, "Your mob has been taken over by a ghost!")
message_admins("[key_name_admin(C)] has taken control of ([ADMIN_LOOKUPFLW(M)])")
- M.ghostize(0)
+ var/mob/dead/observer/G = M.ghostize(FALSE)
+ if(istype(G))
+ G.mind = null
M.key = C.key
return TRUE
else
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 3ed8489b35e4..bf1e03e7a356 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -158,15 +158,17 @@
return
if(!istype(M))
return
-
- if(..())
- if(reagents.total_volume)
- if(M.reagents)
- to_chat(user, span_warning("You begin to injecting [src]'s contents into [M]"))
- if(!do_after(user, 0.5 SECONDS, M))
- return
- reagents.reaction(M, INJECT, reagents.total_volume)
- reagents.trans_to(M, reagents.total_volume, transfered_by = user)
+ if(!..())
+ return
+ if(!reagents.total_volume || !M.reagents)
+ return
+
+ to_chat(user, span_warning("You begin to injecting [src]'s contents into [M]"))
+ if(!do_after(user, 0.5 SECONDS, M))
+ return
+ reagents.reaction(M, INJECT, reagents.total_volume)
+ reagents.trans_to(M, reagents.total_volume, transfered_by = user)
+
/obj/item/pen/sleepy/Initialize()
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 2c4a9820ec79..5b0e5dbdfb00 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -9,7 +9,6 @@
throw_speed = 3
throw_range = 7
materials = list(/datum/material/iron=60)
- item_color = "cargo"
pressure_resistance = 2
attack_verb = list("stamped")
@@ -20,74 +19,74 @@
/obj/item/stamp/qm
name = "quartermaster's rubber stamp"
icon_state = "stamp-qm"
- item_color = "qm"
+ dye_color = DYE_QM
/obj/item/stamp/law
name = "law office's rubber stamp"
icon_state = "stamp-law"
- item_color = "cargo"
+ dye_color = DYE_LAW
/obj/item/stamp/captain
name = "captain's rubber stamp"
icon_state = "stamp-cap"
- item_color = "captain"
+ dye_color = DYE_CAPTAIN
/obj/item/stamp/hop
name = "head of personnel's rubber stamp"
icon_state = "stamp-hop"
- item_color = "hop"
+ dye_color = DYE_HOP
/obj/item/stamp/hos
name = "head of security's rubber stamp"
icon_state = "stamp-hos"
- item_color = "hosred"
+ dye_color = DYE_HOS
/obj/item/stamp/ce
name = "chief engineer's rubber stamp"
icon_state = "stamp-ce"
- item_color = "chief"
+ dye_color = DYE_CE
/obj/item/stamp/rd
name = "research director's rubber stamp"
icon_state = "stamp-rd"
- item_color = "director"
+ dye_color = DYE_RD
/obj/item/stamp/cmo
name = "chief medical officer's rubber stamp"
icon_state = "stamp-cmo"
- item_color = "cmo"
+ dye_color = DYE_CMO
/obj/item/stamp/denied
name = "\improper DENIED rubber stamp"
icon_state = "stamp-deny"
- item_color = "redcoat"
+ dye_color = DYE_REDCOAT
/obj/item/stamp/clown
name = "clown's rubber stamp"
icon_state = "stamp-clown"
- item_color = "clown"
+ dye_color = DYE_CLOWN
/obj/item/stamp/mime
name = "mime's rubber stamp"
icon_state = "stamp-mime"
- item_color = "mime"
+ dye_color = DYE_MIME
/obj/item/stamp/cent
name = "centcom rubber stamp"
icon_state = "stamp-cent"
- item_color = "redcoat"
+ dye_color = DYE_REDCOAT
/obj/item/stamp/syndi
name = "knock-off syndicate rubber stamp"
desc = "Not a syndicate ripoff!"
icon_state = "stamp-syndi"
- item_color = "hosred"
+ dye_color = DYE_HOS
/obj/item/stamp/syndiround
name = "syndicate rubber stamp"
icon_state = "stamp-syndiround"
- item_color = "hosred"
+ dye_color = DYE_HOS
/obj/item/stamp/attack_paw(mob/user)
return attack_hand(user)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 4cd351a6c057..69de93873a67 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -478,7 +478,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
max_amount = MAXCOIL
amount = MAXCOIL
merge_type = /obj/item/stack/cable_coil // This is here to let its children merge between themselves
- item_color = "red"
+ var/cable_color = "red"
desc = "A coil of insulated power cable."
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
@@ -499,8 +499,8 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
cost = 1
/obj/item/stack/cable_coil/cyborg/attack_self(mob/user)
- var/cable_color = input(user,"Pick a cable color.","Cable Color") in list("red","yellow","green","blue","pink","orange","cyan","white")
- item_color = cable_color
+ var/picked = input(user,"Pick a cable color.","Cable Color") in list("red","yellow","green","blue","pink","orange","cyan","white")
+ cable_color = picked
update_icon()
/obj/item/stack/cable_coil/suicide_act(mob/user)
@@ -514,9 +514,9 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
. = ..()
var/list/cable_colors = GLOB.cable_colors
- item_color = param_color || item_color || pick(cable_colors)
- if(cable_colors[item_color])
- item_color = cable_colors[item_color]
+ cable_color = param_color || cable_color || pick(cable_colors)
+ if(cable_colors[cable_color])
+ cable_color = cable_colors[cable_color]
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
@@ -550,7 +550,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
icon_state = "[initial(item_state)][amount < 3 ? amount : ""]"
name = "cable [amount < 3 ? "piece" : "coil"]"
color = null
- add_atom_colour(item_color, FIXED_COLOUR_PRIORITY)
+ add_atom_colour(cable_color, FIXED_COLOUR_PRIORITY)
/obj/item/stack/cable_coil/attack_hand(mob/user)
. = ..()
@@ -558,7 +558,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
return
var/obj/item/stack/cable_coil/new_cable = ..()
if(istype(new_cable))
- new_cable.item_color = item_color
+ new_cable.cable_color = cable_color
new_cable.update_icon()
//add cables to the stack
@@ -577,7 +577,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
/obj/item/stack/cable_coil/proc/get_new_cable(location)
var/path = /obj/structure/cable
- return new path(location, item_color)
+ return new path(location, cable_color)
// called when cable_coil is clicked on a turf
/obj/item/stack/cable_coil/proc/place_turf(turf/T, mob/user, dirnew)
@@ -766,38 +766,38 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
/////////////////////////////
/obj/item/stack/cable_coil/red
- item_color = "red"
+ cable_color = "red"
color = "#ff0000"
/obj/item/stack/cable_coil/yellow
- item_color = "yellow"
+ cable_color = "yellow"
color = "#ffff00"
/obj/item/stack/cable_coil/blue
- item_color = "blue"
+ cable_color = "blue"
color = "#1919c8"
/obj/item/stack/cable_coil/green
- item_color = "green"
+ cable_color = "green"
color = "#00aa00"
/obj/item/stack/cable_coil/pink
- item_color = "pink"
+ cable_color = "pink"
color = "#ff3ccd"
/obj/item/stack/cable_coil/orange
- item_color = "orange"
+ cable_color = "orange"
color = "#ff8000"
/obj/item/stack/cable_coil/cyan
- item_color = "cyan"
+ cable_color = "cyan"
color = "#00ffff"
/obj/item/stack/cable_coil/white
- item_color = "white"
+ cable_color = "white"
/obj/item/stack/cable_coil/random
- item_color = null
+ cable_color = null
color = "#ffffff"
/obj/item/stack/cable_coil/random/thirty
@@ -819,36 +819,36 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
update_icon()
/obj/item/stack/cable_coil/cut/red
- item_color = "red"
+ cable_color = "red"
color = "#ff0000"
/obj/item/stack/cable_coil/cut/yellow
- item_color = "yellow"
+ cable_color = "yellow"
color = "#ffff00"
/obj/item/stack/cable_coil/cut/blue
- item_color = "blue"
+ cable_color = "blue"
color = "#1919c8"
/obj/item/stack/cable_coil/cut/green
- item_color = "green"
+ cable_color = "green"
color = "#00aa00"
/obj/item/stack/cable_coil/cut/pink
- item_color = "pink"
+ cable_color = "pink"
color = "#ff3ccd"
/obj/item/stack/cable_coil/cut/orange
- item_color = "orange"
+ cable_color = "orange"
color = "#ff8000"
/obj/item/stack/cable_coil/cut/cyan
- item_color = "cyan"
+ cable_color = "cyan"
color = "#00ffff"
/obj/item/stack/cable_coil/cut/white
- item_color = "white"
+ cable_color = "white"
/obj/item/stack/cable_coil/cut/random
- item_color = null
+ cable_color = null
color = "#ffffff"
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index f16969d0edb8..9a94a93dca46 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -2,15 +2,10 @@
// stores power
//Cache defines
-#define SMES_CLEVEL_1 1
-#define SMES_CLEVEL_2 2
-#define SMES_CLEVEL_3 3
-#define SMES_CLEVEL_4 4
-#define SMES_CLEVEL_5 5
-#define SMES_OUTPUTTING 6
-#define SMES_NOT_OUTPUTTING 7
-#define SMES_INPUTTING 8
-#define SMES_INPUT_ATTEMPT 9
+#define SMES_OUTPUTTING 7
+#define SMES_NOT_OUTPUTTING 8
+#define SMES_INPUTTING 9
+#define SMES_INPUT_ATTEMPT 10
/obj/machinery/power/smes
name = "power storage unit"
@@ -219,15 +214,15 @@
return
if(outputting)
- add_overlay("smes-op1")
+ add_overlay("smes-out1")
else
- add_overlay("smes-op0")
+ add_overlay("smes-out0")
if(inputting)
- add_overlay("smes-oc1")
+ add_overlay("smes-inp1")
else
if(input_attempt)
- add_overlay("smes-oc0")
+ add_overlay("smes-inp0")
var/clevel = chargedisplay()
if(clevel>0)
@@ -235,7 +230,7 @@
/obj/machinery/power/smes/proc/chargedisplay()
- return clamp(round(5.5*charge/capacity),0,5)
+ return clamp(round(6.5*charge/capacity),0,6)
/obj/machinery/power/smes/process()
if(stat & BROKEN)
@@ -453,12 +448,6 @@
log_smes(user)
update_icon()
-
-#undef SMES_CLEVEL_1
-#undef SMES_CLEVEL_2
-#undef SMES_CLEVEL_3
-#undef SMES_CLEVEL_4
-#undef SMES_CLEVEL_5
#undef SMES_OUTPUTTING
#undef SMES_NOT_OUTPUTTING
#undef SMES_INPUTTING
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index a8f463e4ca5a..06bb0275a487 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -8,6 +8,11 @@
projectile_type = /obj/item/projectile/bullet/shotgun_slug
materials = list(/datum/material/iron=4000)
+/obj/item/ammo_casing/shotgun/syndie
+ name = "syndicate shotgun slug"
+ desc = "An illegal type of ammunition used by the syndicate for their bulldog shotguns. Hopefully you're not the one on the receiving end."
+ projectile_type = /obj/item/projectile/bullet/shotgun_slug/syndie
+
/obj/item/ammo_casing/shotgun/beanbag
name = "beanbag slug"
desc = "A weak beanbag slug for riot control."
@@ -64,6 +69,22 @@
pellets = 6
variance = 25
+/obj/item/ammo_casing/shotgun/hpbuck
+ name = "hollow-point buckshot shell"
+ desc = "A 12 gauge hollow-point buckshot shell."
+ icon_state = "hpbshell"
+ projectile_type = /obj/item/projectile/bullet/pellet/shotgun_hpbuckshot
+ pellets = 6
+ variance = 25
+
+/obj/item/ammo_casing/shotgun/flechette
+ name = "flechette shell"
+ desc = "A 12 gauge flechette shell."
+ icon_state = "flshell"
+ projectile_type = /obj/item/projectile/bullet/pellet/shotgun_flechette
+ pellets = 6
+ variance = 15
+
/obj/item/ammo_casing/shotgun/clownshot
name = "buckshot shell..?"
desc = "This feels a little light for a buckshot shell."
diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
index 2123d76c857c..cf76c460f093 100644
--- a/code/modules/projectiles/boxes_magazines/external/shotgun.dm
+++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
@@ -16,9 +16,9 @@
ammo_type = /obj/item/ammo_casing/shotgun/stunslug
/obj/item/ammo_box/magazine/m12g/slug
- name = "shotgun magazine (12g slugs)"
+ name = "shotgun magazine (12g syndicate slugs)"
icon_state = "m12gb" //this may need an unique sprite
- ammo_type = /obj/item/ammo_casing/shotgun
+ ammo_type = /obj/item/ammo_casing/shotgun/syndie
/obj/item/ammo_box/magazine/m12g/dragon
name = "shotgun magazine (12g dragon's breath)"
@@ -34,3 +34,13 @@
name = "shotgun magazine (12g meteor slugs)"
icon_state = "m12gbc"
ammo_type = /obj/item/ammo_casing/shotgun/meteorslug
+
+/obj/item/ammo_box/magazine/m12g/flechette
+ name = "shotgun magazine (12g flechette)"
+ icon_state = "m12gb"
+ ammo_type = /obj/item/ammo_casing/shotgun/flechette
+
+/obj/item/ammo_box/magazine/m12g/hpbuck
+ name = "shotgun magazine (12g hollow-point buckshot)"
+ icon_state = "m12gb"
+ ammo_type = /obj/item/ammo_casing/shotgun/hpbuck
diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm
index ae0322de805b..8632ea82b87e 100644
--- a/code/modules/projectiles/boxes_magazines/external/smg.dm
+++ b/code/modules/projectiles/boxes_magazines/external/smg.dm
@@ -3,11 +3,23 @@
icon_state = "46x30mmt-20"
ammo_type = /obj/item/ammo_casing/c46x30mm
caliber = "4.6x30mm"
- max_ammo = 20
+ max_ammo = 22
/obj/item/ammo_box/magazine/wt550m9/update_icon()
..()
- icon_state = "46x30mmt-[round(ammo_count(),4)]"
+ switch(ammo_count())
+ if(19 to 22)
+ icon_state = "46x30mmt-20"
+ if(15 to 18)
+ icon_state = "46x30mmt-16"
+ if(11 to 14)
+ icon_state = "46x30mmt-12"
+ if(7 to 10)
+ icon_state = "46x30mmt-8"
+ if(3 to 6)
+ icon_state = "46x30mmt-4"
+ else
+ icon_state = "46x30mmt-0"
/obj/item/ammo_box/magazine/wt550m9/wtap
name = "\improper WT-550 magazine (Armour Piercing 4.6x30mm)"
@@ -16,7 +28,19 @@
/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon()
..()
- icon_state = "46x30mmtA-[round(ammo_count(),4)]"
+ switch(ammo_count())
+ if(19 to 22)
+ icon_state = "46x30mmtA-20"
+ if(15 to 18)
+ icon_state = "46x30mmtA-16"
+ if(11 to 14)
+ icon_state = "46x30mmtA-12"
+ if(7 to 10)
+ icon_state = "46x30mmtA-8"
+ if(3 to 6)
+ icon_state = "46x30mmtA-4"
+ else
+ icon_state = "46x30mmtA-0"
/obj/item/ammo_box/magazine/wt550m9/wtic
name = "\improper WT-550 magazine (Incendiary 4.6x30mm)"
@@ -25,7 +49,19 @@
/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon()
..()
- icon_state = "46x30mmtI-[round(ammo_count(),4)]"
+ switch(ammo_count())
+ if(19 to 22)
+ icon_state = "46x30mmtI-20"
+ if(15 to 18)
+ icon_state = "46x30mmtI-16"
+ if(11 to 14)
+ icon_state = "46x30mmtI-12"
+ if(7 to 10)
+ icon_state = "46x30mmtI-8"
+ if(3 to 6)
+ icon_state = "46x30mmtI-4"
+ else
+ icon_state = "46x30mmtI-0"
/obj/item/ammo_box/magazine/wt550m9/wtr
name = "\improper WT-550 magazine(Rubber Rounds 4.6x30mm)"
@@ -34,7 +70,19 @@
/obj/item/ammo_box/magazine/wt550m9/wtr/update_icon()
..()
- icon_state = "46x30mmtR-[round(ammo_count(),4)]"
+ switch(ammo_count())
+ if(19 to 22)
+ icon_state = "46x30mmtR-20"
+ if(15 to 18)
+ icon_state = "46x30mmtR-16"
+ if(11 to 14)
+ icon_state = "46x30mmtR-12"
+ if(7 to 10)
+ icon_state = "46x30mmtR-8"
+ if(3 to 6)
+ icon_state = "46x30mmtR-4"
+ else
+ icon_state = "46x30mmtR-0"
/obj/item/ammo_box/magazine/uzim9mm
name = "uzi magazine (9mm)"
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index ee3e270b34d8..633418ed4441 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -83,12 +83,13 @@
/obj/item/gun/ballistic/automatic/wt550
name = "security auto rifle"
- desc = "An outdated personal defence weapon. Uses 4.6x30mm rounds and is designated the WT-550 Automatic Rifle. Has a single fire burst mode, but you still can't figure out what advantage that has over semi automatic."
+ desc = "An outdated personal defence weapon. Uses 4.6x30mm rounds and is designated the WT-550 Automatic Rifle. Has a two-round burst or a semi-automatic firing mode."
icon_state = "wt550"
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/wt550m9
fire_delay = 2
- burst_size = 1
+ burst_size = 2
+ weapon_weight = WEAPON_MEDIUM
can_suppress = FALSE
can_bayonet = TRUE
knife_x_offset = 25
diff --git a/code/modules/projectiles/guns/ballistic/minigun.dm b/code/modules/projectiles/guns/ballistic/minigun.dm
index 11c740f869c5..2559f6567a91 100644
--- a/code/modules/projectiles/guns/ballistic/minigun.dm
+++ b/code/modules/projectiles/guns/ballistic/minigun.dm
@@ -113,15 +113,17 @@
slot_flags = null
w_class = WEIGHT_CLASS_HUGE
materials = list()
- burst_size = 3
+ burst_size = 5
+ var/select = TRUE
automatic = FALSE
fire_delay = 1
recoil = 0.5
- spread = 34
+ spread = 30
fire_sound_volume = 60
weapon_weight = WEAPON_HEAVY
fire_sound = 'sound/weapons/gunshot.ogg'
mag_type = /obj/item/ammo_box/magazine/internal/minigunosprey
+ actions_types = list(/datum/action/item_action/toggle_firemode)
tac_reloads = FALSE
casing_ejector = FALSE
item_flags = NEEDS_PERMIT | SLOWS_WHILE_IN_HAND
@@ -172,3 +174,21 @@
/obj/item/gun/ballistic/minigunosprey/dropped(mob/living/user)
. = ..()
ammo_pack.attach_gun(user)
+
+/obj/item/gun/ballistic/minigunosprey/ui_action_click(mob/user, actiontype)
+ if(istype(actiontype, /datum/action/item_action/toggle_firemode))
+ burst_select()
+ . = ..()
+
+/obj/item/gun/ballistic/minigunosprey/proc/burst_select()
+ var/mob/living/carbon/user = usr
+ if(!select)
+ select = TRUE
+ burst_size = initial(burst_size)
+ to_chat(user, span_notice("You switch to [burst_size]-rnd burst."))
+ else
+ select = FALSE
+ burst_size = 7
+ to_chat(user, span_notice("You switch to [burst_size]-rnd burst. BRRRRRRRT."))
+ playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
+ return
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 1590376f3916..ca2cd87abf4c 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -579,6 +579,8 @@
else
var/mob/living/L = target
if(!direct_target)
+ if(!CHECK_BITFIELD(L.mobility_flags, MOBILITY_STAND) && (L in range(2, starting))) //if we're shooting over someone who's prone and nearby bc formations are cool and not going to be unbalanced
+ return FALSE
if(!CHECK_BITFIELD(L.mobility_flags, MOBILITY_USE | MOBILITY_STAND | MOBILITY_MOVE) || !(L.stat == CONSCIOUS)) //If they're able to 1. stand or 2. use items or 3. move, AND they are not softcrit, they are not stunned enough to dodge projectiles passing over.
return FALSE
return TRUE
diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm
index 7b3a39fadc73..8b38bf93471a 100644
--- a/code/modules/projectiles/projectile/bullets/shotgun.dm
+++ b/code/modules/projectiles/projectile/bullets/shotgun.dm
@@ -4,6 +4,10 @@
sharpness = SHARP_POINTY
wound_bonus = -30
+/obj/item/projectile/bullet/shotgun_slug/syndie
+ name = "12g syndicate shotgun slug"
+ damage = 60
+
/obj/item/projectile/bullet/shotgun_beanbag
name = "beanbag slug"
damage = 5
@@ -63,7 +67,7 @@
/obj/item/projectile/bullet/pellet
var/tile_dropoff = 0.45
- var/tile_dropoff_s = 0.5
+ var/tile_dropoff_s = 0.35
/obj/item/projectile/bullet/pellet/shotgun_buckshot
name = "buckshot pellet"
@@ -71,7 +75,20 @@
wound_bonus = 5
bare_wound_bonus = 5
wound_falloff_tile = -2.5 // low damage + additional dropoff will already curb wounding potential anything past point blank
-
+
+/obj/item/projectile/bullet/pellet/shotgun_flechette
+ name = "flechette pellet"
+ damage = 15
+ wound_bonus = -5
+ bare_wound_bonus = -15
+ armour_penetration = 40
+
+/obj/item/projectile/bullet/pellet/shotgun_hpbuckshot
+ name = "hollow-point pellet"
+ damage = 25
+ bare_wound_bonus = 5
+ armour_penetration = -40
+
/obj/item/projectile/bullet/pellet/shotgun_clownshot
name = "clownshot pellet"
damage = 0
@@ -80,7 +97,7 @@
/obj/item/projectile/bullet/pellet/shotgun_rubbershot
name = "rubbershot pellet"
damage = 3
- stamina = 11
+ stamina = 13
sharpness = SHARP_NONE
/obj/item/projectile/bullet/pellet/shotgun_cryoshot
@@ -98,9 +115,9 @@
/obj/item/projectile/bullet/shotgun_uraniumslug
name = "depleted uranium slug"
icon_state = "ubullet"
- damage = 35
- armour_penetration = 200 // he he funny round go through armor
- wound_bonus = -30
+ damage = 30
+ armour_penetration = 60 // he he funny round go through armor
+ wound_bonus = -45
/obj/item/projectile/bullet/shotgun_uraniumslug/on_hit(atom/target)
. = ..()
diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm
index ba380e30df28..b0d45465a4ab 100644
--- a/code/modules/projectiles/projectile/bullets/smg.dm
+++ b/code/modules/projectiles/projectile/bullets/smg.dm
@@ -10,22 +10,22 @@
/obj/item/projectile/bullet/c46x30mm
name = "4.6x30mm bullet"
- damage = 20
+ damage = 13
wound_bonus = -5
bare_wound_bonus = 5
armour_penetration = 20
/obj/item/projectile/bullet/c46x30mm_ap
name = "4.6x30mm armor-piercing bullet"
- damage = 15
+ damage = 10
armour_penetration = 50
/obj/item/projectile/bullet/incendiary/c46x30mm
name = "4.6x30mm incendiary bullet"
- damage = 10
+ damage = 7
fire_stacks = 1
/obj/item/projectile/bullet/c46x30mm_rubber
name = "4.6x30mm rubber bullet"
- damage = 5
- stamina = 20 //slightly more effective than the detective's revolver when fired in bursts
+ damage = 4
+ stamina = 21 //slightly more effective than the detective's revolver when fired in bursts
diff --git a/code/modules/projectiles/projectile/reusable/arrow.dm b/code/modules/projectiles/projectile/reusable/arrow.dm
index cd6313b206de..7ee6be11f570 100644
--- a/code/modules/projectiles/projectile/reusable/arrow.dm
+++ b/code/modules/projectiles/projectile/reusable/arrow.dm
@@ -5,7 +5,7 @@
flag = MELEE
icon_state = "arrow"
ammo_type = /obj/item/ammo_casing/caseless/arrow
- var/embed_chance = 0.5
+ var/embed_chance = 0.4
var/break_chance = 10
var/fauna_damage_bonus = 20
@@ -40,7 +40,7 @@
name = "Ashen arrow"
desc = "Fire Hardened arrow."
damage = 25
- embed_chance = 0.3
+ embed_chance = 0.25
break_chance = 0
ammo_type = /obj/item/ammo_casing/caseless/arrow/ash
@@ -49,7 +49,7 @@
desc = "An arrow made from bone, wood, and sinew."
damage = 30
armour_penetration = 20
- embed_chance = 0.4
+ embed_chance = 0.33
break_chance = 0
ammo_type = /obj/item/ammo_casing/caseless/arrow/bone_tipped
@@ -68,7 +68,7 @@
damage = 25
fauna_damage_bonus = 40
armour_penetration = 35
- embed_chance = 0.5
+ embed_chance = 0.4
break_chance = 0
ammo_type = /obj/item/ammo_casing/caseless/arrow/chitin
@@ -76,8 +76,8 @@
name = "Bamboo arrow"
desc = "An arrow made from bamboo."
damage = 10
- embed_chance = 0.7
- break_chance = 67
+ embed_chance = 0.5
+ break_chance = 50
ammo_type = /obj/item/ammo_casing/caseless/arrow/bamboo
/obj/item/projectile/bullet/reusable/arrow/bronze //Inferior metal. Slightly better than ashen
@@ -93,16 +93,16 @@
name = "Glass arrow"
desc = "Glass tipped arrow"
damage = 15
- embed_chance = 0.5
- break_chance = 33
+ embed_chance = 0.3
+ break_chance = 25
ammo_type = /obj/item/ammo_casing/caseless/arrow/glass
/obj/item/projectile/bullet/reusable/arrow/glass/plasma //Immensely capable of puncturing through materials; plasma is a robust material, more capable of slicing through protection
name = "Plasma Glass arrow"
desc = "Plasma Glass tipped arrow"
- damage = 15
- armour_penetration = 50
- embed_chance = 0.5
+ damage = 18
+ armour_penetration = 60
+ embed_chance = 0.4
break_chance = 0
ammo_type = /obj/item/ammo_casing/caseless/arrow/glass/plasma
@@ -139,7 +139,7 @@
. = ..()
if(iscarbon(target))
var/mob/living/carbon/M = target
- M.apply_damage(10, BURN)
+ M.apply_damage(8, BURN)
M.adjust_fire_stacks(1)
M.IgniteMob()
@@ -148,7 +148,7 @@
icon_state = "arrow_energy"
damage = 25
damage_type = BURN
- var/embed_chance = 0.5
+ var/embed_chance = 0.4
var/obj/item/embed_type = /obj/item/ammo_casing/caseless/arrow/energy
/obj/item/projectile/energy/arrow/on_hit(atom/target, blocked = FALSE)
@@ -163,7 +163,7 @@
name = "disabler bolt"
icon_state = "arrow_disable"
light_color = LIGHT_COLOR_BLUE
- damage = 20
+ damage = 40
damage_type = STAMINA
embed_type = /obj/item/ammo_casing/caseless/arrow/energy/disabler
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 1102ebcd142b..91d76688d508 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -33,6 +33,10 @@
var/has_panel_overlay = TRUE
var/macroresolution = 1
var/obj/item/reagent_containers/beaker = null
+ //This will display every reagent that it could POSSIBLY dispense if it was fully upgraded (barring emagged chemicals). Ones you can't use will show what tier you need.
+ //If you want to add more to the tiers, it has to be in dispensable_reagents AND the list of what you tier you want it in below.
+ var/list/display_reagents = list()
+
var/list/dispensable_reagents = list(
/datum/reagent/aluminium,
/datum/reagent/bromine,
@@ -43,7 +47,6 @@
/datum/reagent/fluorine,
/datum/reagent/hydrogen,
/datum/reagent/iodine,
- /datum/reagent/iron,
/datum/reagent/lithium,
/datum/reagent/mercury,
/datum/reagent/nitrogen,
@@ -57,17 +60,21 @@
/datum/reagent/stable_plasma,
/datum/reagent/consumable/sugar,
/datum/reagent/sulfur,
- /datum/reagent/toxin/acid,
+ /datum/reagent/toxin/acid
+ )
+ var/list/t2_upgrade_reagents = list(
+ /datum/reagent/iron,
/datum/reagent/water,
/datum/reagent/fuel
)
- //these become available once the manipulator has been upgraded to tier 4 (femto)
- var/list/upgrade_reagents = list(
- /datum/reagent/acetone,
+ var/list/t3_upgrade_reagents = list(
/datum/reagent/ammonia,
/datum/reagent/ash,
+ /datum/reagent/oil
+ )
+ var/list/t4_upgrade_reagents = list(
+ /datum/reagent/acetone,
/datum/reagent/diethylamine,
- /datum/reagent/oil,
/datum/reagent/saltpetre
)
var/list/emagged_reagents = list(
@@ -83,10 +90,20 @@
/obj/machinery/chem_dispenser/Initialize()
. = ..()
dispensable_reagents = sortList(dispensable_reagents, /proc/cmp_reagents_asc)
+ display_reagents = dispensable_reagents.Copy()
if(emagged_reagents)
emagged_reagents = sortList(emagged_reagents, /proc/cmp_reagents_asc)
- if(upgrade_reagents)
- upgrade_reagents = sortList(upgrade_reagents, /proc/cmp_reagents_asc)
+ if(t2_upgrade_reagents)
+ t2_upgrade_reagents = sortList(t2_upgrade_reagents, /proc/cmp_reagents_asc)
+ display_reagents |= t2_upgrade_reagents
+ display_reagents = sortList(display_reagents,/proc/cmp_reagents_asc) //Why is this here you ask? because yogs moved things from t1 to t2 so now it fucks up the ordering. This restores it.
+ if(t3_upgrade_reagents)
+ t3_upgrade_reagents = sortList(t3_upgrade_reagents, /proc/cmp_reagents_asc)
+ display_reagents |= t3_upgrade_reagents
+ if(t4_upgrade_reagents)
+ t4_upgrade_reagents = sortList(t4_upgrade_reagents, /proc/cmp_reagents_asc)
+ display_reagents |= t4_upgrade_reagents
+ //we don't sort display_reagents again after adding these because they will fuck up the order
update_icon()
/obj/machinery/chem_dispenser/Destroy()
@@ -101,8 +118,8 @@
if(in_range(user, src) || isobserver(user))
. += "The status display reads: \n"+\
"Recharging [recharge_amount] power units per interval.\n"+\
- "Power efficiency increased by [round((powerefficiency*1000)-100, 1)]%.\n"+\
- "Macro granularity at [macroresolution]u."
+ "Power efficiency increased by [round((powerefficiency*1000)-100, 1)]%."
+ //"Macro granularity at [macroresolution]u."
/obj/machinery/chem_dispenser/process()
if (recharge_counter >= 4)
@@ -143,6 +160,7 @@
return
to_chat(user, span_notice("You short out [src]'s safeties."))
dispensable_reagents |= emagged_reagents//add the emagged reagents to the dispensable ones
+ display_reagents |= emagged_reagents
obj_flags |= EMAGGED
/obj/machinery/chem_dispenser/ex_act(severity, target)
@@ -166,6 +184,16 @@
beaker = null
cut_overlays()
+/obj/machinery/chem_dispenser/proc/get_tier_for_chemical(datum/reagent/chem)
+ var/tier = 1
+ if(t4_upgrade_reagents?.Find(chem.type))
+ tier = 4
+ if(t3_upgrade_reagents?.Find(chem.type))
+ tier = 3
+ if(t2_upgrade_reagents?.Find(chem.type))
+ tier = 2
+ return tier
+
/obj/machinery/chem_dispenser/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
@@ -203,13 +231,13 @@
var/is_hallucinating = FALSE
if(user.hallucinating())
is_hallucinating = TRUE
- for(var/re in dispensable_reagents)
+ for(var/re in display_reagents)
var/datum/reagent/temp = GLOB.chemical_reagents_list[re]
if(temp)
var/chemname = temp.name
if(is_hallucinating && prob(5))
chemname = "[pick_list_replacements("hallucination.json", "chemicals")]"
- chemicals.Add(list(list("title" = chemname, "id" = ckey(temp.name))))
+ chemicals.Add(list(list("title" = chemname, "id" = ckey(temp.name), "locked" = (dispensable_reagents.Find(temp.type) ? FALSE : TRUE), "tier" = get_tier_for_chemical(temp))))
for(var/recipe in saved_recipes)
recipes.Add(list(recipe))
data["chemicals"] = chemicals
@@ -369,10 +397,13 @@
for(var/obj/item/stock_parts/capacitor/C in component_parts)
recharge_amount *= C.rating
for(var/obj/item/stock_parts/manipulator/M in component_parts)
- if (M.rating > 1)
+ if (M.rating > 1) // T2+
+ dispensable_reagents |= t2_upgrade_reagents
macroresolution -= M.rating //5 for t1, 3 for t2, 2 for t3, 1 for t4
- if (M.rating > 3)
- dispensable_reagents |= upgrade_reagents
+ if (M.rating > 2) // T3+
+ dispensable_reagents |= t3_upgrade_reagents
+ if (M.rating > 3) // T4+
+ dispensable_reagents |= t4_upgrade_reagents
powerefficiency = round(newpowereff, 0.01)
/obj/machinery/chem_dispenser/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
@@ -469,6 +500,7 @@
/datum/reagent/consumable/tea,
/datum/reagent/consumable/icetea,
/datum/reagent/consumable/space_cola,
+ /datum/reagent/consumable/rootbeer,
/datum/reagent/consumable/spacemountainwind,
/datum/reagent/consumable/dr_gibb,
/datum/reagent/consumable/space_up,
@@ -487,7 +519,9 @@
/datum/reagent/consumable/menthol,
/datum/reagent/consumable/berryjuice
)
- upgrade_reagents = null
+ t2_upgrade_reagents = null
+ t3_upgrade_reagents = null
+ t4_upgrade_reagents = null
emagged_reagents = list(
/datum/reagent/consumable/ethanol/thirteenloko,
/datum/reagent/consumable/ethanol/whiskey_cola,
@@ -541,7 +575,9 @@
/datum/reagent/consumable/ethanol/applejack,
/datum/reagent/consumable/ethanol/amaretto
)
- upgrade_reagents = null
+ t2_upgrade_reagents = null
+ t3_upgrade_reagents = null
+ t4_upgrade_reagents = null
emagged_reagents = list(
/datum/reagent/consumable/ethanol,
/datum/reagent/iron,
@@ -572,7 +608,9 @@
name = "mutagen dispenser"
desc = "Creates and dispenses mutagen."
dispensable_reagents = list(/datum/reagent/toxin/mutagen)
- upgrade_reagents = null
+ t2_upgrade_reagents = null
+ t3_upgrade_reagents = null
+ t4_upgrade_reagents = null
emagged_reagents = list(/datum/reagent/toxin/plasma)
@@ -595,7 +633,9 @@
/datum/reagent/ammonia,
/datum/reagent/ash,
/datum/reagent/diethylamine)
- upgrade_reagents = null
+ t2_upgrade_reagents = null
+ t3_upgrade_reagents = null
+ t4_upgrade_reagents = null
/obj/machinery/chem_dispenser/mutagensaltpeter/Initialize()
. = ..()
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index c555556bbb9c..86bdbf870cdb 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -479,6 +479,20 @@
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
..()
+/datum/reagent/consumable/rootbeer
+ name = "Root Beer"
+ description = "Beer, but not."
+ color = "#251505" // rgb: 16, 8, 0
+ taste_description = "root and beer"
+ glass_icon_state = "glass_brown"
+ glass_name = "glass of root beer"
+ glass_desc = "A glass of refreshing fizzing root beer."
+
+/datum/reagent/consumable/rootbeer/on_mob_life(mob/living/carbon/M)
+ M.drowsyness = max(0,M.drowsyness-5)
+ M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
+ ..()
+
/datum/reagent/consumable/nuka_cola
name = "Nuka Cola"
description = "Cola, cola never changes."
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 6a7c441e9d99..ac4b457e46c8 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -197,6 +197,7 @@
/obj/item/reagent_containers/syringe/on_embed(mob/living/carbon/human/embedde, obj/item/bodypart/part)
reagents.trans_to(embedde, amount_per_transfer_from_this)
+ return TRUE
/obj/item/reagent_containers/syringe/embed_tick(embedde, part)
reagents.trans_to(embedde, amount_per_transfer_from_this * 0.2)
diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm
index 3007a633fd40..4ffbbf7d77f1 100644
--- a/code/modules/religion/religion_sects.dm
+++ b/code/modules/religion/religion_sects.dm
@@ -210,7 +210,7 @@
id_card.registered_account.adjust_money(-10)
id_cardu.registered_account.adjust_money(10)
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing)
- playsound(user, 'sound/misc/capitialism.ogg', 25, TRUE, -1)
+ playsound(user, 'sound/misc/capitialism-short.ogg', 25, TRUE, -1)
H.visible_message(span_notice("[user] blesses [H] with the power of capitalism!"))
to_chat(H, span_boldnotice("You feel spiritually enriched, and donate to the cause of [GLOB.deity]!"))
H.visible_message(span_notice("[H] donated 10 credits!"))
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index c3464beeae42..6fc7d54e08ac 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -364,7 +364,7 @@
id = "plate"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 1500)
- build_path = /obj/item/storage/bag/tray
+ build_path = /obj/item/plate
category = list("initial","Dinnerware","Service")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 349eacbf9eb1..53e602e704a4 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -217,7 +217,7 @@
id = "rollerbed"
build_path = /obj/item/roller
build_type = PROTOLATHE
- materials = list(/datum/material/iron = 8000, /datum/material/plastic = 2000) // balancing is a bitch, what does this even mean? i don't really know.
+ materials = list(/datum/material/iron = 8000)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
@@ -343,6 +343,17 @@
category = list("Implants", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+/datum/design/cyberimp_science_analyzer
+ name = "Chemical Analyzer Implant"
+ desc = "These cybernetic eye implants will allow rapid identification of reagents. Wiggle eyes to control."
+ id = "ci-scihud"
+ build_type = PROTOLATHE | MECHFAB
+ construction_time = 50
+ materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plastic = 150)
+ build_path = /obj/item/organ/cyberimp/eyes/hud/science
+ category = list("Implants", "Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
/datum/design/cyberimp_xray
name = "X-ray Eyes"
desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile."
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 7028911e967e..dcea347fd5fd 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -104,6 +104,16 @@
category = list("Firing Pins")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+/datum/design/batonupgrade
+ name = "Baton Power Upgrade"
+ desc = "A new power management circuit which enables stun batons to instantly stun, at the cost of more power usage."
+ id = "baton_upgrade"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/gold = 600, /datum/material/silver = 600, /datum/material/diamond = 600, /datum/material/uranium = 600, /datum/material/plasma = 600)
+ build_path = /obj/item/batonupgrade
+ category = list("Firing Pins")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/stunmine/sec //mines ported from BeeStation
name = "Stun Mine"
desc = "A basic non-lethal stunning mine. Stuns anyone who walks over it."
@@ -310,7 +320,7 @@
/datum/design/mag_oldsmg
name = "WT-550 Auto Gun Magazine (4.6x30mm)"
- desc = "A 20 round magazine for the out of date security WT-550 Auto Rifle."
+ desc = "A 22 round magazine for the out of date security WT-550 Auto Rifle."
id = "mag_oldsmg"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 4000)
@@ -320,7 +330,7 @@
/datum/design/mag_oldsmg/ap_mag
name = "WT-550 Auto Gun Armour Piercing Magazine (4.6x30mm AP)"
- desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle."
+ desc = "A 22 round armour piercing magazine for the out of date security WT-550 Auto Rifle."
id = "mag_oldsmg_ap"
materials = list(/datum/material/iron = 6000, /datum/material/silver = 600)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtap
@@ -328,7 +338,7 @@
/datum/design/mag_oldsmg/ic_mag
name = "WT-550 Auto Gun Incendiary Magazine (4.6x30mm IC)"
- desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle."
+ desc = "A 22 round armour piercing magazine for the out of date security WT-550 Auto Rifle."
id = "mag_oldsmg_ic"
materials = list(/datum/material/iron = 6000, /datum/material/silver = 600, /datum/material/glass = 1000)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtic
@@ -336,7 +346,7 @@
/datum/design/mag_oldsmg/rubber_mag
name = "WT-550 Auto Gun Rubber Bullet Magazine (4.6x30mm Rubber)"
- desc = "A 20 round rubber bullet magazine for the out of date security WT-550 Auto Rifle."
+ desc = "A 22 round rubber bullet magazine for the out of date security WT-550 Auto Rifle."
id = "mag_oldsmg_rubber"
materials = list(/datum/material/iron = 4000)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtr
diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm
index b851990adfda..7f892ff8fa90 100644
--- a/code/modules/research/nanites/nanite_programs/suppression.dm
+++ b/code/modules/research/nanites/nanite_programs/suppression.dm
@@ -108,7 +108,7 @@
/datum/nanite_program/fake_death
name = "Death Simulation"
desc = "The nanites induce a death-like coma into the host, able to fool most medical scans."
- use_rate = 3.5
+ use_rate = 4.5
rogue_types = list(/datum/nanite_program/nerve_decay, /datum/nanite_program/necrotic, /datum/nanite_program/brain_decay)
harmful = TRUE
diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm
index 810f59fa3da4..68504cbd7f6c 100644
--- a/code/modules/research/nanites/nanite_programs/weapon.dm
+++ b/code/modules/research/nanites/nanite_programs/weapon.dm
@@ -91,14 +91,14 @@
return
host_mob.visible_message(span_warning("[host_mob] starts emitting a high-pitched buzzing, and [host_mob.p_their()] skin begins to glow..."),\
span_userdanger("You start emitting a high-pitched buzzing, and your skin begins to glow..."))
- addtimer(CALLBACK(src, .proc/boom), clamp((nanites.nanite_volume * 0.35), 25, 150))
+ addtimer(CALLBACK(src, .proc/boom), 30 SECONDS) //You have 30 seconds to live
/datum/nanite_program/triggered/explosive/proc/boom()
var/nanite_amount = nanites.nanite_volume
- var/dev_range = FLOOR(nanite_amount/200, 1) - 1
+ host_mob.adjustBruteLoss(nanite_amount/2.5) //Instead of gibbing we'll just do an asston of damage
var/heavy_range = FLOOR(nanite_amount/100, 1) - 1
var/light_range = FLOOR(nanite_amount/50, 1) - 1
- explosion(host_mob, dev_range, heavy_range, light_range)
+ explosion(host_mob, 0, heavy_range, light_range)
qdel(nanites)
//TODO make it defuse if triggered again
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 81ceddbcace4..7240543c879c 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -699,6 +699,11 @@ Nothing else in the console has ID requirements.
/obj/machinery/computer/rdconsole/proc/machine_icon(atom/item)
return icon2html(initial(item.icon), usr, initial(item.icon_state), SOUTH)
+/obj/machinery/computer/rdconsole/proc/can_research(mob/user)
+ if(!locked || allowed(user))
+ return TRUE
+ return FALSE
+
/obj/machinery/computer/rdconsole/proc/ui_techweb_single_node(datum/techweb_node/node, selflink=TRUE, minimal=FALSE)
var/list/l = list()
if (stored_research.hidden_nodes[node.id])
@@ -974,6 +979,9 @@ Nothing else in the console has ID requirements.
if(ls["disk_slot"])
disk_slot_selected = text2num(ls["disk_slot"])
if(ls["research_node"])
+ if(!can_research(usr))
+ to_chat(usr, "ACCESS DENIED")
+ return
if(!research_control)
return //honestly should call them out for href exploiting :^)
if(!SSresearch.science_tech.available_nodes[ls["research_node"]])
diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm
index 0c1a0ce2515b..c4c7b8417602 100644
--- a/code/modules/research/techweb/_techweb.dm
+++ b/code/modules/research/techweb/_techweb.dm
@@ -14,6 +14,7 @@
var/list/hidden_nodes = list() //Hidden nodes. id = TRUE. Used for unhiding nodes when requirements are met by removing the entry of the node.
var/list/deconstructed_items = list() //items already deconstructed for a generic point boost. path = list(point_type = points)
var/list/research_points = list() //Available research points. type = number
+ var/list/stored_research_points = list() //Stored research, up to doubles server mining when present. type = number
var/list/obj/machinery/computer/rdconsole/consoles_accessing = list()
var/id = "generic"
var/list/research_logs = list() //IC logs.
@@ -142,6 +143,7 @@
/datum/techweb/proc/get_researched_nodes()
return researched_nodes - hidden_nodes
+/// procs for modifying a specific point type amount
/datum/techweb/proc/add_point_type(type, amount)
if(!SSresearch.point_types[type] || (amount <= 0))
return FALSE
@@ -160,6 +162,25 @@
research_points[type] = max(0, research_points[type] - amount)
return TRUE
+/// procs for modifying a specific point type's stored research amount
+/datum/techweb/proc/add_stored_point_type(type, amount)
+ if(!SSresearch.point_types[type] || (amount <= 0))
+ return FALSE
+ stored_research_points[type] = max(0, stored_research_points[type] + amount)
+ return TRUE
+
+/datum/techweb/proc/modify_stored_point_type(type, amount)
+ if(!SSresearch.point_types[type])
+ return FALSE
+ stored_research_points[type] = max(0, stored_research_points[type] + amount)
+ return TRUE
+
+/datum/techweb/proc/remove_stored_point_type(type, amount)
+ if(!SSresearch.point_types[type] || (amount <= 0))
+ return FALSE
+ stored_research_points[type] = max(0, stored_research_points[type] - amount)
+ return TRUE
+
/datum/techweb/proc/add_design_by_id(id, custom = FALSE)
return add_design(SSresearch.techweb_design_by_id(id), custom)
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 5b2e00bd62af..b3a10a569a3b 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -547,7 +547,7 @@
display_name = "Cybernetic Implants"
description = "Electronic implants that improve humans."
prereq_ids = list("adv_biotech", "datatheory")
- design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-diaghud")
+ design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-scihud", "ci-diaghud")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -697,7 +697,7 @@
display_name = "Advanced Weapon Development Technology"
description = "Our weapons are breaking the rules of reality by now."
prereq_ids = list("adv_engi", "weaponry")
- design_ids = list("pin_loyalty", "borg_transform_security")
+ design_ids = list("pin_loyalty", "borg_transform_security", "baton_upgrade")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
export_price = 5000
diff --git a/code/modules/research/techweb/layout.dm b/code/modules/research/techweb/layout.dm
index 80c986c9ebef..3f2a0c33c30a 100644
--- a/code/modules/research/techweb/layout.dm
+++ b/code/modules/research/techweb/layout.dm
@@ -75,10 +75,6 @@
ui_x = 288
ui_y = -96
-/datum/techweb_node/xenoorgan_biotech
- ui_x = 256
- ui_y = -64
-
/datum/techweb_node/bio_process
ui_x = 224
ui_y = -224
@@ -219,6 +215,10 @@
ui_x = 32
ui_y = -832
+/datum/techweb_node/xenoorgan_biotech
+ ui_x = 256
+ ui_y = -64
+
/datum/techweb_node/cyborg_upg_med
ui_x = 352
ui_y = -160
@@ -287,6 +287,14 @@
ui_x = 480
ui_y = -32
+/datum/techweb_node/ai_cpu_advanced
+ ui_x = 992
+ ui_y = 64
+
+/datum/techweb_node/ai_ram_high_cap
+ ui_x = 544
+ ui_y = 64
+
/datum/techweb_node/spacepod_storage
ui_x = 96
ui_y = -832
@@ -327,10 +335,6 @@
ui_x = 96
ui_y = -448
-/datum/techweb_node/magmite_mining
- ui_x = 160
- ui_y = -512
-
/datum/techweb_node/janitor
ui_x = -320
ui_y = -160
@@ -371,6 +375,18 @@
ui_x = -256
ui_y = -224
+/datum/techweb_node/ai_cpu_bluespace
+ ui_x = 992
+ ui_y = 192
+
+/datum/techweb_node/ai_ram_bluespace
+ ui_x = 544
+ ui_y = 192
+
+/datum/techweb_node/ai_architecture_bluespace
+ ui_x = 768
+ ui_y = 160
+
/datum/techweb_node/adv_plasma
ui_x = 32
ui_y = -384
@@ -395,6 +411,14 @@
ui_x = -576
ui_y = -96
+/datum/techweb_node/ai_cpu_1
+ ui_x = 896
+ ui_y = 64
+
+/datum/techweb_node/ai_ram_1
+ ui_x = 640
+ ui_y = 64
+
/datum/techweb_node/emp_super
ui_x = -224
ui_y = -128
@@ -435,6 +459,18 @@
ui_x = -416
ui_y = -256
+/datum/techweb_node/ai_cpu_experimental
+ ui_x = 992
+ ui_y = 128
+
+/datum/techweb_node/ai_ram_hyper
+ ui_x = 544
+ ui_y = 128
+
+/datum/techweb_node/magmite_mining
+ ui_x = 160
+ ui_y = -512
+
/datum/techweb_node/mech_diamond_drill
ui_x = 96
ui_y = -512
@@ -479,6 +515,14 @@
ui_x = -416
ui_y = -320
+/datum/techweb_node/ai_cpu_3
+ ui_x = 896
+ ui_y = 192
+
+/datum/techweb_node/ai_ram_3
+ ui_x = 640
+ ui_y = 192
+
/datum/techweb_node/spacepod_advplasmacutter
ui_x = 160
ui_y = -640
@@ -499,6 +543,18 @@
ui_x = -576
ui_y = -32
+/datum/techweb_node/ai_architecture_256
+ ui_x = 768
+ ui_y = 96
+
+/datum/techweb_node/ai_cpu_2
+ ui_x = 896
+ ui_y = 128
+
+/datum/techweb_node/ai_ram_2
+ ui_x = 640
+ ui_y = 128
+
/datum/techweb_node/xenology
ui_x = 480
ui_y = -96
diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm
index 4cf19ca5dd0b..756ce49e4d13 100644
--- a/code/modules/spells/spell_types/conjure.dm
+++ b/code/modules/spells/spell_types/conjure.dm
@@ -101,7 +101,7 @@
/obj/effect/proc_holder/spell/aoe_turf/horde
name = "Horde"
- desc = "Bring all your existing bloodmen to you at the cost of 18% blood (15 brain damage for those without blood)."
+ desc = "Bring all your existing bloodmen to you at the cost of 3% blood per bloodman or 5 brain damage per bloodman if you're a bloodless race."
action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "horde"
var/list/summon_type = list("/mob/living/simple_animal/hostile/asteroid/hivelord/legion/bloodman")
@@ -123,7 +123,7 @@
user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5)
to_chat(usr, span_notice("You can almost feel your brain writhing as you call your bloodmen to you."))
else
- user.blood_volume -= 30
+ user.blood_volume -= 15
to_chat(usr, span_notice("You feel yourself becoming paler with every minion called."))
if(T)
bloodman.forceMove(T)
diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm
index 724248192792..0f18c664b5a2 100644
--- a/code/modules/spells/spell_types/godhand.dm
+++ b/code/modules/spells/spell_types/godhand.dm
@@ -141,18 +141,19 @@
/obj/item/melee/touch_attack/raisehand
name = "\improper raise bloodman"
- desc = "Blood covers your hand like a glove as it waits for a new host."
+ desc = "Prepare to raise a bloodman for about 5% of your blood or 5 brain damage if you're a bloodless race."
on_use_sound = 'sound/magic/wandodeath.ogg'
icon_state = "flagellation"
item_state = "hivehand"
color = "#FF0000"
+
/obj/item/melee/touch_attack/raisehand/afterattack(atom/target, mob/living/carbon/user, proximity)
var/mob/living/carbon/human/M = target
if(!ishuman(M) || M.stat != DEAD)
- to_chat(M, span_notice("You must be targeting a dead humanoid!"))
+ to_chat(user, span_notice("You must be targeting a dead humanoid!"))
return
if(GLOB.bloodmen_list.len > 2)
- to_chat(M, span_notice("You can't control that many minions!"))
+ to_chat(user, span_notice("You can't control that many minions!"))
return
if(NOBLOOD in M.dna.species.species_traits)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5)
@@ -163,9 +164,8 @@
L.stored_mob = M
M.forceMove(L)
qdel(src)
- user.blood_volume -= 50 // 9% blood cost, cheaper than the other spell because its not like you can stop near a corpse or find one near you in a fight
- to_chat(user, "You curse the body with your blood, leaving you feeling a bit light-headed.")
-
+ user.blood_volume -= 25
+ to_chat(user, span_notice("You curse the body with your blood, leaving you feeling a bit light-headed."))
/obj/item/melee/touch_attack/pacifism
name = "\improper pacifism touch"
diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm
index a4fb116a2b7f..3b06f41a4882 100644
--- a/code/modules/spells/spell_types/touch_attacks.dm
+++ b/code/modules/spells/spell_types/touch_attacks.dm
@@ -104,9 +104,9 @@
hand_path = /obj/item/melee/touch_attack/pacifism
school = "evocation"
- charge_max = 600
+ charge_max = 1 MINUTES
clothes_req = FALSE
- cooldown_min = 2 MINUTES
+ cooldown_min = 20 SECONDS
action_icon ='icons/mob/gondolas.dmi'
action_icon_state = "gondola"
diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm
index 6be764505123..e426ad0bb28a 100644
--- a/code/modules/surgery/advanced/brainwashing.dm
+++ b/code/modules/surgery/advanced/brainwashing.dm
@@ -28,7 +28,10 @@
/datum/surgery_step/brainwash
name = "brainwash"
implements = list(TOOL_HEMOSTAT = 85, TOOL_WIRECUTTER = 50, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15)
- time = 200
+ time = 20 SECONDS
+ preop_sound = 'sound/surgery/hemostat1.ogg'
+ success_sound = 'sound/surgery/hemostat1.ogg'
+ failure_sound = 'sound/surgery/organ2.ogg'
var/objective
/datum/surgery_step/brainwash/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -64,4 +67,4 @@
B.applyOrganDamage(80)
else
user.visible_message("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", span_warning("You suddenly notice that the brain you were working on is not there anymore."))
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm
index 5bf66e36e27c..c90b40a15eba 100644
--- a/code/modules/surgery/advanced/lobotomy.dm
+++ b/code/modules/surgery/advanced/lobotomy.dm
@@ -1,6 +1,7 @@
/datum/surgery/advanced/lobotomy
name = "Lobotomy"
desc = "An invasive surgical procedure which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return."
+ icon_state = "lobotomy"
steps = list(
/datum/surgery_step/incise,
/datum/surgery_step/retract_skin,
@@ -25,7 +26,10 @@
name = "perform lobotomy"
implements = list(TOOL_SCALPEL = 85, /obj/item/melee/transforming/energy/sword = 55, /obj/item/kitchen/knife = 35,
/obj/item/shard = 25, /obj/item = 20)
- time = 100
+ time = 10 SECONDS
+ preop_sound = 'sound/surgery/scalpel1.ogg'
+ success_sound = 'sound/surgery/scalpel2.ogg'
+ failure_sound = 'sound/surgery/organ2.ogg'
fuckup_damage = 20
/datum/surgery_step/lobotomize/tool_check(mob/user, obj/item/tool)
diff --git a/code/modules/surgery/advanced/pacification.dm b/code/modules/surgery/advanced/pacification.dm
index 978ac0de8548..a6ce9d3887dc 100644
--- a/code/modules/surgery/advanced/pacification.dm
+++ b/code/modules/surgery/advanced/pacification.dm
@@ -21,7 +21,10 @@
/datum/surgery_step/pacify
name = "rewire brain"
implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15)
- time = 40
+ time = 4 SECONDS
+ preop_sound = 'sound/surgery/hemostat1.ogg'
+ success_sound = 'sound/surgery/hemostat1.ogg'
+ failure_sound = 'sound/surgery/organ2.ogg'
/datum/surgery_step/pacify/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_notice("You begin to pacify [target]..."),
@@ -40,4 +43,4 @@
span_warning("[user] screws up, causing brain damage!"),
"[user] completes the surgery on [target]'s brain.")
target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY)
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm
index f80d2e424450..164d1fedb60d 100644
--- a/code/modules/surgery/advanced/revival.dm
+++ b/code/modules/surgery/advanced/revival.dm
@@ -1,6 +1,7 @@
/datum/surgery/advanced/revival
name = "Revival"
desc = "An experimental surgical procedure which involves reconstruction and reactivation of the patient's brain even long after death. The body must still be able to sustain life."
+ icon_state = "revival"
steps = list(/datum/surgery_step/incise,
/datum/surgery_step/retract_skin,
/datum/surgery_step/saw,
@@ -26,9 +27,11 @@
return TRUE
/datum/surgery_step/revive
- name = "shock body"
+ name = "shock brain"
implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/melee/baton = 75, /obj/item/gun/energy = 60, /obj/item/melee/touch_attack/shock = 100)
- time = 120
+ time = 12 SECONDS
+ success_sound = 'sound/magic/lightningbolt.ogg'
+ failure_sound = 'sound/machines/defib_zap.ogg'
/datum/surgery_step/revive/tool_check(mob/user, obj/item/tool)
. = TRUE
@@ -56,11 +59,18 @@
"[user] prepares to shock [target]'s brain with [tool].")
target.notify_ghost_cloning("Someone is trying to zap your brain.", source = target)
+/datum/surgery_step/revive/play_preop_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(istype(tool, /obj/item/twohanded/shockpaddles))
+ playsound(tool, 'sound/machines/defib_charge.ogg', 75, 0)
+ else
+ ..()
+
/datum/surgery_step/revive/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(user.job == "Medical Doctor" || user.job == "Paramedic" || user.job == "Chief Medical Officer")
+ user.say("Clear!", forced = "surgery")
display_results(user, target, span_notice("You successfully shock [target]'s brain with [tool]..."),
"[user] send a powerful shock to [target]'s brain with [tool]...",
"[user] send a powerful shock to [target]'s brain with [tool]...")
- playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1)
target.grab_ghost()
target.adjustOxyLoss(-50, 0)
target.updatehealth()
@@ -74,9 +84,10 @@
return FALSE
/datum/surgery_step/revive/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(user.job == "Medical Doctor" || user.job == "Paramedic" || user.job == "Chief Medical Officer")
+ user.say("Clear!", forced = "surgery")
display_results(user, target, span_notice("You shock [target]'s brain with [tool], but [target.p_they()] doesn't react."),
"[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.",
"[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.")
- playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1)
target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 180)
return FALSE
diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm
index 65d2e12ef250..6a357e482b95 100644
--- a/code/modules/surgery/amputation.dm
+++ b/code/modules/surgery/amputation.dm
@@ -1,6 +1,8 @@
/datum/surgery/amputation
name = "Amputation"
+ icon_state = "amputation"
+ desc = "Sever a limb from the torso."
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/sever_limb)
target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD)
@@ -27,7 +29,9 @@
/datum/surgery_step/sever_limb
name = "sever limb"
implements = list(TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/arm_blade = 80, /obj/item/twohanded/required/chainsaw = 80, /obj/item/mounted_chainsaw = 80, /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25)
- time = 64
+ time = 6.4 SECONDS
+ preop_sound = 'sound/surgery/scalpel1.ogg'
+ success_sound = 'sound/surgery/organ2.ogg'
/datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_notice("You begin to sever [target]'s [parse_zone(target_zone)]..."),
diff --git a/code/modules/surgery/autopsy.dm b/code/modules/surgery/autopsy.dm
index 331a4fb9b4e3..995ca5ec1c94 100644
--- a/code/modules/surgery/autopsy.dm
+++ b/code/modules/surgery/autopsy.dm
@@ -1,6 +1,9 @@
/datum/surgery/autopsy
name = "Autopsy"
+ desc = "Tells you what last damaged the patient."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "scalpel"
steps = list(/datum/surgery_step/incise,
/datum/surgery_step/autopsy)
target_mobtypes = list(/mob/living)
diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm
index f73d85ad8676..1d764536b704 100644
--- a/code/modules/surgery/brain_surgery.dm
+++ b/code/modules/surgery/brain_surgery.dm
@@ -1,5 +1,8 @@
/datum/surgery/brain_surgery
name = "Brain surgery"
+ desc = "This procedure cures all severe and basic traumas and reduces brain damage by a large amount. Failing to fix the brain causes hefty brain damage."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "brain"
steps = list(
/datum/surgery_step/incise,
/datum/surgery_step/retract_skin,
@@ -15,7 +18,10 @@
/datum/surgery_step/fix_brain
name = "fix brain"
implements = list(TOOL_HEMOSTAT = 85, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100
- time = 120 //long and complicated
+ time = 12 SECONDS //long and complicated
+ preop_sound = 'sound/surgery/hemostat1.ogg'
+ success_sound = 'sound/surgery/hemostat1.ogg'
+ failure_sound = 'sound/surgery/organ2.ogg'
fuckup_damage = 20
/datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target)
diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm
index d78d0a636d85..2c52586fbdba 100644
--- a/code/modules/surgery/burn_dressing.dm
+++ b/code/modules/surgery/burn_dressing.dm
@@ -24,8 +24,11 @@
/datum/surgery_step/debride_infected
name = "excise infection"
implements = list(TOOL_SCALPEL = 100, TOOL_SAW = 60, TOOL_WIRECUTTER = 40)
- time = 30
+ time = 3 SECONDS
repeatable = TRUE
+ preop_sound = 'sound/surgery/scalpel1.ogg'
+ success_sound = 'sound/surgery/retractor2.ogg'
+ failure_sound = 'sound/surgery/organ1.ogg'
/// How much sanitization is added per step
var/sanitization_added = 0.5
/// How much infestation is removed per step (positive number)
@@ -80,7 +83,9 @@
/datum/surgery_step/dress
name = "bandage burns"
implements = list(/obj/item/stack/medical/gauze = 100)
- time = 40
+ time = 4 SECONDS
+ preop_sound = 'sound/effects/rip2.ogg'
+ success_sound = 'sound/effects/rip1.ogg'
/datum/surgery_step/dress/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/datum/wound/burn/burn_wound = surgery.operated_wound
diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm
index 4c01ddc9c5f3..fc8faf3b667e 100644
--- a/code/modules/surgery/cavity_implant.dm
+++ b/code/modules/surgery/cavity_implant.dm
@@ -1,5 +1,8 @@
/datum/surgery/cavity_implant
name = "Cavity implant"
+ desc = "Implants or removes an object in the chest. Items up to normal size can be implanted, but tiny and small items won't show what they are in the implanting messages."
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "flashlight"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/handle_cavity, /datum/surgery_step/close)
target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST)
@@ -17,7 +20,9 @@
name = "implant item"
accept_hand = 1
accept_any_item = 1
- time = 32
+ time = 3.2 SECONDS
+ preop_sound = 'sound/surgery/organ1.ogg'
+ success_sound = 'sound/surgery/organ2.ogg'
var/obj/item/IC = null
/datum/surgery_step/handle_cavity/preop(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm
index 9155cf201235..32be2db283f0 100644
--- a/code/modules/surgery/core_removal.dm
+++ b/code/modules/surgery/core_removal.dm
@@ -1,5 +1,8 @@
/datum/surgery/core_removal
name = "Core removal"
+ desc = "Remove core from slime. Extract core must be repeated for every core if slime has several."
+ icon = 'icons/mob/slimes.dmi'
+ icon_state = "grey slime extract"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/extract_core)
target_mobtypes = list(/mob/living/simple_animal/slime)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm
index 1a91f36f7fc7..86c32a148482 100644
--- a/code/modules/surgery/coronary_bypass.dm
+++ b/code/modules/surgery/coronary_bypass.dm
@@ -1,5 +1,8 @@
/datum/surgery/coronary_bypass
name = "Coronary Bypass"
+ desc = "Restores the heart to a functional state if it is in a non-functional state, making it able to be defibrillated and sustain life. Can only be performed once on an individual heart."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "heart-off"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders,
/datum/surgery_step/incise_heart, /datum/surgery_step/coronary_bypass, /datum/surgery_step/close)
possible_locs = list(BODY_ZONE_CHEST)
@@ -17,7 +20,10 @@
name = "incise heart"
implements = list(TOOL_SCALPEL = 90, /obj/item/melee/transforming/energy/sword = 45, /obj/item/kitchen/knife = 45,
/obj/item/shard = 25)
- time = 16
+ time = 1.6 SECONDS
+ preop_sound = 'sound/surgery/scalpel1.ogg'
+ success_sound = 'sound/surgery/scalpel2.ogg'
+ failure_sound = 'sound/surgery/organ2.ogg'
fuckup_damage = 20
/datum/surgery_step/incise_heart/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -52,7 +58,10 @@
/datum/surgery_step/coronary_bypass
name = "graft coronary bypass"
implements = list(TOOL_HEMOSTAT = 90, TOOL_WIRECUTTER = 35, /obj/item/stack/packageWrap = 15, /obj/item/stack/cable_coil = 5)
- time = 90
+ time = 9 SECONDS
+ preop_sound = 'sound/surgery/hemostat1.ogg'
+ success_sound = 'sound/surgery/hemostat1.ogg'
+ failure_sound = 'sound/surgery/organ2.ogg'
fuckup_damage = 20
/datum/surgery_step/coronary_bypass/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm
index f0457cdc6b39..965d6cd03f59 100644
--- a/code/modules/surgery/dental_implant.dm
+++ b/code/modules/surgery/dental_implant.dm
@@ -1,5 +1,8 @@
/datum/surgery/dental_implant
name = "Dental implant"
+ desc = "This allows you to insert pills/patches into a tooth cavity, allowing you to pop it any time to ingest it. This works for both stimulants and suicide pills."
+ icon = 'icons/obj/implants.dmi'
+ icon_state = "reagents"
steps = list(/datum/surgery_step/drill, /datum/surgery_step/insert_pill)
possible_locs = list(BODY_ZONE_PRECISE_MOUTH)
diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm
index cfa5b4f8ae80..09bd2b66f8fc 100644
--- a/code/modules/surgery/experimental_dissection.dm
+++ b/code/modules/surgery/experimental_dissection.dm
@@ -1,6 +1,8 @@
/datum/surgery/experimental_dissection
name = "Experimental Dissection"
desc = "A surgical procedure which deeply analyzes the biology of a corpse, and automatically adds new findings to the research database."
+ icon = 'icons/obj/implants.dmi'
+ icon_state = "scan_mode"
steps = list(/datum/surgery_step/incise,
/datum/surgery_step/retract_skin,
/datum/surgery_step/clamp_bleeders,
diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm
index 6c5661c86503..4f41fb3a1308 100644
--- a/code/modules/surgery/eye_surgery.dm
+++ b/code/modules/surgery/eye_surgery.dm
@@ -1,5 +1,8 @@
/datum/surgery/eye_surgery
name = "Eye surgery"
+ desc = "Fixes all damage done to eyes, though doesnt fix genetic blindness. Failing to fix the eyes will cause brain damage to the patient."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "eyeballs"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_PRECISE_EYES)
diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm
index 09ccb42d169b..421c1eb3f19c 100644
--- a/code/modules/surgery/healing.dm
+++ b/code/modules/surgery/healing.dm
@@ -1,4 +1,5 @@
/datum/surgery/healing
+ icon = 'icons/obj/chemical.dmi'
steps = list(/datum/surgery_step/incise,
/datum/surgery_step/heal,
/datum/surgery_step/close)
@@ -23,6 +24,8 @@
implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 65, /obj/item/pen = 55)
repeatable = TRUE
time = 2 SECONDS
+ success_sound = 'sound/surgery/retractor2.ogg'
+ failure_sound = 'sound/surgery/organ2.ogg'
fuckup_damage = 0
var/brutehealing = 0
var/burnhealing = 0
@@ -103,6 +106,7 @@
/***************************BRUTE***************************/
/datum/surgery/healing/brute
name = "Tend Wounds (Bruises)"
+ icon_state = "bandaid_brute"
/datum/surgery/healing/brute/basic
name = "Tend Wounds (Bruises, Basic)"
@@ -168,6 +172,7 @@
/***************************BURN***************************/
/datum/surgery/healing/burn
name = "Tend Wounds (Burn)"
+ icon_state = "bandaid_burn"
/datum/surgery/healing/burn/basic
name = "Tend Wounds (Burn, Basic)"
@@ -234,6 +239,7 @@
/datum/surgery/healing/combo
name = "Tend Wounds (Mixture, Basic)"
+ icon_state = "bandaid_both"
replaced_by = /datum/surgery/healing/combo/upgraded
requires_tech = TRUE
healing_step_type = /datum/surgery_step/heal/combo
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index 2dd2849ba82b..507b7bef2244 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -19,6 +19,7 @@
if(!current_surgery)
var/list/all_surgeries = GLOB.surgeries_list.Copy()
var/list/available_surgeries = list()
+ var/list/radial_list = list()
for(var/datum/surgery/S in all_surgeries)
if(!S.possible_locs.Find(selected_zone))
@@ -39,12 +40,17 @@
for(var/path in S.target_mobtypes)
if(istype(M, path))
available_surgeries[S.name] = S
+ var/datum/radial_menu_choice/choice = new
+ choice.image = S.get_icon()
+ choice.info = S.desc
+ radial_list[S.name] = choice
break
if(!available_surgeries.len)
+ to_chat(user, span_warning("You can't preform any surgeries on [M]'s [parse_zone(selected_zone)]!"))
return
-
- var/P = input("Begin which procedure?", "Surgery", null, null) as null|anything in available_surgeries
+
+ var/P = show_radial_menu(user, M, radial_list, radius = 40, require_near = TRUE, tooltips = TRUE)
if(P && user && user.Adjacent(M) && (I in user))
var/datum/surgery/S = available_surgeries[P]
@@ -69,10 +75,17 @@
if(S.ignore_clothes || get_location_accessible(M, selected_zone))
var/datum/surgery/procedure = new S.type(M, selected_zone, affecting)
- user.visible_message("[user] drapes [I] over [M]'s [parse_zone(selected_zone)] to prepare for surgery.", \
- span_notice("You drape [I] over [M]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name]."))
-
+ var/datum/surgery_step/step = procedure.get_surgery_step()
+ user.visible_message("[user] prepares to operate on [M]'s [parse_zone(selected_zone)].", \
+ span_notice("You prepare to operate on [M]'s [parse_zone(selected_zone)]."))
+ playsound(get_turf(M), 'sound/items/handling/cloth_drop.ogg', 30, TRUE, falloff = 1)
log_combat(user, M, "operated on", null, "(OPERATION TYPE: [procedure.name]) (TARGET AREA: [selected_zone])")
+ if(procedure.step_in_progress)
+ return
+ var/try_to_fail = FALSE
+ if(user.a_intent == INTENT_DISARM)
+ try_to_fail = TRUE
+ step.try_op(user, M, user.zone_selected, I, procedure, try_to_fail)
else
to_chat(user, span_warning("You need to expose [M]'s [parse_zone(selected_zone)] first!"))
@@ -83,26 +96,25 @@
/proc/attempt_cancel_surgery(datum/surgery/S, obj/item/I, mob/living/M, mob/user)
var/selected_zone = user.zone_selected
+ to_chat(user, span_notice("You begin to cancel \the [S]."))
+ if(!do_mob(user, M, 3 SECONDS))
+ return
if(S.status == 1)
M.surgeries -= S
- user.visible_message("[user] removes [I] from [M]'s [parse_zone(selected_zone)].", \
- span_notice("You remove [I] from [M]'s [parse_zone(selected_zone)]."))
+ user.visible_message("[user] stops the surgery on [M]'s [parse_zone(selected_zone)].", \
+ span_notice("You stop the surgery on [M]'s [parse_zone(selected_zone)]."))
qdel(S)
else if(S.can_cancel)
- var/close_tool_type = /obj/item/cautery
- var/obj/item/close_tool = user.get_inactive_held_item()
- var/is_robotic = S.requires_bodypart_type == BODYPART_ROBOTIC
- if(is_robotic)
- close_tool_type = /obj/item/screwdriver
- if(istype(close_tool, close_tool_type) || iscyborg(user))
+ var/obj/item/close_tool = user.get_active_held_item()
+ if(close_tool.tool_behaviour == (S.requires_bodypart_type == BODYPART_ROBOTIC ? TOOL_SCREWDRIVER : TOOL_CAUTERY) || iscyborg(user))
if(S.operated_bodypart)
S.operated_bodypart.generic_bleedstacks -= 10
M.surgeries -= S
- user.visible_message("[user] closes [M]'s [parse_zone(selected_zone)] with [close_tool] and removes [I].", \
- span_notice("You close [M]'s [parse_zone(selected_zone)] with [close_tool] and remove [I]."))
+ user.visible_message("[user] closes [M]'s [parse_zone(selected_zone)] with [close_tool].", \
+ span_notice("You close [M]'s [parse_zone(selected_zone)] with [close_tool]."))
qdel(S)
else
- to_chat(user, span_warning("You need to hold a [is_robotic ? "screwdriver" : "cautery"] in your inactive hand to stop [M]'s surgery!"))
+ to_chat(user, span_warning("You need to hold a [S.requires_bodypart_type == BODYPART_ROBOTIC ? "screwdriver" : "cautery"] in your active hand to stop [M]'s surgery!"))
/proc/get_location_modifier(mob/M)
var/turf/T = get_turf(M)
diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm
index 60c97ed42c6f..5ead081c0fc8 100644
--- a/code/modules/surgery/implant_removal.dm
+++ b/code/modules/surgery/implant_removal.dm
@@ -1,5 +1,8 @@
/datum/surgery/implant_removal
name = "implant removal"
+ desc = "Extracts implants from the patient. If you don't have an empty implant case in your other hand, the implant will be ruined on extraction."
+ icon = 'icons/obj/implants.dmi'
+ icon_state = "implantcase-b"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/extract_implant, /datum/surgery_step/close)
target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST)
@@ -16,7 +19,8 @@
/datum/surgery_step/extract_implant
name = "extract implant"
implements = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 65)
- time = 64
+ time = 6.4 SECONDS
+ success_sound = 'sound/surgery/hemostat1.ogg'
var/obj/item/implant/I = null
/datum/surgery_step/extract_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm
index 25c0deb4f370..56405fb1a813 100644
--- a/code/modules/surgery/limb_augmentation.dm
+++ b/code/modules/surgery/limb_augmentation.dm
@@ -45,6 +45,8 @@
/datum/surgery/augmentation
name = "Augmentation"
+ desc = "Replace a limb with a robot part."
+ icon_state = "augmentation"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/replace, /datum/surgery_step/saw, /datum/surgery_step/replace_limb)
target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm
index 80d399676eb5..59e0a9b60b30 100644
--- a/code/modules/surgery/lipoplasty.dm
+++ b/code/modules/surgery/lipoplasty.dm
@@ -1,5 +1,8 @@
/datum/surgery/lipoplasty
name = "Lipoplasty"
+ desc = "Removes excess fat from the patient."
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "meat"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/cut_fat, /datum/surgery_step/remove_fat, /datum/surgery_step/close)
possible_locs = list(BODY_ZONE_CHEST)
diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm
index 3c3b2310249d..c73fc138b767 100644
--- a/code/modules/surgery/lobectomy.dm
+++ b/code/modules/surgery/lobectomy.dm
@@ -1,5 +1,8 @@
/datum/surgery/lobectomy
name = "Lobectomy" //not to be confused with lobotomy
+ desc = "Restores the lungs to a functional state if it is in a non-functional state, making it able to sustain life. Can only be performed once on an individual set of lungs."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "lungs"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders,
/datum/surgery_step/lobectomy, /datum/surgery_step/close)
possible_locs = list(BODY_ZONE_CHEST)
@@ -17,7 +20,10 @@
name = "excise damaged lung node"
implements = list(TOOL_SCALPEL = 95, /obj/item/melee/transforming/energy/sword = 65, /obj/item/kitchen/knife = 45,
/obj/item/shard = 35)
- time = 42
+ time = 4.2 SECONDS
+ preop_sound = 'sound/surgery/scalpel1.ogg'
+ success_sound = 'sound/surgery/organ1.ogg'
+ failure_sound = 'sound/surgery/organ2.ogg'
fuckup_damage = 20
/datum/surgery_step/lobectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm
index 79d09aa06db3..b6162b4588e1 100644
--- a/code/modules/surgery/mechanic_steps.dm
+++ b/code/modules/surgery/mechanic_steps.dm
@@ -3,19 +3,24 @@
name = "unscrew shell"
implements = list(
TOOL_SCREWDRIVER = 100,
- TOOL_SCALPEL = 75, // med borgs could try to unskrew shell with scalpel
+ TOOL_SCALPEL = 75, // med borgs could try to unscrew shell with scalpel
/obj/item/kitchen/knife = 50,
/obj/item = 10) // 10% success with any sharp item.
- time = 24
+ time = 2.4 SECONDS
+ preop_sound = 'sound/items/screwdriver.ogg'
+ success_sound = 'sound/items/screwdriver2.ogg'
/datum/surgery_step/mechanic_open/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_notice("You begin to unscrew the shell of [target]'s [parse_zone(target_zone)]..."),
"[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].",
"[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].")
-/datum/surgery_step/mechanic_incise/tool_check(mob/user, obj/item/tool)
- if(implement_type == /obj/item && !tool.is_sharp())
- return FALSE
+/datum/surgery_step/mechanic_open/tool_check(mob/user, obj/item/tool)
+ if(istype(tool))
+ if(!tool.is_sharp())
+ return FALSE
+ if(tool.usesound)
+ preop_sound = tool.usesound
return TRUE
@@ -27,7 +32,9 @@
TOOL_SCALPEL = 75,
/obj/item/kitchen/knife = 50,
/obj/item = 10) // 10% success with any sharp item.
- time = 24
+ time = 2.4 SECONDS
+ preop_sound = 'sound/items/screwdriver.ogg'
+ success_sound = 'sound/items/screwdriver2.ogg'
/datum/surgery_step/mechanic_close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_notice("You begin to screw the shell of [target]'s [parse_zone(target_zone)]..."),
@@ -35,8 +42,11 @@
"[user] begins to screw the shell of [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/mechanic_close/tool_check(mob/user, obj/item/tool)
- if(implement_type == /obj/item && !tool.is_sharp())
- return FALSE
+ if(istype(tool))
+ if(!tool.is_sharp())
+ return FALSE
+ if(tool.usesound)
+ preop_sound = tool.usesound
return TRUE
@@ -46,7 +56,10 @@
implements = list(
TOOL_MULTITOOL = 100,
TOOL_HEMOSTAT = 10) // try to reboot internal controllers via short circuit with some conductor
- time = 24
+ time = 2.4 SECONDS
+ preop_sound = 'sound/items/tape_flip.ogg'
+ success_sound = 'sound/items/taperecorder_close.ogg'
+ failure_sound = 'sound/machines/defib_zap.ogg'
/datum/surgery_step/prepare_electronics/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_notice("You begin to prepare electronics in [target]'s [parse_zone(target_zone)]..."),
@@ -59,33 +72,54 @@
implements = list(
TOOL_WRENCH = 100,
TOOL_RETRACTOR = 10)
- time = 24
+ time = 2.4 SECONDS
+ preop_sound = 'sound/items/ratchet.ogg'
/datum/surgery_step/mechanic_unwrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_notice("You begin to unwrench some bolts in [target]'s [parse_zone(target_zone)]..."),
"[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].",
"[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].")
+
+/datum/surgery_step/mechanic_unwrench/tool_check(mob/user, obj/item/tool)
+ if(tool.usesound)
+ preop_sound = tool.usesound
+ return TRUE
+
//wrench
/datum/surgery_step/mechanic_wrench
name = "wrench bolts"
implements = list(
TOOL_WRENCH = 100,
TOOL_RETRACTOR = 10)
- time = 24
+ time = 2.4 SECONDS
+ preop_sound = 'sound/items/ratchet.ogg'
/datum/surgery_step/mechanic_wrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_notice("You begin to wrench some bolts in [target]'s [parse_zone(target_zone)]..."),
"[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].",
"[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].")
+
+/datum/surgery_step/mechanic_wrench/tool_check(mob/user, obj/item/tool)
+ if(tool.usesound)
+ preop_sound = tool.usesound
+ return TRUE
+
//open hatch
/datum/surgery_step/open_hatch
name = "open the hatch"
accept_hand = 1
- time = 10
+ time = 1 SECONDS
+ preop_sound = 'sound/items/ratchet.ogg'
+ success_sound = 'sound/machines/doorclick.ogg'
/datum/surgery_step/open_hatch/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_notice("You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]..."),
"[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].",
- "[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].")
\ No newline at end of file
+ "[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].")
+
+/datum/surgery_step/open_hatch/tool_check(mob/user, obj/item/tool)
+ if(tool.usesound)
+ preop_sound = tool.usesound
+ return TRUE
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index 42a2f3322d13..a27f68fdb38b 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -1,5 +1,7 @@
/datum/surgery/organ_manipulation
name = "Organ manipulation"
+ icon_state = "organ_manipulation"
+ desc = "This surgery covers operations to remove/insert internal organs, tails, and cyber implants."
target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD)
requires_real_bodypart = 1
@@ -65,10 +67,12 @@
)
/datum/surgery_step/manipulate_organs
- time = 64
+ time = 6.4 SECONDS
name = "manipulate organs"
repeatable = 1
implements = list(/obj/item/organ = 100, /obj/item/reagent_containers/food/snacks/organ = 0, /obj/item/organ_storage = 100)
+ preop_sound = 'sound/surgery/organ2.ogg'
+ success_sound = 'sound/surgery/organ1.ogg'
var/implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 55)
var/current_type
var/obj/item/organ/I = null
@@ -80,6 +84,8 @@
/datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
I = null
if(istype(tool, /obj/item/organ_storage))
+ preop_sound = initial(preop_sound)
+ success_sound = initial(success_sound)
if(!tool.contents.len)
to_chat(user, span_notice("There is nothing inside [tool]!"))
return -1
@@ -90,6 +96,8 @@
tool = I
if(isorgan(tool))
current_type = "insert"
+ preop_sound = initial(preop_sound)
+ success_sound = initial(success_sound)
I = tool
if(target_zone != I.zone || target.getorganslot(I.slot))
to_chat(user, span_notice("There is no room for [I] in [target]'s [parse_zone(target_zone)]!"))
@@ -101,6 +109,8 @@
else if(implement_type in implements_extract)
current_type = "extract"
+ preop_sound = 'sound/surgery/hemostat1.ogg'
+ success_sound = 'sound/surgery/organ2.ogg'
var/list/organs = target.getorganszone(target_zone)
var/mob/living/simple_animal/horror/H = target.has_horror_inside()
if(H)
diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm
index 7cdbb26e01d1..938ff27a1f97 100644
--- a/code/modules/surgery/organic_steps.dm
+++ b/code/modules/surgery/organic_steps.dm
@@ -4,7 +4,9 @@
name = "make incision"
implements = list(TOOL_SCALPEL = 100, /obj/item/melee/transforming/energy/sword = 75, /obj/item/kitchen/knife = 65,
/obj/item/shard = 45, /obj/item = 30) // 30% success with any sharp item.
- time = 16
+ time = 1.6 SECONDS
+ preop_sound = 'sound/surgery/scalpel1.ogg'
+ success_sound = 'sound/surgery/scalpel2.ogg'
var/bleeding = 5 //how much bleeding you get from this being done
/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -43,7 +45,8 @@
/datum/surgery_step/clamp_bleeders
name = "clamp bleeders"
implements = list(TOOL_HEMOSTAT = 100, TOOL_WIRECUTTER = 60, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15)
- time = 24
+ time = 2.4 SECONDS
+ preop_sound = 'sound/surgery/hemostat1.ogg'
/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_notice("You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]..."),
@@ -65,7 +68,9 @@
/datum/surgery_step/retract_skin
name = "retract skin"
implements = list(TOOL_RETRACTOR = 100, TOOL_SCREWDRIVER = 45, TOOL_WIRECUTTER = 35)
- time = 24
+ time = 2.4 SECONDS
+ preop_sound = 'sound/surgery/retractor1.ogg'
+ success_sound = 'sound/surgery/retractor2.ogg'
/datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_notice("You begin to retract the skin in [target]'s [parse_zone(target_zone)]..."),
@@ -79,7 +84,9 @@
name = "mend incision"
implements = list(TOOL_CAUTERY = 100, /obj/item/gun/energy/laser = 90, TOOL_WELDER = 70,
/obj/item = 30) // 30% success with any hot item.
- time = 24
+ time = 2.4 SECONDS
+ preop_sound = 'sound/surgery/cautery1.ogg'
+ success_sound = 'sound/surgery/cautery2.ogg'
fuckup_damage_type = BURN
/datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -113,7 +120,15 @@
implements = list(TOOL_SAW = 100, /obj/item/melee/transforming/energy/sword/cyborg/saw = 100,
/obj/item/melee/arm_blade = 75, /obj/item/mounted_chainsaw = 65, /obj/item/twohanded/required/chainsaw = 50,
/obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25)
- time = 54
+ time = 5.4 SECONDS
+ preop_sound = list(
+ /obj/item/circular_saw = 'sound/surgery/saw.ogg',
+ /obj/item/melee/arm_blade = 'sound/surgery/scalpel1.ogg',
+ /obj/item/twohanded/fireaxe = 'sound/surgery/scalpel1.ogg',
+ /obj/item/hatchet = 'sound/surgery/scalpel1.ogg',
+ /obj/item/kitchen/knife/butcher = 'sound/surgery/scalpel1.ogg',
+ /obj/item = 'sound/surgery/scalpel1.ogg',
+ )
fuckup_damage = 20
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 10833bf57762..a1140682a993 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -325,8 +325,7 @@
/obj/item/toolset_handler/attack(mob/living/M, mob/user)
if(active_tool)
- if(istype(active_tool, /obj/item/surgical_drapes)) //of all the things to not have a tool behavior its drapes
- attempt_initiate_surgery(src, M, user)
+ if(!(user.a_intent == INTENT_HARM) && attempt_initiate_surgery(active_tool, M, user))
return
..()
diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm
index 1289ddc587e1..7115f32f923c 100644
--- a/code/modules/surgery/organs/augments_eyes.dm
+++ b/code/modules/surgery/organs/augments_eyes.dm
@@ -45,3 +45,15 @@
name = "Contraband Security HUD Implant"
desc = "A Cybersun Industries brand Security HUD Implant. These illicit cybernetic eye implants will display a security HUD over everything you see."
syndicate_implant = TRUE
+
+/obj/item/organ/cyberimp/eyes/hud/science
+ name = "Chemical Analyzer implant"
+ desc = "These cybernetic eye implants will allow rapid identification of reagents."
+
+/obj/item/organ/cyberimp/eyes/hud/science/Insert(var/mob/living/carbon/M, var/special = 0, drop_if_replaced = FALSE)
+ ..()
+ ADD_TRAIT(owner, TRAIT_SEE_REAGENTS, src)
+
+/obj/item/organ/cyberimp/eyes/hud/science/Remove(var/mob/living/carbon/M, var/special = 0)
+ REMOVE_TRAIT(owner, TRAIT_SEE_REAGENTS, src)
+ ..()
diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm
index f5dcbdcd139b..374aef33655b 100644
--- a/code/modules/surgery/plastic_surgery.dm
+++ b/code/modules/surgery/plastic_surgery.dm
@@ -1,5 +1,7 @@
/datum/surgery/plastic_surgery
name = "Plastic surgery"
+ desc = "If the patient's face is damaged and unrecognizable it restores it, otherwise it change the face and identity of the patient."
+ icon_state = "plastic_surgery"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/reshape_face, /datum/surgery_step/close)
possible_locs = list(BODY_ZONE_HEAD)
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index e158067b4ba6..e7adaf10ca54 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -1,5 +1,7 @@
/datum/surgery/prosthetic_replacement
name = "Prosthetic replacement"
+ desc = "Replace a severed limb with either a normal or a robotic limb."
+ icon_state = "prosthetic_replacement"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/add_prosthetic)
target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD)
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index 3b4f542f5d3a..1ef83e512b6c 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -1,8 +1,16 @@
/datum/surgery/embedded_removal
name = "Removal of embedded objects"
+ desc = "Extracts objects stuck in the body such as throwing stars or spears."
+ icon_state = "embedded_removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/remove_object, /datum/surgery_step/close)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
+/datum/surgery/repair_bone_hairline/can_start(mob/living/user, mob/living/carbon/target)
+ if(!istype(target))
+ return FALSE
+ if(..())
+ var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected)
+ return(targeted_bodypart.embedded_objects)
/datum/surgery_step/remove_object
name = "remove embedded objects"
@@ -13,7 +21,6 @@
var/obj/item/target_item = null
var/obj/item/bodypart/L = null
-
/datum/surgery_step/remove_object/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
L = surgery.operated_bodypart
if(L)
diff --git a/code/modules/surgery/repair_puncture.dm b/code/modules/surgery/repair_puncture.dm
index 7a13400394f1..59936f641564 100644
--- a/code/modules/surgery/repair_puncture.dm
+++ b/code/modules/surgery/repair_puncture.dm
@@ -8,6 +8,8 @@
///// Repair puncture wounds
/datum/surgery/repair_puncture
name = "Repair puncture"
+ icon = 'icons/obj/stack_medical.dmi'
+ icon_state = "suture_3"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/repair_innards, /datum/surgery_step/seal_veins, /datum/surgery_step/close) // repeat between steps 2 and 3 until healed
target_mobtypes = list(/mob/living/carbon)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm
new file mode 100644
index 000000000000..dfe41cc6608c
--- /dev/null
+++ b/code/modules/surgery/stomachpump.dm
@@ -0,0 +1,55 @@
+/datum/surgery/stomach_pump
+ name = "Stomach Pump"
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "stomach"
+ steps = list(
+ /datum/surgery_step/incise,
+ /datum/surgery_step/retract_skin,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/clamp_bleeders,
+ /datum/surgery_step/stomach_pump,
+ /datum/surgery_step/close)
+
+ target_mobtypes = list(/mob/living/carbon/human)
+ possible_locs = list(BODY_ZONE_CHEST)
+ requires_bodypart_type = TRUE
+ ignore_clothes = FALSE
+
+/datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target)
+ var/obj/item/organ/stomach/target_stomach = target.getorganslot(ORGAN_SLOT_STOMACH)
+ if(HAS_TRAIT(target, TRAIT_HUSK))
+ return FALSE
+ if(!target_stomach)
+ return FALSE
+ return ..()
+
+//Working the stomach by hand in such a way that you induce vomiting.
+/datum/surgery_step/stomach_pump
+ name = "Pump Stomach"
+ accept_hand = TRUE
+ repeatable = TRUE
+ time = 2 SECONDS
+
+/datum/surgery_step/stomach_pump/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, span_notice("You begin pumping [target]'s stomach..."),
+ span_notice("[user] begins to pump [target]'s stomach."),
+ span_notice("[user] begins to press on [target]'s chest."))
+ display_pain(target, "You feel a horrible sloshing feeling in your gut! You're going to be sick!")
+
+/datum/surgery_step/stomach_pump/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
+ if(ishuman(target))
+ var/mob/living/carbon/human/target_human = target
+ display_results(user, target, span_notice("[user] forces [target_human] to vomit, cleansing their stomach of some chemicals!"),
+ span_notice("[user] forces [target_human] to vomit, cleansing their stomach of some chemicals!"),
+ "[user] forces [target_human] to vomit!")
+ target_human.vomit(20, FALSE, TRUE, 1, TRUE, FALSE, purge_ratio = 0.67) //higher purge ratio than regular vomiting
+ return ..()
+
+/datum/surgery_step/stomach_pump/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(ishuman(target))
+ var/mob/living/carbon/human/target_human = target
+ display_results(user, target, span_warning("You screw up, brusing [target_human]'s chest!"),
+ span_warning("[user] screws up, brusing [target_human]'s abdomen!"),
+ span_warning("[user] screws up!"))
+ target_human.adjustOrganLoss(ORGAN_SLOT_STOMACH, 10)
+ target_human.adjustBruteLoss(5)
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 6e8e6506fa7d..eae199ee97b5 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -1,26 +1,47 @@
/datum/surgery
var/name = "surgery"
var/desc = "surgery description"
+ var/icon = 'icons/misc/surgery_icons.dmi'
+ var/icon_state
var/status = 1
- var/list/steps = list() //Steps in a surgery
- var/step_in_progress = 0 //Actively performing a Surgery
- var/can_cancel = 1 //Can cancel this surgery after step 1 with cautery
- var/list/target_mobtypes = list(/mob/living/carbon/human) //Acceptable Species
- var/location = BODY_ZONE_CHEST //Surgery location
- var/requires_bodypart_type = BODYPART_ORGANIC //Prevents you from performing an operation on incorrect limbs. 0 for any limb type
- var/list/possible_locs = list() //Multiple locations
- var/ignore_clothes = 0 //This surgery ignores clothes
- var/mob/living/carbon/target //Operation target mob
- var/obj/item/bodypart/operated_bodypart //Operable body part
- var/datum/wound/operated_wound //The actual wound datum instance we're targeting
- var/datum/wound/targetable_wound //The wound type this surgery targets
- var/requires_bodypart = TRUE //Surgery available only when a bodypart is present, or only when it is missing.
- var/success_multiplier = 0 //Step success propability multiplier
- var/requires_real_bodypart = 0 //Some surgeries don't work on limbs that don't really exist
- var/lying_required = TRUE //Does the vicitm needs to be lying down.
- var/self_operable = FALSE //Can the surgery be performed on yourself.
- var/requires_tech = FALSE //handles techweb-oriented surgeries, previously restricted to the /advanced subtype (You still need to add designs)
- var/replaced_by //type; doesn't show up if this type exists. Set to /datum/surgery if you want to hide a "base" surgery (useful for typing parents IE healing.dm just make sure to null it out again)
+ /// Steps in a surgery
+ var/list/steps = list()
+ /// Actively performing a Surgery
+ var/step_in_progress = 0
+ /// Can cancel this surgery after step 1 with cautery
+ var/can_cancel = 1
+ /// Acceptable Species
+ var/list/target_mobtypes = list(/mob/living/carbon/human)
+ /// Surgery location
+ var/location = BODY_ZONE_CHEST
+ /// Prevents you from performing an operation on incorrect limbs. FALSE for any limb type
+ var/requires_bodypart_type = BODYPART_ORGANIC
+ /// Multiple locations
+ var/list/possible_locs = list()
+ /// If this surgery ignores clothes
+ var/ignore_clothes = 0
+ /// Operation target mob
+ var/mob/living/carbon/target
+ /// Operable body part
+ var/obj/item/bodypart/operated_bodypart
+ /// The actual wound datum instance we're targeting
+ var/datum/wound/operated_wound
+ /// The wound type this surgery targets
+ var/datum/wound/targetable_wound
+ /// Surgery available only when a bodypart is present, or only when it is missing.
+ var/requires_bodypart = TRUE
+ /// Step success propability multiplier
+ var/success_multiplier = 0
+ /// Some surgeries don't work on limbs that don't really exist
+ var/requires_real_bodypart = 0
+ /// Does the vicitm needs to be lying down.
+ var/lying_required = TRUE
+ /// Can the surgery be performed on yourself.
+ var/self_operable = FALSE
+ /// Handles techweb-oriented surgeries, previously restricted to the /advanced subtype (You still need to add designs)
+ var/requires_tech = FALSE
+ /// Type; doesn't show up if this type exists. Set to /datum/surgery if you want to hide a "base" surgery (useful for typing parents IE healing.dm just make sure to null it out again)
+ var/replaced_by
/datum/surgery/New(surgery_target, surgery_location, surgery_bodypart)
..()
@@ -114,9 +135,14 @@
var/obj/item/tool = user.get_active_held_item()
if(S.try_op(user, target, user.zone_selected, tool, src, try_to_fail))
return TRUE
- if(tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it
- to_chat(user, span_warning("This step requires a different tool!"))
- return TRUE
+ if(tool)
+ if(tool.tool_behaviour == TOOL_CAUTERY || (requires_bodypart_type == BODYPART_ROBOTIC && tool.tool_behaviour == TOOL_SCREWDRIVER))
+ // Cancel the surgery if a cautery/screwdriver is used AND it's not the tool used in the next step.
+ attempt_cancel_surgery(src, tool, target, user)
+ return TRUE
+ if(tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it
+ to_chat(user, span_warning("This step requires a different tool!"))
+ return TRUE
return FALSE
/datum/surgery/proc/get_surgery_step()
@@ -147,6 +173,9 @@
return probability + success_multiplier
+/datum/surgery/proc/get_icon()
+ return icon(icon, icon_state)
+
/datum/surgery/advanced
name = "advanced surgery"
requires_tech = TRUE
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index 783ca874960e..2dc56a6b5f3d 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -2,17 +2,35 @@
/datum/surgery_step
var/name
- var/list/implements = list() //format is path = probability of success. alternatively
- var/implement_type = null //the current type of implement used. This has to be stored, as the actual typepath of the tool may not match the list type.
- var/accept_hand = FALSE //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item.
- var/accept_any_item = FALSE //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand.
- var/time = 10 //how long does the step take?
- var/repeatable = FALSE //can this step be repeated? Make shure it isn't last step, or it used in surgery with `can_cancel = 1`. Or surgion will be stuck in the loop
- var/list/chems_needed = list() //list of chems needed to complete the step. Even on success, the step will have no effect if there aren't the chems required in the mob.
- var/require_all_chems = TRUE //any on the list or all on the list?
- var/list/ouchie_modifying_chems = list(/datum/reagent/consumable/ethanol/painkiller = 0.5, /datum/reagent/consumable/ethanol/inocybeshine = 0.5, /datum/reagent/medicine/morphine = 0.5) //chems that will modify the chance for fuckups while operating on conscious patients, stacks.
- var/fuckup_damage = 10 //base damage dealt on a surgery being done without anesthetics on SURGERY_FUCKUP_CHANCE percent chance
- var/fuckup_damage_type = BRUTE //damage type fuckup_damage is dealt as
+ /// What tools can be used in this surgery, format is path = probability of success.
+ var/list/implements = list()
+ /// The current type of implement used. This has to be stored, as the actual typepath of the tool may not match the list type.
+ var/implement_type = null
+ /// Does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item.
+ var/accept_hand = FALSE
+ /// Does the surgery step accept any item? If true, ignores implements. Compatible with require_hand.
+ var/accept_any_item = FALSE
+ /// How long does the step take?
+ var/time = 1 SECONDS
+ /// Can this step be repeated? Make shure it isn't last step, or it used in surgery with `can_cancel = 1`. Or surgion will be stuck in the loop
+ var/repeatable = FALSE
+ /// List of chems needed to complete the step. Even on success, the step will have no effect if there aren't the chems required in the mob. Use *require_all_chems* to specify if its any on the list or all on the list
+ var/list/chems_needed = list()
+ /// If *chems_needed* requires all chems in the list or one chem in the list.
+ var/require_all_chems = TRUE
+ /// Chems that will modify the chance for fuckups while operating on conscious patients, stacks.
+ var/list/ouchie_modifying_chems = list(/datum/reagent/consumable/ethanol/painkiller = 0.5, /datum/reagent/consumable/ethanol/inocybeshine = 0.5, /datum/reagent/medicine/morphine = 0.5)
+ /// Base damage dealt on a surgery being done without anesthetics on SURGERY_FUCKUP_CHANCE percent chance
+ var/fuckup_damage = 10
+ /// Damage type fuckup_damage is dealt as
+ var/fuckup_damage_type = BRUTE
+
+ /// Sound played when the step is started
+ var/preop_sound
+ /// Sound played if the step succeeded
+ var/success_sound
+ /// Sound played if the step fails
+ var/failure_sound
/datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
var/success = FALSE
@@ -76,8 +94,9 @@
var/user_speed_mod = 1
if(preop(user, target, target_zone, tool, surgery) == -1)
- surgery.step_in_progress = 0
- return
+ surgery.step_in_progress = FALSE
+ return FALSE
+ play_preop_sound(user, target, target_zone, tool, surgery)
if(tool)
tool_speed_mod = tool.toolspeed
@@ -85,6 +104,8 @@
if(IS_MEDICAL(user))
user_speed_mod = 0.8
+ var/previous_loc = user.loc
+
if(do_after(user, time * tool_speed_mod * user_speed_mod, target))
var/prob_chance = 100
@@ -92,12 +113,23 @@
prob_chance = implements[implement_type]
prob_chance *= surgery.get_probability_multiplier()
+ // Blood splatters on tools and user
+ if(tool && prob(20))
+ tool.add_mob_blood(target)
+ to_chat(user, span_warning("Your [tool] gets covered [target]'s blood "))
+ if(prob(10))
+ user.add_mob_blood(target)
+ to_chat(user, span_warning("You get covered [target]'s blood "))
+
if((prob(prob_chance) || iscyborg(user)) && chem_check(target, user,
tool) && !try_to_fail)
if(success(user, target, target_zone, tool, surgery))
+ play_success_sound(user, target, target_zone, tool, surgery)
advance = TRUE
else
if(failure(user, target, target_zone, tool, surgery))
+ play_failure_sound(user, target, target_zone, tool, surgery)
+
advance = TRUE
if(!HAS_TRAIT(target, TRAIT_SURGERY_PREPARED) && target.stat != DEAD && !IS_IN_STASIS(target) && fuckup_damage) //not under the effects of anaesthetics or a strong painkiller, harsh penalty to success chance
if(!issilicon(user) && !HAS_TRAIT(user, TRAIT_SURGEON)) //borgs and abductors are immune to this
@@ -108,7 +140,9 @@
surgery.status++
if(surgery.status > surgery.steps.len)
surgery.complete()
-
+ else
+ if(!(previous_loc == user.loc))
+ move_ouchie(user, target, target_zone, tool, advance)
surgery.step_in_progress = FALSE
return advance
@@ -118,18 +152,57 @@
"[user] begins to perform surgery on [target].",
"[user] begins to perform surgery on [target].")
+/datum/surgery_step/proc/play_preop_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(!preop_sound)
+ return
+ var/sound_file_use
+ if(islist(preop_sound))
+ for(var/typepath in preop_sound)//iterate and assign subtype to a list, works best if list is arranged from subtype first and parent last
+ if(istype(tool, typepath))
+ sound_file_use = preop_sound[typepath]
+ break
+ else
+ sound_file_use = preop_sound
+ playsound(get_turf(target), sound_file_use, 30, TRUE, falloff = 2)
+
/datum/surgery_step/proc/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_notice("You succeed."),
"[user] succeeds!",
"[user] finishes.")
return TRUE
+/datum/surgery_step/proc/play_success_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(!success_sound)
+ return
+ var/sound_file_use
+ if(islist(success_sound ))
+ for(var/typepath in success_sound )//iterate and assign subtype to a list, works best if list is arranged from subtype first and parent last
+ if(istype(tool, typepath))
+ sound_file_use = success_sound [typepath]
+ break
+ else
+ sound_file_use = success_sound
+ playsound(get_turf(target), sound_file_use, 30, TRUE, falloff = 2)
+
/datum/surgery_step/proc/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_warning("You screw up!"),
span_warning("[user] screws up!"),
"[user] finishes.", TRUE) //By default the patient will notice if the wrong thing has been cut
return FALSE
+/datum/surgery_step/proc/play_failure_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(!failure_sound)
+ return
+ var/sound_file_use
+ if(islist(failure_sound))
+ for(var/typepath in failure_sound)//iterate and assign subtype to a list, works best if list is arranged from subtype first and parent last
+ if(istype(tool, typepath))
+ sound_file_use = failure_sound[typepath]
+ break
+ else
+ sound_file_use = failure_sound
+ playsound(get_turf(target), sound_file_use, 30, TRUE, falloff = 2)
+
/datum/surgery_step/proc/tool_check(mob/user, obj/item/tool)
return TRUE
@@ -188,8 +261,27 @@
var/final_ouchie_chance = SURGERY_FUCKUP_CHANCE * ouchie_mod
if(!prob(final_ouchie_chance))
return
- user.visible_message(span_boldwarning("[target] flinches, bumping [user]'s [tool ? tool.name : "hand"] into something important!"), span_boldwarning("[target] flinches, bumping your [tool ? tool.name : "hand"] into something important!"))
+ user.visible_message(span_boldwarning("[target] flinches, bumping [user]'s [tool ? tool.name : "hand"] into something important!"), span_boldwarning("[target] flinches, bumping your [tool ? tool.name : "hand"] into something important!"))
target.apply_damage(fuckup_damage, fuckup_damage_type, target_zone)
//if(ishuman(target) &&fuckup_damage_type == BRUTE && prob(final_ouchie_chance/2))
//var/mob/living/carbon/human/H = target
//H.bleed_rate += min(fuckup_damage/4, 10)
+
+///Deal damage if the user moved during the op
+/datum/surgery_step/proc/move_ouchie(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, success)
+ user.visible_message(span_boldwarning("[user] bumps [p_their(FALSE, user)] [tool ? tool.name : "hand"] into something important!"), span_boldwarning("You move, bumping your [tool ? tool.name : "hand"] into something important!"))
+ target.apply_damage(fuckup_damage, fuckup_damage_type, target_zone)
+
+/**
+ * Sends a pain message to the target, including a chance of screaming.
+ *
+ * Arguments:
+ * * target - Who the message will be sent to
+ * * pain_message - The message to be displayed
+ * * mechanical_surgery - Boolean flag that represents if a surgery step is done on a mechanical limb (therefore does not force scream)
+ */
+/datum/surgery_step/proc/display_pain(mob/living/target, pain_message, mechanical_surgery = FALSE)
+ if(!HAS_TRAIT(target, TRAIT_SURGERY_PREPARED))
+ to_chat(target, span_userdanger(pain_message))
+ if(prob(30) && !mechanical_surgery)
+ target.emote("scream")
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 5576ac42ed1b..577773fe4322 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -12,6 +12,9 @@
tool_behaviour = TOOL_RETRACTOR
w_class = WEIGHT_CLASS_TINY
+/obj/item/retractor/attack(mob/living/M, mob/user)
+ if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user))
+ ..()
/obj/item/retractor/augment
name = "retractor"
@@ -45,6 +48,9 @@
w_class = WEIGHT_CLASS_TINY
attack_verb = list("attacked", "pinched")
+/obj/item/hemostat/attack(mob/living/M, mob/user)
+ if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user))
+ ..()
/obj/item/hemostat/augment
name = "hemostat"
@@ -79,6 +85,9 @@
w_class = WEIGHT_CLASS_TINY
attack_verb = list("burnt")
+/obj/item/cautery/attack(mob/living/M, mob/user)
+ if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user))
+ ..()
/obj/item/cautery/augment
name = "cautery"
@@ -125,6 +134,9 @@
SSachievements.unlock_achievement(/datum/achievement/likearecord, user.client)
return (MANUAL_SUICIDE)
+/obj/item/surgicaldrill/attack(mob/living/M, mob/user)
+ if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user))
+ ..()
/obj/item/surgicaldrill/augment
name = "surgical drill"
@@ -167,6 +179,10 @@
. = ..()
AddComponent(/datum/component/butchering, 80 * toolspeed, 100, 0)
+/obj/item/scalpel/attack(mob/living/M, mob/user)
+ if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user))
+ ..()
+
/obj/item/scalpel/augment
name = "scalpel"
desc = "Ultra-sharp blade attached directly to your bone for extra-accuracy."
@@ -222,6 +238,10 @@
. = ..()
AddComponent(/datum/component/butchering, 40 * toolspeed, 100, 5, 'sound/weapons/circsawhit.ogg') //saws are very accurate and fast at butchering
+/obj/item/circular_saw/attack(mob/living/M, mob/user)
+ if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user))
+ ..()
+
/obj/item/circular_saw/augment
name = "circular saw"
desc = "A small but very fast spinning saw. Edges dulled to prevent accidental cutting inside of the surgeon."
@@ -258,6 +278,10 @@
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("corrected", "properly set")
+/obj/item/bonesetter/attack(mob/living/M, mob/user)
+ if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user))
+ ..()
+
/obj/item/bonesetter/bone
name = "bone bonesetter"
desc = "A bonesetter made of bones... for setting bones with... bones?"
@@ -276,7 +300,7 @@
attack_verb = list("slapped")
/obj/item/surgical_drapes/attack(mob/living/M, mob/user)
- if(!attempt_initiate_surgery(src, M, user))
+ if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user))
..()
/obj/item/surgical_drapes/goliath
diff --git a/code/modules/swarmers/swarmer.dm b/code/modules/swarmers/swarmer.dm
index 471b0a0a0a30..82a215fc4b91 100644
--- a/code/modules/swarmers/swarmer.dm
+++ b/code/modules/swarmers/swarmer.dm
@@ -59,7 +59,7 @@
del_on_death = 1
deathmessage = "explodes with a sharp pop!"
light_color = LIGHT_COLOR_CYAN
- hud_type = /datum/hud/swarmer
+ hud_type = /datum/hud/living/swarmer
speech_span = SPAN_ROBOT
///Resource points, generated by consuming metal/glass
var/resources = 0
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index d797a6424a19..70692d5b81fb 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -767,6 +767,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 3
item = /obj/item/ammo_box/magazine/m12g/slug
+/datum/uplink_item/ammo/shotgun/hpbuck
+ name = "12g Hollow-Point Buckshot Drum"
+ desc = "An alternative 8-round hollow-point buckshot magazine for use with the Bulldog shotgun. For when you really need to put people in the dirt."
+ item = /obj/item/ammo_box/magazine/m12g/hpbuck
+
+/datum/uplink_item/ammo/shotgun/flechette
+ name = "12g Flechette Drum"
+ desc = "An alternative 8-round flechette magazine for use with the Bulldog shotgun. Hope they didnt want to use that armor..."
+ item = /obj/item/ammo_box/magazine/m12g/flechette
+
/datum/uplink_item/ammo/revolver
name = ".357 Speed Loader"
desc = "A speed loader that contains seven additional .357 Magnum rounds; usable with the Syndicate revolver. \
@@ -1584,7 +1594,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Stimpacks, the tool of many great heroes, make you nearly immune to stuns and knockdowns for about \
5 minutes after injection."
item = /obj/item/reagent_containers/hypospray/medipen/stimpack/large // Yogs -- Stimpack change
- cost = 5
+ cost = 8
surplus = 90
/datum/uplink_item/device_tools/medkit
@@ -1693,7 +1703,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/autosurgeon/anti_stun
cost = 12
surplus = 0
- include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/implants/freedom
name = "Freedom Implant"
diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm
index 7062fa9e6f78..ee690b5b5806 100644
--- a/code/modules/vehicles/motorized_wheelchair.dm
+++ b/code/modules/vehicles/motorized_wheelchair.dm
@@ -1,18 +1,19 @@
/obj/vehicle/ridden/wheelchair/motorized
name = "motorized wheelchair"
desc = "A chair with big wheels. It seems to have a motor in it."
+ icon_state = "mwheelchair"
max_integrity = 150
var/speed = 2
var/power_efficiency = 1
- var/power_usage = 100
+ var/power_usage = 25
var/panel_open = FALSE
var/list/required_parts = list(/obj/item/stock_parts/manipulator,
- /obj/item/stock_parts/manipulator,
- /obj/item/stock_parts/capacitor)
+ /obj/item/stock_parts/manipulator,
+ /obj/item/stock_parts/capacitor)
var/obj/item/stock_parts/cell/power_cell
/obj/vehicle/ridden/wheelchair/motorized/CheckParts(list/parts_list)
- ..()
+ . = ..()
refresh_parts()
/obj/vehicle/ridden/wheelchair/motorized/proc/refresh_parts()
@@ -24,14 +25,20 @@
var/datum/component/riding/D = GetComponent(/datum/component/riding)
D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * movedelay) / speed
-/obj/vehicle/ridden/wheelchair/motorized/obj_destruction(damage_flag)
+/obj/vehicle/ridden/wheelchair/motorized/proc/drop_contents()
var/turf/T = get_turf(src)
for(var/atom/movable/A in contents)
A.forceMove(T)
if(isliving(A))
var/mob/living/L = A
L.update_mobility()
- ..()
+ if(power_cell)
+ power_cell.update_icon()
+ refresh_parts()
+
+/obj/vehicle/ridden/wheelchair/motorized/obj_destruction(damage_flag)
+ drop_contents()
+ . = ..()
/obj/vehicle/ridden/wheelchair/motorized/driver_move(mob/living/user, direction)
if(istype(user))
@@ -70,8 +77,8 @@
if(power_cell && panel_open)
power_cell.update_icon()
user.put_in_hands(power_cell)
- power_cell = null
to_chat(user, span_notice("You remove the [power_cell] from [src]."))
+ power_cell = null
return
return ..()
@@ -92,18 +99,18 @@
refresh_parts()
return
if(istype(I, /obj/item/stock_parts))
- var/obj/item/stock_parts/B = I
+ var/obj/item/stock_parts/newpart = I
var/P
- for(var/obj/item/stock_parts/A in contents)
+ for(var/obj/item/stock_parts/oldpart in contents)
for(var/D in required_parts)
- if(ispath(A.type, D))
+ if(ispath(oldpart.type, D))
P = D
break
- if(istype(B, P) && istype(A, P))
- if(B.get_part_rating() > A.get_part_rating())
- B.forceMove(src)
- user.put_in_hands(A)
- user.visible_message(span_notice("[user] replaces [A] with [B] in [src]."), span_notice("You replace [A] with [B]."))
+ if(istype(newpart, P) && istype(oldpart, P))
+ if(newpart.get_part_rating() > oldpart.get_part_rating())
+ newpart.forceMove(src)
+ user.put_in_hands(oldpart)
+ user.visible_message(span_notice("[user] replaces [oldpart] with [newpart] in [src]."), span_notice("You replace [oldpart] with [newpart]."))
break
refresh_parts()
return
@@ -115,12 +122,7 @@
to_chat(user, span_notice("You detach the wheels and deconstruct the chair."))
new /obj/item/stack/rods(drop_location(), 8)
new /obj/item/stack/sheet/metal(drop_location(), 10)
- var/turf/T = get_turf(src)
- for(var/atom/movable/A in contents)
- A.forceMove(T)
- if(isliving(A))
- var/mob/living/L = A
- L.update_mobility()
+ drop_contents()
qdel(src)
return TRUE
@@ -138,12 +140,12 @@
/obj/vehicle/ridden/wheelchair/motorized/Bump(atom/movable/M)
. = ..()
// Here is the shitty emag functionality.
- if(obj_flags & EMAGGED && (istype(M, /turf/closed) || isliving(M)))
+ if(obj_flags & EMAGGED && (isclosedturf(M) || isliving(M)))
explosion(src, -1, 1, 3, 2, 0)
visible_message(span_boldwarning("[src] explodes!!"))
return
// If the speed is higher than what delay_multiplier used to be throw the person on the wheelchair away
- if(M.density && speed > 6.7 && has_buckled_mobs())
+ if(isclosedturf(M) && speed > 6.7 && has_buckled_mobs())
var/mob/living/H = buckled_mobs[1]
var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals))
unbuckle_mob(H)
diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm
index 993e8bdae3ca..ccc6d43abb1b 100644
--- a/code/modules/vehicles/wheelchair.dm
+++ b/code/modules/vehicles/wheelchair.dm
@@ -10,8 +10,6 @@
canmove = TRUE
density = FALSE //Thought I couldn't fix this one easily, phew
movedelay = 4
- ///Determines the typepath of what the object folds into
- var/foldabletype = /obj/item/wheelchair
/obj/vehicle/ridden/wheelchair/Initialize()
. = ..()
@@ -42,7 +40,7 @@
if(canmove && (user.get_num_arms() < arms_required))
to_chat(user, span_warning("You don't have enough arms to operate the wheels!"))
canmove = FALSE
- addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20)
+ addtimer(VARSET_CALLBACK(src, canmove, TRUE), 2 SECONDS)
return FALSE
//paraplegic quirk users get a halved movedelay to model their life of wheelchair useage - yogs
if(user.has_quirk(/datum/quirk/paraplegic))
@@ -61,11 +59,10 @@
/obj/vehicle/ridden/wheelchair/Moved()
. = ..()
cut_overlays()
- playsound(src, 'sound/effects/roll.ogg', 75, 1)
+ playsound(src, 'sound/effects/roll.ogg', 75, TRUE)
if(has_buckled_mobs())
handle_rotation_overlayed()
-
/obj/vehicle/ridden/wheelchair/post_buckle_mob(mob/living/user)
. = ..()
handle_rotation_overlayed()
@@ -80,7 +77,7 @@
/obj/vehicle/ridden/wheelchair/wrench_act(mob/living/user, obj/item/I) //Attackby should stop it attacking the wheelchair after moving away during decon
to_chat(user, span_notice("You begin to detach the wheels..."))
- if(I.use_tool(src, user, 40, volume=50))
+ if(I.use_tool(src, user, 4 SECONDS, volume=50))
to_chat(user, span_notice("You detach the wheels and deconstruct the chair."))
new /obj/item/stack/rods(drop_location(), 6)
new /obj/item/stack/sheet/metal(drop_location(), 4)
@@ -99,8 +96,6 @@
var/image/V = image(icon = icon, icon_state = "wheelchair_overlay", layer = FLY_LAYER, dir = src.dir)
add_overlay(V)
-
-
/obj/vehicle/ridden/wheelchair/proc/can_be_rotated(mob/living/user)
return TRUE
@@ -113,6 +108,16 @@
return TRUE
return FALSE
+/obj/vehicle/ridden/wheelchair/CtrlClick(mob/user)
+ if(has_buckled_mobs() && pick(buckled_mobs) == user)
+ return
+ . = ..()
+
+/obj/vehicle/ridden/wheelchair/post_buckle_mob(mob/living/L)
+ if(L.pulling && src.pulledby == L)
+ L.stop_pulling()
+ . = ..()
+
/obj/vehicle/ridden/wheelchair/the_whip/driver_move(mob/living/user, direction)
if(istype(user))
var/datum/component/riding/D = GetComponent(/datum/component/riding)
@@ -121,7 +126,6 @@
/obj/item/wheelchair
name = "wheelchair"
- desc = "A collapsed wheelchair that can be carried around."
icon = 'icons/obj/vehicles.dmi'
icon_state = "wheelchair_folded"
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
@@ -129,25 +133,35 @@
w_class = WEIGHT_CLASS_NORMAL
force = 8 //Force is same as a chair
custom_materials = list(/datum/material/iron = 10000)
- var/unfolded_type = /obj/vehicle/ridden/wheelchair
+ var/obj/vehicle/ridden/wheelchair/wheelchair
/obj/vehicle/ridden/wheelchair/MouseDrop(over_object, src_location, over_location) //Lets you collapse wheelchair
. = ..()
- if(over_object != usr || !Adjacent(usr) || !foldabletype)
+ if(over_object != usr || !Adjacent(usr))
return FALSE
if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE))
return FALSE
if(has_buckled_mobs())
+ to_chat(usr, span_warning("You need to unbuckle the passenger from [src] first!"))
return FALSE
- usr.visible_message("[usr] collapses [src].", "You collapse [src].")
- var/obj/vehicle/ridden/wheelchair/wheelchair_folded = new foldabletype(get_turf(src))
+ usr.visible_message(span_notice("[usr] collapses [src]."), span_notice("You collapse [src]."))
+ var/obj/item/wheelchair/wheelchair_folded = new /obj/item/wheelchair(get_turf(src))
+ forceMove(wheelchair_folded)
+ wheelchair_folded.desc = "A collapsed [name] that can be carried around."
+ wheelchair_folded.name = name
+ wheelchair_folded.wheelchair = src
usr.put_in_hands(wheelchair_folded)
- qdel(src)
-
+
/obj/item/wheelchair/attack_self(mob/user) //Deploys wheelchair on in-hand use
deploy_wheelchair(user, user.loc)
/obj/item/wheelchair/proc/deploy_wheelchair(mob/user, atom/location)
- var/obj/vehicle/ridden/wheelchair/wheelchair_unfolded = new unfolded_type(location)
- wheelchair_unfolded.add_fingerprint(user)
+ if(!wheelchair)
+ wheelchair = new /obj/vehicle/ridden/wheelchair(location)
+ wheelchair.add_fingerprint(user)
+ wheelchair.forceMove(location)
qdel(src)
+
+/obj/item/wheelchair/Destroy()
+ wheelchair = null
+ . = ..()
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 82b77793eeda..4298c723052e 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -465,6 +465,9 @@ GLOBAL_LIST_EMPTY(vending_products)
break
/obj/machinery/vending/proc/tilt(mob/fatty, crit=FALSE)
+ var/no_tipper = FALSE
+ if(!fatty)
+ no_tipper = TRUE
visible_message("[src] tips over!")
tilted = TRUE
layer = ABOVE_MOB_LAYER
@@ -476,7 +479,7 @@ GLOBAL_LIST_EMPTY(vending_products)
if(forcecrit)
crit_case = forcecrit
- if(in_range(fatty, src))
+ if(no_tipper || in_range(fatty, src))
for(var/mob/living/L in get_turf(fatty))
var/mob/living/carbon/C = L
@@ -544,7 +547,7 @@ GLOBAL_LIST_EMPTY(vending_products)
M.Turn(pick(90, 270))
transform = M
- if(get_turf(fatty) != get_turf(src))
+ if(fatty && get_turf(fatty) != get_turf(src))
throw_at(get_turf(fatty), 1, 1, spin=FALSE)
/obj/machinery/vending/proc/untilt(mob/user)
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index a1951679160b..b186e919da08 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -61,7 +61,7 @@
/obj/item/clothing/under/pirate = 1,
/obj/item/clothing/suit/pirate = 1,
/obj/item/clothing/head/pirate = 1,
- /obj/item/clothing/head/bandana = 1,
+ /obj/item/clothing/head/pirate/bandana = 1,
/obj/item/clothing/under/soviet = 1,
/obj/item/clothing/head/ushanka = 1,
/obj/item/clothing/suit/imperium_monk = 1,
@@ -76,6 +76,7 @@
/obj/item/clothing/suit/wizrobe/fake = 1,
/obj/item/clothing/head/wizard/fake = 1,
/obj/item/staff = 3,
+ /obj/item/toy/dummy = 2,
/obj/item/clothing/mask/gas/sexyclown = 1,
/obj/item/clothing/under/rank/clown/sexy = 1,
/obj/item/clothing/mask/gas/sexymime = 1,
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index 9299e3766bc2..bd021acb8192 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -176,7 +176,7 @@
/obj/item/clothing/glasses/sunglasses/cheap = 2,
/obj/item/clothing/glasses/yogs/threed = 2,
/obj/item/clothing/shoes/sneakers/black = 3,
- /obj/item/clothing/shoes/yogs/fire_crocs = 1,
+ /obj/item/clothing/shoes/fire_crocs = 1,
/obj/item/clothing/shoes/winterboots = 2,
/obj/item/clothing/shoes/singery = 1,
/obj/item/clothing/shoes/singerb = 1,
diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm
index b8410e719044..4e430624691a 100644
--- a/code/modules/vending/cola.dm
+++ b/code/modules/vending/cola.dm
@@ -13,6 +13,7 @@
/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/rootbeer=10,
/obj/item/reagent_containers/glass/beaker/waterbottle = 10)
contraband = list(/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,
/obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6,
diff --git a/config/game_options.txt b/config/game_options.txt
index 896c6fc3c00d..17241a984872 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -20,7 +20,7 @@ REVIVAL_BRAIN_LIFE -1
JOB_SPECIES_WHITELIST /datum/job/captain human
JOB_SPECIES_WHITELIST /datum/job/hop human
JOB_SPECIES_WHITELIST /datum/job/hos human,lizard
-JOB_SPECIES_WHITELIST /datum/job/chief_engineer human,plasmaman,moth,ethereal,preternis, polysmorph
+JOB_SPECIES_WHITELIST /datum/job/chief_engineer human,plasmaman,moth,ethereal,preternis,polysmorph
JOB_SPECIES_WHITELIST /datum/job/rd human,pod,plasmaman,ethereal,preternis,polysmorph
JOB_SPECIES_WHITELIST /datum/job/cmo human,lizard,pod,moth
diff --git a/dependencies.sh b/dependencies.sh
index 46516ffc69a0..f0cbc83c49b9 100755
--- a/dependencies.sh
+++ b/dependencies.sh
@@ -6,10 +6,10 @@
# byond version
# Extracted from the Dockerfile. Change by editing Dockerfile's FROM command.
export BYOND_MAJOR=514
-export BYOND_MINOR=1564
+export BYOND_MINOR=1583
#rust_g git tag
-export RUST_G_VERSION=0.4.5
+export RUST_G_VERSION=0.7.0
#node version
export NODE_VERSION=12
diff --git a/html/changelog.html b/html/changelog.html
index 1f16a32b61dd..c9a600e43536 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -58,19 +58,477 @@
-->
+
28 June 2022
+
redmoogle updated:
+
+ - Hand drill now works as a screwdriver for surgery
+
+
+
27 June 2022
+
actioninja, Ghommie updated:
+
+ - Washing machines now support arbitrary dye color
+ - Washing machines now dye nearly every item.
+ - lots of backend changes to clothing overlays, report any issues
+ - Different cuffs now come with different worn overlays instead of a generic one.
+
+
adamsong updated:
+
+ - fixed ai whale on gax
+
+
+
26 June 2022
+
Nmajask, IndusRobot, Mothblocks updated:
+
+ - Selecting surgeries are now done by a radial menu
+ - You can now start surgeries with tools and end surgeries without drapes
+ - Surgeries are now quieter
+ - You can now see if someone is being operated on when you inspect them
+ - Doing a surgery now has a 20% chance to get blood on your tool and 10% chance to get blood on you
+
+
SuperSlayer updated:
+
+ - CNS rebooter implant is no more nukie only
+
+
AlvCyktor updated:
+
+ - fixed duplicate build path for plate and trays
+ - RSF can now print plates
+ - Ding
+
+
Arkatos, ported to YogStation by SuperSlayer updated:
+
+ - Blobbernauts now have a generic living healthdoll and pull icon.
+ - Blobbernauts will now show severity of their injuries as a red screen overlay to the user.
+ - Blob core remaining health will now show in percentages and in green color. This affects both blobbernauts and blob overminds.
+ - Blob power is now in orange color for blob overminds.
+ - Swarmers now have a generic living healthdoll and pull icon.
+ - Swarmers will now show severity of their injuries as a red screen overlay to the user.
+ - Swarmer's abilities now have tooltips to clarify their use upon mouse hover.
+
+
Chubbygummibear updated:
+
+ - Rune Scimitar causes mobs to drop bonus loot from a loot table on kill
+ - Rune Scimitar gains bonus damage against fauna with each lavaland fauna slain up to 20, for a total of 100 bonus damage. get out there and grind
+ - Rune Scimitar's base force down to 20
+
+
JamieD1 updated:
+
+ - Disabling Regal Rat till its fixed
+ - Shadowlings now cannot get mutations and nerfs speed
+
+
MajManatee updated:
+
+ - Minigun go BRRRRRRRRRRRRRRRT
+ - Adds a Flechette drum for traitors/nukies
+ - Adds a Hollow-point buckshot drum for traitors/nukies
+
+
Mqiib updated:
+
+ - Krav maga lung punch losebreath reduced by 40%
+ - Moves stun immunity of fortitude to level 2.
+ - Frenzy state gives stun immunity
+ - CQC counter no longer hard stuns
+ - Explosive meltdown nanites have a flat 30 second timer now.
+ - Explosive meltdown nanites no longer gib you, but still do a buttload of brute damage.
+ - Smashing a bluespace crystal now makes you nauseous and slightly confused
+
+
SapphicOverload updated:
+
+ - adds winter coats for department heads
+ - gives the CE's hardsuit full radiation protection
+
+
Skrem7 updated:
+
+ - Mining belts can now hold lazarus injectors and bottles of whiskey
+ - Mining belts can no longer hold bone swords
+ - Storage on mining webbing and sinewbelt increased
+ - Space Pirates now have a unique uniform which has armor stats equal to the tactical turtleneck as well as no sensors.
+ - Space Pirate captain now spawns with a Syndicate captain's coat and hat, which has more robust armor than the standard space pirate gear.
+ - Space Pirate gunner now spawns with a Syndicate pirate hat, having their own unique uniform.
+ - The pirate bandana now gives the ability to speak pirate, similar to the pirate and pirate captain's hat.
+ - All pirate exosuits can now hold the normal cutlass in addition to the energy one. Normal exosuits can hold emergency tanks now.
+ - The normal and space pirate garb have all been given updated descriptions. The Syndicate ones have also received new names and different descriptions.
+ - FEAR THE (LAVA) SEAS LAND LUBBERS, OUR BLADES HUNGER FOR WHELPLING BLOOD
+ - Warden webbing powergaming has been destroyed by secoff financial independence
+ - Patches up some weird storage decisions regarding all mining exosuits. Basically, knives and legion cores of all forms should fit on any mining exosuit
+ - Adds bone sword and all bows as options to exosuit slot on goliath, pathfinder, and drake armors
+ - Adds bone spear to drake armor because it had the normal spear only??
+
+
Sniblet updated:
+
+ - Rollerbeds no longer require plastic
+
+
SomeguyManperson updated:
+
+ - resonator blasts will no longer stack on top of eachother creating a tile you cannot step on without breaking your bones that has collectable rocks on it
+ - 2 ventriloquist dummies are now stocked in autodrobes
+
+
TheRyeGuyWhoWillNowDie updated:
+
+ - inspecting the twisted construction spell AKA the hand that appears after casting the spell will also no longer incorrectly state that it can convert cyborgs
+ - the loose beans in the armory have been placed in boxes. there are also more of them now.
+
+
ToasterBiome updated:
+
+ - Adds buttons to preview what higher tier chem dispensers can put out
+
+
nmajask updated:
+
+ - cryopods should work now
+
+
redmoogle updated:
+
+ - Admins now have a button to set the beer nuke code
+ - Adds PETA cargo loan
+ - SMES Icon changed slightly
+
+
tralezab, ported to Yogstation by SuperSlayer updated:
+
+ - a lot of >32x32 mobs now have icons for their health dolls
+
+
ynot01 updated:
+
+ - Nanite fake death now has a 4.5 use rate from 3.5
+ - ghost role chemical dispensers are now fully upgraded
+ - VR chemical dispensers are now fully upgraded
+
+
+
25 June 2022
+
ToasterBiome updated:
+
+ - fixes bad sign and light in yogsbox
+ - makes some wires more superior on yogsbox
+
+
+
24 June 2022
+
LazennG updated:
+
+ - fixes knuckles not working right
+
+
MajManatee updated:
+
+ - Delta now has grounding rods.
+
+
+
23 June 2022
+
TheRyeGuyWhoWillNowDie updated:
+
+ - cult's twisted construction no longer incorrectly states that it can convert cyborgs
+ - fixes a theos moment
+
+
+
22 June 2022
+
MajManatee updated:
+
+ - WT mags are now visible again
+
+
ynot01 updated:
+
+ - Made the capitalist bible sound much shorter
+
+
+
21 June 2022
+
GalacticRuler updated:
+
+ - Depleted Uranium Slugs cost 1 less uranium sheet each
+ - Depleted Uranium Slugs have 60 ap (down from 200)
+ - Depleted Uranium Slugs do 30 damage (down from 35)
+ - Depleted Uranium Slugs have a -45 wound mod (down from -30)
+
+
GraveHat updated:
+
+ - Adds in Surgery Duffel and a Medical mask with an Anesthetic tank while removing the surgery tools on the table, this also means they get a sterilizer a razor, and an extra surgery mask now
+
+
JamieD1 updated:
+
+ - Batons are now upgradable to be 1 hit stun and can also be equipped with mindshield firing pins
+ - Balances Stimulants - 5 to 8 TC 2 to 3 Uses
+ - Adds FTL Advanced Edition Soundtrack: Lanius (Battle) (ABANDONED SECTOR)
+ - Adds FTL Theme to Lobby Music
+
+
Marmio64 updated:
+
+ - extinguishers deal 33% less damage to blazing oil blob strain
+
+
Skrem7 updated:
+
+ - Secbelts and bandoliers can now hold proper number of items
+ - Syndie mediborg loses emag and crowbar, gains zipties
+ - Syndie saboborg gains combat knife
+
+
SomeguyManperson updated:
+
+ - golem greet text no longer gives conflicting information with certain golem types by assuming your material
+
+
SuperSlayer updated:
+
+ - Blob now becomes almost unlikable after reaching critical mass
+
+
TheRyeGuyWhoWillNowDie updated:
+
+ - syndie sabo borgs now have emags
+ - the shotgun slug drums purchasable by nuclear operative have had their ammo type replaced with syndicate slugs, which do more damage.
+ - syndicate slugs, shotgun slugs that do 60 brute instead of 42. only purchasable by nuclear operatives
+
+
adamsong updated:
+
+ - Added horror's host to check antags
+
+
alexkar598 updated:
+
+ - Lizards are now cannonically 8 feet tall
+
+
nmajask updated:
+
+ - fixed ashwalker clothing having missing pixels if worn by a female
+ - fixed footwraps not showing up on the preference menu and being incorrect when a job outfit is selected by an admin
+ - fixed selecting an outfit for a ghost who had their original body offered teleporting the wrong player
+ - fixed syringes not embedding
+
+
redmoogle updated:
+
+ - Brain damage quirk
+ - organ harvester can be rotated now
+
+
stwordcitizen updated:
+
+ - made simplemob health doll not spawn on top of the stop pulling button
+
+
tattax updated:
+
+ - you can now hold space bats
+ - bats can now actually see in the dark
+ - uncapitalized simplemob names
+ - you can no longer mess with inhand mobs
+
+
ynot01 updated:
+
+ - gave chemical dispensers more manipulator upgrade tiers
+
+
+
19 June 2022
+
@LazennG, @ToasterBiome, Chubbygummibear updated:
+
+ - Basalt Katana gets an activatable dodge roll mechanic
+ - Dodge roll costs 5 stamina on lavaland and 15 on station but gives you .5 seconds of iframes and flying. Dodge rolling into a wall or another person will bonk and stun you, same with stam-critting yourself. i-frames only block straight up damage numbers, explosions still throw and deafen you, cc effects like a bola will still stick
+ - Basalt katana force down to 18 to avoid miner ninjas tearing up the crew
+ - Basalt katana damage on lavaland fauna up to 70, including megafauna
+ - dodge roll sound effect
+ - evasion icon to go with the popup letting you know you're in i-frames
+
+
Galacticruler, @Chubbygummibear, @Hopekz updated:
+
+ - Added new eye implant for reagent scanning, the chemical analyzer implant
+ - added new implant to the tech node with the other HUD implants
+ - added third mob-level check to allow for the new implant to work
+
+
comma, orelbon updated:
+
+ - Added holosigns from Baystation
+
+
00ze-cyclone updated:
+
+ - Removed a space in the species whitelisting
+ - maybe fixed polys not being able to be CE (I hope it's not actually something as stupid as a singular space that broke everything though it would be nice because it would mean that it's easy to fix)
+
+
@ToasterBiome @Chubbygummibear @LazennG updated:
+
+ - Added inhand ability for bloody knuckles
+ - tweaked some recent loot to hopefully be less useless
+
+
Chubbygummibear updated:
+
+ - Preternis eyes no longer delete themselves when in a non preternis host
+ - Preternis eyes use their organ health as a charge meter. They drain (take damage at .5 eye damage per tick) in a non-preternis and recharge quickly (.5 eye healing per tick) in an actual preternis.
+ - Preternis eyes depend on being high organ health to use their night vision rather than preternis charge meter.
+ - Preternis eyes are naturally cybernetic, so they don't decay outside of a body and you get flashed if emp'd. although your eyes are probably the least of your worries if emp'd as a preternis
+ - Stomach Pumping surgery. A quick way to deal with someone, living or dead who has way too many reagents in their system.
+ - I updated our vomit code and i don't want to talk about it. players won't notice a difference
+
+
GalacticRuler updated:
+
+ - Adds new Fishing themed 10x10 maint ruin.
+ - Adds new ruin to station.dmm
+
+
Skrem7 updated:
+
+ - WT has 2-rnd burst back, bullets do less individual damage, magazine size increased
+ - Arrows are now slightly more sensible considering they can be produced and used by just about anyone as a ranged weapon that does more damage than most station weaponry such as the welder or saw.
+ - Secbelt + variants can hold shotgun shell boxes and teleshields, bulky now.
+ - Shotgun shell boxes can now only carry shotgun shells.
+ - Beanbag boxes spawn with 7 beanbags, rather than 6.
+ - Security webbing and HoS belt storage buffed.
+ - HoS now spawns with their belt and teleshield from the locker, extra baton/flash/cuffs moved to locker.
+ - Assault belt now identical to tactical webbing.
+ - Shoulder holster normal-sized again.
+ - Bandolier holds more shells.
+
+
SomeguyManperson updated:
+
+ - toxins bombs no longer give direct research, instead doubling research speed for the amount of points they are worth
+ - bloodsucker frenzy now provides reduced damage slowdown for its duration
+ - adds line battles, you can now shoot over people who are both prone and within 2 tiles of you
+ - this also means you can combat flop to matrix bullets at close range
+
+
TheBonded, ported to YogStation by SuperSlayer updated:
+
+ - podpeople from replica pods now have water blood by default, and inherit their blood chemical from the most abundant chemical trait in their seeds if applicable.
+
+
TheGamerdk updated:
+
+ - AI gets 1 more research point per CPU
+ - AI techs are no longer hiding in the techweb
+ - AI cores should no longer turn off due to grid failure events
+
+
ToasterBiome updated:
+
+ - Adds collapsable fishing rod
+ - fixes fishing rod right inhand
+ - eating fish now works
+ - make fishing loot datums make a bit more sense
+
+
TymurShatillo updated:
+
+ - Fixes pacifism touch cooldown
+
+
jachlompsky updated:
+
+ - gangrel transform now gives the user armor and increased punch damage
+
+
nmajask updated:
+
+ - moving while doing a surgery now hurts the patient
+
+
ynot01 updated:
+
+ - Destroying the bluespace locker now teleports everything inside to the station
+
+
+
18 June 2022
+
Mothblocks, ported to YogStation by SuperSlayer updated:
+
+ - Defibing people now gives positive mood
+
+
Skrem7 updated:
+
+ - Rubber shot more damage and less damage falloff
+
+
tattax updated:
+
+ - vanishing act now works, frenzy exit is now setup properly
+
+
ynot01 updated:
+
+ - fixed fish descriptions
+ - fixed card descriptions
+
+
+
17 June 2022
+
AlvCyktor updated:
+
+ - Barq is good apparently
+
+
JamieD1 updated:
+
+ - Removes ALL button from investigate.
+
+
nmajask updated:
+
+ - fixed wigs using a different sprite than it should
+
+
+
16 June 2022
+
GalacticRuler updated:
+
+ - Added one new 3x3 maint ruin themed around vending machines
+ - Corrected missing spaces in station.dm
+
+
ToasterBiome updated:
+
+ - tinted window in metastation courtroom is now a proper window spawner
+
+
+
15 June 2022
+
SomeguyManperson updated:
+
+ - no more ruin spawned corpses with gpses because people with gpses dont get not recovered (this is canon shut up)
+ - gpses on miners now properly iterate numbers i.e. MINE1 2 3 4 rather than just all being MINE0. The mining medic isn't included because they suck
+ - mining medic no longer gets 2 gpses
+
+
14 June 2022
+
@GalacticRuler, Chubbygummibear updated:
+
+ - crayons and spraycans with 1 charge left are no longer infinite for tags that cost more than 1 charge
+
Hopek updated:
- Mappers can now created round-start tilted vending machines
+
ghost, ported by TheGamerdk updated:
+
+ - Glowshrooms less bad
+ - Glowshrooms now spread and decay different from before, hopefully preventing the issues they were causing with performance
+
+
maxspells, TheBoondock, MrMelbert, nmajask updated:
+
+ - added sounds to surgery steps
+ - fixed medical sounds for wounds, rad laser, and PDA health scan
+ - doctors now say "Clear!" during revive surgery
+ - fixed revive surgery saying "shock body" instead of "shock brain"
+
+
AlvCyktor updated:
+
+ - tweaked deepfryer code
+
+
ChesterTheCheesy updated:
+
+ - arena shuttle now has a mood bonus
+
GalacticRuler updated:
- replaced unusable frames with usable machine frames in the old cryo room maint-ruin
+
JamieD1 updated:
+
+ - Stun batons cannot be turned on for 8 Seconds after being dropped
+ - Scrying orb
+
+
LazennG updated:
+
+ - Removes cursed stomach from bubblegum's loot and removes morph syringe from gluttony ruin
+
+
MajManatee updated:
+
+ - Adds a donor item for Skrem, the Rainbow flower.
+
+
Marmio64 updated:
+
+ - Infiltrator win conditions are stricter, they can also end in a Stalemate if they didn't do very good.
+
+
TheRyeGuyWhoWillNowDie updated:
+
+ - the security belt in the head of security's locker has been changed to a head of security's security belt
+ - the head of security now has a backpack baton and pocket cuffs/flash again
+ - the head of security no longer starts with a full secbelt again
+
ToasterBiome updated:
- Adds support for map spawned holochips
- Adds a bunch of tile and tile trims from tg
+ - Removes Jive Accent
+ - Vomit crawling can't crawl between z levels anymore
+
+
tattax updated:
+
+ - fixes motorized wheelchairs becoming normal ones | powercell now displays its name properly
+ - wheelchairs above 6 speed no longer crash on open turfs like airlocks
+ - motorized wheelchair sprite, little change in the normal wheelchair sprite
+
+
ynot01 updated:
+
+ - Internal Affairs Agents are now equipped with dusting implants instead of cyanide capsules
12 June 2022
@@ -2107,279 +2565,6 @@
adamsong updated:
- fixed paper being blank when held to AI camera
-
-
29 March 2022
-
SomeguyManperson updated:
-
- - you can now repair cybernetic limbs again without the target having to have a wound
- - brazil now only kicks out people who aren't supposed to be there instead of people who are
-
-
adamsong updated:
-
- - rotatium has added rotating
- - fixed the possibility of a malf AI not spawning on a malf round
-
-
tattax updated:
-
- - fixed a bug that made borgs not unrest people and the message when clicking on a resting person
-
-
-
28 March 2022
-
adamsong updated:
-
- - Removed player access to edit variables on any apc on station
-
-
nmajask updated:
-
- - telescopic batons now have the right sprites again
-
-
-
27 March 2022
-
Chubbygummibear, Lazzen updated:
-
- - Grand Core organ adds the blooded faction tag instead of replacing your neutral faction
- - Grand Core organ removes the blooded faction when it's removed from you
-
-
Cuackles, Chubbygummibear updated:
-
- - Added raincoat, officer hatsky, and hotdog costume
- - Sprites added for the clothing
-
-
Hopek updated:
-
- - Added a new donator borg skin; DIO L.I.T.E
- - Added a new donator AI skin; D.I.O
-
-
comma updated:
-
- - Crypods, sleepers and bodyscanner pods now make sounds when someone enters/leaves
-
-
MrMelbert, Simplehorror updated:
-
- - Add 3 new station traits, Ionic Stormfront (increases Ion Storm chances), Radiation Stormfront (increases Radiation Storm chances), Eventful (decreases time between events),
-
-
NovaAzure updated:
-
- - Placing a new bulb into a borg fixes their headlamp
-
-
maxion12345, Simplehorror updated:
-
- - Rapid Pipe Dispensers can no longer print transit tubes, disposal pipes or plumbing pipes on turfs containing dense atoms.
-
-
Chubbygummibear updated:
-
- - Genetics Hulk and Hulk state have an instability cost to them now
- - Genetics Hulk and Hulk state work with all races
- - Genetics Hulk no longer naturally appears through spawns or gene randomizing
- - Genetics Hulk has to be created through Genetics
- - Genetics Hulk and Hulk state can both be removed with mutadone
-
-
Marmio64 updated:
-
- - Adds wax golem and the ability to transform people into it for the candle sect. Also adds new candle sect and kudzu sect bless effects.
-
-
Mqiib updated:
-
- - Makes necroseed work more consistently with species that have weird numbers
-
-
Simplehorror updated:
-
- - Luxury shuttle windows now survive RCDs
- - Fix macros not loading if you join game before SSinput is started
-
-
Skrem7 updated:
-
- - Tweaks several quirky lawset ion weights up
- - Adds a gritty, noir-esqe lawset for those troubled, hard-boiled silicon detectives
-
-
SomeguyManperson updated:
-
- - non-welders that act as welders i.e. holotool can now be used to repair cybernetic limbs
- - preternis can now be placed in cryo to heal oxygen and toxin damage and not get immediately kicked back out
-
-
TheGamerdk updated:
-
- - Tweaked visibility of Toggle Download button for malf AIs
- - AI servers should no longer sporadically fail to add resources
- - AIs are notified when the console downloading them is consolen't
- - Malf AIs can no longer initiate the big bad doomsday device after they've died
- - Added a confirm button to being instantly downloaded
-
-
ToasterBiome updated:
-
- - Adds rock hardness
- - Add PKA mod to increase what hardness rocks you can destroy
- - Adds plasma magmite
- - Adds world anvil to necropolis gate
- - adds hard rocks to lavaland
- - just read the PR
- - yogsbox ai sat exterior airlock button has correct id to open correct exterior airlock door
- - Adds 3 new tumors
- - Adds 3 new virology symptoms
- - lets organs be inserted into special funny slots
-
-
adamsong updated:
-
- - turned off medbay intercom
-
-
maxion12345 updated:
-
- - Added new airlock to secondary datacore
-
-
-
26 March 2022
-
TheGamerdk updated:
-
- - Fixes issue where you could end up downloading an AI out of an intellicard
-
-
ToasterBiome updated:
-
- - plate sprite is now removed from the rest of the filet migrawr frames
-
-
adamsong updated:
-
- - fixed mentorwho still including admins after I explicitly told it not to
-
-
-
25 March 2022
-
Mqiib updated:
-
- - New rare species for powergaming lavalandists: Draconids!
- - Makes the lizard roll for dragon's blood bottles turn you into a draconid
- - WARNING: MINING BUFF
-
-
SomeguyManperson updated:
-
- - crafted structures now have their own crafting category because having everything in misc only works for so long
- - extendohand is now in the weapons category
- - the flashlight eyes are in the robot category
-
-
-
24 March 2022
-
adamsong updated:
-
- - fixed several vv actions not working
- - Removed the ability for non-admins to reboot the server
- - fixed being able to spam admins with pretty filter logs
- - muted people no longer generate pretty filter logs
-
-
-
23 March 2022
-
SomeguyManperson updated:
-
- - swarmers are no longer narsie's worst enemy
-
-
-
21 March 2022
-
Simplehorror updated:
-
- - Fix capitalisation in malf round report
-
-
Sniblet updated:
-
- - slightly expanded the tooltip for pass
-
-
TheGamerdk updated:
-
- - AI Control Console no longer shows 'G2' no matter which AI you're downloading
-
-
maxion12345 updated:
-
- - pool ladders are anchored now
-
-
-
20 March 2022
-
TheGamerdk updated:
-
- - AI Control Console passwords should no longer sporadically fail
-
-
maxion12345 updated:
-
- - RGB project no longer flashes to one color and stops
-
-
-
19 March 2022
-
00ze-cyclone updated:
-
- - an implant case for the syndie surgery duffel
- - cheaper syndie surgery duffel
-
-
Chubbygummibear updated:
-
- - cooldown on health analyzer beep so medbay isn't constant beeping
-
-
MenacingManatee updated:
-
- - Sentient diseases now start with 2 stealth 2 resistance
-
-
Skrem7 updated:
-
- - Adds a new druidic lawset focused on cultivating the organics
-
-
Sniblet updated:
-
- - climbing things doesn't discourage waggers
- - felinids can now oppress other species
-
-
ToasterBiome updated:
-
- - cyborgs now get an "eject hat" button that will take off their hat and drop it
- - fixes shitty minesweeper formatting
-
-
cuackles updated:
-
- - Added new simple mob (snail)
- - added some icons and images of said simple mob (snail)
-
-
nmajask updated:
-
- - fixed deleting files from disks
- - TRAC implant now lasts 15 minutes
- - Detectives now start with a modular PDA
- - Radar programs now work on PDAs and the implant tracking program now only requires brig access
- - captain starts with a phone round start
- - CE's phone starts with a sensor package
-
-
zen373 updated:
-
- - Fixes atmos airlock pipes
-
-
-
18 March 2022
-
ToasterBiome, TheGamerdk updated:
-
- - fixes engine template failing 28% of the time and picking weird weights for engines
- - legitimizes weird engine weights
-
-
Sniblet updated:
-
- - made the code slightly less illiterate
-
-
-
17 March 2022
-
Identification updated:
-
- - Telescopic batons are now a discernible shape
-
-
Chubbygummibear updated:
-
- - Throwing Mjolnier into someone with anti-magic makes it go bye bye in a big boom
-
-
ToasterBiome updated:
-
- - removes erroneous admin logging that is not needed
-
-
-
16 March 2022
-
Marmio64 updated:
-
- - Adds text saying that you can use a lit candle instead of a welder to heat up bowls, substitute cacti for porcini leaves, and that resin uses water now instead of heat to solidify, to the ash walker's knowledge book.
- - Fixed a typo with poultice making.
-
-
adamsong updated:
-
- - fixed bug in dna console sanitization
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index ab287290f783..69684fdaabf7 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -32029,11 +32029,358 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- bugfix: you can now remove embedded objects from dismembered limbs by stabbing
them again
2022-06-14:
+ ' @GalacticRuler, Chubbygummibear':
+ - bugfix: crayons and spraycans with 1 charge left are no longer infinite for tags
+ that cost more than 1 charge
' Hopek':
- rscadd: Mappers can now created round-start tilted vending machines
+ ' ghost, ported by TheGamerdk':
+ - rscadd: Glowshrooms less bad
+ - rscadd: Glowshrooms now spread and decay different from before, hopefully preventing
+ the issues they were causing with performance
+ ' maxspells, TheBoondock, MrMelbert, nmajask':
+ - soundadd: added sounds to surgery steps
+ - bugfix: fixed medical sounds for wounds, rad laser, and PDA health scan
+ - tweak: doctors now say "Clear!" during revive surgery
+ - spellcheck: fixed revive surgery saying "shock body" instead of "shock brain"
+ AlvCyktor:
+ - tweak: tweaked deepfryer code
+ ChesterTheCheesy:
+ - tweak: arena shuttle now has a mood bonus
GalacticRuler:
- bugfix: replaced unusable frames with usable machine frames in the old cryo room
maint-ruin
+ JamieD1:
+ - rscadd: Stun batons cannot be turned on for 8 Seconds after being dropped
+ - rscdel: Scrying orb
+ LazennG:
+ - rscdel: Removes cursed stomach from bubblegum's loot and removes morph syringe
+ from gluttony ruin
+ MajManatee:
+ - rscadd: Adds a donor item for Skrem, the Rainbow flower.
+ Marmio64:
+ - tweak: Infiltrator win conditions are stricter, they can also end in a Stalemate
+ if they didn't do very good.
+ TheRyeGuyWhoWillNowDie:
+ - tweak: the security belt in the head of security's locker has been changed to
+ a head of security's security belt
+ - rscadd: the head of security now has a backpack baton and pocket cuffs/flash again
+ - rscdel: the head of security no longer starts with a full secbelt again
ToasterBiome:
- rscadd: Adds support for map spawned holochips
- rscadd: Adds a bunch of tile and tile trims from tg
+ - rscdel: Removes Jive Accent
+ - bugfix: Vomit crawling can't crawl between z levels anymore
+ tattax:
+ - bugfix: fixes motorized wheelchairs becoming normal ones | powercell now displays
+ its name properly
+ - tweak: wheelchairs above 6 speed no longer crash on open turfs like airlocks
+ - imageadd: motorized wheelchair sprite, little change in the normal wheelchair
+ sprite
+ ynot01:
+ - tweak: Internal Affairs Agents are now equipped with dusting implants instead
+ of cyanide capsules
+2022-06-15:
+ SomeguyManperson:
+ - bugfix: no more ruin spawned corpses with gpses because people with gpses dont
+ get not recovered (this is canon shut up)
+ - tweak: gpses on miners now properly iterate numbers i.e. MINE1 2 3 4 rather than
+ just all being MINE0. The mining medic isn't included because they suck
+ - tweak: mining medic no longer gets 2 gpses
+2022-06-16:
+ GalacticRuler:
+ - rscadd: Added one new 3x3 maint ruin themed around vending machines
+ - bugfix: Corrected missing spaces in station.dm
+ ToasterBiome:
+ - bugfix: tinted window in metastation courtroom is now a proper window spawner
+2022-06-17:
+ AlvCyktor:
+ - rscadd: Barq is good apparently
+ JamieD1:
+ - rscdel: Removes ALL button from investigate.
+ nmajask:
+ - bugfix: fixed wigs using a different sprite than it should
+2022-06-18:
+ Mothblocks, ported to YogStation by SuperSlayer:
+ - rscadd: Defibing people now gives positive mood
+ Skrem7:
+ - tweak: Rubber shot more damage and less damage falloff
+ tattax:
+ - bugfix: vanishing act now works, frenzy exit is now setup properly
+ ynot01:
+ - spellcheck: fixed fish descriptions
+ - spellcheck: fixed card descriptions
+2022-06-19:
+ ' @LazennG, @ToasterBiome, Chubbygummibear':
+ - rscadd: Basalt Katana gets an activatable dodge roll mechanic
+ - rscadd: Dodge roll costs 5 stamina on lavaland and 15 on station but gives you
+ .5 seconds of iframes and flying. Dodge rolling into a wall or another person
+ will bonk and stun you, same with stam-critting yourself. i-frames only block
+ straight up damage numbers, explosions still throw and deafen you, cc effects
+ like a bola will still stick
+ - tweak: Basalt katana force down to 18 to avoid miner ninjas tearing up the crew
+ - tweak: Basalt katana damage on lavaland fauna up to 70, including megafauna
+ - soundadd: dodge roll sound effect
+ - imageadd: evasion icon to go with the popup letting you know you're in i-frames
+ ' Galacticruler, @Chubbygummibear, @Hopekz':
+ - rscadd: Added new eye implant for reagent scanning, the chemical analyzer implant
+ - tweak: added new implant to the tech node with the other HUD implants
+ - tweak: added third mob-level check to allow for the new implant to work
+ ' comma, orelbon':
+ - rscadd: Added holosigns from Baystation
+ 00ze-cyclone:
+ - rscdel: Removed a space in the species whitelisting
+ - bugfix: maybe fixed polys not being able to be CE (I hope it's not actually something
+ as stupid as a singular space that broke everything though it would be nice
+ because it would mean that it's easy to fix)
+ '@ToasterBiome @Chubbygummibear @LazennG':
+ - rscadd: Added inhand ability for bloody knuckles
+ - tweak: tweaked some recent loot to hopefully be less useless
+ Chubbygummibear:
+ - tweak: Preternis eyes no longer delete themselves when in a non preternis host
+ - tweak: Preternis eyes use their organ health as a charge meter. They drain (take
+ damage at .5 eye damage per tick) in a non-preternis and recharge quickly (.5
+ eye healing per tick) in an actual preternis.
+ - tweak: Preternis eyes depend on being high organ health to use their night vision
+ rather than preternis charge meter.
+ - tweak: Preternis eyes are naturally cybernetic, so they don't decay outside of
+ a body and you get flashed if emp'd. although your eyes are probably the least
+ of your worries if emp'd as a preternis
+ - rscadd: Stomach Pumping surgery. A quick way to deal with someone, living or dead
+ who has way too many reagents in their system.
+ - tweak: I updated our vomit code and i don't want to talk about it. players won't
+ notice a difference
+ GalacticRuler:
+ - rscadd: Adds new Fishing themed 10x10 maint ruin.
+ - tweak: Adds new ruin to station.dmm
+ Skrem7:
+ - tweak: WT has 2-rnd burst back, bullets do less individual damage, magazine size
+ increased
+ - tweak: Arrows are now slightly more sensible considering they can be produced
+ and used by just about anyone as a ranged weapon that does more damage than
+ most station weaponry such as the welder or saw.
+ - tweak: Secbelt + variants can hold shotgun shell boxes and teleshields, bulky
+ now.
+ - tweak: Shotgun shell boxes can now only carry shotgun shells.
+ - tweak: Beanbag boxes spawn with 7 beanbags, rather than 6.
+ - tweak: Security webbing and HoS belt storage buffed.
+ - tweak: HoS now spawns with their belt and teleshield from the locker, extra baton/flash/cuffs
+ moved to locker.
+ - tweak: Assault belt now identical to tactical webbing.
+ - tweak: Shoulder holster normal-sized again.
+ - tweak: Bandolier holds more shells.
+ SomeguyManperson:
+ - tweak: toxins bombs no longer give direct research, instead doubling research
+ speed for the amount of points they are worth
+ - tweak: bloodsucker frenzy now provides reduced damage slowdown for its duration
+ - tweak: adds line battles, you can now shoot over people who are both prone and
+ within 2 tiles of you
+ - tweak: this also means you can combat flop to matrix bullets at close range
+ TheBonded, ported to YogStation by SuperSlayer:
+ - rscadd: podpeople from replica pods now have water blood by default, and inherit
+ their blood chemical from the most abundant chemical trait in their seeds if
+ applicable.
+ TheGamerdk:
+ - tweak: AI gets 1 more research point per CPU
+ - rscadd: AI techs are no longer hiding in the techweb
+ - tweak: AI cores should no longer turn off due to grid failure events
+ ToasterBiome:
+ - rscadd: Adds collapsable fishing rod
+ - bugfix: fixes fishing rod right inhand
+ - bugfix: eating fish now works
+ - tweak: make fishing loot datums make a bit more sense
+ TymurShatillo:
+ - bugfix: Fixes pacifism touch cooldown
+ jachlompsky:
+ - bugfix: gangrel transform now gives the user armor and increased punch damage
+ nmajask:
+ - tweak: moving while doing a surgery now hurts the patient
+ ynot01:
+ - tweak: Destroying the bluespace locker now teleports everything inside to the
+ station
+2022-06-21:
+ GalacticRuler:
+ - tweak: Depleted Uranium Slugs cost 1 less uranium sheet each
+ - tweak: Depleted Uranium Slugs have 60 ap (down from 200)
+ - tweak: Depleted Uranium Slugs do 30 damage (down from 35)
+ - tweak: Depleted Uranium Slugs have a -45 wound mod (down from -30)
+ GraveHat:
+ - tweak: Adds in Surgery Duffel and a Medical mask with an Anesthetic tank while
+ removing the surgery tools on the table, this also means they get a sterilizer
+ a razor, and an extra surgery mask now
+ JamieD1:
+ - rscadd: Batons are now upgradable to be 1 hit stun and can also be equipped with
+ mindshield firing pins
+ - tweak: Balances Stimulants - 5 to 8 TC 2 to 3 Uses
+ - rscadd: 'Adds FTL Advanced Edition Soundtrack: Lanius (Battle) (ABANDONED SECTOR)'
+ - rscadd: Adds FTL Theme to Lobby Music
+ Marmio64:
+ - tweak: extinguishers deal 33% less damage to blazing oil blob strain
+ Skrem7:
+ - bugfix: Secbelts and bandoliers can now hold proper number of items
+ - tweak: Syndie mediborg loses emag and crowbar, gains zipties
+ - tweak: Syndie saboborg gains combat knife
+ SomeguyManperson:
+ - tweak: golem greet text no longer gives conflicting information with certain golem
+ types by assuming your material
+ SuperSlayer:
+ - tweak: Blob now becomes almost unlikable after reaching critical mass
+ TheRyeGuyWhoWillNowDie:
+ - rscadd: syndie sabo borgs now have emags
+ - rscadd: the shotgun slug drums purchasable by nuclear operative have had their
+ ammo type replaced with syndicate slugs, which do more damage.
+ - rscadd: syndicate slugs, shotgun slugs that do 60 brute instead of 42. only purchasable
+ by nuclear operatives
+ adamsong:
+ - rscadd: Added horror's host to check antags
+ alexkar598:
+ - tweak: Lizards are now cannonically 8 feet tall
+ nmajask:
+ - bugfix: fixed ashwalker clothing having missing pixels if worn by a female
+ - bugfix: fixed footwraps not showing up on the preference menu and being incorrect
+ when a job outfit is selected by an admin
+ - bugfix: fixed selecting an outfit for a ghost who had their original body offered
+ teleporting the wrong player
+ - bugfix: fixed syringes not embedding
+ redmoogle:
+ - rscadd: Brain damage quirk
+ - bugfix: organ harvester can be rotated now
+ stwordcitizen:
+ - bugfix: made simplemob health doll not spawn on top of the stop pulling button
+ tattax:
+ - rscadd: you can now hold space bats
+ - bugfix: bats can now actually see in the dark
+ - spellcheck: uncapitalized simplemob names
+ - bugfix: you can no longer mess with inhand mobs
+ ynot01:
+ - tweak: gave chemical dispensers more manipulator upgrade tiers
+2022-06-22:
+ MajManatee:
+ - bugfix: WT mags are now visible again
+ ynot01:
+ - tweak: Made the capitalist bible sound much shorter
+2022-06-23:
+ TheRyeGuyWhoWillNowDie:
+ - spellcheck: cult's twisted construction no longer incorrectly states that it can
+ convert cyborgs
+ - experiment: fixes a theos moment
+2022-06-24:
+ LazennG:
+ - bugfix: fixes knuckles not working right
+ MajManatee:
+ - bugfix: Delta now has grounding rods.
+2022-06-25:
+ ToasterBiome:
+ - bugfix: fixes bad sign and light in yogsbox
+ - tweak: makes some wires more superior on yogsbox
+2022-06-26:
+ ' Nmajask, IndusRobot, Mothblocks':
+ - rscadd: Selecting surgeries are now done by a radial menu
+ - tweak: You can now start surgeries with tools and end surgeries without drapes
+ - tweak: Surgeries are now quieter
+ - tweak: You can now see if someone is being operated on when you inspect them
+ - tweak: Doing a surgery now has a 20% chance to get blood on your tool and 10%
+ chance to get blood on you
+ ' SuperSlayer':
+ - tweak: CNS rebooter implant is no more nukie only
+ AlvCyktor:
+ - bugfix: fixed duplicate build path for plate and trays
+ - tweak: RSF can now print plates
+ - rscadd: Ding
+ Arkatos, ported to YogStation by SuperSlayer:
+ - tweak: Blobbernauts now have a generic living healthdoll and pull icon.
+ - tweak: Blobbernauts will now show severity of their injuries as a red screen overlay
+ to the user.
+ - tweak: Blob core remaining health will now show in percentages and in green color.
+ This affects both blobbernauts and blob overminds.
+ - tweak: Blob power is now in orange color for blob overminds.
+ - tweak: Swarmers now have a generic living healthdoll and pull icon.
+ - tweak: Swarmers will now show severity of their injuries as a red screen overlay
+ to the user.
+ - tweak: Swarmer's abilities now have tooltips to clarify their use upon mouse hover.
+ Chubbygummibear:
+ - rscadd: Rune Scimitar causes mobs to drop bonus loot from a loot table on kill
+ - rscadd: Rune Scimitar gains bonus damage against fauna with each lavaland fauna
+ slain up to 20, for a total of 100 bonus damage. get out there and grind
+ - tweak: Rune Scimitar's base force down to 20
+ JamieD1:
+ - bugfix: Disabling Regal Rat till its fixed
+ - tweak: Shadowlings now cannot get mutations and nerfs speed
+ MajManatee:
+ - rscadd: Minigun go BRRRRRRRRRRRRRRRT
+ - rscadd: Adds a Flechette drum for traitors/nukies
+ - rscadd: Adds a Hollow-point buckshot drum for traitors/nukies
+ Mqiib:
+ - tweak: Krav maga lung punch losebreath reduced by 40%
+ - tweak: Moves stun immunity of fortitude to level 2.
+ - tweak: Frenzy state gives stun immunity
+ - tweak: CQC counter no longer hard stuns
+ - tweak: Explosive meltdown nanites have a flat 30 second timer now.
+ - tweak: Explosive meltdown nanites no longer gib you, but still do a buttload of
+ brute damage.
+ - tweak: Smashing a bluespace crystal now makes you nauseous and slightly confused
+ SapphicOverload:
+ - rscadd: adds winter coats for department heads
+ - tweak: gives the CE's hardsuit full radiation protection
+ Skrem7:
+ - tweak: Mining belts can now hold lazarus injectors and bottles of whiskey
+ - tweak: Mining belts can no longer hold bone swords
+ - tweak: Storage on mining webbing and sinewbelt increased
+ - rscadd: Space Pirates now have a unique uniform which has armor stats equal to
+ the tactical turtleneck as well as no sensors.
+ - rscadd: Space Pirate captain now spawns with a Syndicate captain's coat and hat,
+ which has more robust armor than the standard space pirate gear.
+ - rscadd: Space Pirate gunner now spawns with a Syndicate pirate hat, having their
+ own unique uniform.
+ - rscadd: The pirate bandana now gives the ability to speak pirate, similar to the
+ pirate and pirate captain's hat.
+ - tweak: All pirate exosuits can now hold the normal cutlass in addition to the
+ energy one. Normal exosuits can hold emergency tanks now.
+ - tweak: The normal and space pirate garb have all been given updated descriptions.
+ The Syndicate ones have also received new names and different descriptions.
+ - tweak: FEAR THE (LAVA) SEAS LAND LUBBERS, OUR BLADES HUNGER FOR WHELPLING BLOOD
+ - tweak: Warden webbing powergaming has been destroyed by secoff financial independence
+ - tweak: Patches up some weird storage decisions regarding all mining exosuits.
+ Basically, knives and legion cores of all forms should fit on any mining exosuit
+ - tweak: Adds bone sword and all bows as options to exosuit slot on goliath, pathfinder,
+ and drake armors
+ - tweak: Adds bone spear to drake armor because it had the normal spear only??
+ Sniblet:
+ - tweak: Rollerbeds no longer require plastic
+ SomeguyManperson:
+ - bugfix: resonator blasts will no longer stack on top of eachother creating a tile
+ you cannot step on without breaking your bones that has collectable rocks on
+ it
+ - rscadd: 2 ventriloquist dummies are now stocked in autodrobes
+ TheRyeGuyWhoWillNowDie:
+ - spellcheck: inspecting the twisted construction spell AKA the hand that appears
+ after casting the spell will also no longer incorrectly state that it can convert
+ cyborgs
+ - tweak: the loose beans in the armory have been placed in boxes. there are also
+ more of them now.
+ ToasterBiome:
+ - rscadd: Adds buttons to preview what higher tier chem dispensers can put out
+ nmajask:
+ - bugfix: cryopods should work now
+ redmoogle:
+ - rscadd: Admins now have a button to set the beer nuke code
+ - rscadd: Adds PETA cargo loan
+ - imageadd: SMES Icon changed slightly
+ tralezab, ported to Yogstation by SuperSlayer:
+ - imageadd: a lot of >32x32 mobs now have icons for their health dolls
+ ynot01:
+ - tweak: Nanite fake death now has a 4.5 use rate from 3.5
+ - tweak: ghost role chemical dispensers are now fully upgraded
+ - tweak: VR chemical dispensers are now fully upgraded
+2022-06-27:
+ ' actioninja, Ghommie':
+ - rscadd: Washing machines now support arbitrary dye color
+ - rscadd: Washing machines now dye nearly every item.
+ - experiment: lots of backend changes to clothing overlays, report any issues
+ - imageadd: Different cuffs now come with different worn overlays instead of a generic
+ one.
+ adamsong:
+ - bugfix: fixed ai whale on gax
+2022-06-28:
+ redmoogle:
+ - bugfix: Hand drill now works as a screwdriver for surgery
diff --git a/html/changelogs/AutoChangelog-pr-14559.yml b/html/changelogs/AutoChangelog-pr-14559.yml
new file mode 100644
index 000000000000..acca73e1070b
--- /dev/null
+++ b/html/changelogs/AutoChangelog-pr-14559.yml
@@ -0,0 +1,4 @@
+author: "JamieD1"
+delete-after: true
+changes:
+ - rscadd: "Research now requires Toxins/Robotics Access and now has Doors"
diff --git a/icons/effects/clothing.dmi b/icons/effects/clothing.dmi
new file mode 100644
index 000000000000..a01a5471458f
Binary files /dev/null and b/icons/effects/clothing.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index aa03f6b641a9..dcd970251cf5 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/misc/surgery_icons.dmi b/icons/misc/surgery_icons.dmi
new file mode 100644
index 000000000000..9d2abbf3b180
Binary files /dev/null and b/icons/misc/surgery_icons.dmi differ
diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi
index c50351eef374..21238366f198 100644
Binary files a/icons/mob/alien.dmi and b/icons/mob/alien.dmi differ
diff --git a/icons/mob/alienqueen.dmi b/icons/mob/alienqueen.dmi
index 115bd17cb0b1..3a7ab277da1b 100644
Binary files a/icons/mob/alienqueen.dmi and b/icons/mob/alienqueen.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index f2ad8f2633dd..b3ffebe94399 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
deleted file mode 100644
index fb98e52df80a..000000000000
Binary files a/icons/mob/belt.dmi and /dev/null differ
diff --git a/icons/mob/accessories.dmi b/icons/mob/clothing/accessories.dmi
similarity index 100%
rename from icons/mob/accessories.dmi
rename to icons/mob/clothing/accessories.dmi
diff --git a/icons/mob/back.dmi b/icons/mob/clothing/back.dmi
similarity index 100%
rename from icons/mob/back.dmi
rename to icons/mob/clothing/back.dmi
diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi
new file mode 100644
index 000000000000..79200b629135
Binary files /dev/null and b/icons/mob/clothing/belt.dmi differ
diff --git a/icons/mob/ears.dmi b/icons/mob/clothing/ears/ears.dmi
similarity index 100%
rename from icons/mob/ears.dmi
rename to icons/mob/clothing/ears/ears.dmi
diff --git a/icons/mob/eyes.dmi b/icons/mob/clothing/eyes/eyes.dmi
similarity index 100%
rename from icons/mob/eyes.dmi
rename to icons/mob/clothing/eyes/eyes.dmi
diff --git a/icons/mob/feet.dmi b/icons/mob/clothing/feet/feet.dmi
similarity index 100%
rename from icons/mob/feet.dmi
rename to icons/mob/clothing/feet/feet.dmi
diff --git a/icons/mob/clothing/hands/hands.dmi b/icons/mob/clothing/hands/hands.dmi
new file mode 100644
index 000000000000..7b0c692a3492
Binary files /dev/null and b/icons/mob/clothing/hands/hands.dmi differ
diff --git a/icons/mob/clothing/head/head.dmi b/icons/mob/clothing/head/head.dmi
new file mode 100644
index 000000000000..cab2f5225a62
Binary files /dev/null and b/icons/mob/clothing/head/head.dmi differ
diff --git a/icons/mob/clothing/id/id.dmi b/icons/mob/clothing/id/id.dmi
new file mode 100644
index 000000000000..afaaccef27a9
Binary files /dev/null and b/icons/mob/clothing/id/id.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/clothing/mask/mask.dmi
similarity index 100%
rename from icons/mob/mask.dmi
rename to icons/mob/clothing/mask/mask.dmi
diff --git a/icons/mob/clothing/neck/neck.dmi b/icons/mob/clothing/neck/neck.dmi
new file mode 100644
index 000000000000..817d108ea8ad
Binary files /dev/null and b/icons/mob/clothing/neck/neck.dmi differ
diff --git a/icons/mob/clothing/neck/sheets.dmi b/icons/mob/clothing/neck/sheets.dmi
new file mode 100644
index 000000000000..469a1f209816
Binary files /dev/null and b/icons/mob/clothing/neck/sheets.dmi differ
diff --git a/icons/mob/clothing/neck/skillcapes.dmi b/icons/mob/clothing/neck/skillcapes.dmi
new file mode 100644
index 000000000000..bb190a24eaf0
Binary files /dev/null and b/icons/mob/clothing/neck/skillcapes.dmi differ
diff --git a/icons/mob/clothing/sprite_accessories/socks.dmi b/icons/mob/clothing/sprite_accessories/socks.dmi
new file mode 100644
index 000000000000..2b3d0a0b5c89
Binary files /dev/null and b/icons/mob/clothing/sprite_accessories/socks.dmi differ
diff --git a/icons/mob/clothing/sprite_accessories/undershirt.dmi b/icons/mob/clothing/sprite_accessories/undershirt.dmi
new file mode 100644
index 000000000000..265c33e63591
Binary files /dev/null and b/icons/mob/clothing/sprite_accessories/undershirt.dmi differ
diff --git a/icons/mob/clothing/sprite_accessories/underwear.dmi b/icons/mob/clothing/sprite_accessories/underwear.dmi
new file mode 100644
index 000000000000..512e9a31503b
Binary files /dev/null and b/icons/mob/clothing/sprite_accessories/underwear.dmi differ
diff --git a/icons/mob/clothing/suit/suit.dmi b/icons/mob/clothing/suit/suit.dmi
new file mode 100644
index 000000000000..9d539e6498ef
Binary files /dev/null and b/icons/mob/clothing/suit/suit.dmi differ
diff --git a/icons/mob/belt_mirror.dmi b/icons/mob/clothing/suit_storage.dmi
similarity index 100%
rename from icons/mob/belt_mirror.dmi
rename to icons/mob/clothing/suit_storage.dmi
diff --git a/icons/mob/uniform.dmi b/icons/mob/clothing/uniform/uniform.dmi
similarity index 99%
rename from icons/mob/uniform.dmi
rename to icons/mob/clothing/uniform/uniform.dmi
index d98321f574e3..ff5d7802e347 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/clothing/uniform/uniform.dmi differ
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
deleted file mode 100644
index b9f27f2ed0e3..000000000000
Binary files a/icons/mob/hands.dmi and /dev/null differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
deleted file mode 100644
index 72f527e226c5..000000000000
Binary files a/icons/mob/head.dmi and /dev/null differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 723fc4c19c48..13cdd51cec54 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index 6c89fcbbd31b..eb408d4108fa 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/fishing_lefthand.dmi b/icons/mob/inhands/equipment/fishing_lefthand.dmi
deleted file mode 100644
index 0571e36445c3..000000000000
Binary files a/icons/mob/inhands/equipment/fishing_lefthand.dmi and /dev/null differ
diff --git a/icons/mob/inhands/equipment/security_lefthand.dmi b/icons/mob/inhands/equipment/security_lefthand.dmi
index 6ccdfba3fce4..e669626e38f7 100644
Binary files a/icons/mob/inhands/equipment/security_lefthand.dmi and b/icons/mob/inhands/equipment/security_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/security_righthand.dmi b/icons/mob/inhands/equipment/security_righthand.dmi
index e3f930a13e8f..8963ae53b440 100644
Binary files a/icons/mob/inhands/equipment/security_righthand.dmi and b/icons/mob/inhands/equipment/security_righthand.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 3f1756ca8c37..22c6ca201f4d 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/pets_held_lh.dmi b/icons/mob/pets_held_lh.dmi
index 06d7bfc58f8b..0f6a2d861b75 100644
Binary files a/icons/mob/pets_held_lh.dmi and b/icons/mob/pets_held_lh.dmi differ
diff --git a/icons/mob/pets_held_rh.dmi b/icons/mob/pets_held_rh.dmi
index 6d6b8f45f742..a015d0442595 100644
Binary files a/icons/mob/pets_held_rh.dmi and b/icons/mob/pets_held_rh.dmi differ
diff --git a/icons/mob/restraints.dmi b/icons/mob/restraints.dmi
new file mode 100644
index 000000000000..6e22ac1d58d1
Binary files /dev/null and b/icons/mob/restraints.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index ca7fcbf7782d..1f80e7fc0f27 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi
index 2651ee655c55..feee6f67857e 100644
Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
deleted file mode 100644
index f65429117272..000000000000
Binary files a/icons/mob/suit.dmi and /dev/null differ
diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi
deleted file mode 100644
index c08805567f2f..000000000000
Binary files a/icons/mob/underwear.dmi and /dev/null differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 7324b1d28f31..b55e42efc50f 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index d7e864f616b3..c499921d8609 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 2c8abfd76d42..7b9b4b3002b2 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 1cf575f0ab5b..6f3ef5f97f91 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index dcd91f7bf928..d5071fefda9f 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/handcuffs.dmi b/icons/obj/handcuffs.dmi
index c388098bf3fd..b3abdb722bc3 100644
Binary files a/icons/obj/handcuffs.dmi and b/icons/obj/handcuffs.dmi differ
diff --git a/icons/obj/holosign.dmi b/icons/obj/holosign.dmi
new file mode 100644
index 000000000000..16236419a38d
Binary files /dev/null and b/icons/obj/holosign.dmi differ
diff --git a/icons/obj/machines/harvester.dmi b/icons/obj/machines/harvester.dmi
index d6d9b01fc624..a5f2f4e184d2 100644
Binary files a/icons/obj/machines/harvester.dmi and b/icons/obj/machines/harvester.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index b69b75323003..b4c58f12e9c8 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi
index c14c3cc25c87..34f5a363f7b0 100644
Binary files a/icons/obj/vehicles.dmi and b/icons/obj/vehicles.dmi differ
diff --git a/sound/items/tape_flip.ogg b/sound/items/tape_flip.ogg
new file mode 100644
index 000000000000..fae3e07373c5
Binary files /dev/null and b/sound/items/tape_flip.ogg differ
diff --git a/sound/items/taperecorder_close.ogg b/sound/items/taperecorder_close.ogg
new file mode 100644
index 000000000000..ab9f521c5f9f
Binary files /dev/null and b/sound/items/taperecorder_close.ogg differ
diff --git a/sound/misc/capitialism-short.ogg b/sound/misc/capitialism-short.ogg
new file mode 100644
index 000000000000..044617c59cd6
Binary files /dev/null and b/sound/misc/capitialism-short.ogg differ
diff --git a/sound/surgery/cautery1.ogg b/sound/surgery/cautery1.ogg
new file mode 100644
index 000000000000..ac15a5812666
Binary files /dev/null and b/sound/surgery/cautery1.ogg differ
diff --git a/sound/surgery/cautery2.ogg b/sound/surgery/cautery2.ogg
new file mode 100644
index 000000000000..334c98f6cde4
Binary files /dev/null and b/sound/surgery/cautery2.ogg differ
diff --git a/sound/surgery/hemostat1.ogg b/sound/surgery/hemostat1.ogg
new file mode 100644
index 000000000000..d68c82620d2a
Binary files /dev/null and b/sound/surgery/hemostat1.ogg differ
diff --git a/sound/surgery/organ1.ogg b/sound/surgery/organ1.ogg
new file mode 100644
index 000000000000..d6cdd6271fe3
Binary files /dev/null and b/sound/surgery/organ1.ogg differ
diff --git a/sound/surgery/organ2.ogg b/sound/surgery/organ2.ogg
new file mode 100644
index 000000000000..9199c7d1a2db
Binary files /dev/null and b/sound/surgery/organ2.ogg differ
diff --git a/sound/surgery/retractor1.ogg b/sound/surgery/retractor1.ogg
new file mode 100644
index 000000000000..de7c31199e3c
Binary files /dev/null and b/sound/surgery/retractor1.ogg differ
diff --git a/sound/surgery/retractor2.ogg b/sound/surgery/retractor2.ogg
new file mode 100644
index 000000000000..620fafe035d8
Binary files /dev/null and b/sound/surgery/retractor2.ogg differ
diff --git a/sound/surgery/saw.ogg b/sound/surgery/saw.ogg
new file mode 100644
index 000000000000..8e7a47f0fa06
Binary files /dev/null and b/sound/surgery/saw.ogg differ
diff --git a/sound/surgery/scalpel1.ogg b/sound/surgery/scalpel1.ogg
new file mode 100644
index 000000000000..6c0fe5dad9fe
Binary files /dev/null and b/sound/surgery/scalpel1.ogg differ
diff --git a/sound/surgery/scalpel2.ogg b/sound/surgery/scalpel2.ogg
new file mode 100644
index 000000000000..497672239393
Binary files /dev/null and b/sound/surgery/scalpel2.ogg differ
diff --git a/strings/accents/accent_jive.json b/strings/accents/accent_jive.json
deleted file mode 100644
index 780ce30ae1ba..000000000000
--- a/strings/accents/accent_jive.json
+++ /dev/null
@@ -1,193 +0,0 @@
-{
- "Jive": {
- "\bDirector\b": "Directo'",
- "\bStation\b": "Stashun",
- "\bDoctor\b": "Docto'",
- "\bJanitor\b": "Janito'",
- "\bCurator\b": "Curato'",
- "\bCyborg\b": "Cybo'g",
- "\btraitor\b": "traito'",
- "\bchangeling\b": "changelin'",
- "\bOperative\b": "Opuh'ative",
- "\bClockwork\b": "Clockwo'k",
- "\bRevolution\b": "Revolushun",
- "\bShadowling\b": "Shadowlin'",
- "\bling\b": "lin'",
- "\bsling\b": "slin'",
- "\bbrothers\b": "broders",
- "\bxenomorph\b": "xenomo'ph",
- "\bMorph\b": "Mo'ph",
- "\bAbductor\b": "Abducto'",
- "\bDeath\b": "Dead",
- "\bthe\b": "de",
- "\byou\b": "ya'",
- "\bthat\b": "dat",
- "\bwas\b": "wuz",
- "\bfor\b": "fo'",
- "\bwith\b": "wid",
- "\bthey\b": "dey",
- "\bhave\b": "gotss'",
- "\bthis\b": "dis",
- "\bor\b": "o'",
- "\bword\b": "wo'd",
- "\bwhat\b": "whut",
- "\bother\b": "oder",
- "\bthere\b": "dere",
- "\bup\b": "waaay down",
- "\byour\b": "yo'",
- "\btheir\b": "deir",
- "\bwill\b": "gotss'ta",
- "\bthen\b": "den",
- "\bthem\b": "dem",
- "\bwrite\b": "scribble",
- "\blike\b": "likes",
- "\bthese\b": "dese",
- "\bthing\b": "din'",
- "\bmore\b": "mo'e",
- "\bpeople\b": "sucka's",
- "\bwater\b": "booze",
- "\bthan\b": "dan",
- "\bfirst\b": "fust",
- "\bdown\b": "waaay down",
- "\bwork\b": "wo'k",
- "\btake\b": "snatch",
- "\bgood\b": "baaaad",
- "\bname\b": "dojigger",
- "\bthrough\b": "drough",
- "\bform\b": "fo'm",
- "\bthink\b": "dink",
- "\bbefore\b": "befo'e",
- "\bdoes\b": "duz",
- "\bthree\b": "dree",
- "\bwant\b": "wants'",
- "\bwell\b": "sheeit",
- "\bsmall\b": "little-ass",
- "\bport\b": "po't",
- "\bbig\b": "big-ass",
- "\bmother\b": "moder",
- "\bworld\b": "wo'ld",
- "\bearth\b": "eard",
- "\bfather\b": "fader",
- "\bhead\b": "'haid",
- "\bschool\b": "farm",
- "\bfour\b": "foe",
- "\bthought\b": "dought",
- "\bstory\b": "sto'y",
- "\bdon't\b": "duzn't",
- "\bnorth\b": "no'd",
- "\btogether\b": "togeder",
- "\bwhite\b": "honky",
- "\bgot\b": "gots",
- "\bpaper\b": "papuh'",
- "\bmusic\b": "beat",
- "\bthose\b": "dose",
- "\bboth\b": "bod",
- "\bbook\b": "scribblin'",
- "\bfriend\b": "homey",
- "\bhorse\b": "ho'se",
- "\bsure\b": "sho' nuff",
- "\bcolor\b": "colo'",
- "\bgirl\b": "goat",
- "\byoung\b": "yung",
- "\bthough\b": "dough",
- "\btalk\b": "rap",
- "\bmeasure\b": "measho' nuff",
- "\bdoor\b": "doo'",
- "\bshort\b": "sho't",
- "\bquestion\b": "quesshun",
- "\border\b": "o'der",
- "\bsouth\b": "soud",
- "\bknew\b": "knowed",
- "\bking\b": "kin'",
- "\bduring\b": "durin'",
- "\bsing\b": "sin'",
- "\bmorning\b": "mo'nin'",
- "\bperson\b": "sucka'",
- "\bmoney\b": "bre'd",
- "\bcorrect\b": "co'rect",
- "\bdrive\b": "roll",
- "\bnothing\b": "nodin'",
- "\bforce\b": "fo'ce",
- "\brecord\b": "reco'd",
- "\bthousand\b": "dousand",
- "\bbring\b": "brin'",
- "\bposition\b": "posishun",
- "\bperhaps\b": "puh'haps",
- "\blength\b": "lengd",
- "\bbrother\b": "broder",
- "\bfraction\b": "fracshun",
- "\bforest\b": "fo'est",
- "\bstore\b": "sto'e",
- "\bboard\b": "bo'd",
- "\bweather\b": "weader",
- "\bmonth\b": "mond",
- "\bclothe\b": "clode",
- "\bmetal\b": "meta-fuckin'l",
- "\bwhether\b": "wheder",
- "\bthird\b": "dird",
- "\bhair\b": "fro",
- "\bfloor\b": "floo'",
- "\beither\b": "eider",
- "\btemperature\b": "tempuh'ature",
- "\bfinger\b": "fin'er",
- "\bbeat\b": "whup'",
- "\bspring\b": "sprin'",
- "\bnation\b": "nashun",
- "\bdictionary\b": "dicshunary",
- "\bmethod\b": "medod",
- "\borgan\b": "o'gan",
- "\bsection\b": "secshun",
- "\bpoor\b": "poo'",
- "\bexperiment\b": "'spuh'iment",
- "\bsingle\b": "sin'le",
- "\bmouth\b": "moud",
- "\bbreak\b": "boogie",
- "\bbad\b": "bad-ass",
- "\bwoman\b": "honky chick",
- "\bdoctor\b": "docto'",
- "\bring\b": "rin'",
- "\bperiod\b": "puh'iod",
- "\bhistory\b": "histo'y",
- "\bexpect\b": "'spect",
- "\bcorner\b": "co'ner",
- "\bthus\b": "dus",
- "\bchair\b": "cfro",
- "\bthick\b": "dick",
- "\boperate\b": "opuh'ate",
- "\bwing\b": "win'",
- "\bneighbor\b": "neighbo'",
- "\bwash\b": "wuzh",
- "\brather\b": "rader",
- "\bcorn\b": "co'n",
- "\bstring\b": "strin'",
- "\bthin\b": "din",
- "\bmajor\b": "majo'",
- "\bsend\b": "t'row",
- "\bdead\b": "wuzted",
- "\bwife\b": "mama",
- "\bborn\b": "bo'n",
- "\bgather\b": "gader",
- "\bthrow\b": "drow",
- "\bproperty\b": "propuh'ty",
- "\bdeath\b": "wuzted",
- "\bwomen\b": "honky chicks",
- "\bsolution\b": "solushun",
- "\bthank\b": "dank",
- "\bforward\b": "fo'ward",
- "\bexperience\b": "'spuh'ience",
- "\bscore\b": "sco'e",
- "\bevening\b": "evenin'",
- "\bcondition\b": "condishun",
- "\bnor\b": "no'",
- "\bshore\b": "sho'e",
- "\bfavor\b": "favo'",
- "\bchord\b": "cho'd",
- "\boriginal\b": "o'iginal",
- "\bstation\b": "stashun",
- "\bproper\b": "propuh'",
- "\bsupport\b": "suppo't",
- "\bmotion\b": "moshun",
- "\bpath\b": "pad",
- "\bteeth\b": "teed"
- }
-}
\ No newline at end of file
diff --git a/strings/accents/accents.json b/strings/accents/accents.json
index 779a7f584081..7d4cdfdbb0ed 100644
--- a/strings/accents/accents.json
+++ b/strings/accents/accents.json
@@ -7,7 +7,6 @@
"Heavy French": "accent_french.json",
"Kraut": "accent_kraut.json",
"German": "accent_germanlight.json",
- "Jive": "accent_jive.json",
"Old English": "accent_oldenglish.json",
"Ork": "accent_ork.json",
"Pirate": "accent_pirate.json",
@@ -21,4 +20,4 @@
"Valley": "accent_valspeak.json",
"Skaven": "accent_skaven.json"
}
-}
\ No newline at end of file
+}
diff --git a/tgui/packages/tgui/interfaces/ChemDispenser.js b/tgui/packages/tgui/interfaces/ChemDispenser.js
index f266691fc192..faac2ed337d8 100644
--- a/tgui/packages/tgui/interfaces/ChemDispenser.js
+++ b/tgui/packages/tgui/interfaces/ChemDispenser.js
@@ -70,6 +70,8 @@ export const ChemDispenser = (props, context) => {
width="129.5px"
lineHeight={1.75}
content={chemical.title}
+ disabled={chemical.locked}
+ tooltip={chemical.locked ? "Requires T" + chemical.tier + " manipulator!" : ""}
onClick={() => act('dispense', {
reagent: chemical.id,
})} />
@@ -101,14 +103,14 @@ export const ChemDispenser = (props, context) => {
{recording
&& 'Virtual beaker'
|| data.isBeakerLoaded
- && (
-
-
- /{data.beakerMaxVolume} units
-
- )
+ && (
+
+
+ /{data.beakerMaxVolume} units
+
+ )
|| 'No beaker'}
LIGHT_DAM_THRESHOLD)
C.remove_movespeed_modifier(id)
else
- C.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING))
+ C.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
/datum/species/shadow/ling/lesser //Empowered thralls. Obvious, but powerful
diff --git a/yogstation/code/game/gamemodes/vampire/vampire_other.dm b/yogstation/code/game/gamemodes/vampire/vampire_other.dm
index 88783818d3c8..65549012fb63 100644
--- a/yogstation/code/game/gamemodes/vampire/vampire_other.dm
+++ b/yogstation/code/game/gamemodes/vampire/vampire_other.dm
@@ -7,7 +7,7 @@
/obj/item/clothing/suit/draculacoat
name = "Vampire Coat"
desc = "What is a man? A miserable little pile of secrets."
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "draculacoat"
item_state = "draculacoat"
diff --git a/yogstation/code/game/objects/effects/landmarks.dm b/yogstation/code/game/objects/effects/landmarks.dm
index c2ce36c60110..4a40f32984d2 100644
--- a/yogstation/code/game/objects/effects/landmarks.dm
+++ b/yogstation/code/game/objects/effects/landmarks.dm
@@ -166,9 +166,28 @@ GLOBAL_LIST_EMPTY(chosen_station_templates)
template_names = list("Maint aquarium", "Maint bigconstruction", "Maint bigtheatre", "Maint deltalibrary", "Maint graffitiroom", "Maint junction", "Maint podrepairbay", "Maint pubbybar", "Maint roosterdome", "Maint sanitarium", "Maint snakefighter", "Maint vault", "Maint ward", "Maint assaultpod", "Maint maze", "Maint maze2", "Maint boxfactory",
"Maint sixsectorsdown", "Maint advbotany", "Maint beach", "Maint botany_apiary", "Maint gamercave", "Maint ladytesla_altar", "Maint olddiner", "Maint smallmagician", "Maint fourshops")
-/obj/effect/landmark/stationroom/gax/ai_whale
- unique = TRUE
- template_names = list("AI Whale",EMPTY_SPAWN,EMPTY_SPAWN,EMPTY_SPAWN)
+/// Type of landmark that find all others of the same type, and only spawns count number of ruins at them
+/obj/effect/landmark/stationroom/limited_spawn
+ var/choose_result = ""
+ var/count = 1
+
+/obj/effect/landmark/stationroom/limited_spawn/choose()
+ if(choose_result != "")
+ return choose_result
+ var/list/landmarks = list()
+ for(var/obj/effect/landmark/stationroom/limited_spawn/L in GLOB.stationroom_landmarks)
+ if(L.type == src.type)
+ landmarks |= L
+
+ for(var/i = 0, i < count, i++)
+ var/obj/effect/landmark/stationroom/limited_spawn/L = pick_n_take(landmarks)
+ L.choose_result = pick(L.template_names)
+
+ for(var/obj/effect/landmark/stationroom/limited_spawn/L in landmarks)
+ L.choose_result = EMPTY_SPAWN
+
+/obj/effect/landmark/stationroom/limited_spawn/gax/ai_whale
+ template_names = list("AI Whale")
/obj/effect/landmark/start/infiltrator
name = "infiltrator"
diff --git a/yogstation/code/game/objects/items/fishing/fish.dm b/yogstation/code/game/objects/items/fishing/fish.dm
index 7b80d56ae097..a0ef55f35c84 100644
--- a/yogstation/code/game/objects/items/fishing/fish.dm
+++ b/yogstation/code/game/objects/items/fishing/fish.dm
@@ -1,6 +1,6 @@
/obj/item/reagent_containers/food/snacks/fish
- name = "development fish"
- desc = "if you see this, get help"
+ name = "debug fish"
+ desc = "If you see this, get help!"
icon = 'yogstation/icons/obj/fishing/fishing.dmi'
icon_state = "bass"
@@ -23,17 +23,17 @@
var/mutable_appearance/showoff_overlay
/obj/item/reagent_containers/food/snacks/fish/Initialize(mapload)
- . = ..()
length = rand(min_length,max_length)
weight = rand(min_weight,max_weight)
list_reagents = list(/datum/reagent/consumable/nutriment = (3 * slices_num), /datum/reagent/consumable/nutriment/vitamin = (2 * slices_num))
+ . = ..()
/obj/item/reagent_containers/food/snacks/fish/proc/GetChumValue()
return //not used yet
/obj/item/reagent_containers/food/snacks/fish/examine(mob/user)
. = ..()
- . += "It's [length] inches and [weight] ounces!"
+ . += "It's [length] inch[length > 1 ? "es" : ""] and [weight] ounce[weight > 1 ? "s" : ""]!"
/obj/item/reagent_containers/food/snacks/fish/attack_self(mob/M)
if(showoff_overlay)
@@ -44,8 +44,8 @@
showoff_overlay = mutable_appearance(icon,icon_state)
M.add_overlay(showoff_overlay)
showoffer = M
- M.visible_message("[M] shows off [src]. It's [length] inches long and weighs [weight] ounces!", \
- span_notice("You show off [src]. It's [length] inches long and weighs [weight] ounces!"))
+ M.visible_message("[M] shows off [src]. It's [length] inch[length > 1 ? "es" : ""] long and weighs [weight] ounce[weight > 1 ? "s" : ""]!", \
+ span_notice("You show off [src]. It's [length] inch[length > 1 ? "es" : ""] long and weighs [weight] ounce[weight > 1 ? "s" : ""]!"))
RegisterSignal(M,COMSIG_ATOM_DIR_CHANGE,.proc/stop_overlay,TRUE)
/obj/item/reagent_containers/food/snacks/fish/proc/stop_overlay()
@@ -57,7 +57,7 @@
/obj/item/reagent_containers/food/snacks/fish/goldfish
name = "galactic goldfish"
- desc = "it's so... small!"
+ desc = "It's so... small!"
icon_state = "fish_goldfish"
min_length = 1
max_length = 2
@@ -67,7 +67,7 @@
/obj/item/reagent_containers/food/snacks/fish/goldfish/giant
name = "giant galactic goldfish"
- desc = "it's so... big!"
+ desc = "It's so... big!"
icon_state = "fish_goldfish_big"
min_length = 6
max_length = 19
@@ -77,7 +77,7 @@
/obj/item/reagent_containers/food/snacks/fish/salmon
name = "space salmon"
- desc = "i thought they were supposed to be red"
+ desc = "I thought they were supposed to be red..."
icon_state = "fish_salmon"
min_length = 28
max_length = 32
@@ -87,7 +87,7 @@
/obj/item/reagent_containers/food/snacks/fish/bass
name = "big bang bass"
- desc = "how am I supposed to play this thing?"
+ desc = "How am I supposed to play this thing?"
icon_state = "fish_bass"
min_length = 12
max_length = 32
@@ -97,7 +97,7 @@
/obj/item/reagent_containers/food/snacks/fish/tuna
name = "temporal tuna"
- desc = "you can tune a piano but you can't tuna fish"
+ desc = "You can tune a piano but you can't tuna fish!"
icon_state = "fish_tuna"
min_length = 15
max_length = 79
@@ -107,7 +107,7 @@
/obj/item/reagent_containers/food/snacks/fish/shrimp
name = "space shrimp"
- desc = "he looks a little shrimpy"
+ desc = "He looks a little shrimpy."
icon_state = "fish_shrimp"
min_length = 1
max_length = 6
@@ -117,7 +117,7 @@
/obj/item/reagent_containers/food/snacks/fish/squid
name = "space squid"
- desc = "like the game?"
+ desc = "Like the game?"
icon_state = "fish_squid"
min_length = 18
max_length = 24
@@ -127,7 +127,7 @@
/obj/item/reagent_containers/food/snacks/fish/puffer
name = "plasma pufferfish"
- desc = "it doesn't look like it's made of plasma..."
+ desc = "It doesn't look like it's made of plasma..."
icon_state = "fish_puffer"
min_length = 1
max_length = 1.4
diff --git a/yogstation/code/game/objects/items/fishing/rods.dm b/yogstation/code/game/objects/items/fishing/rods.dm
index 953479b95eab..73783df8aee9 100644
--- a/yogstation/code/game/objects/items/fishing/rods.dm
+++ b/yogstation/code/game/objects/items/fishing/rods.dm
@@ -3,13 +3,13 @@
desc = "A rod used for fishing. Despite ordinary appearances, fishing has evolved to suit the cosmos with various features, like auto-reeling."
icon = 'yogstation/icons/obj/fishing/fishing.dmi'
icon_state = "fishing_rod"
- lefthand_file = 'icons/mob/inhands/equipment/fishing_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
+ lefthand_file = 'yogstation/icons/mob/inhands/equipment/fishing_lefthand.dmi'
+ righthand_file = 'yogstation/icons/mob/inhands/equipment/fishing_righthand.dmi'
usesound = 'sound/items/crowbar.ogg'
slot_flags = ITEM_SLOT_BACK
force = 2
throwforce = 5
- w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_BULKY
materials = list(/datum/material/iron=50)
var/fishing_power = 10
@@ -78,7 +78,11 @@
/obj/item/twohanded/fishingrod/proc/reel_in(var/forced = FALSE)
if(!forced && bite) // we got something!!!
playsound(fishing_component, 'sound/effects/water_emerge.ogg', 50, FALSE, -5)
- spawn_reward()
+ var/power = 0
+ if(iscarbon(fisher)) //sorry, non-carbons don't get to wear cool fishing outfits
+ var/mob/living/carbon/carbonfisher = fisher
+ power = carbonfisher.fishing_power
+ spawn_reward(fishing_power + power)
if(bait && prob(max(50 - bait.fishing_power,0))) //50 - bait.fishing_power% chance to lose your bait
to_chat(fisher, span_notice("Your [bait] is lost!"))
cut_overlays()
@@ -112,15 +116,18 @@
I.alpha = 0
animate(I, pixel_z = 32, alpha = 255, time = 2, easing = ELASTIC_EASING)
-/obj/item/twohanded/fishingrod/proc/spawn_reward()
- var/obj/picked_reward = fishing_component.getCommonLoot()
+/obj/item/twohanded/fishingrod/proc/spawn_reward(var/fishing_power = 0)
+ var/picked_reward = fishing_component.get_reward(fishing_power)
+ if(!picked_reward || picked_reward == FISHING_LOOT_NOTHING) //nothing or something messed up
+ fisher.visible_message(span_notice("[fisher] reels in ... nothing!"), span_notice("You reel in... nothing! Better luck next time!"))
+ return
var/obj/reward_item = new picked_reward(fishing_component.parent)
reward_item.alpha = 0
reward_item.pixel_y = -12
animate(reward_item,time = 0.25 SECONDS,pixel_y = 0,alpha = 255,easing = SINE_EASING)
if(!fisher) //uh oh
return
- fisher.visible_message(span_notice("[fisher] reels in a [reward_item]!"), span_notice("You reel in a [reward_item]!"))
+ fisher.visible_message(span_notice("[fisher] reels in [reward_item]!"), span_notice("You reel in [reward_item]!"))
if(fisher.Adjacent(fishing_component.parent))
unwield(fisher,show_message = FALSE)
if(fisher.put_in_hands(reward_item))
@@ -147,6 +154,7 @@
if(bait)
user.put_in_hands(bait)
to_chat(user, span_notice("You take the [bait] off the fishing rod."))
+ cut_overlays()
bait = null
recalculate_power()
@@ -154,3 +162,52 @@
fishing_power = initial(fishing_power)
if(bait)
fishing_power += bait.fishing_power
+
+/obj/item/twohanded/fishingrod/collapsable
+ name = "collapsable fishing rod"
+ icon_state = "fishing_rod_collapse_c"
+ desc = "A collapsable fishing rod! This one can fit into your backpack for space hikes and the like."
+ var/opened = FALSE
+ fishing_power = 15
+
+/obj/item/twohanded/fishingrod/collapsable/attackby(obj/item/B, mob/user, params)
+ if(!istype(B,/obj/item/reagent_containers/food/snacks/bait))
+ return
+ if(!opened)
+ to_chat(user,"You can't put bait on a collapsed rod!")
+ return
+ ..()
+
+/obj/item/twohanded/fishingrod/collapsable/AltClick(mob/living/user)
+ if(bait)
+ return ..()
+ toggle(user)
+
+/obj/item/twohanded/fishingrod/collapsable/proc/toggle(mob/user)
+ if(wielded)
+ to_chat(user,"You can't collapse the rod if you are holding it with both hands")
+ return
+ if(fishing)
+ to_chat(user,"You can't collapse the fishing rod if you are currently using it!")
+ return
+ if(!user.is_holding(src)) //no uncollapsing in your backpack or pockets
+ return
+ opened = !opened
+ w_class = opened ? WEIGHT_CLASS_BULKY : WEIGHT_CLASS_SMALL
+ playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
+ update_icon()
+
+/obj/item/twohanded/fishingrod/collapsable/update_icon()
+ icon_state = "fishing_rod_collapse[opened ? "" : "_c"]"
+
+/obj/item/twohanded/fishingrod/collapsable/attack_self(mob/user)
+ if(!opened)
+ toggle(user)
+ return
+ ..()
+
+/obj/item/twohanded/fishingrod/collapsable/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ if(!opened)
+ to_chat(user,"The collapsable rod has to be open before you can do anything!")
+ return
+ ..()
diff --git a/yogstation/code/game/objects/items/melee/energy.dm b/yogstation/code/game/objects/items/melee/energy.dm
index 82ccb8476dc1..43adcdf8c2bb 100644
--- a/yogstation/code/game/objects/items/melee/energy.dm
+++ b/yogstation/code/game/objects/items/melee/energy.dm
@@ -3,7 +3,7 @@
var/color = input(user, "Select a color!", "Esword color") as null|anything in list("red", "green", "blue", "purple", "rainbow")
if(!color)
return
- item_color = color
+ saber_color = color
if(active)
icon_state = "sword[color]"
@@ -21,4 +21,4 @@
return ..()
return ..()
else
- return 0
\ No newline at end of file
+ return 0
diff --git a/yogstation/code/game/objects/items/storage/backpack.dm b/yogstation/code/game/objects/items/storage/backpack.dm
index a0d47ba00df4..f14d5d7b417f 100644
--- a/yogstation/code/game/objects/items/storage/backpack.dm
+++ b/yogstation/code/game/objects/items/storage/backpack.dm
@@ -8,8 +8,8 @@
/obj/item/storage/backpack/holding/build_worn_icon(var/state = "", var/default_layer = 0, var/default_icon_file = null, var/isinhands = FALSE, var/femaleuniform = NO_FEMALE_UNIFORM)
state = item_state
- if(default_icon_file == 'icons/mob/head.dmi')
- default_icon_file = 'yogstation/icons/mob/head.dmi' // thats a fun dilemma.... how to keep the tg sprites when doing back but do yogs sprites when worn on head.
+ if(default_icon_file == 'icons/mob/clothing/head/head.dmi')
+ default_icon_file = 'yogstation/icons/mob/clothing/head/head.dmi' // thats a fun dilemma.... how to keep the tg sprites when doing back but do yogs sprites when worn on head.
return ..()
/obj/item/storage/backpack/holding/attackby(obj/item/W, mob/living/user)
@@ -183,7 +183,7 @@
name = "snail shell"
desc = "You wonder who this came from."
icon = 'yogstation/icons/obj/storage.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/back.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/back.dmi'
item_state = "snail_green"
icon_state = "snail_green"
slowdown = 1
@@ -199,7 +199,7 @@
name = "green shell backpack"
desc = "An emerald-green snail shell converted into a backpack. Still smells of salt."
icon = 'yogstation/icons/obj/storage.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/back.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/back.dmi'
item_state = "snail_green"
icon_state = "snail_green"
@@ -207,7 +207,7 @@
name = "banana backpack"
desc = "Is it a backpack made of bananas or a backpack with a banana texture? The world may never know."
icon = 'yogstation/icons/obj/storage.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/back.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/back.dmi'
icon_state = "bananabackpack"
item_state = "bananabackpack"
@@ -215,7 +215,7 @@
name = "clown face backpack"
desc = "Sometimes there are some things better left off not existing, this is one of them."
icon = 'yogstation/icons/obj/storage.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/back.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/back.dmi'
icon_state = "clownfacebackpack"
item_state = "clownfacebackpack"
diff --git a/yogstation/code/game/objects/items/tools.dm b/yogstation/code/game/objects/items/tools.dm
index 5e803159f957..3c02f7f7d4cb 100644
--- a/yogstation/code/game/objects/items/tools.dm
+++ b/yogstation/code/game/objects/items/tools.dm
@@ -99,6 +99,7 @@
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.7
tool_behaviour = TOOL_SCREWDRIVER
+ sharpness = SHARP_POINTY
/obj/item/handdrill/attack_self(mob/user)
if (tool_behaviour == TOOL_SCREWDRIVER)
@@ -114,6 +115,7 @@
desc = "A simple powered hand drill. It's fitted with a bolt bit."
icon_state = "drill_bolt"
tool_behaviour = TOOL_WRENCH
+ sharpness = SHARP_NONE
playsound(get_turf(user),'sound/items/change_drill.ogg',50,1)
if (iscyborg(user))
to_chat(user,span_notice("Your servos whirr as the drill reconfigures into bolt mode."))
@@ -125,6 +127,7 @@
desc = "A simple powered hand drill. It's fitted with a screw bit."
icon_state = "drill_screw"
tool_behaviour = TOOL_SCREWDRIVER
+ sharpness = SHARP_POINTY
playsound(get_turf(user),'sound/items/change_drill.ogg',50,1)
if (iscyborg(user))
to_chat(user,span_notice("Your servos whirr as the drill reconfigures into screw mode."))
diff --git a/yogstation/code/game/objects/structures/bedsheet_bin.dm b/yogstation/code/game/objects/structures/bedsheet_bin.dm
index 7020a40681fd..8a9b585345d5 100644
--- a/yogstation/code/game/objects/structures/bedsheet_bin.dm
+++ b/yogstation/code/game/objects/structures/bedsheet_bin.dm
@@ -9,9 +9,8 @@ LINEN BINS
//The description is a reference to the Medical Blanket's description.
desc = "It's a very unsterile blanket used in Virology, covered in pathogens of all sorts. You probably shouldn't wear this one."
icon = 'yogstation/icons/obj/bedsheets.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/neck.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/neck/neck.dmi'
icon_state = "sheetvirology"
- item_color = "virologywhite"
dream_messages = list("plague", "green", "sneezing", "a virologist")
newbedpath = null
@@ -19,7 +18,6 @@ LINEN BINS
name = "prisoner's blanket"
desc = "An old, heavy-duty, Nanotrasen-issue prison bedsheet. You try not to think about where those stains came from..."
icon = 'yogstation/icons/obj/bedsheets.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/neck.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/neck/neck.dmi'
icon_state = "sheetprisoner"
- item_color = "prisoner"
- dream_messages = list("a prison cell", "orange", "a warden", "filth", "captivity", "shackles", "misconduct", "depravity")
\ No newline at end of file
+ dream_messages = list("a prison cell", "orange", "a warden", "filth", "captivity", "shackles", "misconduct", "depravity")
diff --git a/yogstation/code/modules/admin/sql_message_system.dm b/yogstation/code/modules/admin/sql_message_system.dm
index 5a18efd89812..95deb5944e76 100644
--- a/yogstation/code/modules/admin/sql_message_system.dm
+++ b/yogstation/code/modules/admin/sql_message_system.dm
@@ -274,7 +274,7 @@
return
var/list/output = list()
var/ruler = "
"
- var/list/navbar = list("\[All\]|\[#\]")
+ var/list/navbar = list("\[#\]")
for(var/letter in GLOB.alphabet)
navbar += "|\[[letter]\]"
navbar += "|\[Memos\]|\[Watchlist\]"
diff --git a/yogstation/code/modules/antagonists/infiltrator/items/hardsuit.dm b/yogstation/code/modules/antagonists/infiltrator/items/hardsuit.dm
index 92a611bfbe09..a5c0a8780c40 100644
--- a/yogstation/code/modules/antagonists/infiltrator/items/hardsuit.dm
+++ b/yogstation/code/modules/antagonists/infiltrator/items/hardsuit.dm
@@ -2,7 +2,6 @@
name = "engineering hardsuit helmet"
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
- item_color = "engineering"
armor = list(MELEE = 35, BULLET = 15, LASER = 30,ENERGY = 10, BOMB = 10, BIO = 100, RAD = 50, FIRE = 75, ACID = 75)
syndicate = TRUE
diff --git a/yogstation/code/modules/antagonists/infiltrator/team.dm b/yogstation/code/modules/antagonists/infiltrator/team.dm
index 3a7ac9fb1179..4365ee64e1a3 100644
--- a/yogstation/code/modules/antagonists/infiltrator/team.dm
+++ b/yogstation/code/modules/antagonists/infiltrator/team.dm
@@ -52,11 +52,11 @@
if (INFILTRATION_SOMECOMPLETE)
var/static/list/messages = list(
"Better than a complete fluke, I guess.",
- "Nowhere near the smoothest operation I've ever seen, but it was okay.",
- "We did it, but we didn't get everything. We'll get it next time."
+ "I'm going to have to pull some strings to make sure we don't get a pay cut for sub-par preformance.",
+ "I suppose it wasn't a complete waste of time at least..."
)
- parts += span_marooned(span_big("Infiltrator Minor Victory"))
- parts += span_bold("The Syndicate infiltrators completed some of their objectives successfully!")
+ parts += span_marooned(span_big("Neutral victory"))
+ parts += span_bold("The Syndicate infiltrators completed some of their objectives, but not enough to win.")
flavor_message = pick(messages)
else
var/static/list/messages = list(
@@ -151,11 +151,11 @@
else
objectives_failed++
- if(objectives_failed == 0 && objectives_complete > 0)
+ if(objectives_failed == 0 && objectives_complete > 0) //Complete all, and fail none, big win!
return INFILTRATION_ALLCOMPLETE
- else if (objectives_complete > objectives_failed)
+ else if (objectives_failed == 1 && objectives_complete > 0) // Fail one, but complete the rest, still pretty good!
return INFILTRATION_MOSTCOMPLETE
- else if((objectives_complete == objectives_failed) || (objectives_complete > 0 && objectives_failed > objectives_complete))
+ else if((objectives_complete == objectives_failed) || (objectives_complete > 0 && objectives_failed > objectives_complete)) //Fail almost all of them, not very good...
return INFILTRATION_SOMECOMPLETE
else
- return INFILTRATION_NONECOMPLETE
+ return INFILTRATION_NONECOMPLETE //You completely failed, you suck.
diff --git a/yogstation/code/modules/antagonists/shadowling/shadowling_items.dm b/yogstation/code/modules/antagonists/shadowling/shadowling_items.dm
index 96538f5b745a..5e0ac3598af2 100644
--- a/yogstation/code/modules/antagonists/shadowling/shadowling_items.dm
+++ b/yogstation/code/modules/antagonists/shadowling/shadowling_items.dm
@@ -1,7 +1,7 @@
/obj/item/clothing/suit/space/shadowling
name = "chitin shell"
desc = "A dark, semi-transparent shell. Protects against vacuum, but not against the light of the stars." //Still takes damage from spacewalking but is immune to space itself
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "sl_shell"
item_state = "sl_shell"
@@ -24,7 +24,7 @@
/obj/item/clothing/head/shadowling
name = "chitin helm"
desc = "A helmet-like enclosure of the head."
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
icon_state = "sl_head"
item_state = "sl_head"
diff --git a/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm b/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
index 084a144b1abd..9d9093166253 100644
--- a/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
+++ b/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
@@ -97,6 +97,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(H), SLOT_WEAR_SUIT)
H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(H), SLOT_HEAD)
H.set_species(/datum/species/shadow/ling) //can't be a shadowling without being a shadowling
+ H.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA), TRUE)
H.mind.RemoveSpell(src)
if(!do_mob(H,H,10,1))
return
diff --git a/yogstation/code/modules/clothing/clothing.dm b/yogstation/code/modules/clothing/clothing.dm
index f0743536ebca..c8a3cc879d86 100644
--- a/yogstation/code/modules/clothing/clothing.dm
+++ b/yogstation/code/modules/clothing/clothing.dm
@@ -1,48 +1,48 @@
/obj/item/clothing/ears/yogs
- alternate_worn_icon = 'yogstation/icons/mob/ears.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/ears/ears.dmi'
icon = 'yogstation/icons/obj/clothing/ears.dmi'
/obj/item/clothing/glasses/yogs
- alternate_worn_icon = 'yogstation/icons/mob/eyes.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/eyes/eyes.dmi'
icon = 'yogstation/icons/obj/clothing/glasses.dmi'
/obj/item/clothing/gloves/yogs
- alternate_worn_icon = 'yogstation/icons/mob/hands.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/hands/hands.dmi'
icon = 'yogstation/icons/obj/clothing/gloves.dmi'
/obj/item/clothing/head/yogs
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
/obj/item/clothing/neck/yogs
- alternate_worn_icon = 'yogstation/icons/mob/neck.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/neck/neck.dmi'
icon = 'yogstation/icons/obj/clothing/neck.dmi'
/obj/item/clothing/mask/yogs
- alternate_worn_icon = 'yogstation/icons/mob/mask.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/mask/mask.dmi'
icon = 'yogstation/icons/obj/clothing/masks.dmi'
/obj/item
var/list/alternate_screams = list()
/obj/item/clothing/shoes/yogs
- alternate_worn_icon = 'yogstation/icons/mob/feet.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/feet/feet.dmi'
icon = 'yogstation/icons/obj/clothing/shoes.dmi'
/obj/item/clothing/suit/yogs
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
/obj/item/clothing/under/yogs
- alternate_worn_icon = 'yogstation/icons/mob/uniform.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/uniform/uniform.dmi'
icon = 'yogstation/icons/obj/clothing/uniforms.dmi'
/obj/item/clothing/back/yogs
- alternate_worn_icon = 'yogstation/icons/mob/back.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/back.dmi'
icon = 'yogstation/icons/obj/clothing/back.dmi'
/obj/item/storage/belt/yogs
- alternate_worn_icon = 'yogstation/icons/mob/belt.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/belt.dmi'
icon = 'yogstation/icons/obj/clothing/belts.dmi'
/obj/item/clothing/torncloth
diff --git a/yogstation/code/modules/clothing/fishing.dm b/yogstation/code/modules/clothing/fishing.dm
index 6f67c4ce613a..c695fc89130e 100644
--- a/yogstation/code/modules/clothing/fishing.dm
+++ b/yogstation/code/modules/clothing/fishing.dm
@@ -3,10 +3,10 @@
desc = "She said she's down to fish!"
icon_state = "fishing_cap"
item_state = "fishing_cap"
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
-/obj/item/clothing/head/fishingcap/Initialize()
+/obj/item/clothing/head/fishing/Initialize()
. = ..()
AddComponent(/datum/component/fishingbonus,5)
@@ -15,7 +15,7 @@
desc = "As she banging my line, she wastin my time."
icon_state = "fishing_vest"
item_state = "fishing_vest"
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
/obj/item/clothing/suit/fishing/Initialize()
@@ -27,7 +27,7 @@
desc = "Packin my tackle box down by the brook."
icon_state = "fishing_gloves"
item_state = "fishing_gloves"
- alternate_worn_icon = 'yogstation/icons/mob/hands.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/hands/hands.dmi'
icon = 'yogstation/icons/obj/clothing/gloves.dmi'
/obj/item/clothing/gloves/fishing/Initialize()
@@ -39,7 +39,7 @@
desc = "We livin' the life, if we ain't going fishing then don't waste my time."
icon_state = "fishing_sandals"
item_state = "fishing_sandals"
- alternate_worn_icon = 'yogstation/icons/mob/feet.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/feet/feet.dmi'
icon = 'yogstation/icons/obj/clothing/shoes.dmi'
/obj/item/clothing/shoes/fishing/Initialize()
diff --git a/yogstation/code/modules/clothing/head.dm b/yogstation/code/modules/clothing/head.dm
index beb535d073f6..a640060b48e8 100644
--- a/yogstation/code/modules/clothing/head.dm
+++ b/yogstation/code/modules/clothing/head.dm
@@ -44,7 +44,7 @@
name = "nam helmet"
desc = "An ancient war helmet that is perfect for protecting your noggin from greytide clobberin'!"
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "namhelm"
item_state = "namhelm"
@@ -118,7 +118,7 @@
name = "war helmet"
desc = "Get ready boys, we are going to war!"
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "kr_helm"
item_state = "kr_helm"
@@ -144,7 +144,7 @@
name = "corporate warden beret"
desc = "A special black beret with a warden's insignia in the middle. This one is commonly worn by wardens of the corporation."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "beret_corporate_warden"
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 30, acid = 60)
strip_delay = 60
@@ -153,7 +153,7 @@
name = "corporate security beret"
desc = "A special black beret for the mundane life of a corporate security officer."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "beret_corporate_officer"
armor = list(melee = 40, bullet = 30, laser = 30,energy = 10, bomb = 25, bio = 0, rad = 0, fire = 20, acid = 50)
strip_delay = 60
@@ -162,7 +162,7 @@
name = "engineering beret"
desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "beret_engineering"
armor = list(rad = 10, fire = 10)
strip_delay = 60
@@ -171,7 +171,7 @@
name = "atmospherics beret"
desc = "A beret for those who have shown immaculate proficiency in piping. Or plumbing."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "beret_atmospherics"
armor = list(rad = 10, fire = 10)
strip_delay = 60
@@ -180,7 +180,7 @@
name = "chief engineer beret"
desc = "A white beret with the engineering insignia emblazoned on it. Its owner knows what they're doing. Probably."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "beret_ce"
armor = list(rad = 20, fire = 30)
strip_delay = 60
@@ -189,7 +189,7 @@
name = "science beret"
desc = "A purple beret with the science insignia emblazoned on it. It has that authentic burning plasma smell."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "beret_sci"
armor = list(bomb = 5, bio = 5, fire = 5, acid = 10)
strip_delay = 60
@@ -198,7 +198,7 @@
name = "medical beret"
desc = "A white beret with a blue cross finely threaded into it. It has that sterile smell about it."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "beret_med"
armor = list(bio = 20)
strip_delay = 60
@@ -207,7 +207,7 @@
name = "chief medical officer beret"
desc = "A baby blue beret with the insignia of Medistan. It smells very sterile."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "beret_cmo"
armor = list(bio = 30, acid = 20)
strip_delay = 60
@@ -216,7 +216,7 @@
name = "captain beret"
desc = "A lovely blue Captain beret with a gold and white insignia."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "beret_captain"
armor = list(melee = 50, bullet = 30, laser = 20, energy = 10, bomb = 15, bio = 10, rad = 10, fire = 10, acid = 60)
strip_delay = 90
@@ -227,7 +227,7 @@
lefthand_file = 'yogstation/icons/mob/inhands/lefthand.dmi'
righthand_file = 'yogstation/icons/mob/inhands/righthand.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "demonwelding"
item_state = "demonwelding"
@@ -237,7 +237,7 @@
lefthand_file = 'yogstation/icons/mob/inhands/lefthand.dmi'
righthand_file = 'yogstation/icons/mob/inhands/righthand.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "knightwelding"
item_state = "welding"
@@ -247,7 +247,7 @@
lefthand_file = 'yogstation/icons/mob/inhands/lefthand.dmi'
righthand_file = 'yogstation/icons/mob/inhands/righthand.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "fancywelding"
item_state = "fancywelding"
@@ -257,7 +257,7 @@
lefthand_file = 'yogstation/icons/mob/inhands/lefthand.dmi'
righthand_file = 'yogstation/icons/mob/inhands/righthand.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "engiewelding"
item_state = "engiewelding"
@@ -267,14 +267,14 @@
lefthand_file = 'yogstation/icons/mob/inhands/lefthand.dmi'
righthand_file = 'yogstation/icons/mob/inhands/righthand.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "carpwelding"
item_state = "carpwelding"
/obj/item/clothing/head/milliondollarhat
name = "millionaires hat"
desc = "On a small label at the bottom of the hat it reads.'My name is Doug Dimmadome, owner of the Dimmsdale Dimmadome and thank you for buying one of my top quality dimmahats!' On a even smaller label hidden in the small label it reads 'No refunds'."
- alternate_worn_icon = 'yogstation/icons/mob/large-worn-icons/1024x1024/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/large-worn-icons/1024x1024/head.dmi'
icon = 'yogstation/icons/obj/clothing/1024x1024/hats.dmi'
icon_state = "milliondollarhat"
item_state = "milliondollarhat"
@@ -282,4 +282,4 @@
worn_y_dimension = 1024
armor = list(melee = 20) //lets say the hat itself doesnt provide any melee protection but people are so shocked at how huge your hat is they unconsciously soften there blows as to not hurt the hat.
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- strip_delay = 120
\ No newline at end of file
+ strip_delay = 120
diff --git a/yogstation/code/modules/clothing/head/jobs.dm b/yogstation/code/modules/clothing/head/jobs.dm
index ef77471ccc55..e6b38c196b2f 100644
--- a/yogstation/code/modules/clothing/head/jobs.dm
+++ b/yogstation/code/modules/clothing/head/jobs.dm
@@ -15,9 +15,8 @@
name = "Brig Physician's cap"
desc = "It's a baseball hat with a dark brown color and a reflective cross on the top. Has BP embossed into it."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "emtsecsoft"
- item_color = "emtsec"
/obj/item/clothing/head/beret/med/phys
name = "Brig Physician's beret"
@@ -28,6 +27,6 @@
name = "corporate physician beret"
desc = "A special black beret for the mundane life of a corporate brig physician."
icon = 'yogstation/icons/obj/clothing/hats.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "beret_corporate_phys"
armor = list(BIO = 20) //So it isnt a direct upgrade over the normal berret
diff --git a/yogstation/code/modules/clothing/head/misc.dm b/yogstation/code/modules/clothing/head/misc.dm
index 4871066956ea..b031095e865d 100644
--- a/yogstation/code/modules/clothing/head/misc.dm
+++ b/yogstation/code/modules/clothing/head/misc.dm
@@ -29,7 +29,7 @@
/obj/item/clothing/head/helmet/juggernaut
name = "Juggernaut Helmet"
desc = "I...am...the...JUGGERNAUT!!!."
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
icon_state = "juggernauthelm"
item_state = "juggernauthelm"
@@ -50,7 +50,7 @@
/obj/item/clothing/head/yogs/goatpope
name = "goat pope hat"
desc = "And on the seventh day King Goat said there will be cabbage!"
- alternate_worn_icon = 'yogstation/icons/mob/large-worn-icons/64x64/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/large-worn-icons/64x64/head.dmi'
icon_state = "goatpope"
item_state = "goatpope"
worn_x_dimension = 64
diff --git a/yogstation/code/modules/clothing/mask.dm b/yogstation/code/modules/clothing/mask.dm
index 95346d6e5c1b..150007abc4fa 100644
--- a/yogstation/code/modules/clothing/mask.dm
+++ b/yogstation/code/modules/clothing/mask.dm
@@ -206,7 +206,7 @@
name = "banana mask"
desc = "Do you want a banana?"
clothing_flags = MASKINTERNALS
- alternate_worn_icon = 'yogstation/icons/mob/large-worn-icons/64x64/masks.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/large-worn-icons/64x64/masks.dmi'
icon_state = "bananamask"
item_state = "bananamask"
worn_x_dimension = 64
diff --git a/yogstation/code/modules/clothing/neck/_neck.dm b/yogstation/code/modules/clothing/neck/_neck.dm
index 5cfd27b63f2d..106374ac49dd 100644
--- a/yogstation/code/modules/clothing/neck/_neck.dm
+++ b/yogstation/code/modules/clothing/neck/_neck.dm
@@ -2,59 +2,59 @@
name = "striped white scarf"
desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks."
icon_state = "stripescarf"
- item_color = "white"
+ dye_color = DYE_WHITE
custom_price = 10
/obj/item/clothing/neck/yogs/stripedscarf/black
name = "striped black scarf"
- item_color = "black"
+ dye_color = DYE_BLACK
icon_state = "stripedscarf"
color = "#4A4A4B" //Grey but it looks black
/obj/item/clothing/neck/yogs/stripedscarf/pink
name = "striped pink scarf"
- item_color = "pink"
+ dye_color = DYE_RED
icon_state = "stripedscarf"
color = "#F699CD" //Pink
/obj/item/clothing/neck/yogs/stripedscarf/red
name = "striped red scarf"
- item_color = "red"
+ dye_color = DYE_RED
icon_state = "stripedscarf"
color = "#D91414" //Red
/obj/item/clothing/neck/yogs/stripedscarf/green
name = "striped green scarf"
- item_color = "green"
+ dye_color = DYE_GREEN
icon_state = "stripedscarf"
color = "#5C9E54" //Green
/obj/item/clothing/neck/yogs/stripedscarf/darkblue
name = "striped dark blue scarf"
- item_color = "blue"
+ dye_color = DYE_BLUE
icon_state = "stripedscarf"
color = "#1E85BC" //Blue
/obj/item/clothing/neck/yogs/stripedscarf/purple
name = "striped purple scarf"
- item_color = "purple"
+ dye_color = DYE_PURPLE
icon_state = "stripedscarf"
color = "#9557C5" //Purple
/obj/item/clothing/neck/yogs/stripedscarf/yellow
name = "striped yellow scarf"
- item_color = "yellow"
+ dye_color = DYE_YELLOW
icon_state = "stripedscarf"
color = "#E0C14F" //Yellow
/obj/item/clothing/neck/yogs/stripedscarf/orange
name = "striped orange scarf"
- item_color = "orange"
+ dye_color = DYE_ORANGE
icon_state = "stripedscarf"
color = "#C67A4B" //Orange
/obj/item/clothing/neck/yogs/stripedscarf/cyan
name = "striped cyan scarf"
- item_color = "cyan"
+ dye_color = DYE_BLUE
icon_state = "stripedscarf"
- color = "#54A3CE" //Cyan
\ No newline at end of file
+ color = "#54A3CE" //Cyan
diff --git a/yogstation/code/modules/clothing/shoe.dm b/yogstation/code/modules/clothing/shoe.dm
index 76620a4684fc..297b57fae76d 100644
--- a/yogstation/code/modules/clothing/shoe.dm
+++ b/yogstation/code/modules/clothing/shoe.dm
@@ -3,7 +3,6 @@
name = "clown shoes"
icon_state = "cluwne"
item_state = "cluwne"
- item_color = "cluwne"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
item_flags = DROPDEL
slowdown = SHOES_SLOWDOWN+1
diff --git a/yogstation/code/modules/clothing/shoes/miscellaneous.dm b/yogstation/code/modules/clothing/shoes/miscellaneous.dm
index 9122b6ae89e6..0702e7f15d0c 100644
--- a/yogstation/code/modules/clothing/shoes/miscellaneous.dm
+++ b/yogstation/code/modules/clothing/shoes/miscellaneous.dm
@@ -17,7 +17,7 @@
name = "scary clown shoes"
desc = "Clown shoes often seen being worn by sewer clowns."
icon = 'yogstation/icons/obj/clothing/shoes.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/feet.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/feet/feet.dmi'
icon_state = "scaryclownshoes"
item_state = "scaryclownshoes"
@@ -25,7 +25,7 @@
name = "bee shoes"
desc = "It's hip to wear bees."
icon = 'yogstation/icons/obj/clothing/shoes.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/feet.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/feet/feet.dmi'
icon_state = "bee_shoes"
item_state = "bee_shoes"
@@ -40,10 +40,9 @@
permeability_coefficient = 0.05 //Thick soles, and covers the ankle
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
-/obj/item/clothing/shoes/yogs/fire_crocs
+/obj/item/clothing/shoes/fire_crocs
name = "fire crocs"
desc = "You are now the coolest kid on the station."
icon = 'icons/obj/clothing/shoes.dmi'
- alternate_worn_icon = 'icons/mob/feet.dmi'
icon_state = "fire_crocs"
- item_state = "fire_crocs"
\ No newline at end of file
+ item_state = "fire_crocs"
diff --git a/yogstation/code/modules/clothing/suits/armor.dm b/yogstation/code/modules/clothing/suits/armor.dm
index fd90d69eb8f6..4300349f6900 100644
--- a/yogstation/code/modules/clothing/suits/armor.dm
+++ b/yogstation/code/modules/clothing/suits/armor.dm
@@ -12,7 +12,7 @@
/obj/item/clothing/suit/armor/vest/rycliesarmour
name = "war armour"
desc = "Good for protecting your chest during war."
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "rycliesarmour"
item_state = "rycliesarmour"
@@ -20,7 +20,7 @@
/obj/item/clothing/suit/armor/vest/namflakjacket
name = "nam flak jacket"
desc = "Good for protecting your chest from napalm and toolboxes!"
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "namflakjacket"
item_state = "namflakjacket"
@@ -28,7 +28,7 @@
/obj/item/clothing/suit/armor/vest/redcoatcoat
name = "redcoat coat"
desc = "Security is coming! Security is coming! Also padded with kevlar for protection."
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "red_coat_coat"
item_state = "red_coat_coat"
@@ -36,7 +36,7 @@
/obj/item/clothing/suit/armor/vest/secmiljacket
name = "sec military jacket"
desc = "Aviators not included. Now with extra padding!"
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "secmiljacket"
item_state = "secmiljacket"
@@ -44,7 +44,7 @@
/obj/item/clothing/suit/armor/vest/hosjacket
name = "head of security jacket"
desc = "all the style of a jacket with all the protection of a armor vest!"
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "hos_jacket"
item_state = "hos_item"
@@ -52,7 +52,7 @@
/obj/item/clothing/suit/armor/vest/wardenjacket
name = "warden's black jacket"
desc = "all the style of a jacket with all the protection of a armor vest!"
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "warden_jacket"
item_state = "warden_item"
@@ -60,7 +60,7 @@
/obj/item/clothing/suit/armor/hos/germancoat
name = "padded german coat"
desc = "for those cold german winters or for those head of securitys that want to show their true colors."
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "german_coat"
item_state = "german_item"
@@ -73,7 +73,7 @@
/obj/item/clothing/suit/armor/vest/sovietcoat
name = "soviet coat"
desc = "Glory to Arstotzka! Now with padding protection!"
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "soviet_coat"
item_state = "soviet_item"
@@ -81,7 +81,7 @@
/obj/item/clothing/suit/armor/vest/rurmcoat
name = "russian officer coat"
desc = "Papers please. Now with padding protection!"
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "ru_rmcoat"
item_state = "ru_rmcoat"
@@ -89,7 +89,7 @@
/obj/item/clothing/suit/armor/heavy/juggernaut
name = "Juggernaut Suit"
desc = "I...am...the...JUGGERNAUT!!!"
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "juggernaut"
item_state = "juggernaut"
diff --git a/yogstation/code/modules/clothing/suits/labcoat.dm b/yogstation/code/modules/clothing/suits/labcoat.dm
index 664f6b439c1a..eb75b8119367 100644
--- a/yogstation/code/modules/clothing/suits/labcoat.dm
+++ b/yogstation/code/modules/clothing/suits/labcoat.dm
@@ -9,15 +9,14 @@
/obj/item/clothing/suit/toggle/labcoat/emt/physician
name = "brig physicians jacket"
desc = "A protective jacket for medical emergencies on off-world planets. Has BP embossed into it."
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "labcoat_emtsec"
- item_color = "labcoat_emtsec"
/obj/item/clothing/suit/toggle/labcoat/physician
name = "brig physician's labcoat"
desc = "A white labcoat with red medical crosses. Has BP embossed into it."
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "labcoat_sec"
item_state = "labcoat_sec"
diff --git a/yogstation/code/modules/clothing/suits/miscellaneous.dm b/yogstation/code/modules/clothing/suits/miscellaneous.dm
index 1329a1f231e3..827ed514338a 100644
--- a/yogstation/code/modules/clothing/suits/miscellaneous.dm
+++ b/yogstation/code/modules/clothing/suits/miscellaneous.dm
@@ -1,5 +1,5 @@
/obj/item/clothing/suit/hooded/wintercoat/engineering/tcomms
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
name = "network admin's winter coat"
icon_state = "coatsignaltech"
@@ -7,7 +7,7 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/tcomms
/obj/item/clothing/head/hooded/winterhood/engineering/tcomms
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
icon_state = "winterhood_signaltech"
@@ -22,7 +22,7 @@
icon_state = "blackwhitesweat"
/obj/item/clothing/suit/hooded/wintercoat/bluecoat
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
name = "Blue winter coat"
icon_state = "coatwinterblue"
@@ -30,7 +30,7 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/bluecoat
/obj/item/clothing/head/hooded/winterhood/bluecoat
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
icon_state = "winterhood_blue"
@@ -53,7 +53,7 @@
item_state = "hamiltoncoat"
/obj/item/clothing/suit/hooded/sandsuit
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
name = "sand suit"
desc = "A suit often worn by desert nomads."
@@ -63,7 +63,7 @@
hoodtype = /obj/item/clothing/head/hooded/sandsuit
/obj/item/clothing/head/hooded/sandsuit
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
icon_state = "sandsuit"
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDEHAIR
@@ -126,7 +126,7 @@
name = "robotics steampunk labcoat"
desc = "A labcoat with a steampunk design to it for a roboticist."
icon = 'yogstation/icons/obj/clothing/suits.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon_state = "wardt_lab"
item_state = "wardt_lab"
@@ -134,7 +134,7 @@
name = "robotics fancy labcoat"
desc = "A labcoat with a few markings denoting it as a labcoat for a roboticist."
icon = 'yogstation/icons/obj/clothing/suits.dmi'
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon_state = "aeneasrinil"
item_state = "aeneasrinil"
@@ -190,7 +190,7 @@
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/box/fancy/cigarettes, /obj/item/lighter, /obj/item/radio)
/obj/item/clothing/suit/hooded/fiendcowl
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
name = "fiend cowl"
desc = "Only a really evil person would wear such a fiendish cowl!"
@@ -200,13 +200,13 @@
hoodtype = /obj/item/clothing/head/hooded/fiendhood
/obj/item/clothing/head/hooded/fiendhood
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
icon_state = "fiendhood"
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDEHAIR
/obj/item/clothing/suit/hooded/eldritchcowl
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
name = "eldritch cowl"
desc = "A tattered heretical cloak from a time long passed."
@@ -216,7 +216,7 @@
hoodtype = /obj/item/clothing/head/hooded/eldritchhood
/obj/item/clothing/head/hooded/eldritchhood
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
icon_state = "eldritchhood"
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDEHAIR|HIDEMASK
@@ -228,7 +228,7 @@
item_state = "infsuit"
/obj/item/clothing/suit/hooded/caretakercloak
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
name = "caretaker cloak"
desc = "Yeah, he will 'take care' of you alright."
@@ -238,7 +238,7 @@
hoodtype = /obj/item/clothing/head/hooded/caretakerhood
/obj/item/clothing/head/hooded/caretakerhood
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
icon_state = "caretakerhood"
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDEHAIR
@@ -306,7 +306,7 @@
/obj/item/clothing/suit/hooded/spesshoodie
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
name = "spess hoodie"
desc = "A hoodie...IN SPESS!!!"
@@ -316,7 +316,7 @@
hoodtype = /obj/item/clothing/head/hooded/spesshoodie
/obj/item/clothing/head/hooded/spesshoodie
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon = 'yogstation/icons/obj/clothing/hats.dmi'
icon_state = "spesshoodie"
flags_inv = HIDEEARS|HIDEHAIR
diff --git a/yogstation/code/modules/clothing/under.dm b/yogstation/code/modules/clothing/under.dm
index e6ad6332cc09..05dd58e6d72c 100644
--- a/yogstation/code/modules/clothing/under.dm
+++ b/yogstation/code/modules/clothing/under.dm
@@ -4,7 +4,6 @@
alternate_screams = list('yogstation/sound/voice/cluwnelaugh1.ogg','yogstation/sound/voice/cluwnelaugh2.ogg','yogstation/sound/voice/cluwnelaugh3.ogg')
icon_state = "cluwne"
item_state = "cluwne"
- item_color = "cluwne"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
item_flags = DROPDEL
can_adjust = 0
@@ -26,7 +25,6 @@
desc = "'An old uniform that was used as a mascot in commercial advertising to make children smile while in other places slaughtering children.'"
icon_state = "ronald_s"
item_state = "clown"
- item_color = "ronald_s"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
@@ -35,7 +33,6 @@
desc = "Seize the means of production in style!"
icon_state = "soviet_dress_uniform"
item_state = "soviet_dress_uniform"
- item_color = "soviet_dress_uniform"
can_adjust = FALSE
/obj/item/clothing/under/yogs/lederhosen
@@ -43,5 +40,4 @@
desc = "'Nothing like wearing a lederhosen for another hard day at work on a space station.'"
icon_state = "lederhosen"
item_state = "lederhosen"
- item_color = "lederhosen"
can_adjust = FALSE
diff --git a/yogstation/code/modules/clothing/under/jobs/civilian.dm b/yogstation/code/modules/clothing/under/jobs/civilian.dm
index 43ac53d56b9b..7778dc455761 100644
--- a/yogstation/code/modules/clothing/under/jobs/civilian.dm
+++ b/yogstation/code/modules/clothing/under/jobs/civilian.dm
@@ -3,7 +3,6 @@
desc = "I explored the galaxy and all I got was this lousy T-shirt!"
icon_state = "tourist"
item_state = "gy_suit"
- item_color = "tourist"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/under/yogs/rank/clerk
@@ -11,7 +10,6 @@
name = "clerk's uniform"
icon_state = "clerk"
item_state = "clerk"
- item_color = "clerk"
can_adjust = FALSE
mutantrace_variation = MUTANTRACE_VARIATION
@@ -20,7 +18,6 @@
name = "clerk's skirt"
icon_state = "clerk_skirt"
item_state = "clerk_skirt"
- item_color = "clerk_skirt"
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -30,7 +27,6 @@
name = "recovery medic's jumpsuit"
icon_state = "recovery"
item_state = "recovery"
- item_color = "recovery"
can_adjust = 0
sensor_mode = 3
random_sensor = 0
diff --git a/yogstation/code/modules/clothing/under/jobs/security.dm b/yogstation/code/modules/clothing/under/jobs/security.dm
index 5e2bd4b0a0a2..e2fda379b1d6 100644
--- a/yogstation/code/modules/clothing/under/jobs/security.dm
+++ b/yogstation/code/modules/clothing/under/jobs/security.dm
@@ -3,7 +3,6 @@
desc = "You have one job, don't screw it up."
icon_state = "kr_officer_s"
item_state = "kr_officer"
- item_color = "kr_officer_s"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30)
strip_delay = 50
alt_covers_chest = TRUE
@@ -17,7 +16,6 @@
desc = "A verstile blue and white uniform honored to hard working brig physicians who help with injured prisoners and security personel."
icon_state = "recovery"
item_state = "recovery"
- item_color = "recovery"
alt_covers_chest = TRUE
sensor_mode = 3
random_sensor = FALSE
@@ -28,7 +26,6 @@
desc = "A classic jumpsuit that connects you to your medsci brothers and sisters."
icon_state = "secwhite"
item_state = "secwhite"
- item_color = "secwhite"
alt_covers_chest = FALSE
random_sensor = TRUE
@@ -37,8 +34,7 @@
desc = "A classic jumpskirt that connects you to your medsci brothers and sisters."
icon_state = "secwhite_skirt"
item_state = "secwhite_skirt"
- item_color = "secwhite_skirt"
can_adjust = FALSE
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
- mutantrace_variation = NO_MUTANTRACE_VARIATION
\ No newline at end of file
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
diff --git a/yogstation/code/modules/clothing/under/miscellaneous.dm b/yogstation/code/modules/clothing/under/miscellaneous.dm
index c16c0cb60416..eb626e97fc55 100644
--- a/yogstation/code/modules/clothing/under/miscellaneous.dm
+++ b/yogstation/code/modules/clothing/under/miscellaneous.dm
@@ -3,7 +3,6 @@
desc = "Groovy!"
icon_state = "psyche_s"
item_state = "rainbow"
- item_color = "psyche_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/scaryclown
@@ -11,7 +10,6 @@
desc = "Often worn by sewer clowns."
icon_state = "scaryclownuniform"
item_state = "scaryclownuniform"
- item_color = "scaryclownuniform"
can_adjust = FALSE
/obj/item/clothing/under/rank/yogs/scaryclown/Initialize()
@@ -23,7 +21,6 @@
desc = "Two faces, two colors."
icon_state = "harvey_flint_s"
item_state = "harvey_flint"
- item_color = "harvey_flint_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/thejester
@@ -31,7 +28,6 @@
desc = "You can never catch me, spaceman!"
icon_state = "the_jester_s"
item_state = "the_jester"
- item_color = "the_jester_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/trickster
@@ -39,7 +35,6 @@
desc = "HAHAHA! I love riddles!"
icon_state = "trickster_s"
item_state = "trickster"
- item_color = "trickster_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/penguinsuit
@@ -47,7 +42,6 @@
desc = "How fancy!"
icon_state = "penguin_s"
item_state = "penguin"
- item_color = "penguin_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/barber
@@ -55,7 +49,6 @@
desc = "The perfect suit for singing in a quartet."
icon_state = "barber_s"
item_state = "barber"
- item_color = "barber_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/dresdenunder
@@ -63,7 +56,6 @@
desc = "Generic nerd by day, evil super villian by night."
icon_state = "dresdenunder_s"
item_state = "dresdenunder"
- item_color = "dresdenunder_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/relaxedwearm
@@ -71,7 +63,6 @@
desc = "Perfect for hosting that evening bbq!"
icon_state = "relaxedwearm_s"
item_state = "relaxedwearm"
- item_color = "relaxedwearm_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/springm
@@ -79,7 +70,6 @@
desc = "Perfect for relaxing under the spring sun!"
icon_state = "springm_s"
item_state = "springm"
- item_color = "springm_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/pinstripe
@@ -87,7 +77,6 @@
desc = "This suit screams rich mafia boss."
icon_state = "pinstripe_s"
item_state = "pinstripe"
- item_color = "pinstripe_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/treasure
@@ -95,7 +84,6 @@
desc = "This suit belongs in a museum!"
icon_state = "doctor_s"
item_state = "doctor"
- item_color = "doctor_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/doomsday
@@ -103,7 +91,6 @@
desc = "The end times are here!"
icon_state = "doomsday_s"
item_state = "doomsday"
- item_color = "doomsday_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/rycliesuni
@@ -111,7 +98,6 @@
desc = "Protects your body from mental brainwashing. Too bad there is no brain inside of your chest."
icon_state = "rycliesuni_s"
item_state = "rycliesuni"
- item_color = "rycliesuni_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/oliveoutfit
@@ -119,7 +105,6 @@
desc = "For people who want to look like they are in the army without actually being in the army."
icon_state = "oliveoutfit_s"
item_state = "oliveoutfit"
- item_color = "oliveoutfit_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/plaidoutfit
@@ -127,7 +112,6 @@
desc = "The most boring of suits."
icon_state = "plaidoutfit_s"
item_state = "plaidoutfit"
- item_color = "plaidoutfit_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/moutfit
@@ -135,7 +119,6 @@
desc = "The most casual of suits."
icon_state = "moutfit_s"
item_state = "moutfit"
- item_color = "moutfit_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/luna
@@ -143,7 +126,6 @@
desc = "So about that football team..."
icon_state = "luna_s"
item_state = "luna"
- item_color = "luna_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/altshield
@@ -151,7 +133,6 @@
desc = "The name tag has the name 'Joe From Accounting' on it."
icon_state = "altshield_s"
item_state = "altshield"
- item_color = "altshield_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/namjumpsuit
@@ -159,7 +140,6 @@
desc = "Welcome to nam, soldier. Now let's go arrest some greytide!"
icon_state = "namjumpsuit_s"
item_state = "namjumpsuit"
- item_color = "namjumpsuit_s"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30)
strip_delay = 50
alt_covers_chest = TRUE
@@ -172,7 +152,6 @@
desc = "For wardens particular to the use of the gulag."
icon_state = "gru_officer_s"
item_state = "gru_officer"
- item_color = "gru_officer_s"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30)
strip_delay = 50
alt_covers_chest = TRUE
@@ -185,7 +164,6 @@
desc = "As long as you protect your men and arrest the greytide you should be fine. God speed."
icon_state = "Lieut_General_US_s"
item_state = "Lieut_General_US"
- item_color = "Lieut_General_US_s"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50)
strip_delay = 60
alt_covers_chest = TRUE
@@ -198,7 +176,6 @@
desc = "You are the commander of your men and the top of the top, dont let them down!"
icon_state = "Captain_Artillery_CS_s"
item_state = "Captain_Artillery_CS"
- item_color = "Captain_Artillery_CS_s"
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
can_adjust = FALSE
@@ -208,7 +185,6 @@
desc = "Darn yankees."
icon_state = "blue_coat_uniform_s"
item_state = "blue_coat_uniform"
- item_color = "blue_coat_uniform_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/redcoatuniform
@@ -216,7 +192,6 @@
desc = "Security is coming! Security is coming!"
icon_state = "red_coat_uniform_s"
item_state = "red_coat_uniform"
- item_color = "red_coat_uniform_s"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30)
strip_delay = 50
alt_covers_chest = TRUE
@@ -229,7 +204,6 @@
desc = "Time to be the leader of your own musical!"
icon_state = "hamilton_uniform_s"
item_state = "hamilton_uniform"
- item_color = "hamilton_uniform_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/cowboy2
@@ -237,7 +211,6 @@
desc = "Welcome to the wild west partner."
icon_state = "cowboy2_s"
item_state = "cowboy2"
- item_color = "cowboy2_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/cowboy
@@ -245,7 +218,6 @@
desc = "Welcome to the wild west partner. Now slightly more fancy!"
icon_state = "cowboy_s"
item_state = "cowboy"
- item_color = "cowboy_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/bluedetective
@@ -253,7 +225,6 @@
desc = "A suit often worn by those detective types. Now in blue!"
icon_state = "blue_detective"
item_state = "blue_detective"
- item_color = "blue_detective"
can_adjust = FALSE
/obj/item/clothing/under/yogs/golddetective
@@ -261,14 +232,12 @@
desc = "A suit often worn by those detective types. Now in gold!"
icon_state = "gold_detective"
item_state = "gold_detective"
- item_color = "gold_detective"
/obj/item/clothing/under/yogs/greydetective
name = "grey detective suit"
desc = "A suit often worn by those detective types. Now in boring old grey!"
icon_state = "grey_detective"
item_state = "grey_detective"
- item_color = "grey_detective"
can_adjust = FALSE
/obj/item/clothing/under/yogs/blackdetective
@@ -276,7 +245,6 @@
desc = "A suit often worn by those detective types. Now in black!"
icon_state = "black_detective"
item_state = "black_detective"
- item_color = "black_detective"
can_adjust = FALSE
/obj/item/clothing/under/yogs/whitetuxedo
@@ -284,7 +252,6 @@
desc = "The perfect suit for almost any occasion, just make sure to wash it down once you're done with it."
icon_state = "white_tuxedo"
item_state = "white_tuxedo"
- item_color = "white_tuxedo"
can_adjust = FALSE
/obj/item/clothing/under/yogs/ceturtleneck
@@ -292,7 +259,6 @@
desc = "How cozy!"
icon_state = "ce_turtleneck"
item_state = "ce_turtleneck"
- item_color = "ce_turtleneck"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 80, ACID = 40)
resistance_flags = NONE
can_adjust = FALSE
@@ -302,7 +268,6 @@
desc = "The perfect dress for almost any ball."
icon_state = "white_dress"
item_state = "white_dress"
- item_color = "white_dress"
can_adjust = FALSE
/obj/item/clothing/under/yogs/nursedress
@@ -310,7 +275,6 @@
desc = "Nurse, stop standing there and help me! I am dying!"
icon_state = "nurse_dress"
item_state = "nurse_dress"
- item_color = "nurse_dress"
can_adjust = FALSE
/obj/item/clothing/under/yogs/prosecutorsuit
@@ -318,7 +282,6 @@
desc = "GUILTY! LET'S GO GET SOME DONUTS!"
icon_state = "prosecutor_suit"
item_state = "prosecutor_suit"
- item_color = "prosecutor_suit"
can_adjust = FALSE
/obj/item/clothing/under/yogs/dictatorhos
@@ -326,7 +289,6 @@
desc = "The leader the station does not need or want."
icon_state = "uniform_two"
item_state = "uniform_two"
- item_color = "uniform_two"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50)
strip_delay = 60
alt_covers_chest = TRUE
@@ -339,7 +301,6 @@
desc = "Are we making meth or growing plants?"
icon_state = "botany_uniform"
item_state = "botany_uniform"
- item_color = "botany_uniform"
permeability_coefficient = 0.5
can_adjust = FALSE
@@ -348,7 +309,6 @@
desc = "Even the captain has to let loose on this metal death trap every now and then."
icon_state = "casual_captain"
item_state = "casual_captain"
- item_color = "casual_captain"
can_adjust = FALSE
/obj/item/clothing/under/yogs/fancysuit
@@ -356,7 +316,6 @@
desc = "What a fancy suit!"
icon_state = "fancy_suit"
item_state = "fancy_suit"
- item_color = "fancy_suit"
can_adjust = FALSE
/obj/item/clothing/under/yogs/redcamo
@@ -364,7 +323,6 @@
desc = "Kinda ruins the whole point of camouflage in the first place to be honest."
icon_state = "red_camo"
item_state = "red_camo"
- item_color = "red_camo"
can_adjust = FALSE
/obj/item/clothing/under/yogs/whitecaptainsuit
@@ -372,7 +330,6 @@
desc = "For captains who want to pretend they are a boat captain and not a space station captain."
icon_state = "captain_suit"
item_state = "captain_suit"
- item_color = "captain_suit"
can_adjust = FALSE
/obj/item/clothing/under/yogs/armyuniform
@@ -380,7 +337,6 @@
desc = "Often seen being worn by the space army."
icon_state = "army_uniform"
item_state = "army_uniform"
- item_color = "army_uniform"
can_adjust = FALSE
/obj/item/clothing/under/yogs/work_suit
@@ -388,7 +344,6 @@
desc = "Perfect for that 24/7 workout with all the running you do around the station."
icon_state = "work_suit"
item_state = "work_suit"
- item_color = "work_suit"
can_adjust = FALSE
/obj/item/clothing/under/yogs/colony
@@ -396,14 +351,12 @@
desc = "Nothing like exploring the great jungles of watabaga and fighting the great lumbarian wombo in the morning."
icon_state = "colony_longsleeve"
item_state = "colony_longsleeve"
- item_color = "colony_longsleeve"
/obj/item/clothing/under/yogs/hoslatenight
name = "late night head of security uniform"
desc = "For those more quiet shifts."
icon_state = "hos1_suit"
item_state = "hos1_suit"
- item_color = "hos1_suit"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50)
strip_delay = 60
alt_covers_chest = TRUE
@@ -416,7 +369,6 @@
desc = "Even the CE has to take a break from setting up the engine somet- and the singlo is loose."
icon_state = "ce_suit"
item_state = "ce_suit"
- item_color = "ce_suit"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 80, ACID = 40)
resistance_flags = NONE
can_adjust = FALSE
@@ -426,7 +378,6 @@
desc = "Even the HoS has to take a break from beating the clown sometimes."
icon_state = "hos_suit"
item_state = "hos_suit"
- item_color = "hos_suit"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50)
strip_delay = 60
alt_covers_chest = TRUE
@@ -439,7 +390,6 @@
desc = "Even the HoP has to take a break from giving all access to the crew sometimes."
icon_state = "hop_suit"
item_state = "hop_suit"
- item_color = "hop_suit"
can_adjust = FALSE
/obj/item/clothing/under/yogs/forensictech
@@ -447,7 +397,6 @@
desc = "Hmm, this bloody toolbox has insulated fibers on it..."
icon_state = "forensic_tech"
item_state = "forensic_tech"
- item_color = "forensic_tech"
can_adjust = FALSE
/obj/item/clothing/under/yogs/bluetunic
@@ -455,7 +404,6 @@
desc = "Perfect for relaxing in a bath house. Too bad there isn't one on the station."
icon_state = "bluetunic_s"
item_state = "bluetunic"
- item_color = "bluetunic_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/caretaker
@@ -463,7 +411,6 @@
desc = "Yeah, he will 'take care' of you alright."
icon_state = "caretaker_s"
item_state = "caretaker"
- item_color = "caretaker_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/familiartunic
@@ -471,7 +418,6 @@
desc = "You swear you've seen this tunic before, but you can't place where..."
icon_state = "familiartunic_s"
item_state = "familiartunic"
- item_color = "familiartunic_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/fiendsuit
@@ -479,7 +425,6 @@
desc = "Named so because only a really bad person would wear such a suit."
icon_state = "fiendsuit_s"
item_state = "fiendsuit"
- item_color = "fiendsuit_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/grimhoodie
@@ -487,7 +432,6 @@
desc = "A hoodie without a hood... how grim."
icon_state = "grimhoodie_s"
item_state = "grimhoodie"
- item_color = "grimhoodie_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/infmob
@@ -495,7 +439,6 @@
desc = "So you wanna be a classy gangster, ay?"
icon_state = "inf_mob_s"
item_state = "inf_mob"
- item_color = "inf_mob_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/persskinsuit
@@ -503,7 +446,6 @@
desc = "Pretty uncomfortable but at least it looks cool."
icon_state = "pers_skinsuit_s"
item_state = "pers_skinsuit"
- item_color = "pers_skinsuit_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/soldieruniform
@@ -511,7 +453,6 @@
desc = "Are you a man or a mouse?"
icon_state = "soldier_uniform_s"
item_state = "soldier_uniform"
- item_color = "soldier_uniform_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/lightpink
@@ -519,14 +460,12 @@
desc = "A jumpsuit. Now in light pink."
icon_state = "lightpink_s"
item_state = "lightpink"
- item_color = "lightpink_s"
/obj/item/clothing/under/yogs/rdema
name = "pink research directors uniform"
desc = "What relaxing colors."
icon_state = "rdema_s"
item_state = "rdema"
- item_color = "rdema_s"
can_adjust = FALSE
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 35)
@@ -535,7 +474,6 @@
desc = "Candy is dandy, but liquor is quicker!"
icon_state = "billydonka_s"
item_state = "billydonka"
- item_color = "billydonka_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/brownoveralls
@@ -543,7 +481,6 @@
desc = "The perfect uniform for coal mining."
icon_state = "b-overalls_s"
item_state = "b-overalls"
- item_color = "b-overalls_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/redoveralls
@@ -551,7 +488,6 @@
desc = "The perfect uniform for lumberjacks."
icon_state = "r-overalls_s"
item_state = "r-overalls"
- item_color = "r-overalls_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/casualjanitorsuit
@@ -559,7 +495,6 @@
desc = "Even the janitor has to take a break from slipping the crew sometimes."
icon_state = "janitor_suit"
item_state = "janitor_suit"
- item_color = "janitor_suit"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0)
can_adjust = FALSE
@@ -568,7 +503,6 @@
desc = "Even the bartender has to take a break from protecting Pun Pun sometimes."
icon_state = "callum_suit_s"
item_state = "callum_suit"
- item_color = "callum_suit_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/saaland
@@ -576,7 +510,6 @@
desc = "Made from 0.01% real gold!"
icon_state = "saaland_s"
item_state = "saaland"
- item_color = "saaland_s"
can_adjust = FALSE
/obj/item/clothing/under/yogs/victorianblred
@@ -584,7 +517,6 @@
desc = "Oh how eighteen hundreds!"
icon_state = "victorianblred"
item_state = "victorianblred"
- item_color = "victorianblred"
can_adjust = FALSE
/obj/item/clothing/under/yogs/victorianredvest
@@ -592,7 +524,6 @@
desc = "Oh how eighteen hundreds!"
icon_state = "victorianredvest"
item_state = "victorianredvest"
- item_color = "victorianredvest"
can_adjust = FALSE
/obj/item/clothing/under/yogs/victorianvest
@@ -600,7 +531,6 @@
desc = "Oh how eighteen hundreds!"
icon_state = "victorianvest"
item_state = "victorianvest"
- item_color = "victorianvest"
can_adjust = FALSE
/obj/item/clothing/under/yogs/victorianblackdress
@@ -608,7 +538,6 @@
desc = "Oh how eighteen hundreds!"
icon_state = "victorianblackdress"
item_state = "victorianblackdress"
- item_color = "victorianblackdress"
can_adjust = FALSE
/obj/item/clothing/under/yogs/victorianreddress
@@ -616,7 +545,6 @@
desc = "Oh how eighteen hundreds!"
icon_state = "victorianreddress"
item_state = "victorianreddress"
- item_color = "victorianreddress"
can_adjust = FALSE
/obj/item/clothing/under/yogs/shitcurity
@@ -624,21 +552,18 @@
desc = "For the security members that want to show their true colors."
icon_state = "altsecurity"
item_state = "altsecurity"
- item_color = "altsecurity"
/obj/item/clothing/under/yogs/victoriouscaptainuniform
name = "very fancy captain uniform"
desc = "Ask not the sparrow how the eagle soars!"
icon_state = "captainfemaleformal_s"
item_state = "captainfemaleformal"
- item_color = "captainfemaleformal_s"
/obj/item/clothing/under/yogs/zootsuit
name = "zoot suit"
desc = "A snazzy purple zoot suit. The name 'Big Papa' is stitched on the inside of the collar."
icon_state = "zootsuit"
item_state = "zootsuit"
- item_color = "zootsuit"
can_adjust = 0
/obj/item/clothing/under/yogs/cosby
@@ -646,5 +571,4 @@
desc = "Zip zap zoobity bap!"
icon_state = "cosby"
item_state = "cosby"
- item_color = "cosby"
- can_adjust = 0
\ No newline at end of file
+ can_adjust = 0
diff --git a/yogstation/code/modules/donor/unique_donator_items.dm b/yogstation/code/modules/donor/unique_donator_items.dm
index 82289e96e991..199978503bff 100644
--- a/yogstation/code/modules/donor/unique_donator_items.dm
+++ b/yogstation/code/modules/donor/unique_donator_items.dm
@@ -118,7 +118,6 @@ Uncomment this and use atomproccall as necessary, then copypaste the output into
name = "green cosmic bedsheet"
icon_state = "sheetcosmos_green"
item_state = "sheetcosmos_green"
- item_color = "cosmos_green"
/datum/donator_gear/azeelium
name = "Utatul-Azeel plushie"
@@ -150,6 +149,11 @@ Uncomment this and use atomproccall as necessary, then copypaste the output into
ckey = "Hisakaki"
unlock_path = /obj/item/clothing/head/halo
+/datum/donator_gear/skrem
+ name = "Rainbow flower"
+ ckey = "Skrem7"
+ unlock_path = /obj/item/clothing/head/rainbow_flower
+
///Generic donator hats, ckey agnostic.
/datum/donator_gear/beanie
name = "Beanie"
diff --git a/yogstation/code/modules/jobs/job_types/brig_physician.dm b/yogstation/code/modules/jobs/job_types/brig_physician.dm
index 4b3c54f18421..b7a7b325ae0c 100644
--- a/yogstation/code/modules/jobs/job_types/brig_physician.dm
+++ b/yogstation/code/modules/jobs/job_types/brig_physician.dm
@@ -40,6 +40,7 @@
ears = /obj/item/radio/headset/headset_medsec
glasses = /obj/item/clothing/glasses/hud/health/sunglasses
shoes = /obj/item/clothing/shoes/jackboots
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/jackboots
uniform = /obj/item/clothing/under/yogs/rank/miner/medic
suit = /obj/item/clothing/suit/toggle/labcoat/emt/physician
l_hand = /obj/item/storage/firstaid/regular
diff --git a/yogstation/code/modules/jobs/job_types/mining_medic.dm b/yogstation/code/modules/jobs/job_types/mining_medic.dm
index f8d2058ad126..3fd4a43e1ee0 100644
--- a/yogstation/code/modules/jobs/job_types/mining_medic.dm
+++ b/yogstation/code/modules/jobs/job_types/mining_medic.dm
@@ -34,12 +34,12 @@
pda_type = /obj/item/pda/miningmed
backpack_contents = list(/obj/item/roller = 1,\
- /obj/item/kitchen/knife/combat/survival = 1,\
- /obj/item/gps/mining = 1)
+ /obj/item/kitchen/knife/combat/survival = 1)
belt = /obj/item/storage/belt/medical/mining
ears = /obj/item/radio/headset/headset_medcargo
glasses = /obj/item/clothing/glasses/hud/health/meson
shoes = /obj/item/clothing/shoes/workboots/mining
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/medical
suit = /obj/item/clothing/suit/toggle/labcoat/emt/explorer
uniform = /obj/item/clothing/under/yogs/rank/miner/medic
l_hand = /obj/item/storage/firstaid/regular
diff --git a/yogstation/code/modules/jobs/job_types/network_admin.dm b/yogstation/code/modules/jobs/job_types/network_admin.dm
index 59b9bff70d20..c229069d1e6b 100644
--- a/yogstation/code/modules/jobs/job_types/network_admin.dm
+++ b/yogstation/code/modules/jobs/job_types/network_admin.dm
@@ -40,6 +40,7 @@
suit = /obj/item/clothing/suit/hooded/wintercoat/engineering/tcomms
gloves = /obj/item/clothing/gloves/color/black
shoes = /obj/item/clothing/shoes/workboots
+ digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/engineering
backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
backpack = /obj/item/storage/backpack/industrial
diff --git a/yogstation/code/modules/mob/dead/new_player/sprite_accessories.dm b/yogstation/code/modules/mob/dead/new_player/sprite_accessories.dm
index 16a5ea794aec..b6c3742e18d4 100644
--- a/yogstation/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/yogstation/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -1,5 +1,5 @@
/datum/sprite_accessory/undershirt/goose
name = "Shirt (Vomit Goose)"
icon_state = "vomitgooseshirt"
- icon = 'yogstation/icons/mob/underwear.dmi'
- gender = NEUTER
\ No newline at end of file
+ icon = 'yogstation/icons/mob/clothing/sprite_accessories/undershirt.dmi'
+ gender = NEUTER
diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm
index 2206003e834d..8b1f1e69f062 100644
--- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm
+++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm
@@ -1,14 +1,24 @@
-/obj/item/organ/eyes/preternis
+/obj/item/organ/eyes/robotic/preternis
name = "preternis eyes"
- desc = "An experimental upgraded version of eyes that can see in the dark.They are designed to fit preternis"
+ desc = "An experimental upgraded version of eyes that can see in the dark. They are designed to fit preternis"
see_in_dark = PRETERNIS_NV_ON
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
+ //preternis eyes need to be powered by a preternis to function, in a non preternis they slowly power down to blindness
+ organ_flags = ORGAN_SYNTHETIC
+
+ low_threshold_passed = span_info("Your Preternis eyes switch to battery saver mode.")
+ high_threshold_passed = span_info("Your Preternis eyes only show a sliver of battery life left!")
+ now_failing = span_warning("An empty battery icon is all you can see as your eyes shut off!")
+ now_fixed = span_info("Lines of text scroll in your vision as your eyes begin rebooting.")
+ high_threshold_cleared = span_info("Your Preternis eyes have recharged enough to re-enable most functionality.")
+ low_threshold_cleared = span_info("Your Preternis eyes have almost fully recharged.")
+ var/powered = TRUE
actions_types = list(/datum/action/item_action/organ_action/use)
var/night_vision = TRUE
-/obj/item/organ/eyes/preternis/ui_action_click()
- var/datum/species/preternis/S = owner.dna.species
- if(S.charge < PRETERNIS_LEVEL_FED)
+/obj/item/organ/eyes/robotic/preternis/ui_action_click()
+ if(damage > low_threshold)
+ //no nightvision if your eyes are hurt
return
sight_flags = initial(sight_flags)
switch(lighting_alpha)
@@ -23,17 +33,29 @@
sight_flags &= ~SEE_BLACKNESS
owner.update_sight()
-/obj/item/organ/eyes/preternis/on_life()
+/obj/item/organ/eyes/robotic/preternis/on_life()
. = ..()
- if(!ispreternis(owner))
- qdel(src) //these eyes depend on being inside a preternis
+ if(!owner)
return
- var/datum/species/preternis/S = owner.dna.species
- if(S.charge >= PRETERNIS_LEVEL_FED)
+ if(ispreternis(owner) && !powered)
+ powered = TRUE
+ to_chat(owner, span_notice("A battery icon disappears from your vision as your [src] switch to external power."))
+ if(!ispreternis(owner) && powered) //these eyes depend on being inside a preternis for power
+ powered = FALSE
+ to_chat(owner, span_boldwarning("Your [src] flash warnings that they've lost their power source, and are running on emergency power!"))
+ if(powered)
+ //when powered, they recharge by healing
+ owner.adjustOrganLoss(ORGAN_SLOT_EYES,-0.5)
+ else
+ //to simulate running out of power, they take damage
+ owner.adjustOrganLoss(ORGAN_SLOT_EYES,0.5)
+
+ if(damage < low_threshold)
if(see_in_dark == PRETERNIS_NV_OFF)
see_in_dark = PRETERNIS_NV_ON
owner.update_sight()
else
+ //if your eyes start getting hurt no more nightvision
if(see_in_dark == PRETERNIS_NV_ON)
see_in_dark = PRETERNIS_NV_OFF
owner.update_sight()
@@ -42,6 +64,17 @@
sight_flags &= ~SEE_BLACKNESS
owner.update_sight()
+/obj/item/organ/eyes/robotic/preternis/examine(mob/user)
+ . = ..()
+ if(status == ORGAN_ROBOTIC && (organ_flags & ORGAN_FAILING))
+ . += span_warning("[src] appears to be completely out of charge. However, that's nothing popping them back in a Preternis wouldn't fix.")
+
+ else if(organ_flags & ORGAN_FAILING)
+ . += span_warning("[src] appears to be completely out of charge. If they were put back in a Preternis they would surely recharge in time.")
+
+ else if(damage > high_threshold)
+ . += span_warning("[src] seem to flicker on and off. They must be pretty low on charge without being in a Preternis")
+
/obj/item/organ/lungs/preternis
name = "preternis lungs"
desc = "An experimental set of lungs.Due to the cybernetic nature of these lungs,they are less resistant to heat and cold but are more efficent at filtering oxygen."
diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm
index 3752967b4080..46a8cb8dcd5d 100644
--- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm
+++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm
@@ -25,7 +25,7 @@ adjust_charge - take a positive or negative value to adjust the charge level
siemens_coeff = 1.75 //Computers REALLY don't like being shorted out
payday_modifier = 0.8 //Useful to NT for engineering + very close to Human
yogs_draw_robot_hair = TRUE
- mutanteyes = /obj/item/organ/eyes/preternis
+ mutanteyes = /obj/item/organ/eyes/robotic/preternis
mutantlungs = /obj/item/organ/lungs/preternis
yogs_virus_infect_chance = 20
virus_resistance_boost = 10 //YEOUTCH,good luck getting it out
diff --git a/yogstation/code/modules/mob/living/silicon/robot/robot.dm b/yogstation/code/modules/mob/living/silicon/robot/robot.dm
index 2025d350fbff..6ad182cc1c31 100644
--- a/yogstation/code/modules/mob/living/silicon/robot/robot.dm
+++ b/yogstation/code/modules/mob/living/silicon/robot/robot.dm
@@ -66,7 +66,7 @@
else
add_overlay("ov-opencover -c")
if(hat)
- var/mutable_appearance/head_overlay = hat.build_worn_icon(state = hat.icon_state, default_layer = 20, default_icon_file = 'icons/mob/head.dmi')
+ var/mutable_appearance/head_overlay = hat.build_worn_icon(default_layer = 20, default_icon_file = 'icons/mob/clothing/head/head.dmi')
head_overlay.pixel_y += hat_offset
add_overlay(head_overlay)
update_fire()
diff --git a/yogstation/code/modules/ninja/suit/ninja.dm b/yogstation/code/modules/ninja/suit/ninja.dm
index 8def55122e3f..068fb2697ad1 100644
--- a/yogstation/code/modules/ninja/suit/ninja.dm
+++ b/yogstation/code/modules/ninja/suit/ninja.dm
@@ -1,22 +1,22 @@
/obj/item/clothing/head/helmet/space/space_ninja
- alternate_worn_icon = 'yogstation/icons/mob/head.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/head/head.dmi'
icon_state = "s-ninja"
/obj/item/clothing/mask/gas/space_ninja
- alternate_worn_icon = 'yogstation/icons/mob/mask.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/mask/mask.dmi'
icon = 'yogstation/icons/obj/clothing/masks.dmi'
icon_state = "s-ninja"
var/lights_on = FALSE
var/lights_colour = "16be00"
/obj/item/clothing/shoes/space_ninja
- alternate_worn_icon = 'yogstation/icons/mob/feet.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/feet/feet.dmi'
icon_state = "s-ninja"
var/lights_on = FALSE
var/lights_colour = "16be00"
/obj/item/clothing/suit/space/space_ninja
- alternate_worn_icon = 'yogstation/icons/mob/suit.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi'
icon = 'yogstation/icons/obj/clothing/suits.dmi'
icon_state = "s-ninja"
var/lights_on = FALSE
@@ -30,14 +30,14 @@
/obj/item/clothing/suit/space/space_ninja/worn_overlays(isinhands = FALSE)
.=..()
if(!isinhands && lights_on)
- var/mutable_appearance/M = mutable_appearance('yogstation/icons/mob/suit.dmi', "s-ninja-overlay")
+ var/mutable_appearance/M = mutable_appearance(mob_overlay_icon, "s-ninja-overlay")
M.color = lights_colour
. += M
/obj/item/clothing/mask/gas/space_ninja/worn_overlays(isinhands = FALSE)
.=..()
if(!isinhands && lights_on)
- var/mutable_appearance/M = mutable_appearance('yogstation/icons/mob/mask.dmi', "s-ninja-overlay")
+ var/mutable_appearance/M = mutable_appearance(mob_overlay_icon, "s-ninja-overlay")
M.color = lights_colour
. += M
@@ -45,14 +45,14 @@
/obj/item/clothing/shoes/space_ninja/worn_overlays(isinhands = FALSE)
.=..()
if(!isinhands && lights_on)
- var/mutable_appearance/M = mutable_appearance('yogstation/icons/mob/feet.dmi', "s-ninja-overlay")
+ var/mutable_appearance/M = mutable_appearance(mob_overlay_icon, "s-ninja-overlay")
M.color = lights_colour
. += M
/obj/item/clothing/gloves/space_ninja/worn_overlays(isinhands = FALSE)
.=..()
if(!isinhands && lights_on)
- var/mutable_appearance/M = mutable_appearance('yogstation/icons/mob/hands.dmi', "s-ninja-overlay")
+ var/mutable_appearance/M = mutable_appearance(mob_overlay_icon, "s-ninja-overlay")
M.color = lights_colour
. += M
diff --git a/yogstation/code/modules/reagents/reagent_containers/hypospray.dm b/yogstation/code/modules/reagents/reagent_containers/hypospray.dm
index 4dfcd25b1e8a..a3f7fa0ef8de 100644
--- a/yogstation/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/yogstation/code/modules/reagents/reagent_containers/hypospray.dm
@@ -16,12 +16,12 @@
/obj/item/reagent_containers/hypospray/medipen/stimpack/large
name = "stimpack injector"
- desc = "Contains two heavy doses of stimulants."
+ desc = "Contains three heavy doses of stimulants."
icon = 'yogstation/icons/obj/syringe.dmi'
icon_state = "stimpakpen"
- volume = 50
+ volume = 75
amount_per_transfer_from_this = 25
- list_reagents = list(/datum/reagent/medicine/stimulants = 50)
+ list_reagents = list(/datum/reagent/medicine/stimulants = 75)
/obj/item/reagent_containers/hypospray/medipen/stimpack/large/update_icon()
if(reagents.total_volume > 25)
diff --git a/yogstation/code/modules/surgery/gender_reassignment.dm b/yogstation/code/modules/surgery/gender_reassignment.dm
index 25cf89fcada7..c9f040a0225d 100644
--- a/yogstation/code/modules/surgery/gender_reassignment.dm
+++ b/yogstation/code/modules/surgery/gender_reassignment.dm
@@ -1,5 +1,7 @@
/datum/surgery/gender_reassignment
name = "gender reassignment"
+ desc = "This surgery reassigns a person's gender that of the opposite sex. Failure may result in gender ambiguity."
+ icon_state = "gender_change"
steps = list(/datum/surgery_step/incise,
/datum/surgery_step/clamp_bleeders,
/datum/surgery_step/reshape_genitals,
@@ -42,4 +44,4 @@
user.visible_message(span_warning("[user] accidentally mutilates [target]'s genitals beyond the point of recognition!"), span_warning("You accidentally mutilate [target]'s genitals beyond the point of recognition!"))
target.gender = pick(MALE, FEMALE)
target.regenerate_icons()
- return 1
\ No newline at end of file
+ return 1
diff --git a/yogstation/code/modules/surgery/healing_surgeries.dm b/yogstation/code/modules/surgery/healing_surgeries.dm
index 527a7f4e1330..d30634f5ab2b 100644
--- a/yogstation/code/modules/surgery/healing_surgeries.dm
+++ b/yogstation/code/modules/surgery/healing_surgeries.dm
@@ -65,10 +65,16 @@
//surgeries go here
/datum/surgery/heal_brute
name = "patch wounds"
+ desc = "Heals a body part of brute damage. Useful for allowing a body to be defibrillated."
+ icon = 'icons/obj/stack_medical.dmi'
+ icon_state = "brutepack_3"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/debride, /datum/surgery_step/apply_dressing, /datum/surgery_step/close)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
/datum/surgery/heal_burn
name = "treat burns"
+ desc = "Heals a body part of burn damage. Useful for allowing a body to be defibrillated."
+ icon = 'icons/obj/stack_medical.dmi'
+ icon_state = "ointment_3"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/debride, /datum/surgery_step/apply_dressing/burn, /datum/surgery_step/close)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
diff --git a/yogstation/icons/mob/back.dmi b/yogstation/icons/mob/clothing/back.dmi
similarity index 100%
rename from yogstation/icons/mob/back.dmi
rename to yogstation/icons/mob/clothing/back.dmi
diff --git a/yogstation/icons/mob/belt.dmi b/yogstation/icons/mob/clothing/belt.dmi
similarity index 100%
rename from yogstation/icons/mob/belt.dmi
rename to yogstation/icons/mob/clothing/belt.dmi
diff --git a/yogstation/icons/mob/ears.dmi b/yogstation/icons/mob/clothing/ears/ears.dmi
similarity index 100%
rename from yogstation/icons/mob/ears.dmi
rename to yogstation/icons/mob/clothing/ears/ears.dmi
diff --git a/yogstation/icons/mob/eyes.dmi b/yogstation/icons/mob/clothing/eyes/eyes.dmi
similarity index 100%
rename from yogstation/icons/mob/eyes.dmi
rename to yogstation/icons/mob/clothing/eyes/eyes.dmi
diff --git a/yogstation/icons/mob/feet.dmi b/yogstation/icons/mob/clothing/feet/feet.dmi
similarity index 100%
rename from yogstation/icons/mob/feet.dmi
rename to yogstation/icons/mob/clothing/feet/feet.dmi
diff --git a/yogstation/icons/mob/hands.dmi b/yogstation/icons/mob/clothing/hands/hands.dmi
similarity index 100%
rename from yogstation/icons/mob/hands.dmi
rename to yogstation/icons/mob/clothing/hands/hands.dmi
diff --git a/yogstation/icons/mob/head.dmi b/yogstation/icons/mob/clothing/head/head.dmi
similarity index 100%
rename from yogstation/icons/mob/head.dmi
rename to yogstation/icons/mob/clothing/head/head.dmi
diff --git a/yogstation/icons/mob/mask.dmi b/yogstation/icons/mob/clothing/mask/mask.dmi
similarity index 100%
rename from yogstation/icons/mob/mask.dmi
rename to yogstation/icons/mob/clothing/mask/mask.dmi
diff --git a/yogstation/icons/mob/neck.dmi b/yogstation/icons/mob/clothing/neck/neck.dmi
similarity index 100%
rename from yogstation/icons/mob/neck.dmi
rename to yogstation/icons/mob/clothing/neck/neck.dmi
diff --git a/yogstation/icons/mob/underwear.dmi b/yogstation/icons/mob/clothing/sprite_accessories/undershirt.dmi
similarity index 100%
rename from yogstation/icons/mob/underwear.dmi
rename to yogstation/icons/mob/clothing/sprite_accessories/undershirt.dmi
diff --git a/yogstation/icons/mob/suit.dmi b/yogstation/icons/mob/clothing/suit/suit.dmi
similarity index 100%
rename from yogstation/icons/mob/suit.dmi
rename to yogstation/icons/mob/clothing/suit/suit.dmi
diff --git a/yogstation/icons/mob/uniform.dmi b/yogstation/icons/mob/clothing/uniform/uniform.dmi
similarity index 100%
rename from yogstation/icons/mob/uniform.dmi
rename to yogstation/icons/mob/clothing/uniform/uniform.dmi
diff --git a/yogstation/icons/mob/inhands/equipment/fishing_lefthand.dmi b/yogstation/icons/mob/inhands/equipment/fishing_lefthand.dmi
new file mode 100644
index 000000000000..eecb088c76d0
Binary files /dev/null and b/yogstation/icons/mob/inhands/equipment/fishing_lefthand.dmi differ
diff --git a/yogstation/icons/mob/inhands/equipment/fishing_righthand.dmi b/yogstation/icons/mob/inhands/equipment/fishing_righthand.dmi
new file mode 100644
index 000000000000..083467251b9f
Binary files /dev/null and b/yogstation/icons/mob/inhands/equipment/fishing_righthand.dmi differ
diff --git a/yogstation/icons/obj/fishing/fishing.dmi b/yogstation/icons/obj/fishing/fishing.dmi
index 2db5d8259da5..ca4cf1a936dd 100644
Binary files a/yogstation/icons/obj/fishing/fishing.dmi and b/yogstation/icons/obj/fishing/fishing.dmi differ
diff --git a/yogstation/sound/items/dodgeroll.ogg b/yogstation/sound/items/dodgeroll.ogg
new file mode 100644
index 000000000000..7a450778c6fb
Binary files /dev/null and b/yogstation/sound/items/dodgeroll.ogg differ